Changelog & versioning
Release history and versioning policy for the SUQO TypeScript SDK.
Versioning policy
The SDK follows strict SemVer: MAJOR.MINOR.PATCH.
- MAJOR — bumped on either trigger: the API's path version changes (
/api/v1/→/api/v2/), or the SDK introduces its own breaking change with no API change at all (a renamed export, a changed return shape). - MINOR — additive, backward-compatible: a new resource, a new optional parameter, a new non-breaking field.
- PATCH — fixes only, no contract change of any kind.
Anything removed is deprecated one minor ahead with a documented warning, removed only at the next major — no feature is ever removed in a minor or patch release.
Compatibility table
| SDK Version | Supported API Version | Change Type | Status |
|---|---|---|---|
1.1.0 | v1 | Added customers.create/update; SDK-only type fixes shipped as a minor (see below) | Shipped |
1.0.0 | v1 | Initial release | Shipped |
1.1.0 - 2026-09-24
A deliberate exception to the MAJOR rule. The three type changes under Changed are technically SDK-only breaking changes, but each corrects a type that never matched what the API sends, so they ship as a minor. Upgrading from 1.0.0 may need the small code changes noted under each.
Added
customers.create({ phone, fullName?, email?, address? })— records a customer without opening a subscription. A phone you already hold updates that customer instead, so it's safe to retry yourself; the SDK never retries it automatically.customers.update(id, { fullName?, email?, address? })— updates only the given fields;""clears one. The phone can't be changed.CreateCustomerParams,UpdateCustomerParamsandProductImagetypes exported.
Changed
- Breaking:
Customer.idis astring(e.g."cus_1ce18d624"), not anumber— the API never sent an integer, and thenumbertype madecustomers.retrieve()uncallable with a real id. Upgrading: switch customer ids typed asnumbertostring. - Breaking:
Customer.addressadded (string | null) — it was on the wire but missing from the type. Upgrading: addaddress: nullto anyCustomerobjects you build yourself. - Breaking:
Product.productImageisProductImage[]({ image, imageOrder }), notstring[]— the API sends image objects. 1.0.0 passed them through untouched as{ image, image_order }; 1.1.0 types them and renamesimage_ordertoimageOrder. Upgrading: useproductImage[i].imagewhere you usedproductImage[i]as a URL, andimageOrderwhere you readimage_order.
Fixed
customers.retrieve()/update()reject an empty,"."or".."id withSuqoConfigErrorinstead of silently hitting the wrong endpoint.- Missing
buyerPhone/buyerEmail/fullName/addresskeys come back asnull, neverundefined.
1.0.0 - 2026-09-11
Added
SuqoClient— environment (sandbox/live) inferred automatically from the API key prefix, withSuqoConfigErrorthrown before any request on a malformed key or a conflictingbaseUrloverride.products.list()/.autoPaging()— browse the seller's product catalog. Works before KYC.subscriptions.list()/.create()/.cancel()/.updateBillingCycle()/.resume()/.autoPaging()— full subscription lifecycle, including create-time reuse of an inactive/expired subscription for the same buyer + product + billing period.customers.list()/.retrieve()— read-only access to the seller's customer records.webhooks.verify()— HMAC-SHA256 signature verification for inbound webhook deliveries, with replay protection via a configurable timestamp tolerance. Makes no network call.- Automatic retries with exponential backoff and jitter for read operations, on
NetworkError,429, and5xx— honoring aRetry-Afterheader when present. Writes are never auto-retried (no idempotency-key support yet on the backend — see Idempotency). - Full
SuqoErrorhierarchy (SuqoConfigError,AuthenticationError,KycRequiredError,ValidationError,NotFoundError,RateLimitError,ServerError,NetworkError) — every documented failure mode normalized to a class, never a wire-shape check. - Dual ESM + CommonJS build with bundled
.d.ts, zero runtime dependencies.
Fixed
- Corrected the sandbox base URL (
test.be.suqo.ai, which did not resolve) to the real sandbox host,test-be.suqo.ai.