Start a listing
const url = 'https://api.digirare.com/v1/listing-preflights';const options = { method: 'POST', headers: {'x-session-token': '<x-session-token>', 'Content-Type': 'application/json'}, body: '{"idempotency_key":"example","seller":"example","asset_source":"example","asset_utxo":{"txid":"example","vout":1},"asset":"example","price_sats":1,"fee_rate":1}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.digirare.com/v1/listing-preflights \ --header 'Content-Type: application/json' \ --header 'x-session-token: <x-session-token>' \ --data '{ "idempotency_key": "example", "seller": "example", "asset_source": "example", "asset_utxo": { "txid": "example", "vout": 1 }, "asset": "example", "price_sats": 1, "fee_rate": 1 }'Reuses an eligible attached UTXO or returns a server-verified Counterparty attach PSBT. When a price is supplied, the response also contains the exact dependent listing template for a one-review attach-and-list flow.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Client-generated key reused for retries of the same create instruction.
Mainnet P2TR or P2WPKH address. The SIGNING capability: every signature is verified by reconstructing a BIP-143/BIP-341 witness sighash.
Counterparty address whose balance is attached when a listing is prepared. P2PKH, P2WPKH, or P2TR: these spend families are supported by the attach verifier. The source owns input 0 and may differ from seller, which owns the modern asset UTXO and signs the listing.
Prepared-only listing of this exact output. It must belong to seller; unavailable inventory is refused, never replaced or attached again.
object
Canonical compact Counterparty key. A subasset uses its A
Examplegenerated
{ "idempotency_key": "example", "seller": "example", "asset_source": "example", "asset_utxo": { "txid": "example", "vout": 1 }, "asset": "example", "price_sats": 1, "fee_rate": 1}Responses
Section titled “Responses”Durable listing operation
object
object
Mainnet P2TR or P2WPKH address. The SIGNING capability: every signature is verified by reconstructing a BIP-143/BIP-341 witness sighash.
Counterparty address whose balance is attached when a listing is prepared. P2PKH, P2WPKH, or P2TR: these spend families are supported by the attach verifier. The source owns input 0 and may differ from seller, which owns the modern asset UTXO and signs the listing.
Canonical compact Counterparty key. A subasset uses its A
Completed: the listing exists. withdrawn (read-time only): a reorg reopened the attach and withdrew its listing by design; the attach has been mined again, so the unit is attached and must be listed again with a new preflight (next_action list_again). A failed, expired, or re-verifying (awaiting_indexer) preflight keeps its own status even when a listing row exists.
object
object
object
object
object
Mainnet P2TR or P2WPKH address. The SIGNING capability: every signature is verified by reconstructing a BIP-143/BIP-341 witness sighash.
object
Canonical signer groups derived from authenticated PSBT prevouts. Input 0 belongs to asset_source; every input appears exactly once.
object
Counterparty address whose balance is attached when a listing is prepared. P2PKH, P2WPKH, or P2TR: these spend families are supported by the attach verifier. The source owns input 0 and may differ from seller, which owns the modern asset UTXO and signs the listing.
Accepted listing price when recovered by preflight ID.
Current listing state, distinct from a completed preparation. Includes expiry derived at read time.
Example
{ "result": { "protocol_version": "counterparty_attach_listing_v1", "mode": "reuse", "status": "awaiting_attach_signature", "fees": { "network": { "asset": "BTC" }, "protocol": { "asset": "XCP" }, "platform": { "asset": "BTC" } }, "listing": { "sighash": "SINGLE|ANYONECANPAY" }, "attach": { "sighash": "ALL" }, "next_action": "sign_attach" }}Stable machine-readable failure
object
On 422 mempool_rejected from a broadcast: which deterministic node policy refused the bytes. Retrying the same bytes fails the same way. fee_floor: re-quote at a higher fee_rate. chain_too_long: too many unconfirmed ancestors; wait for a confirmation, then retry. truc: a version-3 (TRUC) package rule, such as spending an unconfirmed version-3 output; wait for a confirmation, then retry.
The node’s own reject reason, on mempool_rejected (422) and on state_changed (409) when a broadcast lost to a conflicting or replacing spend.
Present and true when mempool_policy is chain_too_long or truc.
On a checkout or accept completion refused as mempool_rejected: the journaled settlement ended and every listing, bid, and asset claim it held was released (its inputs were proven unspent). The quote or accept is replaced; request a new one.
Batch listing routes only: every refused item. The first sets the status and code.
One refused item in a batch refusal’s refused_listings array. Nothing in the batch was changed.
object
On 429 rate_limited: the exact seconds until the oldest counted request leaves the window; a retry then is admitted (also sent as Retry-After). Limited writes are bucketed per route scope in exact sliding 60-second windows: by session address when a valid x-session-token is present, otherwise by IP, with a per-IP ceiling across sessions. Expensive writes: 20, ceiling 120. Signed completions: 120, ceiling 600. Session minting (/auth/*): 60 per IP. A request refused by any bucket is counted by none.
Example
{ "code": "invalid_request", "mempool_policy": "fee_floor"}Stable machine-readable failure
object
On 422 mempool_rejected from a broadcast: which deterministic node policy refused the bytes. Retrying the same bytes fails the same way. fee_floor: re-quote at a higher fee_rate. chain_too_long: too many unconfirmed ancestors; wait for a confirmation, then retry. truc: a version-3 (TRUC) package rule, such as spending an unconfirmed version-3 output; wait for a confirmation, then retry.
The node’s own reject reason, on mempool_rejected (422) and on state_changed (409) when a broadcast lost to a conflicting or replacing spend.
Present and true when mempool_policy is chain_too_long or truc.
On a checkout or accept completion refused as mempool_rejected: the journaled settlement ended and every listing, bid, and asset claim it held was released (its inputs were proven unspent). The quote or accept is replaced; request a new one.
Batch listing routes only: every refused item. The first sets the status and code.
One refused item in a batch refusal’s refused_listings array. Nothing in the batch was changed.
object
On 429 rate_limited: the exact seconds until the oldest counted request leaves the window; a retry then is admitted (also sent as Retry-After). Limited writes are bucketed per route scope in exact sliding 60-second windows: by session address when a valid x-session-token is present, otherwise by IP, with a per-IP ceiling across sessions. Expensive writes: 20, ceiling 120. Signed completions: 120, ceiling 600. Session minting (/auth/*): 60 per IP. A request refused by any bucket is counted by none.
Example
{ "code": "invalid_request", "mempool_policy": "fee_floor"}