Create a subscription
Create a subscription for a client against one of your billing periods. `client.phone` identifies the buyer and must be a Nepali mobile number (10 digits starting with 96, 97 or 98); a +977 country code is accepted and stripped. The subscription starts in `pending_checkout`; send the returned `checkout_url` to the client to collect payment. `client.email` and `client.phone` are read back on the subscription as `client.email` and `client.phone`, but the `client.billing` block loses its `billing_` prefix on the way back out. `return_url` is required despite reading as optional on the model behind this body — a missing, null or blank value is rejected the same way. A client may hold only one live recurring subscription per product, so a second one on a different billing period of the same product is refused. This endpoint takes no idempotency key: a retried request that timed out opens a second subscription and a second checkout, so reconcile by `subscription_id` before retrying.
Authorization
ApiKey API key issued to the partner, sent with the Bearer prefix — for example: Authorization: Bearer su_key_9f2c4d1ab3….
Keys minted on the live instance are prefixed su_key_ and keys minted on sandbox su_test_key_. The two instances keep separate key tables and separate hosts, so a sandbox key sent to the live host — or the reverse — answers Invalid API key. rather than falling back to the other environment.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/subscriptions/" \ -H "Content-Type: application/json" \ -d '{ "pbp_id": "string", "return_url": "http://example.com", "client": { "phone": "string", "full_name": "string", "email": "[email protected]" } }'{ "created_at": "2026-07-03T10:15:00Z", "pbp_id": "pbp_3n9k2x", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending_checkout", "checkout_url": "https://app.suqo.ai/pay/3fa85f64-5717-4562-b3fc-2c963f66afa6", "next_billing_cycle": "2026-08-03T00:00:00Z"}List subscriptions GET
Paginated subscriptions for your account, newest first, 20 per page by default and 100 at most (`page`, `page_size`). The status counters cover recurring subscriptions only — one-time purchases appear in `results` but are excluded from the totals, which is why `total_subscriptions` can be lower than `count`.
Update a subscription's next billing cycle POST
Move a subscription's next billing date. The date must be today or later, and one-time purchases cannot be rescheduled. Unlike cancel and resume, the subscription is named in the body rather than the path, so this endpoint never returns 404: an unknown or inactive `subscription_id` comes back as a 400 keyed on that field. `next_billing_cycle` is sent as a plain date and stored as midnight Nepal time, which is why it reads back as a timestamp.