Build on StixFlow
StixFlow is a programmable payments platform for stores, catalog, and hosted checkout β sandbox first, live after KYB.
What you can build
- Multi-store catalogs with products, variants, and prices (amounts in cents)
- Hosted checkout sessions that return a payer-facing
url - Direct vs MoR payment models with platform application fees
- Refunds, cancels, and durable payment events
- HMAC-signed webhooks (
StixFlow-Signature)
Start here
How integration usually goes
- 1Register, open the dashboard, copy your
sk_test_key. - 2Complete sandbox KYB in the dashboard so checkout can charge.
- 3Create a store β product β price β checkout session.
- 4Register a webhook endpoint and verify
StixFlow-Signature. - 5Request production, finish live KYB, switch to
sk_live_.
Authentication
Merchant REST endpoints require a secret API key:
Authorization: Bearer sk_test_β¦
Test keys start with sk_test_; live keys with sk_live_. Create keys in the dashboard after registration. Live keys unlock when production KYB is approved.
https://your-stixflow-host β use your live origin, or the same host you are browsing in local/dev. Paths below are relative to that origin.
Webhooks
Register endpoints via POST /api/v1/webhook-endpoints or the dashboard. Events:
payment.succeeded
payment.failed
payment.canceled
payment.refunded
Partner payment webhooks are ingested by StixFlow. You receive one outbound POST per merchant event, with StixFlow event names only.
Verify StixFlow-Signature: t={unix},v1={hmac} where v1 is hex HMAC-SHA256 of t + '.' + raw_body using your whsec_β¦ secret.
Example β payment.succeeded
{
"id": "evt_β¦",
"object": "event",
"type": "payment.succeeded",
"created": 1726500000,
"livemode": false,
"request_id": "req_β¦",
"data": {
"object": {
"object": "payment",
"id": "pay_β¦",
"amount": 1999,
"currency": "eur",
"status": "succeeded",
"payment_model": "direct",
"livemode": false
}
}
}
Sandbox & go-live
Use a sk_test_ key against the same /api/v1/* paths. Complete KYB in the dashboard for sandbox and live separately.
- Checkout requires active KYB for the same livemode (
kyb_requiredotherwise). - After live KYB and a signed production agreement, create
sk_live_*keys in the dashboard.
Base URL
https://your-stixflow-host
Header: Authorization: Bearer sk_test_β¦
Stores
List stores for the authenticated merchant.
{
"name": "Main store",
"slug": "main-store",
"currency": "eur"
}
Catalog
Create products and prices (amounts in minor units / cents).
{
"name": "Pro plan",
"description": "Monthly access",
"product_type": "digital",
"amount": 2900,
"currency": "eur"
}
{
"product": "prod_β¦",
"variant": "var_β¦",
"amount": 1999,
"currency": "eur",
"type": "one_time"
}
Checkout
Required: store_id, items, customer_email, success_url, failed_url. Buyer identity is the email: StixFlow resolves customer.id from it and assigns the order. customer_first_name / customer_last_name required only for a new email. Each item needs product id and quantity; the name comes from the catalog.
{
"store_id": "sto_β¦",
"items": [{ "id": "prod_β¦", "quantity": 1 }],
"customer_email": "[email protected]",
"customer_first_name": "Jane",
"customer_last_name": "Doe",
"success_url": "https://example.com/success",
"failed_url": "https://example.com/failed"
}
Response includes customer.id (cus_β¦) linked to the order.
Payments
GET /api/v1/paymentsβ listGET /api/v1/payments/{id}β retrievePOST /api/v1/payments/{id}/refundβ body{ "amount": 1200 }optionalPOST /api/v1/payments/{id}/cancel
Also: GET /api/v1/events and GET /api/v1/events/{id} for durable outbound events.