API reference

Merchant

Your business profile — the trading name, site and overpayment policy the hosted checkout shows a payer (merchant accounts).

GET/v1/lookup

Console sessions only. ref is the MolnPay ID printed first on every receipt (MOLN- and twelve letters and digits). Returns which kind of record it names — deposit, payout, bridge_order, own_wallet_transfer, balance_release, conversion or swap — and the record in the shape its own endpoint returns; a swap comes back as every conversion row it wrote.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Query Parameters

ref*string

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/lookup?ref=string"
{  "object": "lookup",  "ref": "string",  "kind": "deposit",  "records": [    {}  ]}
GET/v1/merchant

What a payer is shown about you on a checkout link: the trading name, your site, your logo, and what happens to money sent beyond the invoice price. tolerance_bps and tolerance_min_cents come with it and are PLATFORM-WIDE, not yours to set — they are here so you can state the same band we settle against.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant"
{  "object": "merchant",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "display_name": "string",  "website_url": "string",  "logo_url": "string",  "overpayment_policy": "keep",  "settlement_asset": "string",  "checkout_template": "string",  "status": "active",  "domain": "string",  "domain_verified": true,  "tolerance_bps": 0,  "tolerance_min_cents": "string",  "created_at": "2019-08-24T14:15:22Z"}
PATCH/v1/merchant

Send only the fields you are changing. Requires merchant:write, which is NOT granted by default on any key kind — everything this writes is read by strangers on a payment page, so a leaked storefront key must not be able to rename your business.

domain and logo_url are deliberately not writable here: the first is a claim we verified, the second is set by uploading a file. website_url is your own unverified link and is stated as such wherever it is shown.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Properties1 <= properties

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/v1/merchant" \  -H "Content-Type: application/json" \  -d '{}'
{  "object": "merchant",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "display_name": "string",  "website_url": "string",  "logo_url": "string",  "overpayment_policy": "keep",  "settlement_asset": "string",  "checkout_template": "string",  "status": "active",  "domain": "string",  "domain_verified": true,  "tolerance_bps": 0,  "tolerance_min_cents": "string",  "created_at": "2019-08-24T14:15:22Z"}
GET/v1/merchant/domain

The verified domain (or null), how it was proven, and — for a pending claim or a verified domain — the three proofs you can publish: a DNS TXT record, a meta tag, or an HTML file. Once a domain is verified, every API key's origin_allowlist, every webhook endpoint URL and every invoice return_url / cancel_url on a live project must be on it.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/domain"
{  "object": "merchant_domain",  "domain": "string",  "verified": true,  "verified_at": "2019-08-24T14:15:22Z",  "method": "dns",  "last_checked_at": "2019-08-24T14:15:22Z",  "unverifies_at": "2019-08-24T14:15:22Z",  "claim": {    "domain": "string",    "expires_at": "2019-08-24T14:15:22Z",    "last_attempt_at": "2019-08-24T14:15:22Z",    "state": "idle",    "watching_until": "2019-08-24T14:15:22Z",    "gave_up_at": "2019-08-24T14:15:22Z"  },  "proof": {    "dns": {      "type": "TXT",      "host": "string",      "value": "string"    },    "meta": {      "url": "string",      "tag": "string"    },    "file": {      "url": "string",      "content": "string"    }  }}
POST/v1/merchant/domain

Mints a random token, good for 72 hours, and returns the three proofs. A verified domain stays verified until the new one passes. Signed-in owner or admin only — never a key.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/domain" \  -H "Content-Type: application/json" \  -d '{    "domain": "example.com"  }'
{  "object": "merchant_domain",  "domain": "string",  "verified": true,  "verified_at": "2019-08-24T14:15:22Z",  "method": "dns",  "last_checked_at": "2019-08-24T14:15:22Z",  "unverifies_at": "2019-08-24T14:15:22Z",  "claim": {    "domain": "string",    "expires_at": "2019-08-24T14:15:22Z",    "last_attempt_at": "2019-08-24T14:15:22Z",    "state": "idle",    "watching_until": "2019-08-24T14:15:22Z",    "gave_up_at": "2019-08-24T14:15:22Z"  },  "proof": {    "dns": {      "type": "TXT",      "host": "string",      "value": "string"    },    "meta": {      "url": "string",      "tag": "string"    },    "file": {      "url": "string",      "content": "string"    }  }}
POST/v1/merchant/domain/check

Looks for the proof now: DNS first (at your domain's own nameservers), then the meta tag, then the HTML file — or only method if given. The first that passes verifies the domain at once.

On a miss, MolnPay keeps looking every 10 minutes for one hour, then stops and reports claim.state: gave_up with what it found on each method. Nothing is retried after that until you call this again.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/domain/check" \  -H "Content-Type: application/json" \  -d '{}'
{  "object": "merchant_domain",  "domain": "string",  "verified": true,  "verified_at": "2019-08-24T14:15:22Z",  "method": "dns",  "last_checked_at": "2019-08-24T14:15:22Z",  "unverifies_at": "2019-08-24T14:15:22Z",  "claim": {    "domain": "string",    "expires_at": "2019-08-24T14:15:22Z",    "last_attempt_at": "2019-08-24T14:15:22Z",    "state": "idle",    "watching_until": "2019-08-24T14:15:22Z",    "gave_up_at": "2019-08-24T14:15:22Z"  },  "proof": {    "dns": {      "type": "TXT",      "host": "string",      "value": "string"    },    "meta": {      "url": "string",      "tag": "string"    },    "file": {      "url": "string",      "content": "string"    }  }}
GET/v1/merchant/me

Console sessions only. The signed-in member's role (owner, admin, finance, developer, viewer) and what it may do — the console's chrome reads this. An API key has no role: it carries scopes instead.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/me"
{  "object": "membership",  "user_id": "string",  "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea",  "organization_id": "string",  "role": "owner",  "role_summary": "string",  "can": {    "manage_team": true,    "manage_keys": true,    "move_money": true,    "update_profile": true,    "update_billing": true,    "transfer_ownership": true  }}
GET/v1/merchant/team

Console sessions only. The owner, every member with their role, the open invitations, and the seats: how many members beyond the owner your plan includes, what one more costs a month, and how many are in use or invited.

Members and invitations are written through Better Auth's organization endpoints under /v1/auth/organization/ (invite-member, cancel-invitation, update-member-role, remove-member), which enforce the roles and the seats.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/team"
{  "object": "team",  "your_role": "owner",  "organization_id": "string",  "owner": {    "user_id": "string",    "email": "string",    "name": "string"  },  "members": [    {      "id": "string",      "user_id": "string",      "email": "string",      "name": "string",      "role": "string",      "since": "2019-08-24T14:15:22Z"    }  ],  "invitations": [    {      "id": "string",      "email": "string",      "role": "string",      "expires_at": "2019-08-24T14:15:22Z",      "invited_by": "string"    }  ],  "seats": {    "included": 0,    "extra_seat_cents": "string",    "members": 0,    "pending": 0  }}
GET/v1/merchant/passkeys

Console sessions only, and per person: the signed-in member's own passkeys. They confirm withdrawals and withdrawal-address changes; the authenticator code remains the fallback.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/passkeys"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "data": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "label": "string",      "device_type": "string",      "backed_up": true,      "created_at": "2019-08-24T14:15:22Z",      "last_used_at": "2019-08-24T14:15:22Z"    }  ]}
POST/v1/merchant/passkeys

The browser's RegistrationResponseJSON for the options from POST /v1/merchant/passkeys/options. Takes effect immediately, and the person is emailed.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/passkeys" \  -H "Content-Type: application/json" \  -d '{    "label": "string",    "response": {}  }'
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "total": 0}
POST/v1/merchant/passkeys/challenge

WebAuthn PublicKeyCredentialRequestOptionsJSON. Single use, five minutes. Sign it with the browser and send the result as passkey on a withdrawal, an address change, or a passkey change.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/passkeys/challenge"
{}
POST/v1/merchant/passkeys/options

Proof first: once you have any factor, a passkey or totp_code; the very first factor is bought with your password. Returns WebAuthn PublicKeyCredentialCreationOptionsJSON.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/passkeys/options" \  -H "Content-Type: application/json" \  -d '{}'
{}
DELETE/v1/merchant/passkeys/{id}

Needs a second factor. Removing the last one while no authenticator is enrolled pauses withdrawals until a factor is set up again. The person is emailed.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Path Parameters

id*string
Formatuuid

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/v1/merchant/passkeys/497f6eca-6276-4993-bfeb-53cbbbba6f08" \  -H "Content-Type: application/json" \  -d '{}'
{  "removed": true,  "remaining": 0}
GET/v1/merchant/notifications

Console sessions only; any member may read. The topics (each with whether it is on), the notification addresses (pending until the code mailed to them is entered), the daily summary's zone and hour, and whether a private feed is live.

Notices are built from the same events GET /v1/events and your webhooks carry. Topics marked required — a payout awaiting approval, a failed payout, a reversed deposit, a balance moved by MolnPay staff, a disabled webhook endpoint — cannot be switched off.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/notifications"
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
PATCH/v1/merchant/notifications

Owner or admin. Send only what changes: topics as { "deposits": false }, include_test_mode, timezone (IANA, e.g. Europe/Stockholm), summary_hour (0–23, local). Every optional topic starts off. Turning a required topic off is refused with topic_required; turning on a topic your plan does not include (available: false) is refused with alerts_not_on_plan (422).

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/v1/merchant/notifications" \  -H "Content-Type: application/json" \  -d '{}'
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
POST/v1/merchant/notifications/recipients

Owner or admin. Mails a six-digit code to the address; nothing else is sent to it until the code is entered (…/verify). Up to five addresses.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/recipients" \  -H "Content-Type: application/json" \  -d '{    "email": "user@example.com"  }'
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
DELETE/v1/merchant/notifications/recipients/{id}

Owner or admin. The last confirmed address cannot be removed (last_recipient): the always-on notices must reach someone.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Path Parameters

id*string

The recipient id.

Formatuuid

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/v1/merchant/notifications/recipients/497f6eca-6276-4993-bfeb-53cbbbba6f08"
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
POST/v1/merchant/notifications/recipients/{id}/verify

Owner or admin. The code expires after 30 minutes and allows five wrong tries.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Path Parameters

id*string

The recipient id.

Formatuuid

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/recipients/497f6eca-6276-4993-bfeb-53cbbbba6f08/verify" \  -H "Content-Type: application/json" \  -d '{    "code": "string"  }'
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
POST/v1/merchant/notifications/recipients/{id}/resend

Owner or admin. At most once a minute per address.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Path Parameters

id*string

The recipient id.

Formatuuid

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/recipients/497f6eca-6276-4993-bfeb-53cbbbba6f08/resend"
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
POST/v1/merchant/notifications/test

Owner or admin. One test mail to every confirmed address; it appears in the delivery log.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/test"
{  "object": "notification_test",  "recipients": 0,  "sent": 0}
POST/v1/merchant/notifications/feed

Owner or admin. Returns the Atom and RSS URLs ONCE — the token in them is the feed's only credential and is stored hashed. Any previous URL stops working.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/feed"
{  "object": "notification_feed",  "token": "string",  "atom_url": "http://example.com",  "rss_url": "http://example.com"}
DELETE/v1/merchant/notifications/feed
AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/v1/merchant/notifications/feed"
{  "object": "notification_settings",  "plan": {    "alerts_available": true,    "required_plan": "string"  },  "can_manage": true,  "mail_configured": true,  "include_test_mode": true,  "timezone": "string",  "summary_hour": 0,  "topics": [    {      "key": "string",      "label": "string",      "description": "string",      "group": "money_in",      "required": true,      "available": true,      "enabled": true    }  ],  "recipients": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "email": "string",      "status": "pending",      "verified_at": "2019-08-24T14:15:22Z",      "code_sent_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ],  "max_recipients": 0,  "feed": {    "active": true,    "token_prefix": "string",    "created_at": "2019-08-24T14:15:22Z"  }}
GET/v1/merchant/notifications/deliveries

Console sessions only. Every notice we tried to send, to which address, and whether it went.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Query Parameters

limit?integer
Range1 <= value <= 200
Default100

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/notifications/deliveries"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "data": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "topic": "string",      "topic_label": "string",      "channel": "email",      "recipient": "string",      "subject": "string",      "livemode": true,      "status": "sending",      "error": "string",      "event_id": "string",      "created_at": "2019-08-24T14:15:22Z",      "sent_at": "2019-08-24T14:15:22Z"    }  ]}
GET/v1/merchant/notifications/inbox

Deposits, payouts, invoices, refunds, conversions, balance adjustments and funding top-ups worth telling a person about, newest first, within your plan's history window — each as a notice in plain words (the same as the notification email). unread is across the account for the calling member, up to 100.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Query Parameters

limit?integer
Range1 <= value <= 50
Default20
before?string

next_cursor of the previous page.

category?string

Comma list of categories.

unread?string

Value in

  • "true"
  • "false"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/notifications/inbox"
{  "object": "inbox",  "data": [    {      "id": "string",      "category": "invoices",      "tone": "success",      "subject": "string",      "heading": "string",      "summary": "string",      "amount": {        "value": "string",        "asset": "string",        "tone": "sent"      },      "facts": [        {          "label": "string",          "value": "string",          "mono": true        }      ],      "hashes": [        {          "label": "string",          "value": "string",          "href": "string"        }      ],      "alert": "string",      "cta": {        "label": "string",        "path": "string"      },      "livemode": true,      "created": "2019-08-24T14:15:22Z",      "unread": true    }  ],  "has_more": true,  "next_cursor": "string",  "unread": 0,  "unread_capped": true}
GET/v1/merchant/notifications/inbox/{id}
AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Path Parameters

id*string

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/notifications/inbox/string"
{  "id": "string",  "category": "invoices",  "tone": "success",  "subject": "string",  "heading": "string",  "summary": "string",  "amount": {    "value": "string",    "asset": "string",    "tone": "sent"  },  "facts": [    {      "label": "string",      "value": "string",      "mono": true    }  ],  "hashes": [    {      "label": "string",      "value": "string",      "href": "string"    }  ],  "alert": "string",  "cta": {    "label": "string",    "path": "string"  },  "livemode": true,  "created": "2019-08-24T14:15:22Z",  "unread": true}
POST/v1/merchant/notifications/inbox/{id}/read

For the calling member only.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Path Parameters

id*string

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/inbox/string/read"
{  "object": "inbox_read",  "id": "string"}
POST/v1/merchant/notifications/inbox/read-all

For the calling member only; every notice there is, not just a loaded page.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/merchant/notifications/inbox/read-all"
{  "object": "inbox_read_all"}
GET/v1/feeds/{token}/events.atom

Unauthenticated: the nf_ token in the path is the whole credential (create it with POST /v1/merchant/notifications/feed). The latest 50 events, newest first, within your plan's history window. For feed readers and the RSS apps of Slack and Teams.

Path Parameters

token*string

Response Body

application/atom+xml

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/feeds/string/events.atom"
"string"
GET/v1/feeds/{token}/events.rss

The same entries as the Atom feed, as RSS 2.0.

Path Parameters

token*string

Response Body

application/rss+xml

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/feeds/string/events.rss"
"string"
GET/v1/merchant/chains

Your plan includes a number of chains (included); every chain you switch on beyond that is charged extra_chain_cents a month, prorated for the rest of the month you switch it on in and in full on the 1st after that. Enterprise includes every chain.

The switches limit the WALLET SERVICE only — where POST /v1/wallets may issue a static deposit address to one of your customers. Invoices and hosted checkout, your own wallet, payouts and conversions use every chain the platform serves your project (available) whatever is switched on here.

A LIVE project that has never chosen has no wallet-service chains: POST /v1/wallets answers chain_not_enabled until you switch something on here or in the dashboard. A test project with no choice gets every chain the platform serves, so trying the API needs no setup. Once you choose, the choice applies in both modes.

effective is what POST /v1/wallets gets right now — your selection narrowed to what the platform serves your project, the same list GET /v1/ping reports as wallet_chains.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/merchant/chains"
{  "object": "merchant_chains",  "plan": "string",  "included": 0,  "extra_chain_cents": "string",  "chosen": true,  "selected": [    "string"  ],  "effective": [    "string"  ],  "chains": [    {      "chain": "string",      "name": "string",      "available": true,      "on": true,      "role": "included"    }  ]}
PUT/v1/merchant/chains

Send the full list of chains you want ON. Chains already on keep their place in the order (and so whether they are included or extra); new ones go on the end; anything missing is switched off. Requires merchant:write.

Switching an EXTRA chain on charges the rest of this month to your operational balance at once and is refused if the balance cannot carry it. Switching a chain off stops new addresses and invoices on it immediately, credits nothing back for the month, and never touches addresses your customers already hold — they keep receiving.

AuthorizationBearer <token>

Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.

The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding. Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key. A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.

The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/v1/merchant/chains" \  -H "Content-Type: application/json" \  -d '{    "chains": [      "string"    ]  }'
{  "object": "merchant_chains",  "plan": "string",  "included": 0,  "extra_chain_cents": "string",  "chosen": true,  "selected": [    "string"  ],  "effective": [    "string"  ],  "chains": [    {      "chain": "string",      "name": "string",      "available": true,      "on": true,      "role": "included"    }  ]}