Delegations
Scoped, revocable session-key delegations - the authority surface. Build, enable, revoke. There is no per-delegation freeze; freeze the whole account instead.
List all delegations (with spent-to-date)
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Query Parameters
Filter by delegation status.
"active" | "frozen" | "expired" | "revoked"Scope the list to this specific account of the caller's (must belong to the authenticated signer - a foreign or unknown id is rejected, never silently ignored). Omitted defaults to the signer's lowest-visible-index account.
Response Body
application/json
application/json
application/json
curl -X GET "https://api.app.botanary.xyz/delegations"[
{
"id": "d1",
"permissionId": "0x1111111111111111111111111111111111111111111111111111111111111111",
"name": "Uniswap",
"kind": "dApp",
"icon": "arrow-left-right",
"delegateeAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"chain": "Arbitrum",
"chainId": 42161,
"status": "active",
"humanSummary": "This dApp can spend up to 100 USDC in total, and may call 0x3593564c() on Universal Router and approve() on Permit2, max 50 per action, limited to 10 actions. Expires on 2026-08-03.",
"policySet": {
"budgets": [
{
"token": {
"symbol": "USDC",
"chainId": 42161
},
"amount": 100
}
],
"perActionMax": {
"token": {
"symbol": "USDC",
"chainId": 42161
},
"amount": 50
},
"maxActions": 10,
"recipientAllowlist": [],
"allowedActions": [
{
"name": "Universal Router",
"target": "0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af",
"selectors": [
"0x3593564c"
]
},
{
"name": "Permit2",
"target": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
"selectors": [
"0x095ea7b3"
]
}
],
"expiresAt": "2026-08-03T00:00:00Z",
"freezeGated": false
},
"spentToDate": [
{
"token": {
"symbol": "USDC",
"chainId": 42161
},
"limit": 100,
"spent": 42.5,
"remaining": 57.5,
"expiresAt": "2026-08-03T00:00:00Z"
}
]
}
]{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}Enable a delegation from a signed enable op
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "https://api.app.botanary.xyz/delegations" \ -H "Content-Type: application/json" \ -d '{ "userOp": { "sender": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0", "nonce": "0", "callData": "0x", "callGasLimit": "200000", "verificationGasLimit": "150000", "preVerificationGas": "50000", "maxFeePerGas": "1000000000", "maxPriorityFeePerGas": "1000000000", "signature": "0x", "entryPoint": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0", "chainId": 42161 }, "userOpHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b", "intentType": "send" }'{
"id": "d1",
"permissionId": "0x1111111111111111111111111111111111111111111111111111111111111111",
"name": "Uniswap",
"kind": "dApp",
"icon": "arrow-left-right",
"delegateeAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"chain": "Arbitrum",
"chainId": 42161,
"status": "active",
"humanSummary": "This dApp can spend up to 100 USDC in total, and may call 0x3593564c() on Universal Router and approve() on Permit2, max 50 per action, limited to 10 actions. Expires on 2026-08-03.",
"policySet": {
"budgets": [
{
"token": {
"symbol": "USDC",
"chainId": 42161
},
"amount": 100
}
],
"perActionMax": {
"token": {
"symbol": "USDC",
"chainId": 42161
},
"amount": 50
},
"maxActions": 10,
"recipientAllowlist": [],
"allowedActions": [
{
"name": "Universal Router",
"target": "0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af",
"selectors": [
"0x3593564c"
]
},
{
"name": "Permit2",
"target": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
"selectors": [
"0x095ea7b3"
]
}
],
"expiresAt": "2026-08-03T00:00:00Z",
"freezeGated": false
},
"spentToDate": [
{
"token": {
"symbol": "USDC",
"chainId": 42161
},
"limit": 100,
"spent": 42.5,
"remaining": 57.5,
"expiresAt": "2026-08-03T00:00:00Z"
}
]
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "per_action_exceeded"
}
}Build a delegation or mandate (policy set + plain-language summary + enable op) WITHOUT executing
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "https://api.app.botanary.xyz/delegations/build" \ -H "Content-Type: application/json" \ -d '{ "name": "Aave auto-repay", "kind": "dApp", "delegateeAddress": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0", "chainId": 8453, "budgets": [ { "token": { "symbol": "USDC" }, "amount": 50 } ] }'{
"policySet": {
"budgets": [
{
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
}
],
"perActionMax": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"maxActions": 10,
"recipientAllowlist": [
{
"name": "Universal Router",
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"chainId": 8453
}
],
"allowedActions": [
{
"target": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"name": "Universal Router",
"selectors": [
"0x3593564c"
]
}
],
"expiresAt": "2019-08-24T14:15:22Z",
"freezeGated": true
},
"humanSummary": "This automation can spend up to 500 USDC in total, and may call 0x573ade81() on Aave v3 Pool, max 250 per action. Expires on 2026-10-01.",
"enableUserOp": {
"sender": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"nonce": "0",
"factory": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"factoryData": "0x",
"callData": "0x",
"callGasLimit": "200000",
"verificationGasLimit": "150000",
"preVerificationGas": "50000",
"maxFeePerGas": "1000000000",
"maxPriorityFeePerGas": "1000000000",
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"paymasterVerificationGasLimit": "string",
"paymasterPostOpGasLimit": "string",
"paymasterData": "0x",
"signature": "0x",
"entryPoint": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"chainId": 42161
},
"userOpHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
"simulation": {
"id": "string",
"intentType": "send",
"willSucceed": true,
"declineReason": "cap_exceeded",
"amountIn": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"amountOut": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"rate": 1.08,
"route": "USDC → EURC via Uniswap v3",
"slippageBps": 30,
"fees": [
{
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
}
],
"gas": {
"method": "sponsored",
"cost": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"sponsored": true
},
"warnings": [
"string"
],
"expiresAt": "2019-08-24T14:15:22Z"
}
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "per_action_exceeded"
}
}Get one delegation
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Path Parameters
Response Body
application/json
application/json
application/json
curl -X GET "https://api.app.botanary.xyz/delegations/d1"{
"id": "d1",
"permissionId": "0x1111111111111111111111111111111111111111111111111111111111111111",
"name": "Uniswap",
"kind": "dApp",
"icon": "arrow-left-right",
"delegateeAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"chain": "Arbitrum",
"chainId": 42161,
"status": "active",
"humanSummary": "This dApp can spend up to 100 USDC in total, and may call 0x3593564c() on Universal Router and approve() on Permit2, max 50 per action, limited to 10 actions. Expires on 2026-08-03.",
"policySet": {
"budgets": [
{
"token": {
"symbol": "USDC",
"chainId": 42161
},
"amount": 100
}
],
"perActionMax": {
"token": {
"symbol": "USDC",
"chainId": 42161
},
"amount": 50
},
"maxActions": 10,
"recipientAllowlist": [],
"allowedActions": [
{
"name": "Universal Router",
"target": "0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af",
"selectors": [
"0x3593564c"
]
},
{
"name": "Permit2",
"target": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
"selectors": [
"0x095ea7b3"
]
}
],
"expiresAt": "2026-08-03T00:00:00Z",
"freezeGated": false
},
"spentToDate": [
{
"token": {
"symbol": "USDC",
"chainId": 42161
},
"limit": 100,
"spent": 42.5,
"remaining": 57.5,
"expiresAt": "2026-08-03T00:00:00Z"
}
]
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}Build a bounded delegated action (the binding-boundary demonstration)
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Path Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://api.app.botanary.xyz/delegations/d1/actions" \ -H "Content-Type: application/json" \ -d '{ "recipient": "string", "amount": 0 }'{
"intentType": "send",
"userOp": {
"sender": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"nonce": "0",
"factory": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"factoryData": "0x",
"callData": "0x",
"callGasLimit": "200000",
"verificationGasLimit": "150000",
"preVerificationGas": "50000",
"maxFeePerGas": "1000000000",
"maxPriorityFeePerGas": "1000000000",
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"paymasterVerificationGasLimit": "string",
"paymasterPostOpGasLimit": "string",
"paymasterData": "0x",
"signature": "0x",
"entryPoint": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"chainId": 42161
},
"userOpHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
"humanSummary": "string",
"simulation": {
"id": "string",
"intentType": "send",
"willSucceed": true,
"declineReason": "cap_exceeded",
"amountIn": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"amountOut": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"rate": 1.08,
"route": "USDC → EURC via Uniswap v3",
"slippageBps": 30,
"fees": [
{
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
}
],
"gas": {
"method": "sponsored",
"cost": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"sponsored": true
},
"warnings": [
"string"
],
"expiresAt": "2019-08-24T14:15:22Z"
},
"riskReducing": true,
"instant": true,
"gasless": true,
"gasPermit": {
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"token": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"tokenName": "USD Coin",
"tokenVersion": "2",
"kernelVersion": "0.3.3",
"permitAmount": "212142",
"permitNonce": "2",
"permitDeadline": "string",
"permitDigest": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
"signaturePrefix": "0x",
"estimatedFee": 0.031296
},
"usdtApproval": {
"token": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"amount": "string",
"calls": [
{
"to": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"data": "0x",
"value": "string"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}Freeze a single delegation (DOES NOT EXIST - always 400)
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Path Parameters
Response Body
application/json
application/json
application/json
curl -X POST "https://api.app.botanary.xyz/delegations/d1/freeze"{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}Unfreeze a single delegation (DOES NOT EXIST - always 400)
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Path Parameters
Response Body
application/json
application/json
application/json
curl -X POST "https://api.app.botanary.xyz/delegations/d1/unfreeze"{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}Build the revoke op for a delegation (kill-switch - instant, permanent)
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Path Parameters
Response Body
application/json
application/json
application/json
curl -X POST "https://api.app.botanary.xyz/delegations/d1/revoke"{
"intentType": "send",
"userOp": {
"sender": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"nonce": "0",
"factory": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"factoryData": "0x",
"callData": "0x",
"callGasLimit": "200000",
"verificationGasLimit": "150000",
"preVerificationGas": "50000",
"maxFeePerGas": "1000000000",
"maxPriorityFeePerGas": "1000000000",
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"paymasterVerificationGasLimit": "string",
"paymasterPostOpGasLimit": "string",
"paymasterData": "0x",
"signature": "0x",
"entryPoint": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"chainId": 42161
},
"userOpHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
"humanSummary": "string",
"simulation": {
"id": "string",
"intentType": "send",
"willSucceed": true,
"declineReason": "cap_exceeded",
"amountIn": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"amountOut": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"rate": 1.08,
"route": "USDC → EURC via Uniswap v3",
"slippageBps": 30,
"fees": [
{
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
}
],
"gas": {
"method": "sponsored",
"cost": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"sponsored": true
},
"warnings": [
"string"
],
"expiresAt": "2019-08-24T14:15:22Z"
},
"riskReducing": true,
"instant": true,
"gasless": true,
"gasPermit": {
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"token": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"tokenName": "USD Coin",
"tokenVersion": "2",
"kernelVersion": "0.3.3",
"permitAmount": "212142",
"permitNonce": "2",
"permitDeadline": "string",
"permitDigest": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
"signaturePrefix": "0x",
"estimatedFee": 0.031296
},
"usdtApproval": {
"token": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"paymaster": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"amount": "string",
"calls": [
{
"to": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"data": "0x",
"value": "string"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}List immutable policy snapshots for a delegation
Authorization
sessionToken Botanary session token from POST /auth/session. Not a key - a revocable session bearer.
In: header
Path Parameters
Response Body
application/json
application/json
application/json
curl -X GET "https://api.app.botanary.xyz/delegations/d1/policy-snapshots"[
{
"id": "string",
"delegationId": "d2",
"permissionId": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
"policySet": {
"budgets": [
{
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
}
],
"perActionMax": {
"token": {
"symbol": "USDC",
"chainId": 42161,
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
},
"amount": 50
},
"maxActions": 10,
"recipientAllowlist": [
{
"name": "Universal Router",
"address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"chainId": 8453
}
],
"allowedActions": [
{
"target": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
"name": "Universal Router",
"selectors": [
"0x3593564c"
]
}
],
"expiresAt": "2019-08-24T14:15:22Z",
"freezeGated": true
},
"humanSummary": "string",
"capturedAt": "2019-08-24T14:15:22Z",
"enableTxHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b"
}
]{
"error": {
"code": "unauthorized",
"message": "Session token missing or expired."
}
}{
"error": {
"code": "out_of_scope",
"message": "This action exceeds the per-action cap.",
"declineReason": "cap_exceeded",
"details": {},
"requestId": "string"
}
}