Build on Sellix.

One JSON API. Same surface the dashboard uses. Mint a scoped bearer token, pick an endpoint below, hit the Try it button.

api.sellix.gg/v1 v1 stable JSON · UTF-8
Authentication

Bearer tokens, scoped per key.

Mint a key under Developers → API keys. Pick the abilities at creation — for example, a read-only key for analytics, a write-only key for fulfilment. Revoke instantly without touching the others.

Live key
sx_live_…

Real payouts. Real wallets. Real settlement.

Test key
sx_test_…

Sandbox — no on-chain motion, same response shapes.

Errors

RFC 7807. Always JSON.

Every non-2xx returns a structured body — never bare HTML. Branch on the type slug.

400 invalid_request Bad JSON or missing parameter.
401 unauthenticated Missing or invalid bearer token.
403 forbidden_scope Key is valid but lacks the ability for this endpoint.
404 not_found The resource doesn't exist or isn't yours.
409 conflict Idempotency key already used with a different payload.
422 unprocessable Validation failed. Body has an `errors` map per-field.
429 rate_limited You're going too fast. `Retry-After` is set.
500 server_error Our side broke. Includes a `trace_id` for support.
Rate limits & idempotency

Sane defaults, set in stone.

Rate limits

120 req/min on writes, 600 req/min on reads. Sustained bursts back-pressure with Retry-After.

Idempotency

Send Idempotency-Key on every write that moves money. Same key + same body returns the same response, no duplicate side-effect.

Products

GET
/v1/products
List products
Returns a paginated list of your products, newest first.
Parameters
  • limit optional integer query
    How many items to return per page. values:1 – 100 default:25
  • cursor optional string query
    Opaque pagination cursor from a previous response.
  • status optional enum query
    Filter by lifecycle status. values:active | archived | draft
  • type optional enum query
    Filter by product kind. values:license_key | account | file_download | physical | subscription
Example response 200
{
    "object": "list",
    "has_more": false,
    "next_cursor": null,
    "data": [
        {
            "id": "prod_01J2PVQR41",
            "name": "Adobe Creative Cloud Key",
            "type": "license_key",
            "price_cents": 12900,
            "currency": "USD",
            "stock": 47,
            "status": "active"
        },
        {
            "id": "prod_01J2PVQS6X",
            "name": "VIP Discord Role",
            "type": "account",
            "price_cents": 999,
            "currency": "USD",
            "stock": null,
            "status": "active"
        }
    ]
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/products
Create a product
Publishes a new product on the active shop.
Parameters
  • name required string body
    Display name shown on the storefront.
  • type required enum body
    Decides which delivery strategy fires on payment. values:license_key | account | file_download | dynamic | physical | subscription
  • price_cents required integer body
    Price in the smallest unit of `currency`. values:≥ 0
  • currency required string body
    Three-letter fiat currency code. values:ISO-4217 — e.g. USD, EUR, GBP
  • description optional string body
    Markdown-flavoured description body.
  • stock optional integer body
    `null` = unlimited / pool-driven. values:≥ 0 or null
Request body · editable
Example response 201
{
    "id": "prod_01J2PVQR41",
    "name": "Adobe Creative Cloud Key",
    "slug": "adobe-creative-cloud-key",
    "type": "license_key",
    "price_cents": 12900,
    "currency": "USD",
    "stock": 0,
    "status": "active",
    "created_at": "2026-05-26T07:18:03Z"
}
Try it — runs in your browser against a sandbox mock.
GET
/v1/products/{id}
Fetch a product
Returns a single product by id, including its stock count.
Parameters
  • id required string path
    The product identifier. values:prod_…
Example response 200
{
    "id": "prod_01J2PVQR41",
    "name": "Adobe Creative Cloud Key",
    "slug": "adobe-creative-cloud-key",
    "type": "license_key",
    "price_cents": 12900,
    "currency": "USD",
    "stock": 47,
    "status": "active",
    "created_at": "2026-05-26T07:18:03Z"
}
Try it — runs in your browser against a sandbox mock.
PATCH
/v1/products/{id}
Update a product
Patch any subset of editable fields. Sends back the full updated object.
Parameters
  • id required string path
    The product identifier.
  • name optional string body
    New display name.
  • price_cents optional integer body
    New price in smallest currency unit. values:≥ 0
  • status optional enum body
    Lifecycle status. values:active | archived | draft
  • description optional string body
    Markdown body.
Request body · editable
Example response 200
{
    "id": "prod_01J2PVQR41",
    "price_cents": 9900,
    "status": "active",
    "updated_at": "2026-05-26T07:32:18Z"
}
Try it — runs in your browser against a sandbox mock.
DELETE
/v1/products/{id}
Archive a product
Soft-deletes the product. Existing orders keep working.
Parameters
  • id required string path
    The product identifier. values:prod_…
Example response 200
{
    "id": "prod_01J2PVQR41",
    "deleted": true,
    "archived_at": "2026-05-26T07:36:51Z"
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/products/{id}/keys
Bulk-import license keys
Adds keys to a license-key product's pool. Up to 5,000 per call.
Parameters
  • id required string path
    License-key product id.
  • keys required array<string> body
    List of opaque key strings to add to the pool. values:1 – 5,000
Request body · editable
Example response 201
{
    "imported": 3,
    "duplicates": 0,
    "stock_after": 50
}
Try it — runs in your browser against a sandbox mock.

Orders

GET
/v1/orders
List orders
Returns a paginated list of orders for the active shop.
Parameters
  • limit optional integer query
    Items per page. values:1 – 100 default:25
  • status optional enum query
    Filter by order status. values:pending | awaiting_payment | paid | delivering | completed | failed | refunded
  • from optional string query
    Created at or after this date. values:ISO-8601 date
  • to optional string query
    Created at or before this date. values:ISO-8601 date
Example response 200
{
    "object": "list",
    "has_more": false,
    "next_cursor": null,
    "data": [
        {
            "id": "ord_01J2PVP4XJ",
            "status": "paid",
            "total_cents": 4900,
            "currency": "USD",
            "customer_email": "[email protected]",
            "paid_at": "2026-05-26T07:14:22Z"
        },
        {
            "id": "ord_01J2PVN29D",
            "status": "paid",
            "total_cents": 12900,
            "currency": "USD",
            "customer_email": "[email protected]",
            "paid_at": "2026-05-26T07:09:58Z"
        }
    ]
}
Try it — runs in your browser against a sandbox mock.
GET
/v1/orders/{uuid}
Fetch an order
Returns one order with items, payment details and delivery state.
Parameters
  • uuid required string path
    The order identifier. values:ord_…
Example response 200
{
    "id": "ord_01J2PVP4XJ",
    "status": "paid",
    "total_cents": 4900,
    "currency": "USD",
    "customer_email": "[email protected]",
    "paid_at": "2026-05-26T07:14:22Z",
    "payment": {
        "provider": "blockpn",
        "chain": "tron",
        "asset": "USDT",
        "tx_hash": "0xae9c2\u2026"
    },
    "items": [
        {
            "product": "Adobe Creative Cloud Key",
            "qty": 1,
            "subtotal_cents": 4900
        }
    ],
    "delivery": {
        "kind": "license_key",
        "state": "delivered",
        "delivered_at": "2026-05-26T07:14:24Z"
    }
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/orders/{uuid}/refund
Refund an order
Refunds the full amount, or a partial amount if you set `amount_cents`.
Parameters
  • uuid required string path
    The order identifier.
  • amount_cents optional integer body
    Defaults to the full order total. values:> 0 and ≤ order total
  • reason optional enum body
    For your accounting + the buyer receipt. values:requested_by_buyer | duplicate | fraud | other
  • note optional string body
    Internal note attached to the refund record.
Request body · editable
Example response 200
{
    "id": "rf_01J2PVS78B",
    "order_id": "ord_01J2PVP4XJ",
    "status": "processing",
    "amount_cents": 4900,
    "reason": "requested_by_buyer",
    "destination_tx": null,
    "created_at": "2026-05-26T07:22:51Z"
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/orders/{uuid}/resend
Re-send delivery email
Re-fires the delivery email for a paid order (license key, file links, etc.).
Parameters
  • uuid required string path
    The order identifier. values:ord_…
Request body · editable
Example response 200
{
    "sent_at": "2026-05-26T07:41:09Z",
    "recipient": "[email protected]",
    "delivery_kind": "license_key"
}
Try it — runs in your browser against a sandbox mock.

Customers

GET
/v1/customers
List customers
Returns a paginated list of unique customer emails for the active shop.
Parameters
  • limit optional integer query
    Items per page. values:1 – 100 default:25
  • cursor optional string query
    Opaque pagination cursor.
Example response 200
{
    "object": "list",
    "has_more": false,
    "data": [
        {
            "id": "cus_01J2PR9M5C",
            "email": "[email protected]",
            "orders_count": 8,
            "lifetime_cents": 103200
        },
        {
            "id": "cus_01J2PRA1FE",
            "email": "[email protected]",
            "orders_count": 3,
            "lifetime_cents": 149700
        }
    ]
}
Try it — runs in your browser against a sandbox mock.
GET
/v1/customers/{id}
Fetch a customer
Returns one customer with their order history and lifetime metrics.
Parameters
  • id required string path
    Customer identifier. values:cus_…
Example response 200
{
    "id": "cus_01J2PR9M5C",
    "email": "[email protected]",
    "orders_count": 8,
    "lifetime_cents": 103200,
    "first_seen_at": "2026-04-12T09:21:55Z",
    "last_seen_at": "2026-05-26T07:14:22Z",
    "orders": [
        {
            "id": "ord_01J2PVP4XJ",
            "total_cents": 4900,
            "paid_at": "2026-05-26T07:14:22Z"
        },
        {
            "id": "ord_01J0HE83KW",
            "total_cents": 12900,
            "paid_at": "2026-05-19T22:01:08Z"
        }
    ]
}
Try it — runs in your browser against a sandbox mock.

Payouts

GET
/v1/payouts
List payouts
Returns a paginated list of payouts triggered from this tenant.
Parameters
  • limit optional integer query
    Items per page. values:1 – 100 default:25
  • status optional enum query
    Filter by payout status. values:queued | broadcast | confirmed | failed
Example response 200
{
    "object": "list",
    "has_more": false,
    "data": [
        {
            "id": "po_01J2PVZ8KK",
            "status": "confirmed",
            "chain": "tron",
            "asset": "USDT",
            "amount_cents": 25000,
            "tx_hash": "0xfa3b\u2026",
            "confirmed_at": "2026-05-26T08:01:11Z"
        }
    ]
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/payouts
Trigger a payout
Queues a payout from your BlockPN wallet to the destination address.
Parameters
  • chain required enum body
    Network to broadcast on. values:tron | base | ethereum | bitcoin | solana | polygon | bsc
  • asset required string body
    Asset symbol on that chain. values:USDT | USDC | BTC | ETH | SOL | …
  • amount_cents required integer body
    Amount in fiat-cents (we convert on the way out). values:> 0
  • destination_address required string body
    On-chain address to send to.
  • memo optional string body
    Optional memo/tag for chains that need one.
Request body · editable
Example response 201
{
    "id": "po_01J2PW01GG",
    "status": "queued",
    "chain": "tron",
    "asset": "USDT",
    "amount_cents": 25000,
    "destination_address": "T...",
    "created_at": "2026-05-26T08:03:47Z"
}
Try it — runs in your browser against a sandbox mock.

Webhooks

GET
/v1/webhooks
List endpoints
Returns every webhook endpoint registered for the active shop.
Example response 200
{
    "object": "list",
    "data": [
        {
            "id": "wh_01J2PTR7QW",
            "url": "https://your.app/sellix/webhook",
            "events": [
                "order.paid",
                "order.refunded"
            ],
            "status": "active"
        }
    ]
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/webhooks
Register an endpoint
Subscribes a URL to one or more event types. Returns the signing secret.
Parameters
  • url required string body
    HTTPS URL we POST to.
  • events required array<string> body
    Events to subscribe to. Use `*` for all. values:order.paid | order.refunded | order.delivered | order.failed | product.* | payout.* | customer.created
  • description optional string body
    Human-readable note. Shown in the dashboard.
Request body · editable
Example response 201
{
    "id": "wh_01J2PVT0KZ",
    "url": "https://your.app/sellix/webhook",
    "events": [
        "order.paid",
        "order.refunded"
    ],
    "signing_secret": "whsec_29Ax\u2026",
    "status": "active",
    "created_at": "2026-05-26T08:08:14Z"
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/webhooks/{id}/test
Fire a test event
Sends a synthetic event to the endpoint so you can verify your handler.
Parameters
  • id required string path
    Endpoint identifier.
  • event optional enum body
    Which event type to send. values:order.paid | order.refunded | … default:order.paid
Request body · editable
Example response 200
{
    "delivered": true,
    "response_code": 200,
    "delivery_ms": 184
}
Try it — runs in your browser against a sandbox mock.
DELETE
/v1/webhooks/{id}
Remove an endpoint
Stops further deliveries. In-flight retries are cancelled.
Parameters
  • id required string path
    Endpoint identifier. values:wh_…
Example response 200
{
    "id": "wh_01J2PVT0KZ",
    "deleted": true
}
Try it — runs in your browser against a sandbox mock.

API keys

GET
/v1/api-keys
List API keys
Returns metadata for every key minted under this tenant. Secret values are never returned twice.
Example response 200
{
    "object": "list",
    "data": [
        {
            "id": "apik_01J2PR\u2026",
            "name": "Fulfilment worker",
            "abilities": [
                "orders:read",
                "orders:write"
            ],
            "last_used_at": "2026-05-26T08:11:00Z"
        },
        {
            "id": "apik_01J2PS\u2026",
            "name": "Analytics dash",
            "abilities": [
                "orders:read",
                "customers:read"
            ],
            "last_used_at": null
        }
    ]
}
Try it — runs in your browser against a sandbox mock.
POST
/v1/api-keys
Mint a key
Mints a scoped key. The secret value is only returned in this response — store it.
Parameters
  • name required string body
    Human-readable label.
  • abilities required array<string> body
    Permission set this key grants. values:orders:read | orders:write | products:read | products:write | customers:read | payouts:read | payouts:write | webhooks:read | webhooks:write
  • mode optional enum body
    Live or sandbox. values:live | test default:live
Request body · editable
Example response 201
{
    "id": "apik_01J2PW2F88",
    "name": "Fulfilment worker",
    "abilities": [
        "orders:read",
        "orders:write"
    ],
    "secret": "sx_live_9kzQ7xV9c4fT2mN8rY",
    "created_at": "2026-05-26T08:15:31Z"
}
Try it — runs in your browser against a sandbox mock.
DELETE
/v1/api-keys/{id}
Revoke a key
Revokes a key instantly. Any in-flight request using it returns 401 from this point on.
Parameters
  • id required string path
    Key identifier. values:apik_…
Example response 200
{
    "id": "apik_01J2PW2F88",
    "revoked": true
}
Try it — runs in your browser against a sandbox mock.