Hushxima
Marketplace

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_total and profit_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_id and buyer_ref.
GET
/purchases

Authorization

bearerAuth
AuthorizationBearer <token>

JWT from /auth/login (users) or an org API key (mk_...) for integrations.

In: header

Query Parameters

buyer_ref?|

Filter purchases (settled sales) to a single buyer reference.

Defaultnull
limit?integer
Formatint64
Default50
offset?integer
Formatint64
Default0

Response 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.

GET
/purchases/{id}/wallets

Authorization

bearerAuth
AuthorizationBearer <token>

JWT from /auth/login (users) or an org API key (mk_...) for integrations.

In: header

Path Parameters

id*String

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.

GET
/quotes/abandoned

Authorization

bearerAuth
AuthorizationBearer <token>

JWT from /auth/login (users) or an org API key (mk_...) for integrations.

In: header

Query Parameters

limit?integer
Formatint64
Default50
offset?integer
Formatint64
Default0
status?string|null

Response 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.

GET
/quote/{id}/wallets

Authorization

bearerAuth
AuthorizationBearer <token>

JWT from /auth/login (users) or an org API key (mk_...) for integrations.

In: header

Path Parameters

id*String

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

On this page