Download OpenAPI specification:
CANDI is a Merchant-of-Record billing platform (Creem.io parity): hosted checkout, subscriptions, license keys, customer credits, discounts, HMAC-signed webhooks and MoR payouts. This document is the CONTRACT — every parallel team builds against it. All monetary values are integer minor units (cents). Money is charged in USD and EUR only.
Server-side only. Send your secret key in the x-api-key header. The key
prefix selects the data plane: candi_live_... hits live, candi_test_...
hits the fully isolated test environment (separate database). Keys are shown
once at creation and stored only as a sha256 hash.
Every error returns the envelope {trace_id, status, error, message[], timestamp}.
error is a stable machine-readable slug; message is a human-readable array.
Send an Idempotency-Key header on any POST/PUT/PATCH/DELETE to make it safe
to retry — the original response is replayed for 24h. Reusing a key with a
different body returns 409 idempotency_conflict. Customer-credit writes
additionally require a durable idempotency_key field in the body.
Every /v1/<resource> here is also served at /dashboard/v1/<resource> for the
merchant dashboard, using the SAME schemas. The difference is auth + mode: the
dashboard mount uses a session cookie (or bearer JWT) instead of x-api-key, and
selects the live/test data plane via the x-candi-mode: live|test header instead
of the key prefix. The dashboard also adds session-only reads not on the public
API: /dashboard/v1/events, /dashboard/v1/stats/summary, /dashboard/v1/invoices
and /dashboard/v1/api-keys.
| name required | string |
| description | string |
| image_url | string <uri> |
| price required | integer <int64> cents; 0 = free |
| currency required | string (Currency) Enum: "usd" "eur" |
| billing_type required | string (BillingType) Enum: "onetime" "recurring" |
| billing_period | string (BillingPeriod) Enum: "once" "every-day" "every-month" "every-three-months" "every-six-months" "every-year" |
| tax_mode | string (TaxMode) Enum: "inclusive" "exclusive" |
| tax_category | string (TaxCategory) Enum: "saas" "digital-goods-service" "ebooks" |
| pay_what_you_want | boolean |
| suggested_price | integer <int64> |
| trial_days | integer |
| default_success_url | string <uri> |
| name required | string |
| description | string |
| image_url | string <uri> |
| price required | integer <int64> cents; 0 = free |
| currency required | string (Currency) Enum: "usd" "eur" |
| billing_type required | string (BillingType) Enum: "onetime" "recurring" |
| billing_period | string (BillingPeriod) Enum: "once" "every-day" "every-month" "every-three-months" "every-six-months" "every-year" |
| tax_mode | string (TaxMode) Enum: "inclusive" "exclusive" |
| tax_category | string (TaxCategory) Enum: "saas" "digital-goods-service" "ebooks" |
| pay_what_you_want | boolean |
| suggested_price | integer <int64> |
| trial_days | integer |
| default_success_url | string <uri> |
| id | string |
| mode | string |
| status | string Enum: "active" "archived" |
| created_at | string <date-time> |
{- "name": "string",
- "description": "string",
- "price": 0,
- "currency": "usd",
- "billing_type": "onetime",
- "billing_period": "once",
- "tax_mode": "inclusive",
- "tax_category": "saas",
- "pay_what_you_want": true,
- "suggested_price": 0,
- "trial_days": 0,
}{- "name": "string",
- "description": "string",
- "price": 0,
- "currency": "usd",
- "billing_type": "onetime",
- "billing_period": "once",
- "tax_mode": "inclusive",
- "tax_category": "saas",
- "pay_what_you_want": true,
- "suggested_price": 0,
- "trial_days": 0,
- "id": "string",
- "mode": "string",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Product) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "name": "string",
- "description": "string",
- "price": 0,
- "currency": "usd",
- "billing_type": "onetime",
- "billing_period": "once",
- "tax_mode": "inclusive",
- "tax_category": "saas",
- "pay_what_you_want": true,
- "suggested_price": 0,
- "trial_days": 0,
- "id": "string",
- "mode": "string",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| query | string |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Product) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "name": "string",
- "description": "string",
- "price": 0,
- "currency": "usd",
- "billing_type": "onetime",
- "billing_period": "once",
- "tax_mode": "inclusive",
- "tax_category": "saas",
- "pay_what_you_want": true,
- "suggested_price": 0,
- "trial_days": 0,
- "id": "string",
- "mode": "string",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| id required | string |
| name required | string |
| description | string |
| image_url | string <uri> |
| price required | integer <int64> cents; 0 = free |
| currency required | string (Currency) Enum: "usd" "eur" |
| billing_type required | string (BillingType) Enum: "onetime" "recurring" |
| billing_period | string (BillingPeriod) Enum: "once" "every-day" "every-month" "every-three-months" "every-six-months" "every-year" |
| tax_mode | string (TaxMode) Enum: "inclusive" "exclusive" |
| tax_category | string (TaxCategory) Enum: "saas" "digital-goods-service" "ebooks" |
| pay_what_you_want | boolean |
| suggested_price | integer <int64> |
| trial_days | integer |
| default_success_url | string <uri> |
| id | string |
| mode | string |
| status | string Enum: "active" "archived" |
| created_at | string <date-time> |
{- "name": "string",
- "description": "string",
- "price": 0,
- "currency": "usd",
- "billing_type": "onetime",
- "billing_period": "once",
- "tax_mode": "inclusive",
- "tax_category": "saas",
- "pay_what_you_want": true,
- "suggested_price": 0,
- "trial_days": 0,
- "id": "string",
- "mode": "string",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}Returns a session whose checkout_url is checkout.usecandi.com/{id}.
| product_id required | string |
| units | integer >= 1 Default: 1 |
| request_id | string |
| discount_code | string |
| pwyw_amount | integer <int64> |
| success_url | string <uri> |
| customer_email | string <email> |
| affiliate_ref | string |
| locale | string |
| theme | string Enum: "light" "dark" |
object | |
object Values for the product's custom fields, keyed by field key. Every non-optional field must be present; unknown keys are rejected. |
| id | string |
| product_id | string |
| status | string Enum: "pending" "completed" "expired" |
| checkout_url | string <uri> |
| units | integer |
| request_id | string |
| success_url | string <uri> |
| expires_at | string <date-time> |
| created_at | string <date-time> |
{- "product_id": "string",
- "units": 1,
- "request_id": "string",
- "discount_code": "string",
- "pwyw_amount": 0,
- "affiliate_ref": "string",
- "locale": "string",
- "theme": "light",
- "metadata": { },
- "custom_fields": { }
}{- "id": "string",
- "product_id": "string",
- "status": "pending",
- "units": 0,
- "request_id": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Checkout) |
{- "items": [
- {
- "id": "string",
- "product_id": "string",
- "status": "pending",
- "units": 0,
- "request_id": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}| id required | string |
| id | string |
| product_id | string |
| status | string Enum: "pending" "completed" "expired" |
| checkout_url | string <uri> |
| units | integer |
| request_id | string |
| success_url | string <uri> |
| expires_at | string <date-time> |
| created_at | string <date-time> |
{- "id": "string",
- "product_id": "string",
- "status": "pending",
- "units": 0,
- "request_id": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}Orders are created by the platform when a checkout is paid; read-only.
| customer_id | string |
| product_id | string |
| status | string Enum: "pending" "paid" "refunded" "partially_refunded" "chargeback" "failed" |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Order) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "status": "pending",
- "type": "onetime",
- "customer_id": "string",
- "product_id": "string",
- "checkout_id": "string",
- "subscription_id": "string",
- "currency": "usd",
- "sub_total": 0,
- "tax_amount": 0,
- "amount": 0,
- "amount_paid": 0,
- "amount_refunded": 0,
- "fee_amount": 0,
- "net_amount": 0,
- "transaction_id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| customer_id | string |
| product_id | string |
| status | string |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Order) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "status": "pending",
- "type": "onetime",
- "customer_id": "string",
- "product_id": "string",
- "checkout_id": "string",
- "subscription_id": "string",
- "currency": "usd",
- "sub_total": 0,
- "tax_amount": 0,
- "amount": 0,
- "amount_paid": 0,
- "amount_refunded": 0,
- "fee_amount": 0,
- "net_amount": 0,
- "transaction_id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| id required | string |
| id | string |
| status | string Enum: "pending" "paid" "refunded" "partially_refunded" "chargeback" "failed" |
| type | string Enum: "onetime" "recurring" |
| customer_id | string |
| product_id | string |
| checkout_id | string |
| subscription_id | string |
| currency | string (Currency) Enum: "usd" "eur" |
| sub_total | integer <int64> |
| tax_amount | integer <int64> |
| amount | integer <int64> gross (sub_total + tax) |
| amount_paid | integer <int64> |
| amount_refunded | integer <int64> |
| fee_amount | integer <int64> platform fee |
| net_amount | integer <int64> amount - fee - tax (merchant credit) |
| transaction_id | string |
| created_at | string <date-time> |
{- "id": "string",
- "status": "pending",
- "type": "onetime",
- "customer_id": "string",
- "product_id": "string",
- "checkout_id": "string",
- "subscription_id": "string",
- "currency": "usd",
- "sub_total": 0,
- "tax_amount": 0,
- "amount": 0,
- "amount_paid": 0,
- "amount_refunded": 0,
- "fee_amount": 0,
- "net_amount": 0,
- "transaction_id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Subscription) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Subscription) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| id required | string |
| id | string |
| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| units | integer >= 1 |
| id | string |
| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| created_at | string <date-time> |
{- "units": 1
}{- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| product_id required | string |
| units | integer >= 1 |
| update_behavior required | string (UpdateBehavior) Enum: "proration-charge-immediately" "proration-charge" "proration-none" |
| id | string |
| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| created_at | string <date-time> |
{- "product_id": "string",
- "units": 1,
- "update_behavior": "proration-charge-immediately"
}{- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}Runs the same proration math as /upgrade without mutating the subscription, so the dashboard can show the exact immediate charge and next-invoice total before the merchant confirms. All amounts are int64 cents.
| id required | string |
| product_id required | string |
| units | integer >= 1 |
| update_behavior required | string (UpdateBehavior) Enum: "proration-charge-immediately" "proration-charge" "proration-none" |
| update_behavior | string (UpdateBehavior) Enum: "proration-charge-immediately" "proration-charge" "proration-none" |
| currency | string |
| proration_amount | integer <int64> Charged immediately (0 for charge/none; never negative). |
| credit_amount | integer <int64> Unused current-plan time credited. |
| next_invoice_total | integer <int64> Total at the next renewal. |
| next_renewal_at | string <date-time> |
| immediate | boolean |
{- "product_id": "string",
- "units": 1,
- "update_behavior": "proration-charge-immediately"
}{- "update_behavior": "proration-charge-immediately",
- "currency": "string",
- "proration_amount": 0,
- "credit_amount": 0,
- "next_invoice_total": 0,
- "next_renewal_at": "2019-08-24T14:15:22Z",
- "immediate": true
}| id required | string |
| at_period_end | boolean Default: false |
| id | string |
| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| created_at | string <date-time> |
{- "at_period_end": false
}{- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| id | string |
| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| id | string |
| customer_id | string |
| product_id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "product_id": "string",
- "status": "trialing",
- "units": 0,
- "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}| email required | string <email> |
| name | string |
| country | string |
| tax_id | string |
object |
| email required | string <email> |
| name | string |
| country | string |
| tax_id | string |
object | |
| id | string |
| created_at | string <date-time> |
{- "name": "string",
- "country": "string",
- "tax_id": "string",
- "metadata": { }
}{- "name": "string",
- "country": "string",
- "tax_id": "string",
- "metadata": { },
- "id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| name | string |
| country | string |
| tax_id | string |
| email required | string <email> |
| name | string |
| country | string |
| tax_id | string |
object | |
| id | string |
| created_at | string <date-time> |
{- "id": "string",
- "name": "string",
- "country": "string",
- "tax_id": "string"
}{- "name": "string",
- "country": "string",
- "tax_id": "string",
- "metadata": { },
- "id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Customer) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "name": "string",
- "country": "string",
- "tax_id": "string",
- "metadata": { },
- "id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}Returns a one-time magic link to the customer billing portal (portal.usecandi.com) for the identified customer. Provide either customer_id or customer_email. The merchant redirects the customer to the link (and CANDI also emails it when email delivery is configured). The link is single-use and short-lived; exchanging it sets a portal session cookie.
| customer_id required | string |
| customer_email | string <email> |
| customer_portal_link | string <uri> |
{- "customer_id": "string",
- "customer_email": "[email protected]"
}{
}| id required | string |
| email required | string <email> |
| name | string |
| country | string |
| tax_id | string |
object | |
| id | string |
| created_at | string <date-time> |
{- "name": "string",
- "country": "string",
- "tax_id": "string",
- "metadata": { },
- "id": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| customer_id | string |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Transaction) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "order_id": "string",
- "subscription_id": "string",
- "customer_id": "string",
- "status": "pending",
- "currency": "usd",
- "amount": 0,
- "amount_paid": 0,
- "amount_refunded": 0,
- "tax_amount": 0,
- "fee_amount": 0,
- "tax_country": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| id required | string |
| id | string |
| order_id | string |
| subscription_id | string |
| customer_id | string |
| status | string Enum: "pending" "paid" "refunded" "chargeback" |
| currency | string (Currency) Enum: "usd" "eur" |
| amount | integer <int64> |
| amount_paid | integer <int64> |
| amount_refunded | integer <int64> |
| tax_amount | integer <int64> |
| fee_amount | integer <int64> |
| tax_country | string |
| created_at | string <date-time> |
{- "id": "string",
- "order_id": "string",
- "subscription_id": "string",
- "customer_id": "string",
- "status": "pending",
- "currency": "usd",
- "amount": 0,
- "amount_paid": 0,
- "amount_refunded": 0,
- "tax_amount": 0,
- "fee_amount": 0,
- "tax_country": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| key required | string |
| instance_name required | string |
| valid | boolean |
| key | string |
| status | string Enum: "active" "inactive" "expired" "disabled" |
| activation_limit | integer |
| activation_count | integer |
object |
{- "key": "string",
- "instance_name": "string"
}{- "valid": true,
- "key": "string",
- "status": "active",
- "activation_limit": 0,
- "activation_count": 0,
- "instance": {
- "id": "string",
- "name": "string"
}
}| key required | string |
| instance_id | string |
| valid | boolean |
| key | string |
| status | string Enum: "active" "inactive" "expired" "disabled" |
| activation_limit | integer |
| activation_count | integer |
object |
{- "key": "string",
- "instance_id": "string"
}{- "valid": true,
- "key": "string",
- "status": "active",
- "activation_limit": 0,
- "activation_count": 0,
- "instance": {
- "id": "string",
- "name": "string"
}
}| key required | string |
| instance_id required | string |
| valid | boolean |
| key | string |
| status | string Enum: "active" "inactive" "expired" "disabled" |
| activation_limit | integer |
| activation_count | integer |
object |
{- "key": "string",
- "instance_id": "string"
}{- "valid": true,
- "key": "string",
- "status": "active",
- "activation_limit": 0,
- "activation_count": 0,
- "instance": {
- "id": "string",
- "name": "string"
}
}| name required | string |
| code required | string |
| type required | string Enum: "percentage" "fixed" |
| percentage | integer [ 0 .. 100 ] |
| amount | integer <int64> |
| currency | string (Currency) Enum: "usd" "eur" |
| duration | string Enum: "once" "forever" "repeating" |
| duration_in_months | integer |
| applies_to_products | Array of strings |
| expiry_date | string <date-time> |
| max_redemptions | integer |
| name required | string |
| code required | string |
| type required | string Enum: "percentage" "fixed" |
| percentage | integer [ 0 .. 100 ] |
| amount | integer <int64> |
| currency | string (Currency) Enum: "usd" "eur" |
| duration | string Enum: "once" "forever" "repeating" |
| duration_in_months | integer |
| applies_to_products | Array of strings |
| expiry_date | string <date-time> |
| max_redemptions | integer |
| id | string |
| redeem_count | integer |
| status | string Enum: "active" "archived" |
| created_at | string <date-time> |
{- "name": "string",
- "code": "string",
- "type": "percentage",
- "percentage": 100,
- "amount": 0,
- "currency": "usd",
- "duration": "once",
- "duration_in_months": 0,
- "applies_to_products": [
- "string"
], - "expiry_date": "2019-08-24T14:15:22Z",
- "max_redemptions": 0
}{- "name": "string",
- "code": "string",
- "type": "percentage",
- "percentage": 100,
- "amount": 0,
- "currency": "usd",
- "duration": "once",
- "duration_in_months": 0,
- "applies_to_products": [
- "string"
], - "expiry_date": "2019-08-24T14:15:22Z",
- "max_redemptions": 0,
- "id": "string",
- "redeem_count": 0,
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Discount) |
{- "items": [
- {
- "name": "string",
- "code": "string",
- "type": "percentage",
- "percentage": 100,
- "amount": 0,
- "currency": "usd",
- "duration": "once",
- "duration_in_months": 0,
- "applies_to_products": [
- "string"
], - "expiry_date": "2019-08-24T14:15:22Z",
- "max_redemptions": 0,
- "id": "string",
- "redeem_count": 0,
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}| code | string |
Array of objects (Discount) |
{- "items": [
- {
- "name": "string",
- "code": "string",
- "type": "percentage",
- "percentage": 100,
- "amount": 0,
- "currency": "usd",
- "duration": "once",
- "duration_in_months": 0,
- "applies_to_products": [
- "string"
], - "expiry_date": "2019-08-24T14:15:22Z",
- "max_redemptions": 0,
- "id": "string",
- "redeem_count": 0,
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}| id required | string |
| name required | string |
| code required | string |
| type required | string Enum: "percentage" "fixed" |
| percentage | integer [ 0 .. 100 ] |
| amount | integer <int64> |
| currency | string (Currency) Enum: "usd" "eur" |
| duration | string Enum: "once" "forever" "repeating" |
| duration_in_months | integer |
| applies_to_products | Array of strings |
| expiry_date | string <date-time> |
| max_redemptions | integer |
| id | string |
| redeem_count | integer |
| status | string Enum: "active" "archived" |
| created_at | string <date-time> |
{- "name": "string",
- "code": "string",
- "type": "percentage",
- "percentage": 100,
- "amount": 0,
- "currency": "usd",
- "duration": "once",
- "duration_in_months": 0,
- "applies_to_products": [
- "string"
], - "expiry_date": "2019-08-24T14:15:22Z",
- "max_redemptions": 0,
- "id": "string",
- "redeem_count": 0,
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z"
}| customer_id required | string |
| name | string |
| unit_label | string |
| id | string |
| customer_id | string |
| name | string |
| unit_label | string |
| status | string Enum: "active" "frozen" "closed" |
| balance | integer <int64> |
| created_at | string <date-time> |
{- "customer_id": "string",
- "name": "string",
- "unit_label": "string"
}{- "id": "string",
- "customer_id": "string",
- "name": "string",
- "unit_label": "string",
- "status": "active",
- "balance": 0,
- "created_at": "2019-08-24T14:15:22Z"
}| customer_id | string |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
| id | string |
| customer_id | string |
| name | string |
| unit_label | string |
| status | string Enum: "active" "frozen" "closed" |
| balance | integer <int64> |
| created_at | string <date-time> |
[- {
- "id": "string",
- "customer_id": "string",
- "name": "string",
- "unit_label": "string",
- "status": "active",
- "balance": 0,
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string |
| id | string |
| customer_id | string |
| name | string |
| unit_label | string |
| status | string Enum: "active" "frozen" "closed" |
| balance | integer <int64> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "name": "string",
- "unit_label": "string",
- "status": "active",
- "balance": 0,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| id | string |
| customer_id | string |
| name | string |
| unit_label | string |
| status | string Enum: "active" "frozen" "closed" |
| balance | integer <int64> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "name": "string",
- "unit_label": "string",
- "status": "active",
- "balance": 0,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| id | string |
| customer_id | string |
| name | string |
| unit_label | string |
| status | string Enum: "active" "frozen" "closed" |
| balance | integer <int64> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "name": "string",
- "unit_label": "string",
- "status": "active",
- "balance": 0,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| id | string |
| customer_id | string |
| name | string |
| unit_label | string |
| status | string Enum: "active" "frozen" "closed" |
| balance | integer <int64> |
| created_at | string <date-time> |
{- "id": "string",
- "customer_id": "string",
- "name": "string",
- "unit_label": "string",
- "status": "active",
- "balance": 0,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| amount required | integer <int64> >= 1 |
| reference required | string |
| idempotency_key required | string durable; dedupes the write |
| id | string |
| account_id | string |
| delta | integer <int64> |
| reference | string |
| idempotency_key | string |
| reversed_of | string |
| created_at | string <date-time> |
{- "amount": 1,
- "reference": "string",
- "idempotency_key": "string"
}{- "id": "string",
- "account_id": "string",
- "delta": 0,
- "reference": "string",
- "idempotency_key": "string",
- "reversed_of": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| amount required | integer <int64> >= 1 |
| reference required | string |
| idempotency_key required | string durable; dedupes the write |
| id | string |
| account_id | string |
| delta | integer <int64> |
| reference | string |
| idempotency_key | string |
| reversed_of | string |
| created_at | string <date-time> |
{- "amount": 1,
- "reference": "string",
- "idempotency_key": "string"
}{- "id": "string",
- "account_id": "string",
- "delta": 0,
- "reference": "string",
- "idempotency_key": "string",
- "reversed_of": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| entry_id required | string |
| idempotency_key required | string |
| id | string |
| account_id | string |
| delta | integer <int64> |
| reference | string |
| idempotency_key | string |
| reversed_of | string |
| created_at | string <date-time> |
{- "entry_id": "string",
- "idempotency_key": "string"
}{- "id": "string",
- "account_id": "string",
- "delta": 0,
- "reference": "string",
- "idempotency_key": "string",
- "reversed_of": "string",
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| at | string <date-time> balance as of this instant |
| balance | integer <int64> |
| unit_label | string |
{- "balance": 0,
- "unit_label": "string"
}| id required | string |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
| id | string |
| account_id | string |
| delta | integer <int64> |
| reference | string |
| idempotency_key | string |
| reversed_of | string |
| created_at | string <date-time> |
[- {
- "id": "string",
- "account_id": "string",
- "delta": 0,
- "reference": "string",
- "idempotency_key": "string",
- "reversed_of": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| total_revenue | integer <int64> gross paid |
| transaction_count | integer |
| order_count | integer |
| customer_count | integer |
| mrr | integer <int64> monthly recurring revenue |
| active_subscriptions | integer |
| currency | string (Currency) Enum: "usd" "eur" |
{- "total_revenue": 0,
- "transaction_count": 0,
- "order_count": 0,
- "customer_count": 0,
- "mrr": 0,
- "active_subscriptions": 0,
- "currency": "usd"
}| interval | string Enum: "day" "week" "month" |
| mrr | integer <int64> monthly recurring revenue in cents |
| active_subscriptions | integer |
Array of objects |
{- "mrr": 0,
- "active_subscriptions": 0,
- "periods": [
- {
- "period_start": "2019-08-24T14:15:22Z",
- "mrr": 0,
- "revenue": 0
}
]
}| url required | string <uri> |
| events required | Array of strings (EventType) Items Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| id | string |
| url | string <uri> |
| events | Array of strings (EventType) Items Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| active | boolean |
| created_at | string <date-time> |
{- "events": [
- "checkout.completed"
]
}{- "id": "string",
- "events": [
- "checkout.completed"
], - "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id | string |
| url | string <uri> |
| events | Array of strings (EventType) Items Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| active | boolean |
| created_at | string <date-time> |
[- {
- "id": "string",
- "events": [
- "checkout.completed"
], - "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string |
| id | string |
| url | string <uri> |
| events | Array of strings (EventType) Items Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| active | boolean |
| created_at | string <date-time> |
{- "id": "string",
- "events": [
- "checkout.completed"
], - "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| url | string <uri> |
| events | Array of strings (EventType) Items Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| active | boolean |
| id | string |
| url | string <uri> |
| events | Array of strings (EventType) Items Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| active | boolean |
| created_at | string <date-time> |
{- "events": [
- "checkout.completed"
], - "active": true
}{- "id": "string",
- "events": [
- "checkout.completed"
], - "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
| id | string |
| endpoint_id | string |
| event_id | string |
| event_type | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| attempts | integer |
| status | string Enum: "pending" "succeeded" "failed" "exhausted" |
| response_code | integer |
| next_retry_at | string <date-time> |
| created_at | string <date-time> |
[- {
- "id": "string",
- "endpoint_id": "string",
- "event_id": "string",
- "event_type": "checkout.completed",
- "attempts": 0,
- "status": "pending",
- "response_code": 0,
- "next_retry_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string |
| id | string |
| status | string Enum: "pending" "completed" "expired" |
| account_name | string |
object | |
| units | integer |
| sub_total | integer <int64> |
| discount_code | string applied discount code (present only when it re-priced) |
| discount_amount | integer <int64> amount subtracted before tax |
| tax_amount | integer <int64> |
| total | integer <int64> |
| currency | string (Currency) Enum: "usd" "eur" |
Array of objects | |
| theme | string |
| locale | string |
| stripe_publishable_key | string |
| prefill_email | string <email> |
| success_url | string <uri> |
| expires_at | string <date-time> |
{- "id": "string",
- "status": "pending",
- "account_name": "string",
- "product": {
- "name": "string",
- "description": "string",
- "price": 0,
- "currency": "usd",
- "billing_type": "onetime",
- "billing_period": "once",
- "pay_what_you_want": true,
- "suggested_price": 0
}, - "units": 0,
- "sub_total": 0,
- "discount_code": "string",
- "discount_amount": 0,
- "tax_amount": 0,
- "total": 0,
- "currency": "usd",
- "custom_fields": [
- {
- "key": "string",
- "label": "string",
- "type": "text",
- "optional": true
}
], - "theme": "string",
- "locale": "string",
- "stripe_publishable_key": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}Re-derives the amount server-side from the stored session and creates a Stripe PaymentIntent, returning its client_secret for the Payment Element. The order and its paid state are created by the platform on the resulting payment_intent.succeeded webhook, not by this call.
| id required | string |
string <email> | |
| pwyw_amount | integer <int64> customer-chosen pay-what-you-want amount (cents) |
object values keyed by custom field key |
| client_secret | string |
| stripe_publishable_key | string |
| payment_intent_id | string |
| success_url | string <uri> pass as stripe.confirmPayment return_url |
| amount | integer <int64> |
| currency | string (Currency) Enum: "usd" "eur" |
{- "pwyw_amount": 0,
- "custom_field_values": { }
}{- "client_secret": "string",
- "stripe_publishable_key": "string",
- "payment_intent_id": "string",
- "amount": 0,
- "currency": "usd"
}Evaluates a discount code for the pending checkout and returns the pre-tax amount off so the hosted page can show the savings before payment. It never mutates and never redeems; the authoritative re-price happens in confirm. For an inapplicable code it returns 200 with valid:false and a reason.
| id required | string |
| code required | string |
| valid | boolean |
| code | string |
| type | string Enum: "percentage" "fixed" |
| amount_off | integer <int64> cents off the pre-tax subtotal |
| currency | string (Currency) Enum: "usd" "eur" |
| total_before | integer <int64> |
| reason | string Enum: "not_found" "expired" "exhausted" "not_applicable_to_product" "currency_mismatch" |
| message | string |
{- "code": "string"
}{- "valid": true,
- "code": "string",
- "type": "percentage",
- "amount_off": 0,
- "currency": "usd",
- "total_before": 0,
- "reason": "not_found",
- "message": "string"
}| mode required | string Enum: "live" "test" |
| name | string |
| scopes | Array of strings |
| id | string |
| mode | string Enum: "live" "test" |
| prefix | string candi_live_ / candi_test_ |
| last4 | string |
| name | string |
| scopes | Array of strings |
| last_used_at | string <date-time> |
| revoked_at | string <date-time> |
| created_at | string <date-time> |
| key | string the full secret — returned ONCE |
{- "mode": "live",
- "name": "string",
- "scopes": [
- "string"
]
}{- "id": "string",
- "mode": "live",
- "prefix": "string",
- "last4": "string",
- "name": "string",
- "scopes": [
- "string"
], - "last_used_at": "2019-08-24T14:15:22Z",
- "revoked_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "key": "string"
}| id | string |
| mode | string Enum: "live" "test" |
| prefix | string candi_live_ / candi_test_ |
| last4 | string |
| name | string |
| scopes | Array of strings |
| last_used_at | string <date-time> |
| revoked_at | string <date-time> |
| created_at | string <date-time> |
[- {
- "id": "string",
- "mode": "live",
- "prefix": "string",
- "last4": "string",
- "name": "string",
- "scopes": [
- "string"
], - "last_used_at": "2019-08-24T14:15:22Z",
- "revoked_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
]| mode | string Default: "live" Enum: "live" "test" |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Invoice) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "number": "string",
- "status": "pending",
- "currency": "usd",
- "sub_total": 0,
- "tax_amount": 0,
- "total": 0,
- "customer_id": "string",
- "order_id": "string",
- "pdf_ready": true,
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| id required | string |
| mode | string Default: "live" Enum: "live" "test" |
| id | string |
| number | string human number, e.g. INV-7Z9K2Q-00042 |
| status | string Enum: "pending" "rendered" "failed" |
| currency | string (Currency) Enum: "usd" "eur" |
| sub_total | integer <int64> |
| tax_amount | integer <int64> |
| total | integer <int64> |
| customer_id | string |
| order_id | string |
| pdf_url | string <uri> download URL once pdf_ready |
| pdf_ready | boolean |
| created_at | string <date-time> |
{- "id": "string",
- "number": "string",
- "status": "pending",
- "currency": "usd",
- "sub_total": 0,
- "tax_amount": 0,
- "total": 0,
- "customer_id": "string",
- "order_id": "string",
- "pdf_ready": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| mode | string Default: "live" Enum: "live" "test" |
{- "trace_id": "string",
- "status": 0,
- "error": "string",
- "message": [
- "string"
], - "timestamp": "2019-08-24T14:15:22Z"
}| type | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| mode | string Default: "live" Enum: "live" "test" |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Event) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "type": "checkout.completed",
- "mode": "prod",
- "object": { },
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| id required | string |
| mode | string Default: "live" Enum: "live" "test" |
| id | string |
| type | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| mode | string Enum: "prod" "test" |
object | |
| created_at | string <date-time> |
{- "id": "string",
- "type": "checkout.completed",
- "mode": "prod",
- "object": { },
- "created_at": "2019-08-24T14:15:22Z"
}| mode | string Default: "live" Enum: "live" "test" |
| total_revenue | integer <int64> gross paid |
| transaction_count | integer |
| order_count | integer |
| customer_count | integer |
| mrr | integer <int64> monthly recurring revenue |
| active_subscriptions | integer |
| currency | string (Currency) Enum: "usd" "eur" |
{- "total_revenue": 0,
- "transaction_count": 0,
- "order_count": 0,
- "customer_count": 0,
- "mrr": 0,
- "active_subscriptions": 0,
- "currency": "usd"
}| mode | string Default: "live" Enum: "live" "test" |
| currency | string (Currency) Enum: "usd" "eur" |
| merchant_held | integer <int64> in the risk-hold window |
| merchant_available | integer <int64> released |
{- "currency": "usd",
- "merchant_held": 0,
- "merchant_available": 0
}| mode | string Default: "live" Enum: "live" "test" |
| page_number | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 100 ] Default: 10 |
Array of objects (Payout) | |
| page_number | integer |
| page_size | integer |
| total | integer |
{- "items": [
- {
- "id": "string",
- "amount": 0,
- "currency": "usd",
- "status": "pending",
- "method": "string",
- "scheduled_window": "1",
- "reverse_invoice_id": "string",
- "failure_reason": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "page_number": 0,
- "page_size": 0,
- "total": 0
}| token required | string |
object (PortalCustomer) |
{- "token": "string"
}{
}Array of objects (PortalSubscription) |
{- "items": [
- {
- "id": "string",
- "status": "trialing",
- "units": 0,
- "product": {
- "name": "string",
- "price": 0,
- "currency": "usd",
- "billing_period": "once"
}, - "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "has_payment_method": true,
- "created_at": "2019-08-24T14:15:22Z"
}
]
}| id required | string |
| at_period_end | boolean true = cancel at current period end |
| id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
object | |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| has_payment_method | boolean |
| created_at | string <date-time> |
{- "at_period_end": true
}{- "id": "string",
- "status": "trialing",
- "units": 0,
- "product": {
- "name": "string",
- "price": 0,
- "currency": "usd",
- "billing_period": "once"
}, - "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "has_payment_method": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| id | string |
| status | string (SubscriptionStatus) Enum: "trialing" "active" "paused" "past_due" "scheduled_cancel" "canceled" "expired" |
| units | integer |
object | |
| current_period_start | string <date-time> |
| current_period_end | string <date-time> |
| next_transaction_date | string <date-time> |
| trial_end | string <date-time> |
| canceled_at | string <date-time> |
| has_payment_method | boolean |
| created_at | string <date-time> |
{- "id": "string",
- "status": "trialing",
- "units": 0,
- "product": {
- "name": "string",
- "price": 0,
- "currency": "usd",
- "billing_period": "once"
}, - "current_period_start": "2019-08-24T14:15:22Z",
- "current_period_end": "2019-08-24T14:15:22Z",
- "next_transaction_date": "2019-08-24T14:15:22Z",
- "trial_end": "2019-08-24T14:15:22Z",
- "canceled_at": "2019-08-24T14:15:22Z",
- "has_payment_method": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string |
| client_secret | string |
| stripe_publishable_key | string |
{- "client_secret": "string",
- "stripe_publishable_key": "string"
}Sent when a checkout is paid and fulfilled. All 12 CANDI events share the
WebhookEvent envelope; object holds the relevant entity (checkout,
subscription, refund or dispute).
candi-signature header)candi-signature: <hex> = HMAC_SHA256(rawBody, endpoint.secret), lower
hex. Verify over the RAW request body (not a re-serialised copy). Retries
fire at 30s, 1m, 5m, 1h; a manual resend is available from the dashboard.
Never IP-allowlist — CANDI has no static source IPs. Dedupe on id.
On the customer's return to success_url, CANDI appends checkout_id,
order_id, customer_id, subscription_id, product_id, request_id
and signature. Verify:
signature == SHA256hex("checkout_id={v}|order_id={v}|...|salt={apiKey}"),
params in ARRIVAL order (not sorted), null/empty values excluded.
| id required | string event id (evt_...) |
| eventType required | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| mode required | string Enum: "prod" "test" "local" "sandbox" |
| created_at | string <date-time> |
required | object |
{- "id": "string",
- "eventType": "checkout.completed",
- "mode": "prod",
- "created_at": "2019-08-24T14:15:22Z",
- "object": { }
}| id required | string event id (evt_...) |
| eventType required | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| mode required | string Enum: "prod" "test" "local" "sandbox" |
| created_at | string <date-time> |
required | object |
{- "id": "string",
- "eventType": "checkout.completed",
- "mode": "prod",
- "created_at": "2019-08-24T14:15:22Z",
- "object": { }
}| id required | string event id (evt_...) |
| eventType required | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| mode required | string Enum: "prod" "test" "local" "sandbox" |
| created_at | string <date-time> |
required | object |
{- "id": "string",
- "eventType": "checkout.completed",
- "mode": "prod",
- "created_at": "2019-08-24T14:15:22Z",
- "object": { }
}| id required | string event id (evt_...) |
| eventType required | string (EventType) Enum: "checkout.completed" "subscription.active" "subscription.paid" "subscription.canceled" "subscription.scheduled_cancel" "subscription.past_due" "subscription.expired" "subscription.trialing" "subscription.paused" "subscription.update" "refund.created" "dispute.created" |
| mode required | string Enum: "prod" "test" "local" "sandbox" |
| created_at | string <date-time> |
required | object |
{- "id": "string",
- "eventType": "checkout.completed",
- "mode": "prod",
- "created_at": "2019-08-24T14:15:22Z",
- "object": { }
}