Skip to main content
This workflow covers the full lifecycle of a recurring donation schedule: creating one through 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


Creating a recurring schedule

The same POST /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 standard amount, paymentMethodId, and paymentMethodType: The 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:
⚠️ Spec gap: The Frequency enum integer-to-label mapping is not documented in the Raise OpenAPI spec. The values above are inferred from the integer patterns and common sense, but the authoritative mapping should be confirmed against the live API before relying on it in production.Use GET /api/Query/options/{queryType} to discover the correct values for the RecurringGift query type, or coordinate with the platform team to confirm the mapping.

Optional but commonly-set fields

A complete recurring submission

cURL
This creates the schedule and processes the first payment, producing two records:
  • A RecurringGift record representing the schedule.
  • A Gift record representing the first payment, with recurringGiftId pointing back to the schedule.
The response is the Gift record from the first payment. The recurringGiftId field on the Gift tells you the ID of the new schedule.

Reading the schedule after creation

JavaScript
The schedule’s 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
When changing amount, the projectAllocation entries must sum to the new amount. The API rejects schedule updates where the allocation total doesn’t match. Update both together in a single PUT.
Change the frequency:
JavaScript
Change the next charge date:
JavaScript
Change the designation:
JavaScript

Handling payment failures

The most operational consideration for recurring schedules: payments fail. Cards expire, accounts close, balances run low. The schedule’s hasPaymentFailed 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 with hasPaymentFailed: true, the typical recovery workflow:
1

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.
2

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.
3

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.
4

Re-check the schedule

After the donor updates their payment method (typically through the page link), the next scheduled charge will succeed and hasPaymentFailed will return to false.
The donor-update flow happens through the customer’s hosted Raise page — your integration doesn’t update the schedule’s payment method through the API. This is by design: card data tokenization happens client-side at the page, never on your servers.

Detecting upcoming expirations (proactive)

A more effective pattern than waiting for failures: check for soon-to-expire cards before they cause failures. The expMonthAndYear 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.
Notify donors with upcoming expirations through the same personalized-page flow. Response rates for proactive outreach are typically much higher than for after-the-fact failure recovery.

Cancelling a schedule

Cancellation has a dedicated endpoint. Don’t try to cancel by setting status directly via PUT:
cURL
After cancellation:
  • 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 no PUT /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.
Once cancelled, whether a schedule can be reactivated depends on the platform’s lifecycle rules. The API doesn’t document an “uncancel” or “resume” operation. Confirm with the platform team before designing any workflow that relies on reactivating cancelled schedules.

Reading a schedule’s payment history

The GET /api/RecurringGift/{id}/activities endpoint returns the schedule’s payment activity — successful charges, failed attempts, and other lifecycle events:
cURL
Use this to build donor-facing payment history views, to investigate schedules with persistent failures, or to reconcile recurring payments against your integration’s records. The activity record represents each cycle’s outcome. Successful cycles produce a Gift record; failed cycles produce an activity entry but no Gift.

Transferring a schedule to another donor

A schedule attached to the wrong donor can be transferred without cancellation:
cURL
The schedule’s 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.
Last modified on May 20, 2026