Purchases
What you bought, what was in it, and the paper trail for the orders that never closed.
A settled quote becomes a sale. Quotes are the working record: they expire, they get cancelled, they churn. Sales are the permanent one.
Order history
GET /purchases lists your settled sales, newest first, optionally filtered by
buyer_ref. Each row is the financial summary of one order:
user_price_total, what you paid.our_price_total,cost_basis_total,margin_totalandprofit_total, the breakdown behind it.wallet_count, how many wallets were in the lot.payment_tx_hash, the transfer that paid for it, when the chain gave us one.settled_at,quote_idandbuyer_ref.
Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Query Parameters
Filter purchases (settled sales) to a single buyer reference.
nullint6450int640Response Body
application/json
curl -X GET "https://example.com/purchases"[ { "buyer_ref": "string", "chain": "string", "cost_basis_total": "string", "id": "string", "is_internal": true, "margin_total": "string", "org_id": "string", "our_price_total": "string", "payment_tx_hash": "string", "profit_total": "string", "quote_id": "string", "settled_at": "string", "sweep_tx_hash": "string", "user_price_total": "string", "wallet_count": 0 }]What was in an order
GET /purchases/{id}/wallets returns the line items: one row per wallet, with
the address, the price it went out at, and how old it was on the day of the
sale.
This endpoint deliberately returns metadata only. Private keys come from
GET /wallets/{id}/key or from the originating quote's
/keys call. Key material never rides along in a listing.
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/purchases/string/wallets"[ { "age_days_at_sale": "string", "our_price": "string", "pubkey": "string", "user_price": "string", "wallet_id": "string" }]The orders that did not close
Most quotes never become sales. Someone opened a basket and walked away, a
transfer arrived too late, a lot was cancelled. GET /quotes/abandoned is the
record of those: expired, cancelled and failed quotes by default, or whatever
you pass in statuses.
It is the endpoint behind a "recover abandoned baskets" view. What was in the basket, what it would have cost, when it lapsed.
Authorization
bearerAuth JWT from /auth/login (users) or an org API key (mk_...) for integrations.
In: header
Query Parameters
int6450int640Response Body
application/json
curl -X GET "https://example.com/quotes/abandoned"[ { "buyer_ref": "string", "chain": "string", "completed_at": "string", "created_at": "string", "hard_expiry": "string", "id": "string", "margin_total": "string", "org_id": "string", "our_price_total": "string", "pay_address": "string", "reserved_until": "string", "status": "string", "updated_at": "string", "user_price_total": "string", "wallet_count": 0 }]Which wallets a quote had held
GET /quote/{id}/wallets returns the wallets a quote reserved, from a snapshot
taken at reservation time. That snapshot is the point. It survives expiry and
cancellation, and it does not change when the wallets go back to the catalog and
get sold to someone else.
So for a settled quote this tells you what you bought, and for an abandoned one it tells you what you nearly bought, which is exactly what you need to rebuild the basket.
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/quote/string/wallets"[ { "age_days_at_reserve": "string", "balance": "string", "our_price": "string", "pubkey": "string", "user_price": "string", "wallet_id": "string" }]Being told instead of asking
If your organisation has a webhook registered, settlement delivers a
sale.completed payload to it:
{
"event": "sale.completed",
"sale_id": "…",
"quote_id": "…",
"org_id": "…",
"chain": "solana",
"user_price_total": "…",
"margin_total": "…"
}Webhook registration is not self-serve today, so ask us to set one up. Until
then, polling GET /quote/{id} until it reads settled is the supported way to
find out.
Last updated on