Skip to main content

Subscriptions

The Subscriptions API provides read access plus CRM-side updates, cancel and delete.
New to the API? Start with Getting started (base URL, response envelope, errors, pagination) and Authentication (API keys).
Identifier note: subscriptions are addressed by their numeric subscription_id.
Subscriptions are Stripe-gateway-driven. A subscription is provisioned against a Stripe product/price and activated by client checkout, so creating a subscription is not exposed by the API — it is managed via Stripe / the CRM UI. The gateway fields (product, price, interval, amounts) are owned by Stripe and exposed read-only.
Scope: the Stripe checkout/pay flow, the product-prices helper, bulk change-category and per-user pinning are out of API scope. Subscriptions do not support tags in this application.

The subscription object

{
  "id": 26,
  "status": "active",
  "gateway": {
    "id": "sub_1A2b3C",
    "product": "prod_Iu74Qv",
    "product_name": "Pro Plan",
    "price": "price_1A2b3C",
    "interval": 1,
    "period": "month"
  },
  "category": { "id": 1, "name": "SEO" },
  "client": { "id": 1, "name": "Acme Inc" },
  "project_id": null,
  "creator_id": 1,
  "totals": {
    "subtotal": "50.00", "amount_before_tax": "50.00",
    "tax_percentage": "0.00", "tax_amount": "0.00", "final_amount": "50.00"
  },
  "dates": {
    "started": "2026-06-20", "next_renewal": "2026-07-20",
    "renewed": null, "ended": null, "created": "..."
  },
  "notes": null
}
FieldTypeNotes
idintegerSubscription id.
statusstringpending, active or cancelled.
gatewayobjectStripe product/price/interval — read-only.
category / client / project_idobject/intLinks.
totalsobjectAmounts (Stripe-managed) — read-only.
datesobjectstarted, next_renewal, renewed, ended, created.
notesstringCRM-side note (editable).

List / search subscriptions

GET /api/subscriptions
Query params: status, client_id, project_id, category_id, search, sort (subscription_date_started,subscription_date_next_renewal,subscription_final_amount,subscription_created), order, limit, page.
curl -G https://your-domain/api/subscriptions -H "Authorization: Bearer YOUR_API_KEY" -d status=active

Get a subscription

GET /api/subscriptions/{id}

List a subscription’s invoices

GET /api/subscriptions/{id}/invoices
Returns the (paginated) invoices generated by the subscription — see Invoices.

Update a subscription

PATCH /api/subscriptions/{id}
Updates the CRM-side metadata only. The gateway fields and amounts are managed by Stripe and cannot be changed via the API.
ParameterTypeRequired
subscription_categoryidintegeryes
subscription_projectidintegerno
subscription_notesstringno
curl -X PATCH https://your-domain/api/subscriptions/26 -H "Authorization: Bearer YOUR_API_KEY" \
  -d subscription_categoryid=1 -d subscription_notes="Renewed for 2026"

Cancel a subscription

PUT /api/subscriptions/{id}/cancel
Marks the subscription cancelled and queues the cancellation at Stripe (processed by the cron, exactly as the UI does). No body. 409 if already cancelled.
curl -X PUT https://your-domain/api/subscriptions/26/cancel -H "Authorization: Bearer YOUR_API_KEY"

Delete a subscription

DELETE /api/subscriptions/{id}
Queues the Stripe cancellation and deletes the subscription, cascading its generated invoices and payments. Use with care.

Errors

See Getting started. Subscription-specific:
StatusMeaning
404 Not FoundThe subscription id does not exist.
409 ConflictThe subscription is already cancelled.
422 Unprocessable EntityValidation failed (e.g. missing/invalid category).