ClocknextHelp
DocumentationAPI ReferenceMCP Tools
Dashboard

Get started

OverviewQuickstart

Core concepts

The response envelopeErrorsPaginationAsync, flushing & reliability

API reference

Record Signals POSTRecord usage logs POST
List customers GETCreate a customer POSTGet a customer GETUpdate a customer PATCHDelete a customer DELETEGet a customer's balances GETGet a customer's current plan GETList a customer's wallet transactions GETAdd a wallet transaction POSTAdjust a customer's credit balance POSTAdjust a customer's outcome balance POSTAdjust a customer's unit balance POST
List a customer's members GETAdd a member POSTUpdate a member PATCHRemove a member DELETE
List purchases GETCreate a purchase POSTGet a purchase GETUpdate a purchase's auto-payment setting PATCHCancel a purchase POST
List invoices GETGet an invoice GETMint a hosted pay link GET
List payments GETGet a payment GET
Mint a customer-portal access token POST
Purchases

Create a purchase

Subscribes a customer to a plan. Any existing SCHEDULED/ACTIVE purchase for the customer is cancelled first. A cycle-0 invoice is issued immediately for non-PAYG plans.

POST
/purchases

Authorization

apiKey
AuthorizationBearer <token>

Per-organisation API key from Settings → API Keys, sent as Authorization: Bearer cnk_…. Missing, unknown or expired keys return 401.

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

application/json

application/json

curl -X POST "https://example.com/purchases" \  -H "Content-Type: application/json" \  -d '{    "customerId": "cus_abc123",    "planId": "plan_growth",    "billingDate": "2026-08-01",    "notes": "Upgraded from Free after the trial",    "autoPayment": true,    "voidAfterMinutes": 1440  }'
{  "statusCode": 200,  "statusDetail": {    "status": "SUCCESS",    "message": "OK"  },  "result": {    "purchase": {      "id": "pur_ghi789",      "purchaseNumber": "PUR-2026-0042",      "customerId": "cus_abc123",      "customerName": "Acme Inc",      "planId": "plan_growth",      "planName": "Growth",      "planType": "WALLET",      "hasWallet": true,      "hasCredit": true,      "hasOutcome": false,      "hasUnit": false,      "billingCycle": "MONTHLY",      "cost": 499,      "currencyCode": "USD",      "billingDate": "2026-08-01T00:00:00.000Z",      "status": "SCHEDULED",      "autoPayment": true,      "autoPaymentPauseReason": "string",      "createdAt": "2026-07-01T09:45:00.000Z"    }  }}
{  "statusCode": 400,  "statusDetail": {    "status": "ERROR",    "message": "Request body must be valid JSON."  },  "result": {}}
{  "statusCode": 401,  "statusDetail": {    "status": "ERROR",    "message": "Invalid API key."  },  "result": {}}
{  "statusCode": 404,  "statusDetail": {    "status": "ERROR",    "message": "No customer with id \"cus_abc123\"."  },  "result": {}}
{  "statusCode": 422,  "statusDetail": {    "status": "ERROR",    "message": "No credit with agent key \"summarize\" exists in this workspace."  },  "result": {}}
{  "statusCode": 500,  "statusDetail": {    "status": "ERROR",    "message": "Could not complete the request."  },  "result": {}}

List purchases GET

Previous Page

Get a purchase GET

Next Page

customerId*string
Length1 <= length
planId*string
Length1 <= length
billingDate?string

YYYY-MM-DD. Defaults to today; must be a valid non-past date.

Formatdate
notes?string
Lengthlength <= 500
autoPayment?boolean
Defaultfalse
voidAfterMinutes?integer

Auto-void the purchase if unpaid after N minutes.

Default30

Value in

  • 30
  • 1440
  • 4320
  • 10080
  • 43200