curl --request POST \
--url https://{organization}.rescueconsole.com/api/fundraising/donations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"donor_email": "priya.natarajan@contoso.com",
"donor_name": "Priya Natarajan",
"amount_cents": 5000,
"campaign_id": "7d1c2a0e-4b3f-4e8a-9c61-2f0d5e8b1a44",
"payment_gateway": "paypal",
"gateway_reference": {
"external_id": "PAYID-M5XK2QA"
},
"donated_at": "2026-09-12"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
donor_email: 'priya.natarajan@contoso.com',
donor_name: 'Priya Natarajan',
amount_cents: 5000,
campaign_id: '7d1c2a0e-4b3f-4e8a-9c61-2f0d5e8b1a44',
payment_gateway: 'paypal',
gateway_reference: {external_id: 'PAYID-M5XK2QA'},
donated_at: '2026-09-12'
})
};
fetch('https://{organization}.rescueconsole.com/api/fundraising/donations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/fundraising/donations"
payload = {
"donor_email": "priya.natarajan@contoso.com",
"donor_name": "Priya Natarajan",
"amount_cents": 5000,
"campaign_id": "7d1c2a0e-4b3f-4e8a-9c61-2f0d5e8b1a44",
"payment_gateway": "paypal",
"gateway_reference": { "external_id": "PAYID-M5XK2QA" },
"donated_at": "2026-09-12"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"amount_cents": 123,
"currency": "<string>",
"donation_type": "one_time",
"status": "pending",
"donated_at": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"tenant_id": "<string>",
"person_id": "<string>",
"campaign_id": "<string>",
"recurring_schedule": {},
"payment_gateway": "stripe",
"gateway_reference": {},
"custom_fields": {}
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}Record a donation
Records a gift. Only amount_cents is required. Name the donor with person_id, or with donor_email: an email that matches one of your people (capitals ignored) attributes the gift to them, and one that matches nobody CREATES a person with that email and donor_name. Either way the person is given the donor role if they did not have it, even when the key has no permission on People. Send neither for an anonymous gift. A gift recorded as completed with a donor starts any workflow your organization runs when a donor’s gift lands. Needs write on Fundraising.
curl --request POST \
--url https://{organization}.rescueconsole.com/api/fundraising/donations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"donor_email": "priya.natarajan@contoso.com",
"donor_name": "Priya Natarajan",
"amount_cents": 5000,
"campaign_id": "7d1c2a0e-4b3f-4e8a-9c61-2f0d5e8b1a44",
"payment_gateway": "paypal",
"gateway_reference": {
"external_id": "PAYID-M5XK2QA"
},
"donated_at": "2026-09-12"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
donor_email: 'priya.natarajan@contoso.com',
donor_name: 'Priya Natarajan',
amount_cents: 5000,
campaign_id: '7d1c2a0e-4b3f-4e8a-9c61-2f0d5e8b1a44',
payment_gateway: 'paypal',
gateway_reference: {external_id: 'PAYID-M5XK2QA'},
donated_at: '2026-09-12'
})
};
fetch('https://{organization}.rescueconsole.com/api/fundraising/donations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{organization}.rescueconsole.com/api/fundraising/donations"
payload = {
"donor_email": "priya.natarajan@contoso.com",
"donor_name": "Priya Natarajan",
"amount_cents": 5000,
"campaign_id": "7d1c2a0e-4b3f-4e8a-9c61-2f0d5e8b1a44",
"payment_gateway": "paypal",
"gateway_reference": { "external_id": "PAYID-M5XK2QA" },
"donated_at": "2026-09-12"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"amount_cents": 123,
"currency": "<string>",
"donation_type": "one_time",
"status": "pending",
"donated_at": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"tenant_id": "<string>",
"person_id": "<string>",
"campaign_id": "<string>",
"recurring_schedule": {},
"payment_gateway": "stripe",
"gateway_reference": {},
"custom_fields": {}
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}{
"error": "house_trained must be 1, 0 or null (not assessed)"
}Authorizations
An API key from Settings, API keys. It starts with rc_live_.
Body
The amount in whole cents: 5000 is $50.00. Not a decimal.
x >= 1A currency code. Stored as you send it.
The donor, one of your people. Wins over donor_email when both are sent.
The donor's email, when you do not have their person ID. See the operation's description for what happens when it matches nobody.
Used only when donor_email creates a new person: the first word becomes the first name and the rest the last name.
The campaign the gift was given to.
one_time, recurring, post_adoption_bump, upsell Details of a recurring gift's schedule, as keys and values of your choosing. Can only be set when the gift is recorded.
How the money came.
stripe, paypal, square, zelle, cashapp, venmo, other, null Your payment processor's references for the gift, such as a charge ID. Gifts imported with a reference carry it as external_id, and a later import skips a row whose external_id is already here.
Only completed gifts count towards a campaign, a donor's giving or the donors list.
pending, completed, failed, refunded The day of the gift. Today unless you say. A timestamp is cut to its date.
Values for your own donation fields, by field key. Every field marked required must be here, and a key that is not one of your fields is refused.
Response
The donation, as it was recorded.
The amount in whole cents: 5000 is $50.00.
one_time, recurring, post_adoption_bump, upsell Only completed gifts count towards a campaign, a donor's giving or the donors list.
pending, completed, failed, refunded The day of the gift, YYYY-MM-DD.
When it was recorded.
Your organization's ID.
The donor. Null for an anonymous gift.
How the money came.
stripe, paypal, square, zelle, cashapp, venmo, other, null