POST /api/Raise/give. It’s the only endpoint that creates Gifts. There is no POST /api/Gift — donations enter Raise exclusively through this path.
This page walks through the full flow: building the request, what happens server-side, handling the response, and what events fire downstream. For the resource-level reference, see Gifts and Donors.
When to use this workflow
UsePOST /api/Raise/give when:
- A donor completes a donation form on a Raise-hosted or partner-hosted page.
- A partner integration captures a donation through its own UI and submits to Raise for payment processing.
- An integration replays a stored donation (e.g., re-attempting a previously-failed submission) — though the response will produce a new Gift, not modify an existing one.
- Importing historical gifts that have already been processed elsewhere. There’s no API for that — coordinate with the customer’s admin team for bulk imports.
- Recording a manual gift entered by staff. That happens through the Raise admin UI.
- Updating an existing Gift. There is no Gift PUT — see Gifts.
What POST /api/Raise/give actually does
The endpoint runs five operations as a single transaction:
The five operations:
- Charge the payment method through the configured gateway using the tokenized
paymentMethodId. - Match or create the Donor from the embedded donor block (typically by email).
- Create the Gift record with the gateway response.
- Fire the
giftCreatewebhook to subscribers. - Queue for sync to downstream products like CRM+.
Building the request
Required fields
Only three fields are required:| Field | Type | Description |
|---|---|---|
amount | number | The donation amount. |
paymentMethodId | string | The tokenized payment method. |
paymentMethodType | enum | The payment method type. |
A minimal request
cURL
A realistic request
cURL
The full request body
TheDonatePaymentRequest body has many optional fields beyond the basics. Group them by purpose:
| Group | Fields |
|---|---|
| Required | amount, paymentMethodId, paymentMethodType |
| Currency | currency, exchangeRate |
| Donor | donor (embedded DonorRequest block) |
| Designation | projects[], projectOverrideCode, premiumId |
| Recurring setup | isRecurring, frequency, startDate, startDateTimeUtc |
| Attribution | segment, segmentOverrideCode, motivationCodeId, motivationCodeGroupId, googleGclid, UTM fields |
| Fee handling | donorPaidCosts, coverAdminFee, adminFee, adminFeeProjectId |
| Tribute | tribute |
| Gateway | gatewayId, creditCardType, paypalPaymentSource, nonce |
| Anonymous / test mode | isAnonymous, isTestMode |
| External linkage | crmKey (seed the CRM+ Contact ID on creation) |
| Form-flow tracking | publicId, pageRequestId, paymentId |
| Browser context | visitorId, sessionId, clientId, timeZone |
| Employer match | doubleTheDonationCompanyId, doubleTheDonationEnteredText |
| UK Gift Aid | giftAidRequested |
| Comments | comments |
Step-by-step walkthrough
Step 1: obtain a payment method token
Raise uses tokenization to keep partner integrations out of PCI scope. Your integration never sees a raw card number — instead, the donor’s payment information is exchanged for an opaquepaymentMethodId token that you submit to POST /api/Raise/give.
For development and testing, use the dedicated test-payment-method generator:
cURL
paymentMethodId you can submit to /api/Raise/give in test mode (isTestMode: true) without touching real card data.
For production, the customer’s payment gateway provides tokenization through its hosted fields, drop-in UI, or client-side SDK. The donor’s card data is captured by the gateway’s tools, tokenized client-side, and the resulting paymentMethodId flows through your integration to POST /api/Raise/give.
Step 2: prepare the donor block
Thedonor field on the request is an embedded block that Raise uses for matching or creating the Donor record. Include the fields you have:
Step 3: prepare the project allocation
Theprojects[] array specifies how the donation’s amount should be designated across one or more Projects. Each entry has a Project identifier and an amount:
amount. If you omit projects[] entirely, the gift designates to the default Project configured on the Form (or the Campaign, depending on configuration).
Step 4: submit the request
JavaScript
Step 5: handle the response
A successful donation returns200 OK with the created Gift record. The most important fields:
| Field | Why it matters |
|---|---|
id | The Gift’s Raise primary key. Store this for reconciliation and audit. |
donorId | The Donor that the gift attached to (existing or newly created). |
status / statusText | The Gift’s processing state — see Statuses and Lifecycle States. |
transactionId | The payment gateway’s transaction reference. |
authorizationNumber | The gateway authorization. |
canRefund | Whether the Gift can be refunded through POST /api/Gift/{id}/refund. |
recurringGiftId | If isRecurring: true was set in the request, the ID of the newly-created RecurringGift schedule. |
JavaScript
Handling errors
The most common error categories and how to respond:400: validation failure
The request body is syntactically valid but failed validation — missing required field, invalid combination, etc. The response includes theerrors map identifying which fields failed:
400: payment processing failure
A400 can also indicate that the payment gateway rejected the charge — card declined, insufficient funds, expired card. The detail or errors map will identify the specific reason. The Gift record was not created in this case.
Don’t retry the same payment method — the result will be the same. The right path is to surface the failure to the donor and let them try a different method (or contact their card issuer).
401: unauthorized
The token is invalid, expired, or revoked. See Authentication: errors. Don’t retry; fix the credential.429: rate limited
Too many requests in too short a time. HonorRetry-After and back off — see Rate Limits. Retries should not multiply the customer’s charge — see “Idempotency considerations” below.
500 / 502 / 503: server errors
Transient. Retry with exponential backoff. But see “Idempotency considerations” below — a request that the server received but couldn’t acknowledge may have created a Gift even though your code raised an error.Idempotency considerations
POST /api/Raise/give charges a payment method. A naive retry on a network error or transient failure can result in double charges if the original request actually succeeded but the response didn’t reach you.
The Raise spec does not currently document an idempotency-key header (like Stripe’s Idempotency-Key). Until one is published, partner integrations should defend against duplicate submissions client-side:
| Defense | Description |
|---|---|
| Pre-submission deduplication | Generate a unique key per intended donation (e.g., a UUID stored before submission). On retry, check whether your local record already shows the donation as submitted. |
| Webhook reconciliation | Subscribe to giftCreate webhooks. On a retry where the original may have succeeded, check whether a Gift with your tracking identifier already exists before re-submitting. |
| Limited retries | Cap retries strictly — 2 attempts at most for POST /api/Raise/give. Persistent failures should surface for human review rather than continue retrying. |
| Test mode for validation | When uncertain whether to retry, switch to isTestMode: true for a validation submission to confirm the request shape works before retrying production. |
Webhook events
A successfulPOST /api/Raise/give triggers a giftCreate event to subscribers. Partner integrations that need to react to donations beyond the immediate response should subscribe rather than poll:
JavaScript
isRecurring: true, a corresponding event for the RecurringGift schedule also fires. See Event Types for the full event list.
Test-mode flow for development
For end-to-end testing without real charges:JavaScript
isTestMode: true and won’t appear in production-filtered reports. See Base URLs and Environments: Use the test payment method generator.
Where to go next
Create or Find a Donor
The workflow for ensuring a donor exists before submitting a donation — useful when matching needs to happen explicitly before the donation step.
Configure a Recurring Gift
Use the same
POST /api/Raise/give path to set up a recurring schedule.Handle Failed Payments
The full failure-handling workflow including recurring payment failures.
Webhooks Overview
React to donations in real time through
giftCreate events.