Wallets & keys
Your inventory after the sale. Retrieving keys, the format they come in, and tracking who each wallet is for.
Once an order settles, the wallets are yours. They keep their whole history
(balance, age, transaction count, tier, persona) and gain three fields: the sale
they came from, the price they went out at, and a buyer_ref if you set one.
Your inventory
GET /wallets lists the wallets your organisation owns. It is cursor-paged and
filterable by chain and buyer_ref.
Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Query Parameters
Opaque keyset cursor from a prior response's next_cursor. When set, returns the page strictly after it.
nullint6450Response Body
application/json
curl -X GET "https://example.com/wallets"{ "items": [ { "aging_status": "string", "balance": "string", "buyer_ref": "string", "chain": "string", "cost_basis": "string", "created_at": "string", "first_tx_at": "string", "funded_at": "string", "funding_exchange": "string", "funding_source": "string", "id": "string", "imported": true, "last_tx_at": "string", "network": "string", "owner_org_id": "string", "persona_name": "string", "pubkey": "string", "sale_id": "string", "sold_at": "string", "source_kind": "string", "status": "string", "target_age_days": 0, "tier": "string", "timezone_name": "string", "token_holdings": [ { "balance": "string", "decimals": 0, "mint": "string", "symbol": "string", "ui_multiplier": "string", "usd_value": 0 } ], "tx_count": 0, "user_price": "string" } ], "next_cursor": "string"}Getting a key
GET /wallets/{id}/key returns one wallet's private key. It works for any
wallet you own, whichever order it came from, which makes it the endpoint to use
long after the purchase. GET /quote/{id}/keys is the other one: it hands back
a whole lot at once, and it is what you call right after settlement.
Both are idempotent and neither consumes anything. For what happens to a key while we are still holding it, see Security.
Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Path Parameters
Response Body
application/json
curl -X GET "https://example.com/wallets/string/key"{ "chain": "string", "private_key_hex": "string", "pubkey": "string", "purged_at": "string", "wallet_id": "string"}Key formats
The field is called private_key_hex, and on Solana it is not hex. The encoding
follows what each ecosystem's wallets actually import.
| Chain | Encoding |
|---|---|
solana | base58 of the full 64-byte ed25519 keypair (seed ‖ pubkey), the format Phantom, Solflare and solana-keygen produce and accept |
ethereum, base, bsc, robinhood | hex of the 32-byte secp256k1 key |
Solana wallets reject hex, and they reject the bare 32-byte seed too, so there
was not much of a choice. Read the chain field on the response and decode
accordingly.
When the key is gone
If your organisation has opted into key retention, we stop holding the keys of
the wallets you buy a set number of minutes after the sale. Past that window the
response still comes back, but with private_key_hex: null and purged_at set
to the moment it was dropped.
This is off by default, and turning it on is a one-way door for each wallet. Past the window we cannot hand the key back, because we do not have it. Make sure your own custody is in place before asking for it.
Buyer references
buyer_ref is a free-text label you attach to wallets and orders. Nothing in
the API interprets it. It exists so you can answer "which of my customers has
this wallet". You can set it at quote creation, at settlement, or afterwards.
Four endpoints manage it after the fact:
PUT /wallets/{id}/ownersets or clears it on one wallet.POST /wallets/reassignmoves every wallet from one reference to another and returns how many moved.POST /wallets/unassignclears one reference across the board.GET /wallets/userslists the distinct references currently in use, which is the raw material for a customer picker.
Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Path Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X PUT "https://example.com/wallets/string/owner" \ -H "Content-Type: application/json" \ -d '{}'{ "ok": true}Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X POST "https://example.com/wallets/reassign" \ -H "Content-Type: application/json" \ -d '{ "from_buyer_ref": "string", "to_buyer_ref": "string" }'{ "count": 0}Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X POST "https://example.com/wallets/unassign" \ -H "Content-Type: application/json" \ -d '{ "buyer_ref": "string" }'{ "count": 0}Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Response Body
application/json
curl -X GET "https://example.com/wallets/users""string"Putting money in them
Wallets bought here arrive with whatever balance they had. To add native currency, to them or to any address you own elsewhere, see Top up wallets.
Last updated on