Checkout sessions
Checkout sessions are the primary way to accept payments through Skiro. Create a session server-side, then redirect your customer to the returned URL.
Create a session
POST /v1/checkout
Parameters
| Field | Type | Description |
|---|---|---|
amount | number | Required. Amount to charge, in the smallest unit of the currency. For USD, this is dollars (e.g. 49.99). |
currency | string | Required. ISO 4217 currency code. Supported: USD, EUR, GBP, CAD, AUD. |
payout_currency | string | Required. The crypto you want to receive. Supported: USDT, USDC, BTC, ETH. |
customer_email | string | Optional. Pre-fills the email field on checkout. |
metadata | object | Optional. Up to 50 key/value pairs for your records. Returned in webhook payloads. |
redirect_url | string | Optional. Where to send the customer after a successful payment. |
webhook_url | string | Optional. Override your default webhook URL for this session. |
Example request
curl https://api.skiro.io/v1/checkout \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"amount": 49.99,
"currency": "USD",
"payout_currency": "USDT",
"customer_email": "buyer@example.com",
"metadata": {
"order_id": "ORD-2847",
"product": "premium-license"
},
"redirect_url": "https://yoursite.com/order/success",
"webhook_url": "https://yoursite.com/api/webhooks/skiro"
}'Example response
{
"id": "cs_8f2a91c...",
"url": "https://pay.skiro.io/cs_8f2a91c...",
"amount": 49.99,
"currency": "USD",
"payout_currency": "USDT",
"status": "pending",
"metadata": {
"order_id": "ORD-2847",
"product": "premium-license"
},
"redirect_url": "https://yoursite.com/order/success",
"webhook_url": "https://yoursite.com/api/webhooks/skiro",
"expires_at": "2026-05-29T15:02:00Z",
"created_at": "2026-05-29T14:32:00Z"
}Sessions expire after 1 hour
If a customer doesn't complete the checkout in time, the session moves to
expired state and can't be used. Just create a new one.Retrieve a session
GET /v1/checkout/{id}
Useful for confirming the session status server-side, especially if you don't want to rely solely on webhooks.
const session = await skiro.checkout.retrieve('cs_8f2a91c...')
console.log(session.status) // 'pending' | 'completed' | 'failed' | 'expired'Expire a session
POST /v1/checkout/{id}/expire
Manually expires a session before its 1-hour timeout. Useful if the customer abandons their cart and you want to free up the order ID.
await skiro.checkout.expire('cs_8f2a91c...')The session object
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (cs_...). |
url | string | Hosted checkout URL. Send the customer here. |
amount | number | The amount you charged. |
currency | string | The fiat currency for the charge. |
payout_currency | string | The crypto that will be sent to your wallet. |
status | string | One of pending, completed, failed, expired. |
metadata | object | The key/value pairs you attached. |
expires_at | string | ISO 8601 timestamp. After this, the session can't be paid. |
created_at | string | ISO 8601 timestamp. |