BotanaryBotanary

Money

Send (batched) / receive / swap intents. Build returns an unsigned UserOp; the API never custodies.

Build a (batched) send intent

POST
/money/send/build

Authorization

sessionToken
AuthorizationBearer <token>

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/money/send/build" \  -H "Content-Type: application/json" \  -d '{    "chainId": 42161,    "transfers": [      {        "token": {          "symbol": "USDC"        },        "amount": 50,        "to": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"      }    ]  }'
{
  "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": "per_action_exceeded"
  }
}

Build an owner-lane swap intent (any token, same-chain or cross-chain)

POST
/money/swap/build

Authorization

sessionToken
AuthorizationBearer <token>

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/money/swap/build" \  -H "Content-Type: application/json" \  -d '{    "chainId": 42161,    "fromToken": {      "symbol": "USDC"    },    "toToken": {      "symbol": "USDC"    },    "amountIn": 50  }'
{
  "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": "per_action_exceeded"
  }
}

Preview a swap route (read-only, no op built)

POST
/money/swap/quote

Authorization

sessionToken
AuthorizationBearer <token>

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

curl -X POST "https://api.app.botanary.xyz/money/swap/quote" \  -H "Content-Type: application/json" \  -d '{    "chainId": 42161,    "fromToken": {      "symbol": "USDC"    },    "toToken": {      "symbol": "USDC"    },    "amountIn": 50  }'
{
  "supported": true,
  "crossChain": true,
  "amountOut": {
    "symbol": "ETH",
    "amount": 0.0192
  },
  "amountOutMin": {
    "symbol": "ETH",
    "amount": 0.0191
  },
  "rate": 0.000384,
  "priceImpactBps": 12,
  "route": [
    {
      "tool": "uniswap-v3",
      "fromSymbol": "USDC",
      "toSymbol": "ETH",
      "fromChainId": 42161,
      "toChainId": 42161
    }
  ],
  "fees": [
    {
      "token": {
        "symbol": "USDC",
        "chainId": 42161,
        "address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
      },
      "amount": 50
    }
  ],
  "slippageBps": 50,
  "estimatedDurationSec": 45,
  "unsupportedReason": "string",
  "graduationStatus": "sentient"
}
{
  "error": {
    "code": "unauthorized",
    "message": "Session token missing or expired."
  }
}

List swappable tokens on a chain

GET
/money/swap/tokens

Authorization

sessionToken
AuthorizationBearer <token>

Botanary session token from POST /auth/session. Not a key - a revocable session bearer.

In: header

Query Parameters

chainId*integer
query?string

Filter by symbol/name substring.

Response Body

application/json

application/json

curl -X GET "https://api.app.botanary.xyz/money/swap/tokens?chainId=0"
[
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
    "decimals": 6,
    "chainId": 42161,
    "priceUsd": 1,
    "verified": true,
    "logoUri": "string",
    "graduationStatus": "sentient"
  }
]
{
  "error": {
    "code": "unauthorized",
    "message": "Session token missing or expired."
  }
}

Track a cross-chain swap's bridge leg

GET
/money/swap/status

Authorization

sessionToken
AuthorizationBearer <token>

Botanary session token from POST /auth/session. Not a key - a revocable session bearer.

In: header

Query Parameters

txHash*string

A 32-byte hash (tx hash, userOpHash, permissionId, audit hash).

Match^0x[a-fA-F0-9]{64}$
fromChainId*integer
toChainId*integer

Response Body

application/json

application/json

curl -X GET "https://api.app.botanary.xyz/money/swap/status?txHash=0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b&fromChainId=0&toChainId=0"
{
  "state": "bridging",
  "destTxHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
  "message": "string",
  "explorerUrl": "string"
}
{
  "error": {
    "code": "unauthorized",
    "message": "Session token missing or expired."
  }
}

Get receive info (address + QR payload)

GET
/money/receive

Authorization

sessionToken
AuthorizationBearer <token>

Botanary session token from POST /auth/session. Not a key - a revocable session bearer.

In: header

Query Parameters

chainId?integer
token?string

Response Body

application/json

application/json

curl -X GET "https://api.app.botanary.xyz/money/receive"
{
  "address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0",
  "chains": [
    {
      "name": "Arbitrum",
      "chainId": 42161,
      "shortName": "arb",
      "testnet": false,
      "nativeSymbol": "ETH",
      "tier": "botanary",
      "explorerUrl": "https://base-sepolia.blockscout.com",
      "blockscoutUrl": "https://base-sepolia.blockscout.com",
      "gasTokens": [
        "native",
        "USDC"
      ]
    }
  ],
  "tokens": [
    {
      "symbol": "USDC",
      "chainId": 42161,
      "address": "0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0"
    }
  ],
  "uri": "ethereum:0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0@42161"
}
{
  "error": {
    "code": "unauthorized",
    "message": "Session token missing or expired."
  }
}