Compose offer authorizations before funding
const url = 'https://api.digirare.com/v1/offer-funding-authorization-templates';const options = { method: 'POST', headers: {'x-session-token': '<x-session-token>', 'Content-Type': 'application/json'}, body: '{"funding_psbt_hex":"example","slot_vout":1,"targets":[{"utxo_txid":"example","utxo_vout":1}],"assets":["example"],"expires_at":1,"receive_address":"example","delivery_mode":"detached","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/offer-funding-authorization-templates \ --header 'Content-Type: application/json' \ --header 'x-session-token: <x-session-token>' \ --data '{ "funding_psbt_hex": "example", "slot_vout": 1, "targets": [ { "utxo_txid": "example", "utxo_vout": 1 } ], "assets": [ "example" ], "expires_at": 1, "receive_address": "example", "delivery_mode": "detached", "fee_rate": 1 }'Exact-offer authorization templates (1..7 targets) over one set-aside output (slot_vout) of an UNSIGNED offer funding template from POST /v1/offer-funding-templates, so one wallet review can sign the funding and these authorizations together (the fund-and-authorize-offers wallet bundle). Every funding input must be a witness input of the authenticated bidder, so signing cannot change the txid the authorizations spend. Each target is composed exactly as POST /v1/offers/{id}/exact-authorizations/batch composes it, at the one returned fee_rate, including the asset-UTXO depth rule; assets are the placement’s asset-scope targets and every target must be one of them. Nothing is stored, placed, or reserved, and authorization_id values are preview ids. After signing, place the offer with the signed funding (POST /v1/funded-offers), create the batch with fee_rate set to this response’s rate, and submit each signature whose expected_txid the batch reproduced; a template that no longer reproduces is signed again.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
The unsigned funding.psbt_hex from POST /v1/offer-funding-templates.
object
The placement’s asset-scope targets, as POST /v1/funded-offers will receive them.
Responses
Section titled “Responses”Successful composeOfferFundingAuthorizationTemplates response.
object
Exact-offer authorization templates over one set-aside output of an offer funding template that is not broadcast yet, for a wallet review that signs the funding and these authorizations together. Nothing is stored: after placing the offer with the signed funding, create the authorization batch with fee_rate set to this fee_rate; unchanged facts give byte-identical templates, so the signatures submit as they are. Each authorization_id here is a preview id, never a stored row.
object
The funding template’s (unsigned, witness-only) txid.
object
Always the UNSIGNED settlement template, for both roles. The buyer’s input-0 signature is never served to the seller; the market merges it server-side when the seller submits input 1.
object
object
Counterparty atomic units. A string preserves integers beyond JSON’s safe numeric range; divisibility affects display, never this wire value.
object
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Hex x-only BIP86 internal key of the marketplace fee output, derived server-side from the fee allocation’s own index. The fee output is exactly the key-path-only P2TR of this key; a wallet that reads it checks that match and shows the fee payment either way. Absent when there is no key to vouch for (a pre-fee template or an unconfigured/rotated key).
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
object
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
object
object
object
object
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
object
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
object
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
Integer satoshis, exactly representable as a JSON number. Aggregated historical volume can exceed Bitcoin’s supply, so this is the safe JSON integer ceiling, not a single-transaction spending limit.
object
object
Example
{ "result": { "protocol_version": "exact_offer_v1", "authorizations": [ { "protocol_version": "exact_offer_v1", "status": "awaiting_bidder", "signing": { "inputs_to_sign": "all", "sighash": "ALL" }, "delivery": { "mode": "detached" }, "signature_validity": { "bitcoin_invalidation": { "type": "spend_funding_outpoint" } }, "fee_adjustment": { "state": "ready" }, "cpfp": { "signing": { "inputs_to_sign": "all", "sighash": "ALL" } }, "reserves_funding": false, "requires_buyer_action": false } ], "stored": false, "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"}