Docs/API/Recurring

Recurring

Subscriptions, plans, add-ons, and discounts. Compose them into recurring billing schedules for vaulted customers.

Recurring billing is built from four building blocks: add-ons and discounts modify an amount; plans package those modifiers with a base amount, cadence, and duration; subscriptions attach a plan to a vaulted customer. You can mix and match — the fields that define billing cadence live on both plans and subscriptions, so a subscription can override anything its plan specifies.

Add-ons

An add-on adds an amount or a percentage to a recurring charge. Either use amount (cents) or percentage (in thousandths of a percent — 43440 = 43.44%). Not both.

Create add-on

POST /api/recurring/addon
FieldTypeDescription
namestringDisplay name.
descriptionstringFree-text description.
amountintegerFlat amount in cents. 100 = $1.00. Either amount or percentage.
percentageinteger0 or .1%–100%, expressed in thousandths. Either amount or percentage.
durationintegerBilling-cycle count. 0 means "until cancelled".

Get add-on by ID

GET /api/recurring/addon/{addon_id}

List add-ons

GET /api/recurring/addons

Update add-on

POST /api/recurring/addon/{addon_id}

Same body as create.

Delete add-on

DELETE /api/recurring/addon/{addon_id}

Discounts

Identical shape to add-ons, but subtracts instead of adds. Create / Get / List / Update / Delete follow the same pattern.

ActionMethodEndpoint
CreatePOST/api/recurring/discount
Get by IDGET/api/recurring/discount/{discount_id}
ListGET/api/recurring/discounts
UpdatePOST/api/recurring/discount/{discount_id}
DeleteDELETE/api/recurring/discount/{discount_id}

Fields match the add-on set: name, description, amount or percentage, duration.

Plans

A plan is a reusable template. It names the base amount, the billing cadence, the duration, and any add-ons or discounts that travel with it.

Create plan

POST /api/recurring/plan
FieldTypeRequiredDescription
namestringrequiredDisplay name.
descriptionstringoptionalFree-text.
amountintegerrequiredBase amount in cents.
billing_cycle_intervalintegerrequiredRun the billing cycle every X months.
billing_frequencystringrequiredmonthly, twice_monthly, or daily.
billing_daysstringrequiredDay(s) of the month. Comma-separated for twice_monthly (e.g. "1,15"). Use "0" for the last day of the month.
charge_on_daybooleanoptionalWhen true, billing day is set to today.
durationintegeroptionalNumber of billings. 0 means "until cancelled".
add_onsarrayoptionalEach entry has an id plus optional overrides (name, description, amount, duration).
discountsarrayoptionalSame shape as add_ons, for discount references.

Get plan by ID

GET /api/recurring/plan/{plan_id}

List plans

GET /api/recurring/plans

Update plan

POST /api/recurring/plan/{plan_id}

Same fields as create, with one addition:

FieldTypeDescription
update_subscriptionsbooleanWhen true, apply the new amount to every active subscription using this plan.

Delete plan

DELETE /api/recurring/plan/{plan_id}

Subscriptions

Subscriptions bind a plan to a customer, lock in a cadence and a start date, and produce recurring transactions. Subscription fields override plan fields when both are present.

Create subscription

POST /api/recurring/subscription
FieldTypeRequiredDescription
plan_idstringoptionalPlan to inherit from.
descriptionstringoptionalFree-text description.
customer.idstringrequiredVaulted customer ID.
customer.payment_method_typestringoptionalcard or ach. Defaults to the customer's default type.
customer.payment_method_idstringconditionalSpecific vault payment method to charge. Required if payment_method_type is set.
customer.billing_address_idstringoptionalSpecific billing address.
customer.shipping_address_idstringoptionalSpecific shipping address.
amountintegerrequiredCharge amount in cents.
billing_cycle_intervalintegerrequiredEvery X months.
billing_frequencystringrequiredmonthly, twice_monthly, daily.
billing_daysstringrequiredSame semantics as plans.
charge_on_daybooleanoptionalSets billing day to today when true.
durationintegeroptionalNumber of billings. 0 means "until cancelled".
next_bill_datestringoptionalYYYY-MM-DD. The next charge date.
add_ons / discountsarrayoptionalSame shape as on plans.

Get subscription by ID

GET /api/recurring/subscription/{subscription_id}

Search subscriptions

POST /api/recurring/subscription/search

Query with the usual {operator, value} shape for string fields and {start_date, end_date} for dates.

FieldType
plan_idQuerySearchString
customer.idQuerySearchString
next_bill_dateQuerySearchDateRange
expiration_dateQuerySearchDateRange
statusQuerySearchString
limit / offsetinteger (0–100 / any)

Update subscription

POST /api/recurring/subscription/{subscription_id}

Same shape as create.

Change subscription status

Status transitions are separate GET endpoints. Each returns the updated subscription.

ActionEndpoint
PauseGET /api/recurring/subscription/{id}/status/paused
Mark past dueGET /api/recurring/subscription/{id}/status/past_due
CancelGET /api/recurring/subscription/{id}/status/cancelled
ActivateGET /api/recurring/subscription/{id}/status/active — accepts query param next_bill_date (YYYY-MM-DD).
CompleteGET /api/recurring/subscription/{id}/status/completed

Delete subscription

DELETE /api/recurring/subscription/{subscription_id}