Developer API
Read and change your store's subscriptions from your own systems with the Subrise API. Base URL, API keys, IDs and errors.
The Subrise API lets your own code read and change the subscriptions on your store. Use it to sync subscribers into a CRM, build a custom account page, or run bulk changes from a script.
It is a JSON API over HTTPS. Every request is authenticated with an API key that belongs to one store.
Base URL
Send every request to:
https://backend-production.subrise.app/apiThe paths on these pages start after /api. For example, GET /fields means GET https://backend-production.subrise.app/api/fields.
Get an API key
There is no API key screen in the Subrise admin. Subrise support issues keys on request.
- Email info@subrise.app from the email address on your Subrise account.
- Include your store's
.myshopify.comdomain.
Support sends you a key. Each key works for one store only.
Authenticate
Send the key in the x-api-key header on every request.
curl https://backend-production.subrise.app/api/fields \
-H "x-api-key: $SUBRISE_API_KEY"A missing or unknown key gets a 401 with the plain-text body Unauthorized.
Warning
An API key acts as your store's admin. Anyone who holds it can read your subscribers' names, emails and addresses and change their subscriptions. Keep it on your server, never in theme code, a browser or a public repository. If a key leaks, email info@subrise.app and ask for it to be deleted.
Permissions
Keys are issued with Read and Write access for now, so every key can both read and change subscriptions. Each page in this section says which kind of access its endpoints use.
| Permission | Covers |
|---|---|
| Read | GET requests and searches. |
| Write | Requests that change a subscription, such as pause, skip or cancel. |
Pages in this section
- Subscriptions: search subscriptions, get one, and list billing attempts.
- Change a subscription: pause, resume, skip, reschedule, cancel, and edit products and addresses.
- Products: the products Subrise has synced from your store.
- Subscription plans: your plans and the products on them.
- Customers: a customer's payment methods, and the email that asks them to update one.
- Activity and fields: each subscription's activity log, and the allowed values for plan and status fields.
IDs
Subrise uses two kinds of ID.
- Subscription and customer IDs are numeric strings in Subrise's own data, for example
"12704383255". Use the numeric form in paths, such as/subscription-contracts/12704383255. - Shopify objects (products, variants, subscription lines, plans) use Shopify's global IDs, for example
"gid://shopify/ProductVariant/44406306701591".
Each endpoint says which form it takes. Where it accepts both, it says so.
Dates
Dates are ISO 8601 strings in UTC, for example "2026-11-05T14:00:00Z".
Responses
Responses are JSON. Their shape depends on the endpoint, so each page shows a real example.
- Data from Subrise's own records comes back as plain objects, often wrapped as
{ "success": true, "data": ... }. - Data read live from Shopify comes back in Shopify's GraphQL shape,
{ "data": { ... } }, with Shopify's field names.
Examples on these pages are abridged. Expect more fields than they show, and ignore fields you don't use.
Errors
| Status | Meaning |
|---|---|
400 | The request was invalid, or Shopify rejected the change. The body says why. |
401 | The API key is missing or unknown. The body is the text Unauthorized. |
403 | The request is not allowed for this store. |
404 | The subscription, plan or other object was not found on this store. |
409 | The subscription changed since you last read it. See Safe writes. |
500 | Something failed on our side or at Shopify. Retry later, or contact support. |
503 | Subrise couldn't reach its database. The body has "error": "database_unavailable" and a message. Retry after a short delay. |
Most error bodies look like this:
{
"success": false,
"error": "Subscription not found"
}Some endpoints use message instead of error, and some pass Shopify's userErrors through unchanged.
Safe writes
Two people can change the same subscription at once, for example your script and a customer in their portal. To make sure you only change what you last saw, send the state you expect with the write.
| Header | Value |
|---|---|
X-Subrise-Expected-Status | ACTIVE, PAUSED, CANCELLED, EXPIRED or FAILED |
X-Subrise-Expected-Next-Billing-Date | An ISO date-time or a YYYY-MM-DD date |
If the subscription no longer matches, Subrise changes nothing and answers 409:
{
"success": false,
"error": "This subscription changed after the draft was made: it is now PAUSED, not ACTIVE. Nothing was changed. Reload the subscription and try again.",
"code": "CONTRACT_CHANGED",
"current": { "status": "PAUSED", "nextBillingDate": "2026-11-05T14:00:00Z" }
}The endpoints that accept these headers are marked on Change a subscription. The headers are optional.
Rate limits
Subrise does not set a per-key rate limit. Requests that read from or write to Shopify count against your store's Shopify Admin API limit, so spread bulk jobs out and retry a 500 with a delay.
Get notified of changes
The API is for requests you make. To have Subrise tell you when something happens, such as a new subscription or a failed payment, use webhooks or Shopify Flow.