πŸ‡¬πŸ‡§ EN β†’ Login
Welcome

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

  1. 1Register, open the dashboard, copy your sk_test_ key.
  2. 2Complete sandbox KYB in the dashboard so checkout can charge.
  3. 3Create a store β†’ product β†’ price β†’ checkout session.
  4. 4Register a webhook endpoint and verify StixFlow-Signature.
  5. 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.

Base URL: 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.

POST your endpoint Outbound

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_required otherwise).
  • After live KYB and a signed production agreement, create sk_live_* keys in the dashboard.

Base URL

API host
https://your-stixflow-host

Header: Authorization: Bearer sk_test_…

Stores

GET /api/v1/stores

List stores for the authenticated merchant.

POST /api/v1/stores
{
  "name": "Main store",
  "slug": "main-store",
  "currency": "eur"
}

Catalog

Create products and prices (amounts in minor units / cents).

POST /api/v1/products
{
  "name": "Pro plan",
  "description": "Monthly access",
  "product_type": "digital",
  "amount": 2900,
  "currency": "eur"
}
POST /api/v1/prices
{
  "product": "prod_…",
  "variant": "var_…",
  "amount": 1999,
  "currency": "eur",
  "type": "one_time"
}

Checkout

POST /api/v1/checkout-sessions

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 β€” list
  • GET /api/v1/payments/{id} β€” retrieve
  • POST /api/v1/payments/{id}/refund β€” body { "amount": 1200 } optional
  • POST /api/v1/payments/{id}/cancel

Also: GET /api/v1/events and GET /api/v1/events/{id} for durable outbound events.