BotanaryBotanary

Activity

The tamper-evident, hash-chained audit log (paginated; executed vs declined).

List the audit log (paginated, filterable)

GET
/activity

Authorization

sessionToken
AuthorizationBearer <token>

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

In: header

Query Parameters

cursor?|

Opaque pagination cursor from the previous page's pageInfo.nextCursor.

limit?integer
Default25
Range1 <= value <= 100
status?string

Filter by executed / declined / pending.

Value in"executed" | "declined" | "pending"
delegationId?string
from?string

ISO-8601 lower bound (inclusive).

Formatdate-time
to?string

ISO-8601 upper bound (exclusive).

Formatdate-time
accountId?string

Scope the log 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/activity"
{
  "items": [
    {
      "id": "a2",
      "timestamp": "2026-07-07T09:41:00Z",
      "dateLabel": "Today",
      "timeLabel": "09:41",
      "actor": {
        "name": "Uniswap",
        "kind": "dApp",
        "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
      },
      "action": "Swap 120 USDC → EURC",
      "amount": -120,
      "token": {
        "symbol": "USDC",
        "chainId": 42161
      },
      "chain": "Arbitrum",
      "chainId": 42161,
      "status": "declined",
      "declineReason": "per_action_exceeded",
      "provenance": "offchain_only",
      "txHash": null,
      "auditNonce": null,
      "prevHash": "0x9b2c1d0a7e4f3c8b6a1d5e2f0c9a7b3d9b2c1d0a7e4f3c8b6a1d5e2f0c9a7b3d",
      "hash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
      "delegationId": "d1"
    }
  ],
  "pageInfo": {
    "nextCursor": "string",
    "hasMore": true
  }
}
{
  "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"
  }
}

The on-chain anchoring status of the audit log

GET
/activity/anchor

Authorization

sessionToken
AuthorizationBearer <token>

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

In: header

Response Body

application/json

application/json

curl -X GET "https://api.app.botanary.xyz/activity/anchor"
{
  "available": true,
  "anchoredHead": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
  "localHead": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
  "unanchoredCount": 0,
  "lastTxHash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
  "lastError": "string"
}
{
  "error": {
    "code": "unauthorized",
    "message": "Session token missing or expired."
  }
}

Get one audit event (with hash-chain fields)

GET
/activity/{eventId}

Authorization

sessionToken
AuthorizationBearer <token>

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

In: header

Path Parameters

eventId*string

Response Body

application/json

application/json

application/json

curl -X GET "https://api.app.botanary.xyz/activity/string"
{
  "id": "a2",
  "timestamp": "2026-07-07T09:41:00Z",
  "dateLabel": "Today",
  "timeLabel": "09:41",
  "actor": {
    "name": "Uniswap",
    "kind": "dApp",
    "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
  },
  "action": "Swap 120 USDC → EURC",
  "amount": -120,
  "token": {
    "symbol": "USDC",
    "chainId": 42161
  },
  "chain": "Arbitrum",
  "chainId": 42161,
  "status": "declined",
  "declineReason": "per_action_exceeded",
  "provenance": "offchain_only",
  "txHash": null,
  "auditNonce": null,
  "prevHash": "0x9b2c1d0a7e4f3c8b6a1d5e2f0c9a7b3d9b2c1d0a7e4f3c8b6a1d5e2f0c9a7b3d",
  "hash": "0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b",
  "delegationId": "d1"
}
{
  "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"
  }
}