---
title: "Errors"
description: "What the API returns when a call fails: the status, the body and the message of each error, and how to fix it."
canonical: https://www.charitips.com/docs/api-reference/errors
---

# Errors

> What the API returns when a call fails: the status, the body and the message of each error, and how to fix it.

## The error format

Every error is a JSON body with a readable `message`. Most errors also repeat the HTTP status in `statusCode` and its name in `error`:

```json
{
  "statusCode": 403,
  "message": "Campaign has to be activated first.",
  "error": "Forbidden"
}
```

Some errors carry a `code` instead of `statusCode` and `error`, for example a closed account or a donation over the campaign's budget:

```json
{
  "message": "Insufficient campaign budget.",
  "code": "INSUFFICIENT_CAMPAIGN_BUDGET"
}
```

The 409 on `uniqueExternalId` and the 429 carry `statusCode` and `message` only. Read the HTTP status of the response, then `code` when there is one, then `message`. Never rely on `error`.

When the request does not match the schema, `message` is a list with one entry per problem. Fields that are not part of the schema are rejected, not ignored.

```json
{
  "statusCode": 400,
  "message": ["amount must not be less than 1", "property foo should not exist"],
  "error": "Bad Request"
}
```

## Status codes

- **400**: the request is invalid, through a field, a value or a combination of them. Fix the request, do not retry it.
- **401**: the access token is missing, expired or invalid. Retry once, with a new token. On `POST /v1/authentication` itself, a 401 `Unauthorized` means the Basic authentication header is missing, and `Invalid credentials` means the client id or secret is wrong, or belongs to the other environment.
- **402**: the account lacks something the call needs: a plan feature (`Plan upgrade required`), a payment method (`MISSING_PAYMENT_METHOD`) or an active subscription (`NO_ACTIVE_SUBSCRIPTION`). Fix the account, then retry.
- **403**: the call is understood but refused, because of the state of the resource (a donation on a campaign that is not active yet, an account that has not finished onboarding) or because of your role. Change the state first.
- **404**: no such resource on your account and environment. An id that belongs to another account is treated as unknown: 404 when it is in the path, 400 `Bad Request` when it is in the body or the query, never 403. Ids from the sandbox do not exist in production.
- **409**: the resource already exists, is already in that state, or conflicts with another one. On a create with `uniqueExternalId`, your previous call succeeded. On a claim, a cast or a validation, the donation or the vote is no longer pending: read it to see its status. Otherwise read the message: `Slug already used` means another campaign has that `slug`, and on an update, `Unique constraint failed on uniqueExternalId` means another record already uses that id.
- **429**: too many calls to an endpoint that has a limit, like the bulk download links. Wait the number of seconds given in the `Retry-After` header, then retry. Never retry in a loop. The endpoints concerned are listed below.
- **500**: something failed on our side. Retry once with the same `uniqueExternalId`: a duplicate then returns 409, not a second donation.

A token lasts one hour: create one, reuse it for every call, and create the next one when a call returns 401. Asking for a new token before each call makes your integration slower.

## Retrying safely

Send your own id in `uniqueExternalId` when you create a donation, a vote, a donor or a recurring donation. If the network fails and you send the call again, the second one returns `409 Unique constraint failed on uniqueExternalId` instead of creating a duplicate. Fetch the first one with the list endpoint filtered on that id (donations, votes and donors); for recurring donations, keep the id you received at creation, as their list has no such filter.

## Every error, by endpoint

Read from the API code. Each entry says what triggers it and how to fix it.

### 400

- `A field is missing, has the wrong type, or is not part of the request schema.`: returned by `create-admin-widget-token`, `create-donor-widget-token`, `create-donor-platform-widget-token`, `list-accounts`, `get-account`, `update-account` and 66 more. Fix: `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.
- `Invalid customDomain`: returned by `update-account`, `create-child-account`, `create-site`, `update-site`. Fix: A custom domain cannot contain a Charitips domain (charitips.com, charitips.net, charitips.org, charitips.tech, chari.tips). Use a domain you own, or `subdomain` for an address under Charitips. See https://www.charitips.com/docs/api-reference/create-site.md.
- `Invalid campaignIds`: returned by `create-invitation`, `update-user-invitation`, `update-user`. Fix: At least one id of `campaignIds` is not a campaign of this account, or an id is repeated. List the account's campaigns and send each id once. See https://www.charitips.com/docs/api-reference/list-campaigns.md.
- `A selection must have at least one charity when linked to a campaign`: returned by `update-charities-selection`, `remove-charity`. Fix: Add at least one charity to the selection before linking it to a campaign. See https://www.charitips.com/docs/api-reference/add-charity.md.
- `Bad Request`: returned by `create-recurring-donation`, `create-vote`. Fix: The `campaignId` does not exist on your account and environment. Ids from the sandbox do not exist in production. See https://www.charitips.com/docs/api-reference/errors.md.
- `Both donor.email and donor.firstName are required for email campaigns`: returned by `create-donation`, `create-vote`. Fix: Pass both `donor.email` and `donor.firstName`. See https://www.charitips.com/docs/api-reference/create-donation.md.
- `Both donor.slackId and donor.firstName are required for slack campaigns`: returned by `create-donation`, `create-vote`. Fix: Pass both `donor.slackId` and `donor.firstName`. See https://www.charitips.com/docs/api-reference/create-donation.md.
- `Budget is required for FIXED_AMOUNT campaigns`: returned by `enable-donor-platform`, `create-campaign`. Fix: Set `budget`, in cents, when amountType is FIXED_AMOUNT. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `DISTRIBUTION campaigns must also be FIXED_AMOUNT campaigns`: returned by `enable-donor-platform`, `create-campaign`. Fix: A DISTRIBUTION campaign shares a fixed budget: set amountType to FIXED_AMOUNT and a budget. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `donor is required for EMAIL campaigns.`: returned by `create-donation`, `create-vote`. Fix: EMAIL campaigns send the donation to someone: pass `donor` with at least `email` and `firstName`. See https://www.charitips.com/docs/api-reference/create-donation.md.
- `donor is required for SLACK campaigns.`: returned by `create-donation`, `create-vote`. Fix: SLACK campaigns send the donation in Slack: pass `donor` with `slackId` and `firstName`. See https://www.charitips.com/docs/api-reference/create-donation.md.
- `Featured charities must be part of the selected charities: <join(', ')>`: returned by `create-charities-selection`, `update-charities-selection`. Fix: `featuredCharitiesIds` names charities that are not in the selection: the message lists them. Add them to `charityIds`, or leave them out of `featuredCharitiesIds`. See https://www.charitips.com/docs/concepts/charities.md#your-own-selections.
- `givingTarget is only supported for fundraising campaigns`: returned by `enable-donor-platform`, `create-campaign`.
  - Fix for `enable-donor-platform`: Enabling the donor platform creates a spontaneous donations campaign from a Charitips template, and that campaign was refused. Nothing in your request causes it: contact us. See https://www.charitips.com/docs/api-reference/enable-donor-platform.md.
  - Fix for `create-campaign`: `givingTarget` only applies when the donor pays: send `defaultHasBeenCharged: true`, or remove `givingTarget`. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `INCLUDED fee type not supported`: returned by `enable-donor-platform`, `create-campaign`.
  - Fix for `enable-donor-platform`: Enabling the donor platform creates a spontaneous donations campaign from a Charitips template, and that campaign was refused. Nothing in your request causes it: contact us. See https://www.charitips.com/docs/api-reference/enable-donor-platform.md.
  - Fix for `create-campaign`: `defaultFeeType` INCLUDED only works with `defaultHasBeenCharged: true`. Leave `defaultFeeType` out or set it to EXCLUDED. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Insufficient campaign budget.`: returned by `create-donation`, `claim-recurring-donation`. Fix: This donation would take the campaign over its budget. Create a smaller donation, or use another campaign: the API does not change the budget of an existing campaign. See https://www.charitips.com/docs/api-reference/errors.md.
- `Invalid charitiesSelectionId`: returned by `create-campaign`, `update-campaign`. Fix: The selection does not exist on your account. List your selections, or create one. See https://www.charitips.com/docs/api-reference/list-charities-selections.md.
- `Invalid parameter includeDonor`: returned by `list-donations`, `list-votes`. Fix: `includeDonor` is not available with API credentials. Remove it, and read the donor with its own endpoint. See https://www.charitips.com/docs/api-reference/get-donor.md.
- `Nested subdomains are not allowed`: returned by `update-account`, `create-child-account`. Fix: The part before your own subdomain must be a single label: 1 to 63 lowercase letters, digits or hyphens, no dot, not starting or ending with a hyphen. See https://www.charitips.com/docs/use-cases/account-hierarchy.md.
- `Only members can be assigned campaigns`: returned by `update-user-invitation`, `update-user`. Fix: `campaignIds` only apply to the MEMBER role, and the check reads the role saved before this call. Set `role` to MEMBER in a first update, then send `campaignIds`, or leave `campaignIds` out. See https://www.charitips.com/docs/concepts/account-hierarchy.md#dashboards-and-users.
- `Only one of <givingType> campaigns is supported`: returned by `enable-donor-platform`, `create-campaign`.
  - Fix for `enable-donor-platform`: Enabling the donor platform creates a spontaneous donations campaign from a Charitips template, and that campaign was refused. Nothing in your request causes it: contact us. See https://www.charitips.com/docs/api-reference/enable-donor-platform.md.
  - Fix for `create-campaign`: The campaign template sets a giving type (PAYROLL or PAID_TIME_OFF), and your account already has a campaign of that type. Use the existing campaign instead of creating a second one. See https://www.charitips.com/docs/api-reference/list-campaigns.md.
- `Public campaigns must be both FIXED_AMOUNT and DISTRIBUTION campaigns`: returned by `enable-donor-platform`, `create-campaign`. Fix: A PUBLIC campaign is a vote on a fixed budget: set amountType FIXED_AMOUNT and donationType DISTRIBUTION, or keep it PRIVATE. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Subdomain must ends with .<subdomain>`: returned by `update-account`, `create-child-account`. Fix: A child account's subdomain sits under yours: send `<child>.<your subdomain>`, for example `shop.acme` when your subdomain is `acme`. The message gives your subdomain. See https://www.charitips.com/docs/use-cases/account-hierarchy.md.
- `A selection must have at least one charity to be linked to a campaign`: returned by `create-charities-selection`. Fix: You sent `campaignId`: pass at least one id in `charityIds` as well, or create the selection without `campaignId`. See https://www.charitips.com/docs/api-reference/create-charities-selection.md.
- `accessToken is required for Bearer authentication`: returned by `create-webhook`. Fix: With authenticationStrategy BEARER, pass the accessToken Charitips will send to your endpoint. See https://www.charitips.com/docs/webhooks/configuration.md.
- `accountId is required when includeCampaigns is true`: returned by `list-campaign-templates`.
- `At least one campaign is required for members`: returned by `create-invitation`. Fix: A MEMBER only sees the campaigns they are given. Send `campaignIds` with at least one campaign of the account, or invite the user as ADMIN or PAYROLL_MANAGER. See https://www.charitips.com/docs/api-reference/create-invitation.md.
- `At least one of subdomain and customDomain is required.`: returned by `create-site`. Fix: Send `subdomain`, `customDomain`, or both. See https://www.charitips.com/docs/api-reference/create-site.md.
- `Bad Request`: returned by `create-donation`. Fix: The `campaignId` does not exist on your account and environment. Ids from the sandbox do not exist in production. See https://www.charitips.com/docs/api-reference/errors.md.
- `Both username and password are required for Basic authentication`: returned by `create-webhook`. Fix: With authenticationStrategy BASIC, pass the username and password Charitips will send to your endpoint. See https://www.charitips.com/docs/webhooks/configuration.md.
- `Campaign budget exceeds payment card amount limit`: returned by `activate-campaign`. Fix: The amount to charge (the budget, the usage not billed yet and the fees) is above what the account's payment card can be charged at once. Create the campaign with a lower budget, or switch to another payment method, such as a bank transfer, in the dashboard, under Settings > Billing. The sandbox never returns this error. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Campaign budget exceeds SEPA Direct Debit amount limit`: returned by `activate-campaign`. Fix: The amount to charge (the budget, the usage not billed yet and the fees) is above what a SEPA direct debit can take at once. Create the campaign with a lower budget, or switch to another payment method, such as a bank transfer, in the dashboard, under Settings > Billing. The sandbox never returns this error. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Campaign is a DISTRIBUTION one. Only votes can be created`: returned by `create-donation`. Fix: On a DISTRIBUTION campaign, people vote on a budget: create a vote, not a donation. See https://www.charitips.com/docs/api-reference/create-vote.md.
- `Campaign is a FACE_VALUE one. Only donations can be created`: returned by `create-vote`. Fix: On a FACE_VALUE campaign, each person gives an amount: create a donation, not a vote. See https://www.charitips.com/docs/api-reference/create-donation.md.
- `Cannot delete a charities selection with active campaigns`: returned by `delete-charities-selection`. Fix: A campaign that is ACTIVE, PENDING or DRAFT still uses this selection. Give those campaigns another selection, or delete it once they are complete or canceled. See https://www.charitips.com/docs/api-reference/list-campaigns.md.
- `charityId cannot be set for POSTAL campaigns: the recipient chooses the charity with the card.`: returned by `create-donation`.
- `Donation not claimed yet`: returned by `validate-donation`. Fix: Claim the donation for a charity first. See https://www.charitips.com/docs/api-reference/claim-donation.md.
- `Donations of an order campaign cannot be created through the API.`: returned by `create-donation`.
- `Exactly 3 START and 3 END reminders are required`: returned by `update-campaign-reminders`.
- `Invalid authenticationStrategy`: returned by `create-webhook`. Fix: Set `authenticationStrategy` to `BASIC` (with `username` and `password`) or `BEARER` (with `accessToken`). See https://www.charitips.com/docs/webhooks/configuration.md.
- `Invalid campaignReminderId`: returned by `update-campaign-reminders`.
- `Invalid fields: <join(', ')>`: returned by `update-donor`. Fix: A donor platform token can only change the donor's own profile: firstName, lastName, phone, pictureUrl, birthdate, personalEmail, title, persona, hasAcceptedTerms, street, zip, city and country. Remove the fields listed in the message. See https://www.charitips.com/docs/api-reference/update-donor.md.
- `Invalid lead information`: returned by `claim-donation`. Fix: A field enabled in the campaign's `leadCollectionOptions` (fullname, companyName, email, phone or custom) is missing from `lead`. See https://www.charitips.com/docs/api-reference/claim-donation.md.
- `Invalid parentDonationId`: returned by `create-donation`.
- `Invoice amount <amount_due> is over the payment card limit <PAYMENT_CARD_AMOUNT_LIMIT>`: returned by `activate-campaign`. Fix: The budget of the campaign is invoiced at activation, and the invoice is above what the payment card can be charged at once. Create the campaign with a lower budget, or switch to another payment method, such as a bank transfer, in the dashboard, under Settings > Billing. The sandbox never returns this error. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Invoice amount <amount_due> is over the SDD limit <SDD_AMOUNT_LIMIT>`: returned by `activate-campaign`. Fix: The budget of the campaign is invoiced at activation, and the invoice is above what a SEPA direct debit can take at once. Create the campaign with a lower budget, or switch to another payment method, such as a bank transfer, in the dashboard, under Settings > Billing. The sandbox never returns this error. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Language is already the default language`: returned by `add-campaign-translation`. Fix: This is the campaign's own language: its texts are the campaign fields. Update the campaign to change them, or send another `language`. See https://www.charitips.com/docs/api-reference/update-campaign.md.
- `Lead collection is not enabled for this campaign`: returned by `claim-donation`. Fix: The campaign does not collect leads: remove `lead` from the claim, or create the campaign with `withLeadCollection` and `leadCollectionOptions`. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Lead has to accept terms and conditions`: returned by `claim-donation`. Fix: Set `lead.hasAcceptedTerms` to true once the person has accepted the terms. See https://www.charitips.com/docs/api-reference/claim-donation.md.
- `Lead is required`: returned by `claim-donation`. Fix: The campaign collects the donor's details at the claim: pass `lead` with the fields enabled in the campaign's `leadCollectionOptions` and `hasAcceptedTerms` set to true. See https://www.charitips.com/docs/api-reference/claim-donation.md.
- `Missing params in createFileGenerationRequest`: returned by `create-file-generation-request`. Fix: `params` must carry `campaignId` (required for PRINT_PHYSICAL_CARDS_PDF) or `fileRefs`. Send one of them. See https://www.charitips.com/docs/api-reference/create-file-generation-request.md.
- `No budget set for this campaign`: returned by `activate-campaign`. Fix: A campaign with `amountType: FIXED_AMOUNT` needs a `budget` in cents, and the API cannot add one after creation. Create the campaign again with its `budget`, then activate it. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `No charity selection linked to this campaign`: returned by `activate-campaign`. Fix: Create a charities selection with at least one charity, set it on the campaign with `charitiesSelectionId`, then activate. See https://www.charitips.com/docs/api-reference/create-charities-selection.md.
- `No domain found for your account`: returned by `create-shareable-billing-link`. Fix: The billing link is built on your own account's site. Every account gets its site when its onboarding is completed, so your account should have one: contact us. See https://www.charitips.com/docs/api-reference/create-shareable-billing-link.md.
- `Only one of accountId or includeChildAccountsCampaigns can be used`: returned by `get-all-campaigns-metrics`. Fix: Send `accountId` for the metrics of one account, or `includeChildAccountsCampaigns=true` to add your child accounts' campaigns to yours, not both. See https://www.charitips.com/docs/api-reference/get-all-campaigns-metrics.md.
- `Recurring donations can only be created for FREE_AMOUNT campaigns`: returned by `create-recurring-donation`. Fix: Use a campaign with amountType FREE_AMOUNT for recurring donations. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `Reminder type is required for each reminder`: returned by `update-campaign-reminders`.
- `Vote not casted yet`: returned by `validate-vote`. Fix: Cast the vote for a charity first. See https://www.charitips.com/docs/api-reference/cast-vote.md.
- `Votes cannot be posted.`: returned by `create-vote`.

### 401

- `Unauthorized`: returned by `create-token`, `create-user-magic-link`, `create-donor-magic-link`, `create-admin-widget-token`, `create-donor-widget-token`, `create-donor-platform-widget-token` and 107 more.
  - Fix for the other 112 operations: 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.
  - Fix for `create-token`: The request has no Basic authentication header. Send the client id and secret as Basic authentication, with `-u id:secret` in cURL, not a Bearer token. See https://www.charitips.com/docs/get-started/authentication.md.
- `Invalid credentials`: returned by `create-token`. Fix: The client id or secret is wrong, or the pair belongs to the other environment: sandbox credentials start with `test_` and only work on api.sandbox.charitips.com. Send them as Basic authentication (`-u id:secret`). See https://www.charitips.com/docs/get-started/sandbox.md.

### 402

- `Plan upgrade required`: returned by `create-donor-widget-token`, `create-donor-platform-widget-token`, `update-account`, `create-invitation`, `create-child-account`, `create-shareable-billing-link` and 11 more. Fix: Your plan does not include this feature. Upgrade the plan from the dashboard, then retry. See https://www.charitips.com/docs/overview/plans.md.
- `Missing payment method`: returned by `activate-campaign`, `create-donation`, `create-recurring-donation`. Fix: The account that pays for the donations (your (parent) account or a child account if they are billed directly) has no payment method. Add one in the dashboard, under Settings > Billing, then retry. On the sandbox, creating a single donation skips this check, but other calls can still return it, like activating a FIXED_AMOUNT campaign that is billed on order. See https://www.charitips.com/docs/concepts/billing-and-receipts.md#payment-methods.
- `No active subscription found`: returned by `activate-campaign`. Fix: The account has no active monthly subscription, so the campaign cannot be activated. Contact us if you sandbox account has no subscription. See https://www.charitips.com/docs/overview/plans.md.

### 403

- `Account closed`: returned by `create-token`, `create-user-magic-link`, `create-donor-magic-link`, `create-admin-widget-token`, `create-donor-widget-token`, `create-donor-platform-widget-token` and 106 more. Fix: 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.
- `Forbidden`: returned by `create-user-magic-link`, `create-donor-magic-link`, `create-donor-platform-widget-token`, `logout-user`, `logout-donor`, `get-account` and 53 more. Fix: 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.
- `Account not validated`: returned by `create-campaign`, `activate-campaign`, `create-donation`, `claim-donation`, `create-recurring-donation`, `claim-recurring-donation` and 3 more. Fix: The account behind your credentials has not finished onboarding. Complete it in the dashboard, or contact us. See https://www.charitips.com/docs/api-reference/troubleshooting.md#calls-answer-403-account-not-active-account-not-validated-or-account-closed.
- `Campaign has ended.`: returned by `activate-campaign`, `create-donation`, `claim-donation`, `create-recurring-donation`, `claim-recurring-donation`, `create-vote` and 1 more. Fix: The campaign is COMPLETE or CANCELED: nothing can be created, claimed or cast on it any more. Use an active campaign. See https://www.charitips.com/docs/api-reference/list-campaigns.md.
- `Campaign has to be activated first.`: returned by `create-donation`, `create-recurring-donation`, `create-vote`. Fix: Activate the campaign once it has its charities selection, then retry. See https://www.charitips.com/docs/api-reference/activate-campaign.md.
- `This selection can't be customized`: returned by `update-charities-selection`, `add-charity`, `remove-charity`. Fix: The selection belongs to a campaign whose charities cannot be changed. Create a new selection for your campaign. See https://www.charitips.com/docs/api-reference/create-charities-selection.md.
- `Donation has not been processed yet.`: returned by `create-donation-fiscal-receipt`, `get-donation-fiscal-receipt`. Fix: The donation is still being processed. Wait for the donation_update webhook, then retry. See https://www.charitips.com/docs/webhooks/configuration.md.
- `Only recurring donations can be created for recurring campaigns.`: returned by `create-donation`, `create-vote`. Fix: This campaign has a recurring frequency: create a recurring donation. See https://www.charitips.com/docs/api-reference/create-recurring-donation.md.
- `Parent account is missing a domain`: returned by `update-account`, `create-child-account`. Fix: A child's subdomain is built under your own subdomain, and your account has none. Contact us to set it up, or give the child account a `customDomain` instead. See https://www.charitips.com/docs/use-cases/account-hierarchy.md.
- `A FIXED_AMOUNT campaign cannot be closed before its first donation or vote.`: returned by `close-campaign`.
- `Account not active`: returned by `create-token`. Fix: The account behind these credentials has not finished onboarding, so no token is issued. Complete the onboarding in the dashboard, or contact us. See https://www.charitips.com/docs/api-reference/troubleshooting.md#calls-answer-403-account-not-active-account-not-validated-or-account-closed.
- `API authentication is not allowed for this account`: returned by `create-user-magic-link`. Fix: The user's account does not list API in its `authSchemes`, so no magic link can be made for its users. `authSchemes` is set when the child account is created; contact us to change it. See https://www.charitips.com/docs/api-reference/create-child-account.md.
- `API authentication is not allowed for this donor platform`: returned by `create-donor-magic-link`. Fix: The donor platform does not list API in its `authSchemes`. Disable the donor platform, then enable it again with API in `authSchemes`. See https://www.charitips.com/docs/api-reference/enable-donor-platform.md.
- `Billing delegation is not enabled for this account`: returned by `create-shareable-billing-link`. Fix: With an API token, the billing link needs billing delegation: the account must be billed to itself (`billedTo` ACCOUNT) and your plan must include delegated billing. Contact us to enable it. See https://www.charitips.com/docs/guides/account-hierarchy-billing.md.
- `Campaign is waiting for payment`: returned by `activate-campaign`. Fix: The fixed budget of the campaign has been invoiced and is not paid yet. Pay the invoice, then activate. See https://www.charitips.com/docs/api-reference/list-invoices.md.
- `Can't delete yourself`: returned by `delete-user`. Fix: A user session cannot delete its own user: another admin has to do it. An API token is not a user, so it never gets this error. See https://www.charitips.com/docs/api-reference/delete-user.md.
- `Cannot delete a featured charities selection`: returned by `delete-charities-selection`. Fix: This is the selection created with your account, and it cannot be deleted. Change its charities instead. See https://www.charitips.com/docs/api-reference/update-charities-selection.md.
- `Custom domain can't be updated for parent accounts`: returned by `update-account`. Fix: Accounts with account hierarchy can set a custom domain only on their child accounts: the `accountId` in the path is your own account. Use the site endpoints for your own domains. See https://www.charitips.com/docs/api-reference/update-site.md.
- `Donation already invoiced`: returned by `delete-donation`. Fix: The donation is on an invoice and cannot be deleted. Refund it in your own books; delete a donation before it is billed. See https://www.charitips.com/docs/api-reference/delete-donation.md.
- `Donation already paid`: returned by `delete-donation`. Fix: The invoice carrying this donation has been paid, so it cannot be deleted. Refund it in your own books. See https://www.charitips.com/docs/api-reference/delete-donation.md.
- `Donation already processed`: returned by `delete-donation`. Fix: The donation has reached the PROCESSED status and cannot be deleted. Refund it in your own books. See https://www.charitips.com/docs/api-reference/delete-donation.md.
- `Donation amount can't be updated as it has already been billed.`: returned by `update-donation`. Fix: 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.
- `Donation amount can't be updated as it has already been claimed.`: returned by `update-donation`. Fix: 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.
- `Donation amount can't be updated as it has been claimed, billed or its card posted.`: returned by `update-donation`.
- `Donation amount can't be updated as its card has already been posted.`: returned by `update-donation`.
- `Donation card already posted`: returned by `delete-donation`.
- `Donor is missing required fiscal information.`: returned by `create-donation-fiscal-receipt`. Fix: A fiscal receipt needs the donor's first name, last name, street, zip, city and country. Complete the donor, or set withFiscalReceipt to false. See https://www.charitips.com/docs/use-cases/b2c.md.
- `Donor platform is not enabled`: returned by `create-donor-magic-link`. Fix: The donor's account has no enabled donor platform. Enable it first, then retry. See https://www.charitips.com/docs/api-reference/enable-donor-platform.md.
- `New subdomain site can't be created`: returned by `create-site`. Fix: Accounts with account hierarchy cannot create a subdomain site. Create the site with `customDomain`; for a child account, the parent sets its subdomain with update-account. See https://www.charitips.com/docs/api-reference/update-account.md.
- `Only avaible for donation created with hasBeenCharged set to true.`: returned by `create-donation-fiscal-receipt`. Fix: A donor's fiscal receipt exists only for a donation the donor paid for. Create the donation with `hasBeenCharged` set to true, which needs the B2C use case on your account. See https://www.charitips.com/docs/use-cases/b2c.md.
- `Only avaible for donation created with withFiscalReceipt set to true.`: returned by `create-donation-fiscal-receipt`. Fix: The donation was created without a fiscal receipt. Create it with `withFiscalReceipt` set to true, or leave the field out on a campaign that issues receipts. See https://www.charitips.com/docs/use-cases/b2c.md.
- `Only CUSTOM charities selections can be deleted`: returned by `delete-charities-selection`. Fix: Only your CUSTOM selections can be deleted. GENERIC selections are shared by Charitips with every account and cannot be deleted. See https://www.charitips.com/docs/concepts/charities.md.
- `Only draft or not billed pending campaigns can be deleted`: returned by `delete-campaign`.
- `Only pending invites can be deleted`: returned by `delete-user-invitation`. Fix: The invitation was already accepted or canceled. If it was accepted, delete the user instead. See https://www.charitips.com/docs/api-reference/delete-user.md.
- `Recurring donations can only be created for recurring frequency campaigns.`: returned by `create-recurring-donation`. Fix: Recurring donations need a campaign whose `recurringType` is `FREQUENCY`. Read the campaign to check it. `recurringType` cannot be set when you create a campaign: it comes from the campaign template. See https://www.charitips.com/docs/use-cases/recurring-donations.md.
- `Subdomain can't be updated`: returned by `update-site`. Fix: Accounts with account hierarchycannot change a site's subdomain here; `customDomain` can still be changed. For a child account, the parent sets the subdomain with update-account. See https://www.charitips.com/docs/api-reference/update-account.md.
- `Subdomain can't be updated for parent accounts`: returned by `update-account`. Fix: Accounts with account hierarchy can set a subdomain only on their child accounts: the `accountId` in the path is your own account. See https://www.charitips.com/docs/api-reference/list-child-accounts.md.
- `The charities of this campaign cannot be customized`: returned by `update-campaign`. Fix: This campaign keeps the charities it was created with: its `charitiesSelectionId` cannot change. Leave the field out, or create a new campaign with your selection. See https://www.charitips.com/docs/api-reference/create-campaign.md.
- `This charity does not support fiscal receipts.`: returned by `create-donation-fiscal-receipt`. Fix: Not every charity can issue a receipt. Read `fiscalReceiptsSupport` on the charity before promising one: only `ENABLED` charities issue receipts. See https://www.charitips.com/docs/api-reference/get-charity.md.
- `Vote already billed`: returned by `delete-vote`. Fix: The vote is on an invoice and cannot be deleted. See https://www.charitips.com/docs/api-reference/delete-vote.md.
- `Vote already sent`: returned by `delete-vote`. Fix: The vote has been sent to the person and cannot be deleted. See https://www.charitips.com/docs/api-reference/delete-vote.md.
- `Vote already used`: returned by `delete-vote`. Fix: The vote has been cast and cannot be deleted. See https://www.charitips.com/docs/api-reference/delete-vote.md.

### 404

- `Not Found`: returned by `create-user-magic-link`, `create-donor-magic-link`, `create-donor-platform-widget-token`, `logout-user`, `logout-donor`, `get-account` and 65 more. Fix: 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.
- `Donor not found`: returned by `create-donor-magic-link`. Fix: No donor with this id belongs to the account as a whole: the id is wrong, or the donor was created with a donation, for one campaign only, and cannot sign in to the donor platform. Create the donor with create-donor. See https://www.charitips.com/docs/api-reference/create-donor.md.
- `Donor platform not found`: returned by `disable-donor-platform`. Fix: The donor platform is not enabled on this account, so there is nothing to disable. See https://www.charitips.com/docs/api-reference/enable-donor-platform.md.
- `Fiscal receipt not found.`: returned by `get-donation-fiscal-receipt`. Fix: The donation has been processed but has no fiscal receipt yet. Create it with Create a donation fiscal receipt, or wait for the `fiscalreceipt_generated` webhook. See https://www.charitips.com/docs/api-reference/create-donation-fiscal-receipt.md.

### 409

- `Unique constraint failed on uniqueExternalId`: returned by `create-donation`, `update-donation`, `create-donor`, `update-donor`, `create-recurring-donation`, `update-recurring-donation` and 2 more.
  - Fix for `create-donation`, `create-donor`, `create-recurring-donation`, `create-vote`: A resource with this uniqueExternalId already exists: your previous call succeeded. Fetch it with the list endpoint filtered by uniqueExternalId (donations, votes, donors) instead of creating it again; for recurring donations, keep the id you received at creation. See https://www.charitips.com/docs/api-reference/list-donations.md.
  - Fix for `update-donation`: 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.
  - Fix for `update-donor`: Another donor 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-donors.md.
  - Fix for `update-recurring-donation`: Another recurring 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-recurring-donations.md.
  - Fix for `update-vote`: Another vote 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-votes.md.
- `Slug already used`: returned by `enable-donor-platform`, `create-campaign`, `update-campaign`. Fix: Another campaign of your account already uses this `slug`. Pick another one. See https://www.charitips.com/docs/api-reference/errors.md.
- `Domain already exists`: returned by `create-child-account`. Fix: This subdomain or custom domain is already used by a Charitips site, possibly one of your own accounts. Pick another one, or detach it from the other site first. See https://www.charitips.com/docs/api-reference/create-child-account.md.
- `Donation already claimed`: returned by `claim-donation`. Fix: The donation is no longer waiting for a claim: it is already linked to a charity, by your previous claim or automatically, or it was canceled. Read the donation: `status` and `charityId` tell which. See https://www.charitips.com/docs/api-reference/get-donation.md.
- `Donation already validated`: returned by `validate-donation`. Fix: The donation is no longer pending: it was validated already, it was done without validation because this campaign does not ask for it, or it was canceled. Read the donation to see its status. See https://www.charitips.com/docs/api-reference/get-donation.md.
- `Invitation already exist`: returned by `create-invitation`. Fix: A pending invitation already exists for this email on this account. Update it or delete it instead of inviting again. See https://www.charitips.com/docs/api-reference/list-user-invitations.md.
- `Recurring donation has been canceled`: returned by `claim-recurring-donation`. Fix: A canceled recurring donation cannot be claimed. Create a new one. See https://www.charitips.com/docs/api-reference/create-recurring-donation.md.
- `User already exist`: returned by `create-invitation`. Fix: A user with this email already belongs to this account. Update the user instead of inviting them. See https://www.charitips.com/docs/api-reference/update-user.md.
- `Vote already casted`: returned by `cast-vote`. Fix: The vote has already been cast: your previous call succeeded. See https://www.charitips.com/docs/api-reference/get-vote.md.
- `Vote already validated`: returned by `validate-vote`. Fix: The vote is no longer pending: it was validated already, or it was done when cast because this campaign does not ask for validation. Read the vote to see its status. See https://www.charitips.com/docs/api-reference/get-vote.md.

### 429

- `Rate limit exceeded`: returned by `generate-invoices-bulk-download-url`, `create-file-generation-request`, `generate-fiscal-receipts-bulk-download-url`. Fix: Wait the number of seconds given in the `Retry-After` header, then send the call once more. Do not retry in a loop. See https://www.charitips.com/docs/api-reference/errors.md.
