Base URLs

The kurnl API has two separate surfaces: All partner integration work uses the /partner base. Examples in this reference use that base unless the page is explicitly marked as internal (/api/v1). All endpoints are HTTPS only. The partner API operates on your live account; there is no separate sandbox API key. For safe exploration, use the in-dashboard sandbox.

Authentication

See Authentication for the full guide. Quick reference:

Rate limits

Rate limit headers are included in every response:
When the limit is exceeded, kurnl returns 429 Too Many Requests. Retry after the X-RateLimit-Reset timestamp.

Response format

All responses are JSON. Successful responses vary by endpoint. Error responses always follow this structure:
Validation errors return an array:

Common HTTP status codes

Idempotency

Several endpoints are idempotent by design:
  • POST /external-checkout/complete — the same session_id (or email + plan_version_id in the explicit-fields flow) returns the existing subscription
  • POST /external-checkout/anonymous-complete — the same external_subscription_id (or session_id) returns the existing subscription
  • POST /provisioning/bulk — resubmitting the same subscriber email returns the existing subscription
  • POST /provisioning/provider-initiated — same as above
On 5xx errors, retry the full request. kurnl rolls back partial state automatically on server failures.

Pagination

List endpoints support cursor-based pagination:
Response includes total, page, page_size, and has_more fields alongside the results array.