raresats.net API
Offers API View as Markdown

Get an offer

GET/api/market/offers/{id}

One offer by id, whatever its status.

Path parameters #

ParameterTypeRequiredDescription
idstringyesThe offer id (16 hex characters).

Example request #

cURL
curl 'https://raresats.net/api/market/offers/dbf866a1e7e209e7'
JavaScript
const response = await fetch('https://raresats.net/api/market/offers/dbf866a1e7e209e7');
const data = await response.json();
Python
import requests

data = requests.get("https://raresats.net/api/market/offers/dbf866a1e7e209e7").json()

Response 200 #

FieldTypeDescription
idstringThe offer id: 16 lowercase hex characters.
kindstringWhat the offer is on: item, one UTXO (the only kind so far).
outpointstringThe UTXO bid on, txid:vout.
valueintegerThe UTXO's own value in sats (it moves to the bidder whole).
seller_addressstringThe address that held the UTXO when the offer was made: it receives price, and only it can accept.
priceintegerThe offer price in sats: exactly what the seller receives (output 1).
platform_feeintegerThe bidder's platform fee: 2.5% of price, at least 546 sats.
fee_ratenumberThe network fee rate in sat/vB, fixed by the bidder's signature.
network_feeintegerThe network fee in sats.
totalintegerWhat the bidder pays: price + platform_fee + network_fee.
vsizeintegerThe transaction's estimated virtual size.
unit_pricenumber(price - value) / count, to the hundredth of a sat, as listings.
rowstringThe listing's own row (collection): the rarest market row holding every tracked sat of the UTXO, else the rarest market row present. Never a label row.
countintegerHow many sats of row the UTXO holds (the "×N" of a bulk listing).
rowsmap of integerEvery row the UTXO's tracked sats count toward, with their counts (label rows included).
typesarray of TypeGroup | nullThe UTXO's sats grouped by exact type combination, rarest first.
satsinteger | nullTracked sats in the UTXO (all rows).
rangesarray of array of integer | nullThe tracked sats as inclusive [first, last] ranges, ascending.
yearsmap of integer | nullTracked sats per mint year (UTC year of the block that mined them).
bidder_payment_addressstringThe bidder's payment address: it funds the offer and gets the change.
bidder_ordinals_addressstringWhere the bidder receives the UTXO (output 0).
statusstringactive (can be accepted), pending (accepted, in the mempool), accepted (confirmed), cancelled (by the bidder), expired, invalid (the UTXO moved or the bidder's funds were spent).
created_atintegerUnix seconds.
updated_atintegerUnix seconds of the last status change.
expires_atinteger | nullUnix seconds after which it can no longer be accepted; null: no expiry (until cancelled, accepted or invalid).
reasonstring | nullWhy an invalid offer is: utxo_spent (the UTXO was sold here otherwise: its listing bought, or another offer accepted), utxo_moved (spent elsewhere), funding_spent (a UTXO funding it was spent), config_changed (the marketplace's fee settings changed since it was made). null in every other status.
txidstring | nullThe accepting transaction, while pending and once accepted; otherwise null.
listing_idstring | nullThe UTXO's live listing, if it is listed.
acceptance_publicbooleantrue once an acceptance the server broadcast left the mempool unconfirmed: that fully signed transaction is public and can still confirm, even after a cancel or expiry here (the offer then ends accepted), until the bidder spends a funding UTXO or the UTXO moves. Back to false once it no longer can.
subbooleanOnly on an offer read for a row (row=) that is not its own row but holds every tracked sat of the item (a sub-category or a label row): true.
in_bundlebooleanOnly on an offer read for a row (row=) whose UTXO holds some sats of that row among others (in bundle): true. Its unit price is its own row's.
contains_countinteger | nullWith in_bundle: how many sats of the row asked for the item holds.
Response
{
  "id": "dbf866a1e7e209e7",
  "kind": "item",
  "outpoint": "24b3eedfdc210f4a5baa96a6c99db5a51d3b1286ab2f58cb0b16fc607e54107f:0",
  "value": 10000,
  "seller_address": "bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr",
  "price": 110000,
  "platform_fee": 2750,
  "fee_rate": 3,
  "network_fee": 963,
  "total": 113713,
  "vsize": 321,
  "unit_price": 100000,
  "row": "decasat_alpha",
  "count": 1,
  "rows": {"uncommon": 1, "alpha_uncommon": 1, "decasat_alpha": 1},
  "types": [
    {
      "types": ["uncommon", "decasat_alpha", "alpha"],
      "count": 1,
      "sats": [441000000000000]
    }
  ],
  "sats": 1,
  "ranges": [[441000000000000, 441000000000000]],
  "years": {"2010": 1},
  "bidder_payment_address": "bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh",
  "bidder_ordinals_address": "bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh",
  "status": "pending",
  "created_at": 1790967012,
  "updated_at": 1790967012,
  "expires_at": 1791571812,
  "reason": null,
  "txid": "332f8cf83155e2532101454afe84ed45aedf9b2f98f8593b82ff38687cfee3be",
  "listing_id": "5e1cb930f43354c3",
  "acceptance_public": false
}

Errors #

{error, code}; see Errors for every code.

StatusCodeMeaning
400bad_pathThe path is not valid percent-encoding.
404not_foundNo such listing or offer. In chat: no such message. A display name to remove that does not exist.
Error (404)
{"error": "no such offer", "code": "not_found"}

Use it to follow an offer through its life: active, then pending with the accepting txid, then accepted; or cancelled, expired or invalid. See The Offer object.