Compose an attach
const url = 'https://api.digirare.com/v1/attach-templates';const options = { method: 'POST', headers: {'x-session-token': '<x-session-token>', 'Content-Type': 'application/json'}, body: '{"utxo_owner":"example","asset_source":"example","asset":"example","fee_rate":1,"exclude":[{"txid":"example","vout":1}],"in_flight":[{"asset":"example","quantity_raw":"example","asset_utxo":{"txid":"example","vout":1}}],"funding":[{"txid":"example","vout":1,"value_sats":1,"script_pub_key_hex":"example"}]}'};
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/attach-templates \ --header 'Content-Type: application/json' \ --header 'x-session-token: <x-session-token>' \ --data '{ "utxo_owner": "example", "asset_source": "example", "asset": "example", "fee_rate": 1, "exclude": [ { "txid": "example", "vout": 1 } ], "in_flight": [ { "asset": "example", "quantity_raw": "example", "asset_utxo": { "txid": "example", "vout": 1 } } ], "funding": [ { "txid": "example", "vout": 1, "value_sats": 1, "script_pub_key_hex": "example" } ] }'Composes and independently verifies one one-unit attach for the client leg runner. Nothing is stored or reserved: the browser signs, broadcasts, and keeps its own leg state, and the marketplace learns about the asset UTXO when Counterparty indexes it. Explicit funding lets a leg name a disjoint coin or the previous leg’s unconfirmed change.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”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
Coins server selection must skip: inputs the caller already committed in earlier legs that chain data cannot yet show as spent.
object
The caller’s own attaches from this source that may still be moving units, as asset and raw units each one moves (the XCP protocol fee under XCP). A signed attach names its asset_utxo and stays declared until it is FINALITY_DEPTH deep: the server skips entries whose asset UTXO its balance projection currently shows attached (already out of the detached balance) and counts the rest, so an attach a reorg un-parsed counts again. Entries without asset_utxo always count. Only ever subtracted from the held balance, so the server refuses composing units those attaches already use.
object
Canonical compact Counterparty key. A subasset uses its A
object
Exact inputs this attach may spend. Supply script_pub_key_hex on every input to spend an unconfirmed parent’s change; omit it on all of them for confirmed coins.
object
Examplegenerated
{ "utxo_owner": "example", "asset_source": "example", "asset": "example", "fee_rate": 1, "exclude": [ { "txid": "example", "vout": 1 } ], "in_flight": [ { "asset": "example", "quantity_raw": "example", "asset_utxo": { "txid": "example", "vout": 1 } } ], "funding": [ { "txid": "example", "vout": 1, "value_sats": 1, "script_pub_key_hex": "example" } ]}Responses
Section titled “Responses”One verified attach template, never stored
object
object
Canonical compact Counterparty key. A subasset uses its A
The address that will own the asset UTXO.
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.
object
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.
True when a legacy input makes the txid unknowable before signing; a chained leg must compose from the signed parent.
Output 0 of the attach: the UTXO the unit lands on.
object
object
object
object
object
Example
{ "result": { "attach": { "sighash": "ALL" }, "fees": { "network": { "asset": "BTC" }, "protocol": { "asset": "XCP" }, "platform": { "asset": "BTC" } } }}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"}