MolnPayDocs
API reference

Wallets

GET/v1/wallets

The active address is included on every row, so a table of deposit addresses is one request rather than one per wallet. A wallet whose address is still being derived, or all of whose addresses are retired, comes back without the address field.

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 <= 100
Default25
cursor?string

Opaque cursor from the previous page's next_cursor.

customer_id?string
Formatuuid
chain?string

Value in

  • "ethereum"
  • "bsc"
  • "polygon"
  • "arbitrum"
  • "base"
  • "avalanche"
  • "tron"
  • "solana"
  • "ton"
  • "bitcoin"
  • "dogecoin"
  • "optimism"
  • "linea"
  • "zksync"
  • "scroll"
role?string

Value in

  • "customer"
  • "master"
  • "gas_station"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/wallets"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "data": [    {      "object": "wallet",      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",      "chain": "ethereum",      "role": "customer",      "status": "string",      "external": true,      "account_kind": "eoa",      "address": "string",      "memo": "string",      "created_at": "2019-08-24T14:15:22Z"    }  ]}
POST/v1/wallets

Idempotent BY CONSTRUCTION — there is one wallet per (customer, chain). Calling again returns the same address with 200. Deriving a second address would split the customer's deposits across addresses your UI does not show.

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 POST "https://example.com/v1/wallets" \  -H "Content-Type: application/json" \  -d '{    "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",    "chain": "ethereum"  }'
{  "object": "wallet",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",  "chain": "ethereum",  "role": "customer",  "status": "string",  "external": true,  "account_kind": "eoa",  "address": "string",  "memo": "string",  "created_at": "2019-08-24T14:15:22Z"}
GET/v1/wallets/{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
Formatuuid

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/wallets/497f6eca-6276-4993-bfeb-53cbbbba6f08"
{  "object": "wallet",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",  "chain": "ethereum",  "role": "customer",  "status": "string",  "external": true,  "account_kind": "eoa",  "address": "string",  "memo": "string",  "created_at": "2019-08-24T14:15:22Z"}
GET/v1/wallets/{id}/addresses

Includes retired addresses. They stay monitored forever, so funds sent to an old one are still credited and you may need to explain where they came from.

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

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/wallets/497f6eca-6276-4993-bfeb-53cbbbba6f08/addresses"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "data": [    {      "object": "address",      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "wallet_id": "d9a8fbfc-848f-43a2-9168-911ed3a04a48",      "address": "string",      "memo": "string",      "chain": "ethereum",      "is_primary": true,      "retired_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z"    }  ]}
GET/v1/addresses/{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

address*string

Query Parameters

chain*string

Value in

  • "ethereum"
  • "bsc"
  • "polygon"
  • "arbitrum"
  • "base"
  • "avalanche"
  • "tron"
  • "solana"
  • "ton"
  • "bitcoin"
  • "dogecoin"
  • "optimism"
  • "linea"
  • "zksync"
  • "scroll"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/addresses/string?chain=ethereum"
{  "object": "address",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "wallet_id": "d9a8fbfc-848f-43a2-9168-911ed3a04a48",  "address": "string",  "memo": "string",  "chain": "ethereum",  "is_primary": true,  "retired_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z"}
GET/v1/master_wallets
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/master_wallets"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "data": [    {      "object": "wallet",      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",      "chain": "ethereum",      "role": "customer",      "status": "string",      "external": true,      "account_kind": "eoa",      "address": "string",      "memo": "string",      "created_at": "2019-08-24T14:15:22Z"    }  ]}
POST/v1/master_wallets

Omit address and we generate and custody it. Supply address and it is watch-only: sweeps can target it, but nothing here can ever spend from 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

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/master_wallets" \  -H "Content-Type: application/json" \  -d '{    "chain": "ethereum"  }'
{  "object": "wallet",  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",  "chain": "ethereum",  "role": "customer",  "status": "string",  "external": true,  "account_kind": "eoa",  "address": "string",  "memo": "string",  "created_at": "2019-08-24T14:15:22Z"}