Prepare a collection offer
const url = 'https://api.digirare.com/v1/policy-offers/preflight';const options = { method: 'POST', headers: {'x-session-token': '<x-session-token>', 'Content-Type': 'application/json'}, body: '{"bidder_public_key":"example","delivery_address":"example","alternatives":[{"price_sats":1,"expires_at":1,"policy":{"scope":"asset","asset":"example","collection":"example","max_supply_units":1,"min_supply_units":1,"issued_year":1,"series":1,"artist":"example"}}],"funding":[{"txid":"example","vout":1}],"exclude":[{"txid":"example","vout":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/policy-offers/preflight \ --header 'Content-Type: application/json' \ --header 'x-session-token: <x-session-token>' \ --data '{ "bidder_public_key": "example", "delivery_address": "example", "alternatives": [ { "price_sats": 1, "expires_at": 1, "policy": { "scope": "asset", "asset": "example", "collection": "example", "max_supply_units": 1, "min_supply_units": 1, "issued_year": 1, "series": 1, "artist": "example" } } ], "funding": [ { "txid": "example", "vout": 1 } ], "exclude": [ { "txid": "example", "vout": 1 } ] }'Selects (or verifies) the bidder’s confirmed, asset-free funding inputs, assigns a free confirmed market anchor, and builds 1..100 zero-fee v3 alternative parents sharing that funding set, returning the fund_policy_offer wallet request. Reserves nothing. 503 offer_capacity_full (retryable) when no anchor is free; 409 open_offer_limit at the per-address cap of open funding sets. Every policy-offer route answers 503 service_unavailable when collection-offer signing is unavailable.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
P2TR: the 32-byte x-only internal key. P2WPKH: the 33-byte compressed key. Must own the session address.
Detach destination (any family); defaults to the session address.
object
Unix seconds in [now + 600, now + 90 days].
Funded_policy_offer_v1 canonical policy (spec 4.4). Exactly these keys, absent traits null; SHA256 of its canonical JSON is the leaf’s policy hash.
object
Explicit funding inputs; otherwise confirmed asset-free coins are selected.
object
object
Responses
Section titled “Responses”Unsigned zero-fee v3 alternative parents and the fund_policy_offer wallet request
object
object
Mainnet P2TR or P2WPKH address. The SIGNING capability: every signature is verified by reconstructing a BIP-143/BIP-341 witness sighash.
object
object
object
Destination for a detached Counterparty balance. ANY address family Core accepts, legacy P2PKH included: a delivery address is a UTF-8 string inside the detach OP_RETURN, never a signer and never an output script. Deliberately wider than BitcoinAddress.
object
Funded_policy_offer_v1 canonical policy (spec 4.4). Exactly these keys, absent traits null; SHA256 of its canonical JSON is the leaf’s policy hash.
object
object
Fund_policy_offer wallet intent claim (policy-offer-wallet.ts).
object
Xcp_signPsbts request: one PSBT per alternative, funding inputs only.
object
Example
{ "result": { "protocol_version": "funded_policy_offer_v1", "anchor": { "value_sats": 330 }, "delivery": { "mode": "detached" }, "alternatives": [ { "policy": { "scope": "asset" } } ], "network_fee_sats": 0, "reserves_funding": false }}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"}