---
title: "Create a donor"
description: "Create an account level donor."
canonical: https://www.charitips.com/docs/api-reference/create-donor
---

# Create a donor

`POST /v1/donors`

Create an account level donor.

**Authentication**: Bearer access token.

## Body

- `street` (string): Address line 1
- `streetAddition` (string): Address line 2
- `city` (string): City
- `country` (string): Country alpha 2 ISO code
- `zip` (string): Zip code
- `firstName` (string, required): Donor's first name
- `lastName` (string, required): Donor's last name
- `email` (string, required, email address): Donor's email.
- `companyName` (string): Donor's company name.
- `phone` (string): Donor's phone number.
- `birthdate` (string (date))
- `pictureUrl` (string, URL): Donor's phone number.
- `title` (string): Donor's job title.
- `personalEmail` (string, email address): Donor's personal email.
- `persona` (string): Persona of the donor. One of `CSR`, `MARKETING`, `HR`, `SALES`, `COMMUNICATION`, `PRODUCT`, `SMB`, `OTHER`.
- `extraInfo` (string): Additional information about the donor.
- `externalId` (string): Optional id to link this donor to an entity on your side.
- `uniqueExternalId` (string): Similar to externalId but should be unique across all donors. Can be used to prevent duplicate donors
- `slackId` (string): Donor's slack id. Required for SLACK campaigns.
- `accountId` (string, UUID): Only required to link the created entity to a child account instead of the current one.
- `hasAcceptedTerms` (boolean): Whether the donor has accepted the terms and conditions

## Response 201

- `donorId` (string, required)
- `scopeType` (DonorScopeType, required) One of `CAMPAIGN`, `ACCOUNT`.
- `platformAccessStatus` (DonorPlatformAccessStatus, required) One of `ENABLED`, `DISABLED`, `RESTRICTED`.
- `firstName` (string, required)
- `lastName` (string, required)
- `email` (string)
- `companyName` (string)
- `phone` (string)
- `extraInfo` (string)
- `birthdate` (string (date-time))
- `street` (string)
- `streetAddition` (string)
- `city` (string)
- `country` (string)
- `zip` (string)
- `externalId` (string)
- `uniqueExternalId` (string)
- `slackId` (string)
- `pictureUrl` (string)
- `title` (string)
- `personalEmail` (string)
- `persona` (Persona) One of `CSR`, `MARKETING`, `HR`, `SALES`, `COMMUNICATION`, `PRODUCT`, `SMB`, `OTHER`.
- `language` (Language) One of `fr`, `en`.
- `hasAcceptedTerms` (boolean, required)
- `accountId` (string, required)
- `campaignId` (string)
- `individualAccountId` (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 `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.
- 409 `Unique constraint failed on uniqueExternalId`: 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.

## Example

```bash
curl -X POST https://api.sandbox.charitips.com/v1/donors \
  -H "Authorization: Bearer $CHARITIPS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "<firstName>",
    "lastName": "<lastName>",
    "email": "donor@example.com"
  }'
```

```javascript
const response = await fetch('https://api.sandbox.charitips.com/v1/donors', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CHARITIPS_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "firstName": "<firstName>",
    "lastName": "<lastName>",
    "email": "donor@example.com"
  }),
});
if (!response.ok) throw new Error(`${response.status} ${await response.text()}`);
const data = await response.json();
```

```python
import os, requests

response = requests.post(
    "https://api.sandbox.charitips.com/v1/donors",
    headers={"Authorization": f"Bearer {os.environ['CHARITIPS_TOKEN']}"},
    json={
      "firstName": "<firstName>",
      "lastName": "<lastName>",
      "email": "donor@example.com"
    },
)
response.raise_for_status()
data = response.json()
```

## Response example (201, placeholder values)

```json
{
  "donorId": "<donorId>",
  "scopeType": "CAMPAIGN",
  "platformAccessStatus": "ENABLED",
  "firstName": "<firstName>",
  "lastName": "<lastName>",
  "email": "<email>",
  "companyName": "<companyName>",
  "phone": "<phone>"
}
```
