POST /api/Raise/give, modifying it after creation, handling payment failures, and cancelling when the donor is done.
The Raise API doesn’t expose a dedicated POST /api/RecurringGift create endpoint. Schedules are created through the same POST /api/Raise/give path that processes one-time donations — with the isRecurring, frequency, and schedule-related fields set.
For the resource-level reference, see Recurring Gifts.
When to use this workflow
| Scenario | Approach |
|---|---|
| Donor opts into recurring giving on a donation form | The form’s submit handler calls POST /api/Raise/give with isRecurring: true. |
| Partner integration captures a recurring commitment through its own UI | Integration calls POST /api/Raise/give with the recurring fields set. |
| Updating an existing recurring schedule (amount, frequency, payment method) | PUT /api/RecurringGift/{id} with the full updated record. |
| Cancelling a recurring schedule | PUT /api/RecurringGift/{id}/cancel — dedicated endpoint, not a status update. |
Creating a recurring schedule
The samePOST /api/Raise/give endpoint that processes one-time donations creates recurring schedules when isRecurring is true. This is the only API path for schedule creation.
Required fields for a recurring submission
In addition to the standardamount, paymentMethodId, and paymentMethodType:
| Field | Type | Description |
|---|---|---|
isRecurring | boolean | Must be true to create a recurring schedule. |
frequency | integer enum | The schedule’s cadence. |
frequency integer values come from the Frequency enum in the spec: 0, 1, 2, 4, 12, 26, 52, 100. The integer pattern suggests cadence-per-year semantics:
| Value | Likely meaning |
|---|---|
52 | Weekly (52 payments per year) |
26 | Biweekly (26 payments per year) |
12 | Monthly (12 payments per year) |
4 | Quarterly (4 payments per year) |
2 | Semi-annual (2 payments per year) |
1 | Annual (1 payment per year) |
0, 100 | Other cadences |
Optional but commonly-set fields
| Field | Type | Description |
|---|---|---|
startDate | string | The schedule’s start date (when the first charge should occur). If omitted, the first charge runs immediately as part of the submission. |
startDateTimeUtc | string | The start date with explicit UTC timezone. Use this for unambiguous scheduling across timezones. |
donor | DonorRequest block | Standard donor block — same as for one-time donations. |
projects | array | Project allocation — same as for one-time donations. Allocations apply to each recurring payment. |
premiumId | integer | Premium given at signup (one-time). |
donorPaidCosts | boolean | Whether the donor covers processing fees for each recurring payment. |
tribute | object | Tribute information that applies to the recurring schedule. |
A complete recurring submission
cURL
- A RecurringGift record representing the schedule.
- A Gift record representing the first payment, with
recurringGiftIdpointing back to the schedule.
recurringGiftId field on the Gift tells you the ID of the new schedule.
Reading the schedule after creation
JavaScript
nextChargeDate indicates when the next payment will be charged. The schedule advances this field automatically after each successful charge.
Updating a schedule
PUT /api/RecurringGift/{id} updates an existing schedule. The Raise spec doesn’t expose a PATCH variant — use the GET-then-PUT pattern for partial updates:
JavaScript
Common update scenarios
Change the recurring amount:JavaScript
JavaScript
JavaScript
JavaScript
Handling payment failures
The most operational consideration for recurring schedules: payments fail. Cards expire, accounts close, balances run low. The schedule’shasPaymentFailed flag becomes true when a charge attempt fails, and the schedule pauses until the donor’s payment method is updated.
Detecting failures
Query for schedules with failed payments on a regular cadence (typically daily):JavaScript
Notifying the donor
For each schedule withhasPaymentFailed: true, the typical recovery workflow:
Generate a personalized donor page
Use
POST /api/Donor/{donorId}/generate-page to create a URL pre-filled with the donor’s identity. The donor will need to update their payment method on this page.Send the donor an email
Include the personalized URL and a clear explanation of why the schedule is paused. Most donors respond quickly when the message is clear.
Track the outreach
Record that you’ve contacted the donor and when. Subsequent failed-schedule queries should skip donors you’ve already notified within a reasonable window to avoid spamming.
Detecting upcoming expirations (proactive)
A more effective pattern than waiting for failures: check for soon-to-expire cards before they cause failures. TheexpMonthAndYear field on a RecurringGift exposes the card’s expiration:
JavaScript
The exact format of
expMonthAndYear (e.g., MM/YYYY, MM/YY) is not documented in the spec. Confirm the format against live data before parsing in production.Cancelling a schedule
Cancellation has a dedicated endpoint. Don’t try to cancel by settingstatus directly via PUT:
cURL
- The schedule’s status changes to the cancelled state.
- No further charge cycles run against the schedule.
- Any already-processed Gifts produced by the schedule remain attached for historical reference.
- The donor’s payment method is no longer used by this schedule.
When to cancel vs. pause
The Raise API exposes cancellation as a final operation, not a pause. There’s noPUT /api/RecurringGift/{id}/pause endpoint in the current spec. If a donor wants to temporarily stop giving:
- For a known short pause: cancel and let the donor sign up for a new schedule when ready.
- For a longer or indefinite pause: cancellation is the path.
Reading a schedule’s payment history
TheGET /api/RecurringGift/{id}/activities endpoint returns the schedule’s payment activity — successful charges, failed attempts, and other lifecycle events:
cURL
Transferring a schedule to another donor
A schedule attached to the wrong donor can be transferred without cancellation:cURL
donorId updates to the new donor. Future Gifts produced by the schedule belong to the new donor. Historical Gifts already produced by the schedule remain attached to the original donor unless transferred separately via transfer-gift.
See Donors: Transfer a gift to another donor for the parallel operation on individual Gifts.
A complete schedule-management snippet
Pulling the workflow together — create, monitor for failures, cancel:JavaScript
Where to go next
Process a Donation
The one-time donation flow that shares the
POST /api/Raise/give path.Handle Failed Payments
The full failure-handling workflow including one-time payment failures and gateway-level errors.
Recurring Gifts
The RecurringGift resource reference with all 50+ fields documented.
Webhooks Overview
React to recurring payment events in real time.