ClocknextHelp
DocumentationAPI ReferenceMCP Tools
Dashboard

Get started

OverviewQuickstart

Good to know

Response formatHandling errorsPaginating resultsSending data reliablyYour own customer idsWebhooks

API reference

Record credit POSTRecord outcome POSTComplete outcome POSTRecord wallet POSTRecord unit POSTComplete composite POST
List customers GETCreate a customer POSTGet a customer GETUpdate a customer PATCHDelete a customer DELETEGet a customer's balances GETGet a customer's wallet ledger GETSet a customer's low-balance alert PUTGet a customer's current plan GETChange a recurring grant PUTList Customer Usage Log GETLook Up Usage Logs by ID GET
Manage a customer's credit balance POSTManage a customer's outcome balance POSTManage a customer's unit balance POSTManage a customer's composite balance POSTManage a customer's wallet balance POST
List a customer's members GETAdd a member POSTUpdate a member PATCHRemove a member DELETE
PlansCreditsOutcomesUnitsComposites
List taxes GETCreate a tax POSTGet a tax GETUpdate a tax PATCH
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
wallet.balance.update POSTwallet.balance.drop POST
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. The plan itself must be active — purchasing an inactive plan is rejected with 400. Every invoice includes the taxes set up for the customer's billing country (Settings → Taxes); see subtotal, taxAmount and taxes on the invoice.

POST
/purchases

Authorization

apiKey
AuthorizationBearer <token>

Organisation-scoped key from Settings → API Keys.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Name the customer with customerId or externalId — one is required.

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

Customer id. Required unless externalId is sent.

Length1 <= length
externalId?string

Your own id for the customer (its externalId) — send instead of customerId. Ignored when customerId is also sent.

Match^[A-Za-z0-9-]{1,32}$
Length1 <= length <= 32
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