---
title: "Update a donation"
description: "Update a not claimed and not billed donation's amount or set the externalId/uniqueExternalId of your choice."
canonical: https://www.charitips.com/docs/api-reference/update-donation
---

# Update a donation

`PATCH /v1/donations/{donationId}`

Update a not claimed and not billed donation's amount or set the externalId/uniqueExternalId of your choice.

**Authentication**: Bearer access token.

## Parameters

- `donationId` (string, required)

## Body

- `amount` (integer (int64), minimum 1): Donation amount in minor currency unit i.e cents if the donation hasn't been billed or claimed yet.
- `externalId` (string): An optional internal id of your system e.g orderId or customerId. Can be used to link a donation to an entity in your system.
- `uniqueExternalId` (string): Similar to externalId but should be unique across all donations. Can be used to prevent duplicate donations.

## Response 200

- `donationId` (string, required)
- `amount` (integer (int64))
- `externalId` (string)
- `uniqueExternalId` (string)
- `status` (DonationStatus, required) One of `PENDING`, `DONE`, `PROCESSED`, `CANCELED`.
- `secret` (string, required)
- `withFiscalReceipt` (boolean, required)
- `hasBeenCharged` (boolean, required)
- `claimedAt` (string (date-time))
- `validatedAt` (string (date-time))
- `processedAt` (string (date-time))
- `billingStatus` (BillingStatus, required) One of `PENDING`, `BILLED`, `PAID`.
- `hideAmount` (boolean, required)
- `billedOn` (DonationBilledOn, required) One of `CREATION`, `CLAIM`.
- `autoAssigned` (boolean)
- `expiryDate` (string (date-time))
- `sendingMode` (CampaignSendingMode, required) One of `MANUAL`, `EMAIL`, `PHYSICAL`, `SLACK`, `POSTAL`.
- `sendingDate` (string (date-time))
- `sendingStatus` (DonationSendingStatus, required) One of `PENDING`, `FAILED`, `DONE`.
- `externalSendingId` (string)
- `lastReminderId` (string)
- `message` (string)
- `reminderMessage` (string)
- `from` (string)
- `language` (Language, required) One of `fr`, `en`.
- `sharedOn` (SocialNetwork) One of `LINKEDIN`, `INSTAGRAM`, `FACEBOOK`, `TWITTER`, `WHATSAPP`.
- `ptoType` (PaidTimeOffType, required) One of `NONE`, `PAID_TIME_OFF`, `WORKING_TIME_REDUCTION`.
- `accountId` (string, required)
- `campaignId` (string, required)
- `charityId` (string)
- `recurringDonationId` (string)
- `transactionId` (string)
- `donorId` (string)
- `orderPlatformUserId` (string)
- `usageId` (string)
- `parentDonationId` (string)
- `parentVoteId` (string)
- `parentRecurringDonationId` (string)
- `createdAt` (string (date-time), required)
- `updatedAt` (string (date-time), required)

## Errors

- 400 `A field is missing, has the wrong type, or is not part of the request schema.`: `message` lists every problem. Unknown fields are rejected, not ignored: remove them rather than sending extra data. See https://www.charitips.com/docs/api-reference/errors.md.
- 401 `Unauthorized`: The access token is missing, expired or invalid. Create a new one with your client id and secret, send it as `Authorization: Bearer <accessToken>`, then retry once. Sandbox tokens only work on api.sandbox.charitips.com. See https://www.charitips.com/docs/get-started/authentication.md.
- 403 `Donation amount can't be updated as its card has already been posted.`
- 403 `Donation amount can't be updated as it has already been claimed.`: Once claimed, the amount is final. Create a new donation for a different amount. See https://www.charitips.com/docs/api-reference/create-donation.md.
- 403 `Donation amount can't be updated as it has already been billed.`: Once billed, the amount is final. Create a new donation for a different amount. See https://www.charitips.com/docs/api-reference/create-donation.md.
- 403 `Donation amount can't be updated as it has been claimed, billed or its card posted.`
- 403 `Account closed`: The account behind these credentials is closed: no token is issued and every call is refused, reads included. Contact Charitips to reopen it. See https://www.charitips.com/docs/api-reference/troubleshooting.md#calls-answer-403-account-not-active-account-not-validated-or-account-closed.
- 403 `Forbidden`: Your credentials cannot perform this action on this resource. An id from another account never answers 403: it is treated as unknown, with a 404 in the path or a 400 `Bad Request` in the body or the query. See https://www.charitips.com/docs/api-reference/errors.md.
- 404 `Not Found`: No resource with this id on your account and environment. An id that belongs to another account answers 404 too when it is in the path. Ids from the sandbox do not exist in production. See https://www.charitips.com/docs/get-started/sandbox.md.
- 409 `Unique constraint failed on uniqueExternalId`: Another donation of your account already uses this uniqueExternalId. Pick another id, or leave the field out of the update. See https://www.charitips.com/docs/api-reference/list-donations.md.

## Example

```bash
curl -X PATCH https://api.sandbox.charitips.com/v1/donations/<donationId> \
  -H "Authorization: Bearer $CHARITIPS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 2000,
    "externalId": "<externalId>"
  }'
```

```javascript
const response = await fetch('https://api.sandbox.charitips.com/v1/donations/<donationId>', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.CHARITIPS_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "amount": 2000,
    "externalId": "<externalId>"
  }),
});
if (!response.ok) throw new Error(`${response.status} ${await response.text()}`);
const data = await response.json();
```

```python
import os, requests

response = requests.patch(
    "https://api.sandbox.charitips.com/v1/donations/<donationId>",
    headers={"Authorization": f"Bearer {os.environ['CHARITIPS_TOKEN']}"},
    json={
      "amount": 2000,
      "externalId": "<externalId>"
    },
)
response.raise_for_status()
data = response.json()
```

## Response example (200, placeholder values)

```json
{
  "donationId": "<donationId>",
  "amount": 2000,
  "externalId": "<externalId>",
  "uniqueExternalId": "<uniqueExternalId>",
  "status": "PENDING",
  "secret": "<secret>",
  "withFiscalReceipt": false,
  "hasBeenCharged": false
}
```
