tx.receipt
Signed receipt for unsigned bytes: simulated effects, Agent Pass policy check, intent checks and a verdict, signed by tide.
Details
- Endpoint
- POST /v1/tx/receipt
- Credits
- 10
- Rate class
- Heavy. Counts against your heavy requests per second.
Send the exact unsigned TransactionData an agent is about to sign, and optionally its intent (max_spend, min_receive, deadline, pass). tide simulates it on current mainnet state and returns a receipt signed with its ed25519 attestation key: the intent, the transaction digest (the digest Sui will give these bytes), every simulated balance change, object and event, gas, the checkpoint, what Sui itself enforces when the bytes run under an Agent Pass (caps, listed pools, price floor, budget), tide's intent checks and a verdict. The bytes are in the receipt, so anyone can re-run the dry run on any full node. Show the human the url (tide.ad/proof/<id>); after sending, call GET /v1/tx/{digest}/receipt-check.
Parameters
| Name | Type | Description |
|---|---|---|
| tx_bytesrequired | string | Full unsigned TransactionData as base64, with sender, gas and budget set (the bytes the wallet signs). |
| intent | object | What the agent means to do, in its own words as fields. Every field is optional. Amounts in whole coins; coins by symbol (USDC, SUI) or full type. |
| intent.action | string | swap, transfer, stake, supply, or anything else. |
| intent.pass | string | The Agent Pass object id when the agent acts under a pass. Found from the bytes when left out. |
| intent.wallet | string | Whose funds the limits are about. Default: the pass owner under a pass, else the signer. |
| intent.max_spend | object | Coin -> most that may leave the wallet, for example { "USDC": "5000" }. Gas is separate. Any other coin leaving fails the check. |
| intent.min_receive | object | Coin -> least that must arrive, for example { "nUSDC": "4990" }. |
| intent.deadline_ms | integer | Unix milliseconds the agent must send by. |
Request
Send your key in the x-api-key header, or leave it out to use the keyless tier.
curl -X POST "https://api.tide.ad/v1/tx/receipt" \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{
"tx_bytes": "<base64 TransactionData>",
"intent": {
"action": "swap",
"coin_in": "USDC",
"coin_out": "SUI",
"amount": "0.2",
"max_spend": {
"USDC": "0.2"
},
"min_receive": {
"SUI": "0.2"
}
}
}'const res = await fetch("https://api.tide.ad/v1/tx/receipt", {
method: "POST",
headers: {
"x-api-key": process.env.TIDE_API_KEY!,
"content-type": "application/json",
},
body: JSON.stringify({
"tx_bytes": "<base64 TransactionData>",
"intent": {
"action": "swap",
"coin_in": "USDC",
"coin_out": "SUI",
"amount": "0.2",
"max_spend": {
"USDC": "0.2"
},
"min_receive": {
"SUI": "0.2"
}
}
}),
});
const data = await res.json();Response
No example response is available for this method yet.