Lykia API v0.1.0

Built on Arc Network and Circle's rails. Plan money moves in plain words, check them against a Fence, hand unsigned steps to the user's wallet and follow them to finality. The server never holds user keys; intents come back unsigned. Optional server signers (a gas-only keeper, opt-in Circle developer-controlled wallets) are off unless the operator configures them. Authenticate with `Lykia-Key` (lk_live_… or lk_test_…; test keys only reach testnet) or a `Lykia-Session` from wallet sign-in. Pin behaviour with `Lykia-Version` (2026-06-01, 2026-11-01). Send `Idempotency-Key` on POSTs. Every answer carries `X-Request-Id`; every error is `{ error: { code, message, details?, requestId } }`.

openapi.json

AI routing

POST /v1/ai/compile

Goal language -> lykia.program/v1 -> plan for now + drafts for later

The intent compiler. Reads several goals, time (every month, if BTC goes above) and abstract wording (safe, the rest, a third, out within a day) into a typed, hashed program; resolves shares, remainders and reserves against the owner's balances (or what-if balances); compiles one plan for now (route-searched under the Fence, the program digest pinned in the Fence facts) plus automation, order, alert and standing-order drafts with links to their prefilled forms; and explains assumptions, trade-offs, rejected alternatives and what is deferred. overrides change an assumption by id. Nothing is signed or saved; plan: true stores the plan for signing.

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1000
    },
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "overrides": {
      "type": "object",
      "additionalProperties": {
        "type": "string",
        "maxLength": 64
      }
    },
    "balances": {
      "type": "object",
      "additionalProperties": {
        "type": "string",
        "pattern": "^(?:0|[1-9]\\d{0,14})(?:\\.\\d{1,18})?$"
      }
    },
    "constraints": {
      "type": "object",
      "properties": {
        "fence": {},
        "venues": {
          "type": "object",
          "properties": {
            "allow": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-z0-9-]{2,48}$"
              },
              "maxItems": 24
            },
            "deny": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-z0-9-]{2,48}$"
              },
              "maxItems": 24
            }
          }
        },
        "maxCandidates": {
          "type": "integer",
          "minimum": 1,
          "maximum": 24
        },
        "horizonDays": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3650
        }
      },
      "additionalProperties": false
    },
    "search": {
      "type": "boolean"
    },
    "plan": {
      "type": "boolean"
    },
    "preview": {
      "type": "boolean"
    },
    "reader": {
      "type": "string",
      "enum": [
        "auto",
        "llm",
        "deterministic"
      ]
    }
  },
  "required": [
    "text"
  ],
  "additionalProperties": false
}

POST /v1/ai/explain-route

Explain a route or a quote in plain words

auth: public · scope: quote

Request body
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "route": {},
        "language": {
          "type": "string",
          "maxLength": 40
        },
        "question": {
          "type": "string",
          "maxLength": 300
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "quoteId": {
          "type": "string",
          "pattern": "^q_[A-Za-z0-9_-]{8,40}$"
        },
        "language": {
          "type": "string",
          "maxLength": 40
        }
      },
      "required": [
        "quoteId"
      ],
      "additionalProperties": false
    }
  ]
}

POST /v1/ai/route

Natural language -> actions -> best route

Any language when a model is configured (deterministic English reader otherwise). Constraints (Fence, venue allow/deny, risk appetite, max steps) only tighten the Fence. build: true also returns the aggregator build of the best route.

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1000
    },
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "constraints": {
      "type": "object",
      "properties": {
        "fence": {},
        "venues": {
          "type": "object",
          "properties": {
            "allow": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-z0-9-]{2,48}$"
              },
              "maxItems": 24
            },
            "deny": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-z0-9-]{2,48}$"
              },
              "maxItems": 24
            }
          }
        },
        "appetite": {
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high"
          ]
        },
        "maxSteps": {
          "type": "integer",
          "minimum": 1,
          "maximum": 12
        },
        "maxCandidates": {
          "type": "integer",
          "minimum": 1,
          "maximum": 24
        },
        "horizonDays": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3650
        }
      },
      "additionalProperties": false
    },
    "simulate": {
      "type": "boolean"
    },
    "build": {
      "type": "boolean"
    },
    "buildOptions": {
      "type": "object",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "transactions",
            "calls",
            "eip5792"
          ]
        },
        "batch": {
          "type": "string",
          "enum": [
            "step",
            "single"
          ]
        },
        "confirm": {
          "type": "boolean"
        },
        "preview": {
          "type": "boolean"
        },
        "provider": {
          "type": "string",
          "pattern": "^[a-z0-9-]{2,48}$"
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "text",
    "owner"
  ],
  "additionalProperties": false
}

Admin

POST /v1/admin/circle/entity-secret

Register the Circle entity secret

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/admin/deployments

Recorded deployments

auth: session

POST /v1/admin/deployments

Record a deployment after checking it on chain

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/admin/flags

Feature flags

auth: session

PUT /v1/admin/flags

Set feature flags

auth: session

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/admin/overview

Operator overview

auth: session

GET /v1/admin/ownership

Unsigned ownership-hardening calls (Safe + timelock)

auth: session

GET /v1/admin/router

Router allowlist

auth: session

Agent

GET /v1/agent/automations

Agent automations (the owner's session or a secret key with the agents scope)

auth: session

ParameterInRequired
ownerqueryyes

POST /v1/agent/automations

Create an automation

auth: key · scope: agents · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/agent/automations/{id}/disable

Disable an automation

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/agent/automations/{id}/enable

Enable an automation

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/agent/automations/run

Run due automations now

auth: key · scope: agents · Idempotency-Key

POST /v1/agent/chat

Chat with Lyko (server-sent events)

Streams Server-Sent Events: thread, notice, reading, task, tool, step (one step of Lyko at work: sent with state running when it starts and again with the same id, ok, warn or fail, the result and the measured ms when it ends), block (a typed answer card built from server data: gas, fence, balance, rate, herded or settled; the text stays the fallback), thinking-summary, proposal, clarify, draft, program, text, error and done. Send Accept: application/json to get the same events collected in one JSON document.

auth: key · scope: agents

Request body
{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4000
    },
    "messages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "enum": [
              "user",
              "assistant"
            ]
          },
          "content": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000
          }
        },
        "required": [
          "role",
          "content"
        ]
      },
      "minItems": 1,
      "maxItems": 30
    },
    "owner": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "threadId": {
      "type": "string",
      "maxLength": 120
    },
    "fence": {},
    "origin": {
      "type": "string",
      "enum": [
        "ask",
        "fold"
      ]
    },
    "context": {
      "type": "string",
      "maxLength": 1000
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "es",
        "pt-BR",
        "zh-CN",
        "fr"
      ],
      "description": "The interface language Lyko answers in (overrides Accept-Language). Input may be in any language."
    }
  }
}

POST /v1/agent/check

Check a proposed agent move

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/agent/insights

Insights about an owner's Flock

auth: key

GET /v1/agent/threads

Conversation threads (the owner's session or a secret key with the agents scope)

auth: session

ParameterInRequired
ownerqueryyes

POST /v1/agent/threads

Start a thread

auth: key · scope: agents · Idempotency-Key

GET /v1/agent/threads/{id}

One thread

auth: key

ParameterInRequired
idpathyes

Agents

GET /v1/agent/instructions

The owner's hand-offs between Lyko on watch and Ask Lyko (plans and watch tasks), newest first; plan statuses follow their plans

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno
toqueryno
kindqueryno
statusqueryno

POST /v1/agent/instructions

Hand work to the other agent: a plan from an insight (Lyko on watch to Ask Lyko, planned under the owner's Fence as a staged plan and written to the shared thread), or a watch task (Ask Lyko to Lyko on watch) from a condition or from a settled plan

auth: session

Request body
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "owner": {
          "type": "string"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "kind": {
          "const": "plan"
        },
        "from": {
          "type": "string",
          "enum": [
            "watch",
            "ask"
          ]
        },
        "to": {
          "type": "string",
          "enum": [
            "watch",
            "ask"
          ]
        },
        "insightId": {
          "type": "string",
          "minLength": 2,
          "maxLength": 120
        },
        "threadId": {
          "type": "string",
          "maxLength": 120
        },
        "fence": {}
      },
      "required": [
        "owner",
        "kind",
        "from",
        "to",
        "insightId"
      ]
    },
    {
      "type": "object",
      "properties": {
        "owner": {
          "type": "string"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "kind": {
          "const": "watch"
        },
        "from": {
          "type": "string",
          "enum": [
            "watch",
            "ask"
          ]
        },
        "to": {
          "type": "string",
          "enum": [
            "watch",
            "ask"
          ]
        },
        "condition": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "const": "health-below"
                },
                "threshold": {
                  "type": "string",
                  "maxLength": 20,
                  "pattern": "^(?:0|[1-9]\\d*)(?:\\.\\d+)?$"
                },
                "venue": {
                  "type": "string",
                  "pattern": "^[a-z0-9-]{2,40}$"
                }
              },
              "required": [
                "kind",
                "threshold"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "const": "lp-out-of-range"
                },
                "venue": {
                  "type": "stri

POST /v1/agent/instructions/{id}/pause

Pause a watch task

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    }
  },
  "required": [
    "owner"
  ]
}

POST /v1/agent/instructions/{id}/remove

Remove a watch task

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    }
  },
  "required": [
    "owner"
  ]
}

POST /v1/agent/instructions/{id}/resume

Resume a watch task

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    }
  },
  "required": [
    "owner"
  ]
}

GET /v1/agents

List agents

auth: secret · scope: read

POST /v1/agents

Create an agent

auth: secret · scope: agents

Request body
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$"
    },
    "name": {
      "type": "string",
      "minLength": 2,
      "maxLength": 64
    },
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "tools": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "plan",
          "flock",
          "scent",
          "venues",
          "prices",
          "search_routes",
          "knowledge",
          "outrun"
        ]
      },
      "maxItems": 8
    },
    "kinds": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "enum": [
          "approve",
          "transfer",
          "swap",
          "fx",
          "deposit",
          "withdraw",
          "supply",
          "borrow",
          "repay",
          "bridge",
          "gateway-deposit",
          "register-agent",
          "attest"
        ]
      },
      "maxItems": 20
    },
    "venues": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 48
      },
      "maxItems": 40
    },
    "fence": {
      "type": "object",
      "additionalProperties": {},
      "description": "A lykia.fence/v1 document (see /v1/fence/templates)."
    },
    "budget": {
      "type": "object",
      "properties": {
        "perRunUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "dailyUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "maxRunsPerDay": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        }
      }
    },
    "pack": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 8,
        "maxLength": 120
      },
      "maxItems": 16
    },
    "persona": {
      "type": "string",
      "maxLength": 2400
    },
    "memory": {
      "type": "boolean"
    },
    "autoPrepare": {
      "type": "boolean"
    },
    "llm": {
      "type": "object",
      "properties": {
        "provider": {
          "type": "string",
          "enum": [
            "lykia"

DELETE /v1/agents/{id}

Delete an agent

auth: secret · scope: agents

ParameterInRequired
idpathyes

GET /v1/agents/{id}

One agent

auth: secret · scope: read

ParameterInRequired
idpathyes

PATCH /v1/agents/{id}

Reconfigure an agent

auth: secret · scope: agents

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$"
    },
    "name": {
      "type": "string",
      "minLength": 2,
      "maxLength": 64
    },
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "tools": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "plan",
          "flock",
          "scent",
          "venues",
          "prices",
          "search_routes",
          "knowledge",
          "outrun"
        ]
      },
      "maxItems": 8
    },
    "kinds": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "enum": [
          "approve",
          "transfer",
          "swap",
          "fx",
          "deposit",
          "withdraw",
          "supply",
          "borrow",
          "repay",
          "bridge",
          "gateway-deposit",
          "register-agent",
          "attest"
        ]
      },
      "maxItems": 20
    },
    "venues": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 48
      },
      "maxItems": 40
    },
    "fence": {
      "type": "object",
      "additionalProperties": {},
      "description": "A lykia.fence/v1 document (see /v1/fence/templates)."
    },
    "budget": {
      "type": "object",
      "properties": {
        "perRunUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "dailyUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "maxRunsPerDay": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        }
      }
    },
    "pack": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 8,
        "maxLength": 120
      },
      "maxItems": 16
    },
    "persona": {
      "type": "string",
      "maxLength": 2400
    },
    "memory": {
      "type": "boolean"
    },
    "autoPrepare": {
      "type": "boolean"
    },
    "llm": {
      "type": "object",
      "properties": {
        "provider": {
          "type": "string",
          "enum": [
            "lykia"

POST /v1/agents/{id}/run

Sentence to plan under the agent's Fence

auth: secret · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4000
    },
    "threadId": {
      "type": "string",
      "maxLength": 80
    },
    "autoPrepare": {
      "type": "boolean"
    },
    "dryRun": {
      "type": "boolean"
    }
  },
  "required": [
    "message"
  ]
}

POST /v1/agents/{id}/tag

ERC-8004 registration (card + unsigned register call)

auth: secret · scope: agents

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "description": {
      "type": "string",
      "maxLength": 500
    },
    "agentWallet": {
      "type": "string"
    }
  }
}

GET /v1/agents/{id}/threads

Conversation threads

auth: secret · scope: read

ParameterInRequired
idpathyes

GET /v1/agents/{id}/threads/{threadId}

One thread

auth: secret · scope: read

ParameterInRequired
idpathyes
threadIdpathyes

Aggregator

POST /v1/aggregator/build

Build ready-to-sign calls

From a quote id or the action's params. Simulated on Arc in one batch and checked by the Fence and the security layer before it is returned; refuses (fail closed) on a deny, an unconfirmed confirm, a revert or any security block. format: transactions (EOA, Arc Memo + Multicall3From), calls (smart accounts) or eip5792 (wallet_sendCalls).

auth: public · scope: build · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "transfer",
        "swap",
        "fx",
        "bridge",
        "deposit",
        "withdraw",
        "supply",
        "borrow",
        "repay",
        "batch"
      ]
    },
    "quoteId": {
      "type": "string",
      "pattern": "^q_[A-Za-z0-9_-]{8,40}$"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "taker": {
      "type": "string"
    },
    "owner": {
      "type": "string"
    },
    "tokenIn": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "tokenOut": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "token": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "amount": {
      "anyOf": [
        {
          "const": "all"
        },
        {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        }
      ]
    },
    "to": {
      "type": "string"
    },
    "memo": {
      "type": "string",
      "maxLength": 256
    },
    "destination": {
      "type": "string",
      "minLength": 2,
      "maxLength": 20
    },
    "recipient": {
      "type": "string"
    },
    "venue": {
      "type": "string",
      "maxLength": 80
    },
    "maxRisk": {
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "collateral": {
      "type": "object",
      "properties": {
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 12
        },
        "amount": {
          "anyOf": [
            {
              "const": "all"
            },
            {
              "type": "string",
              "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
            }
          ]
        }
      },
      "required": [
        "token"
      ]
    },
    "minHealth": {
      "type": "string",
      "pattern": "^\\d{1,3}(?:\\.\\d{1,4})?$"
    },
    "actions": {
      "type": "array",
      "items": {},
      "minItems": 1,
      "maxItems": 12
    },
    "slippageBps": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    },
    "integratorFee": {
      "type": "object",
      "properties": {
        "bps": {
          "type": "integer",
          "minimum": 0

GET /v1/aggregator/quote

Swap quote from query parameters

Best route across every executable Arc venue, the alternatives it beat, price impact, gas in USDC, Lykia's fee, the integrator's fee and the Fence verdict. Returns a quote id to build from.

auth: public · scope: quote

ParameterInRequired
kindqueryno
environmentqueryno
tokenInqueryyes
tokenOutqueryyes
amountqueryyes
takerqueryyes
slippageBpsqueryno
integratorFeeBpsqueryno
integratorFeeRecipientqueryno
includeVenuesqueryno
excludeVenuesqueryno
splitqueryno

POST /v1/aggregator/quote

Quote any action

kind: transfer, swap, fx, bridge, deposit, withdraw, supply, borrow, repay or batch.

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "transfer",
        "swap",
        "fx",
        "bridge",
        "deposit",
        "withdraw",
        "supply",
        "borrow",
        "repay",
        "batch"
      ],
      "default": "swap"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "taker": {
      "type": "string"
    },
    "owner": {
      "type": "string"
    },
    "tokenIn": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "tokenOut": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "token": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "amount": {
      "anyOf": [
        {
          "const": "all"
        },
        {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        }
      ]
    },
    "to": {
      "type": "string"
    },
    "memo": {
      "type": "string",
      "maxLength": 256
    },
    "destination": {
      "type": "string",
      "minLength": 2,
      "maxLength": 20
    },
    "recipient": {
      "type": "string"
    },
    "venue": {
      "type": "string",
      "maxLength": 80
    },
    "maxRisk": {
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "collateral": {
      "type": "object",
      "properties": {
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 12
        },
        "amount": {
          "anyOf": [
            {
              "const": "all"
            },
            {
              "type": "string",
              "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
            }
          ]
        }
      },
      "required": [
        "token"
      ]
    },
    "minHealth": {
      "type": "string",
      "pattern": "^\\d{1,3}(?:\\.\\d{1,4})?$"
    },
    "actions": {
      "type": "array",
      "items": {},
      "minItems": 1,
      "maxItems": 12
    },
    "slippageBps": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    },
    "integratorFee": {
      "type": "object",
      "properties": {
        "bps": {
          "type": "integer",
          "minimum": 0,
          "maximum": 50
        },
        "recipient": {
      

POST /v1/build/{kind}

Build one action type

transfer, swap, fx, bridge, deposit, withdraw, supply, borrow, repay or batch; same answer as POST /v1/aggregator/build.

auth: public · scope: build · Idempotency-Key

ParameterInRequired
kindpathyes
Request body
{
  "type": "object",
  "properties": {
    "quoteId": {
      "type": "string",
      "pattern": "^q_[A-Za-z0-9_-]{8,40}$"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "taker": {
      "type": "string"
    },
    "owner": {
      "type": "string"
    },
    "tokenIn": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "tokenOut": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "token": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "amount": {
      "anyOf": [
        {
          "const": "all"
        },
        {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        }
      ]
    },
    "to": {
      "type": "string"
    },
    "memo": {
      "type": "string",
      "maxLength": 256
    },
    "destination": {
      "type": "string",
      "minLength": 2,
      "maxLength": 20
    },
    "recipient": {
      "type": "string"
    },
    "venue": {
      "type": "string",
      "maxLength": 80
    },
    "maxRisk": {
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "collateral": {
      "type": "object",
      "properties": {
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 12
        },
        "amount": {
          "anyOf": [
            {
              "const": "all"
            },
            {
              "type": "string",
              "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
            }
          ]
        }
      },
      "required": [
        "token"
      ]
    },
    "minHealth": {
      "type": "string",
      "pattern": "^\\d{1,3}(?:\\.\\d{1,4})?$"
    },
    "actions": {
      "type": "array",
      "items": {},
      "minItems": 1,
      "maxItems": 12
    },
    "slippageBps": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    },
    "integratorFee": {
      "type": "object",
      "properties": {
        "bps": {
          "type": "integer",
          "minimum": 0,
          "maximum": 50
        },
        "recipient": {
          "type": "string"
        }
      },
      "required": [
        "bps",
        "recipient"
      ]
    },
    "venues": {
      "type": "object",
      "properties": {
       

POST /v1/quote/{kind}

Quote one action type

auth: public · scope: quote

ParameterInRequired
kindpathyes
Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "taker": {
      "type": "string"
    },
    "owner": {
      "type": "string"
    },
    "tokenIn": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "tokenOut": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "token": {
      "type": "string",
      "minLength": 2,
      "maxLength": 12
    },
    "amount": {
      "anyOf": [
        {
          "const": "all"
        },
        {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        }
      ]
    },
    "to": {
      "type": "string"
    },
    "memo": {
      "type": "string",
      "maxLength": 256
    },
    "destination": {
      "type": "string",
      "minLength": 2,
      "maxLength": 20
    },
    "recipient": {
      "type": "string"
    },
    "venue": {
      "type": "string",
      "maxLength": 80
    },
    "maxRisk": {
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "collateral": {
      "type": "object",
      "properties": {
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 12
        },
        "amount": {
          "anyOf": [
            {
              "const": "all"
            },
            {
              "type": "string",
              "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
            }
          ]
        }
      },
      "required": [
        "token"
      ]
    },
    "minHealth": {
      "type": "string",
      "pattern": "^\\d{1,3}(?:\\.\\d{1,4})?$"
    },
    "actions": {
      "type": "array",
      "items": {},
      "minItems": 1,
      "maxItems": 12
    },
    "slippageBps": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    },
    "integratorFee": {
      "type": "object",
      "properties": {
        "bps": {
          "type": "integer",
          "minimum": 0,
          "maximum": 50
        },
        "recipient": {
          "type": "string"
        }
      },
      "required": [
        "bps",
        "recipient"
      ]
    },
    "venues": {
      "type": "object",
      "properties": {
        "include": {
          "type": "array",
          "items": {
            "type": "string",

Alerts

GET /v1/alerts

Alert rules

auth: session

POST /v1/alerts

Create an alert rule

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

DELETE /v1/alerts/{id}

Delete an alert rule

auth: session

ParameterInRequired
idpathyes

PATCH /v1/alerts/{id}

Update an alert rule

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/alerts/check

Check alert rules now

auth: session · Idempotency-Key

GET /v1/alerts/inbox

Fired alerts

auth: session

POST /v1/alerts/inbox/read

Mark alerts read

auth: session · Idempotency-Key

Arc

GET /v1/arc/pulse

Latest block, gas and finality on Arc

auth: public

ParameterInRequired
environmentqueryno

GET /v1/arc/pulse/stream

Server-sent events: Arc pulse

auth: public

ParameterInRequired
environmentqueryno

GET /v1/contracts

Verified Circle and protocol contracts

auth: public

ParameterInRequired
environmentqueryno

GET /v1/deployments

Lykia's verified contract deployments

auth: public

GET /v1/networks

Arc mainnet and testnet

auth: public

GET /v1/oracles

Chainlink and Pyth reference prices

auth: public

ParameterInRequired
environmentqueryno

GET /v1/protocols

The protocol registry on Arc

auth: public

GET /v1/tokens

Verified tokens per network

auth: public

ParameterInRequired
environmentqueryno

GET /v1/venues

Registry venues with live status and whether Lykia can route through them

auth: public

ParameterInRequired
environmentqueryno

Auth

POST /v1/auth/logout

Revoke the current session

auth: session

POST /v1/auth/mcp-token

A read-only token for the MCP personal tools (memory, contacts, profile); never usable as a session

auth: session

Request body
{
  "type": "object",
  "properties": {
    "ttlHours": {
      "type": "integer",
      "minimum": 1,
      "maximum": 168
    }
  }
}

POST /v1/auth/mcp-token/revoke

Revoke an MCP read-only token

auth: session

Request body
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string"
    }
  },
  "required": [
    "token"
  ]
}

POST /v1/auth/nonce

A SIWE nonce and a ready EIP-4361 message for Arc

auth: public

Request body
{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "chainId": {
      "type": "integer"
    }
  }
}

GET /v1/auth/session

The current session and its roles

auth: session

POST /v1/auth/verify

Verify a signed SIWE message and get a session token

auth: public

Request body
{
  "type": "object",
  "properties": {
    "message": {
      "type": "string"
    },
    "signature": {
      "type": "string"
    }
  },
  "required": [
    "message",
    "signature"
  ]
}

Automations

GET /v1/automations

Unified list (with the owner's standing orders, alerts, agent automations and orders)

auth: secret · scope: read

ParameterInRequired
ownerqueryno

POST /v1/automations

Create an automation (price, schedule, balance or event; plan or notify)

auth: secret · scope: automation · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$"
    },
    "owner": {
      "type": "string"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "trigger": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "const": "price"
            },
            "feed": {
              "type": "string",
              "enum": [
                "EURC/USD",
                "BTC/USD",
                "ETH/USD",
                "EUR/USD",
                "USDC/USD",
                "JPY/USD",
                "BRL/USD",
                "MXN/USD",
                "PAXG/USD"
              ]
            },
            "op": {
              "type": "string",
              "enum": [
                "above",
                "below"
              ]
            },
            "value": {
              "type": "string",
              "pattern": "^(?:0|[1-9]\\d{0,17})(?:\\.\\d{1,18})?$"
            }
          },
          "required": [
            "type",
            "feed",
            "op",
            "value"
          ]
        },
        {
          "type": "object",
          "properties": {
            "every": {
              "type": "string",
              "enum": [
                "day",
                "week",
                "month"
              ]
            },
            "weekday": {
              "type": "string",
              "enum": [
                "mon",
                "tue",
                "wed",
                "thu",
                "fri",
                "sat",
                "sun"
              ]
            },
            "day": {
              "type": "integer",
              "minimum": 1,
              "maximum": 28
            },
            "at": {
              "type": "string",
              "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$"
            },
            "timezone": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "type": {
              "const": "schedule"
            }
          },
          "required": [
            "every",
            "at",
            "timezone",
     

DELETE /v1/automations/{id}

Delete

auth: secret · scope: automation

ParameterInRequired
idpathyes

GET /v1/automations/{id}

One automation

auth: secret · scope: read

ParameterInRequired
idpathyes

POST /v1/automations/{id}/pause

Pause

auth: secret · scope: automation

ParameterInRequired
idpathyes

POST /v1/automations/{id}/resume

Resume

auth: secret · scope: automation

ParameterInRequired
idpathyes

Autopilot

GET /v1/autopilot

The owner's Autopilot

Whether this server can sign for Autopilot, its ceilings (at most the lower of $100 a step and $300 a day and the mainnet beta cap), the acknowledgement and its digest, who holds what, and the owner's Autopilot with its leash, today's spend and the last runs. Task kinds: repay, dca, sweep, pay, watch.

auth: session

ParameterInRequired
environmentqueryno

POST /v1/autopilot/enable

Turn Autopilot on

Needs LYKIA_CIRCLE_SERVER_WALLETS=true on the server (403 otherwise), the acknowledgement digest (400 AUTOPILOT_ACK_REQUIRED otherwise) and limits under the ceilings. Makes (or reuses) the owner's Circle EOA wallet and a leash on the owner's LykiaAccount with that wallet as its session key; returns the transactions the owner signs once. Nothing is signed by the server before that session lands.

auth: session

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "ack": {
      "type": "string",
      "maxLength": 80,
      "description": "The digest of the acknowledgement text from GET /v1/autopilot (offer.ack.digest)."
    },
    "limits": {
      "type": "object",
      "properties": {
        "perStepUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "perDayUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30
        }
      },
      "required": [
        "perStepUsd",
        "perDayUsd",
        "days"
      ]
    },
    "payees": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 10,
      "description": "Addresses Autopilot may pay (recurring invoices). Money to you is always allowed."
    }
  },
  "required": [
    "ack",
    "limits"
  ]
}

POST /v1/autopilot/pause

Pause Autopilot

Nothing is signed until it is resumed; the session stays.

auth: session

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "reason": {
      "type": "string",
      "maxLength": 200
    }
  }
}

POST /v1/autopilot/resume

Resume Autopilot

After a pause by the owner or by the anomaly guard (repeated refusals, unusual spend velocity).

auth: session

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "reason": {
      "type": "string",
      "maxLength": 200
    }
  }
}

POST /v1/autopilot/stop

Stop Autopilot

The kill switch. Server signing stops at once, the leash and its Pack agent are revoked, and revokeSession comes back for the owner's wallet.

auth: session

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "reason": {
      "type": "string",
      "maxLength": 200
    }
  }
}

POST /v1/autopilot/tasks

Add an Autopilot task

repay (when the account's health factor drops below a floor), dca (convert on a schedule), sweep (idle USDC above an amount into a vault), pay (a payee named when Autopilot was turned on, on a schedule), watch (one of the owner's watches, then an action). Every run is planned under the Autopilot leash and checked again before Circle signs.

auth: session

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "task": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "kind": {
              "const": "repay"
            },
            "amountUsd": {
              "type": "string",
              "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
            },
            "floor": {
              "type": "string",
              "maxLength": 8
            },
            "venue": {
              "const": "aave-v4"
            }
          },
          "required": [
            "kind",
            "amountUsd",
            "floor"
          ]
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "const": "dca"
            },
            "amountUsd": {
              "type": "string",
              "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
            },
            "every": {
              "type": "string",
              "enum": [
                "day",
                "week",
                "month"
              ]
            },
            "to": {
              "type": "string",
              "enum": [
                "EURC",
                "USDC"
              ]
            }
          },
          "required": [
            "kind",
            "amountUsd",
            "every",
            "to"
          ]
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "const": "sweep"
            },
            "amountUsd": {
              "type": "string",
              "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
            },
            "keepUsd": {
              "type": "string",
              "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
            },
            "vault": {
              "type": "string",
              "minLength": 2,
              "maxLength": 48
            }
          },
          "required": [
            "kind",
            "amountUsd",
            "keepUsd",
            "vault"
          ]
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "const": "pay"
            },
            "amountUsd": {
              "type": "string",
              "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
            },
 

POST /v1/autopilot/tasks/{id}/{action}

Pause, resume, remove or run a task

run plans it now with the same checks as a scheduled run.

auth: session

ParameterInRequired
idpathyes
actionpathyes
Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    }
  }
}

Billing

POST /v1/billing/credits

Buy prepaid API credits with x402 (USDC on Arc); answers 402 with the requirements until paid

auth: session · scope: admin · Idempotency-Key

ParameterInRequired
X-PAYMENTheaderno
Request body
{
  "type": "object",
  "properties": {
    "amountUsdc": {
      "type": "string",
      "pattern": "^\\d{1,5}(?:\\.\\d{1,6})?$"
    }
  },
  "required": [
    "amountUsdc"
  ]
}

GET /v1/billing/ledger

Credit purchases and overage paid over x402

auth: session · scope: read

GET /v1/billing/plan

The account's plan, credits and limits

auth: session · scope: read

PUT /v1/billing/plan

Switch between Free and Pay as you go

auth: session · scope: admin

Request body
{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string",
      "enum": [
        "free",
        "payg",
        "enterprise"
      ]
    },
    "owner": {
      "type": "string",
      "description": "Admins only: the account to change."
    }
  },
  "required": [
    "plan"
  ]
}

GET /v1/billing/plans

Every API plan

auth: public

GET /v1/billing/usage

Usage this month, per day and per endpoint

auth: session · scope: read

ParameterInRequired
daysqueryno

Circle

POST /v1/circle/agent-wallets

Create Circle agent wallets

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/cctp/fees

CCTP V2 fees

auth: public

ParameterInRequired
environmentqueryno

POST /v1/circle/cctp/forward

Draft a CCTP forward

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/cctp/status

A CCTP burn from Arc: attestation, forwarding state, destination mint

auth: public

ParameterInRequired
environmentqueryno

GET /v1/circle/compliance/{address}

Compliance screening of an address

auth: key

ParameterInRequired
addresspathyes

GET /v1/circle/gateway/balance

Unified Gateway balance

auth: key

POST /v1/circle/gateway/transfer

Submit a Gateway transfer

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/gateway/transfer/attest

Attest a Gateway transfer

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/gateway/transfer/draft

Draft a Gateway transfer

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/gateway/transfers/{id}

Gateway's record of a transfer, forwarded mints included

auth: public

ParameterInRequired
idpathyes
environmentqueryno

POST /v1/circle/mandates/draft

Arc typed-mandate draft from a Fence (status pending)

auth: public · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/mandates/proof

Arc execution-proof draft from a verdict (status pending)

auth: public · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/marketplace/listing

Lykia's Agent Marketplace listing package

auth: public

GET /v1/circle/marketplace/services

Agent Marketplace services payable on Arc

auth: public

POST /v1/circle/policies/apply

The owner's Circle CLI commands for a compiled policy (never applied by Lykia)

auth: public · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/policies/compile

Compile a Fence into a Circle Agent Wallet spending policy, with who enforces each rule

auth: public · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/providers

Circle execution providers and controls, with status

auth: public

POST /v1/circle/screen

Screen an address

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/services

Circle Agent Marketplace services

auth: public

POST /v1/circle/stablefx/fund

StableFX taker funding: hand over the signed Permit2 data

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/stablefx/funding/presign

StableFX taker funding: Permit2 typed data to sign

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/stablefx/quote

StableFX quote (USDC/EURC)

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/stablefx/trade

StableFX trade

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/stablefx/trades/{id}

A StableFX trade

auth: key

ParameterInRequired
idpathyes

GET /v1/circle/status

Every Circle product live on Arc and how Lykia uses it

auth: public

GET /v1/circle/usyc/eligibility

USYC entitlement of a wallet on Arc (Entitlements.canCall on the Teller)

auth: public

ParameterInRequired
environmentqueryno

POST /v1/circle/usyc/prepare

USYC subscribe or redeem for an entitled wallet: Fence verdict and unsigned calls

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/circle/wallets/{id}/balances

Circle wallet balances

auth: session

ParameterInRequired
idpathyes

POST /v1/circle/wallets/agent

Create a Circle agent wallet

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/x402/pay

Pay an x402 resource

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/circle/x402/prepare

Prepare an x402 payment

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

Contracts

POST /v1/contracts/decode

Calldata and logs -> plain English

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "to": {
      "type": "string"
    },
    "data": {
      "type": "string",
      "pattern": "^0x(?:[0-9a-fA-F]{2}){0,24576}$"
    },
    "value": {
      "type": "string",
      "pattern": "^\\d{1,40}$"
    },
    "logs": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string"
          },
          "topics": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{64}$"
            },
            "minItems": 1,
            "maxItems": 4
          },
          "data": {
            "type": "string",
            "pattern": "^0x(?:[0-9a-fA-F]{2}){0,24576}$"
          }
        },
        "required": [
          "address",
          "topics",
          "data"
        ]
      },
      "maxItems": 100
    },
    "abi": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000
          },
          "minItems": 1,
          "maxItems": 64
        },
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": {}
          },
          "minItems": 1,
          "maxItems": 256
        }
      ]
    }
  },
  "additionalProperties": false
}

POST /v1/contracts/encode

ABI + function + args -> calldata

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "abi": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000
          },
          "minItems": 1,
          "maxItems": 64
        },
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": {}
          },
          "minItems": 1,
          "maxItems": 256
        }
      ]
    },
    "function": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "args": {
      "type": "array",
      "items": {},
      "maxItems": 32
    }
  },
  "required": [
    "abi",
    "function"
  ],
  "additionalProperties": false
}

POST /v1/contracts/read

Many view calls in one multicall

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "calls": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string"
          },
          "abi": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 1000
                },
                "minItems": 1,
                "maxItems": 64
              },
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": {}
                },
                "minItems": 1,
                "maxItems": 256
              }
            ]
          },
          "function": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "args": {
            "type": "array",
            "items": {},
            "maxItems": 32
          }
        },
        "required": [
          "address",
          "abi",
          "function"
        ]
      },
      "minItems": 1,
      "maxItems": 50
    }
  },
  "required": [
    "calls"
  ],
  "additionalProperties": false
}

POST /v1/contracts/simulate

Simulate a call batch from an address

One Multicall3From eth_call: balance diff, decoded calls, events when eth_simulateV1 is available, and a security verdict.

auth: public · scope: quote

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "from": {
      "type": "string"
    },
    "calls": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "to": {
                "type": "string"
              },
              "data": {
                "type": "string",
                "pattern": "^0x(?:[0-9a-fA-F]{2}){0,24576}$"
              },
              "value": {
                "type": "string",
                "pattern": "^\\d{1,40}$"
              }
            },
            "required": [
              "to",
              "data"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "to": {
                "type": "string"
              },
              "abi": {
                "anyOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "minItems": 1,
                    "maxItems": 64
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": {}
                    },
                    "minItems": 1,
                    "maxItems": 256
                  }
                ]
              },
              "function": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "args": {
                "type": "array",
                "items": {},
                "maxItems": 32
              },
              "value": {
                "type": "string",
                "pattern": "^\\d{1,40}$"
              }
            },
            "required": [
              "to",
              "abi",
              "function"
            ],
            "additionalProperties": false
          }
        ]
      },
      "minItems": 1,
      "maxItems": 20
    },
    "tokens": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 10
    },
    "abi": {
      "anyOf":

Data

GET /v1/data/portfolio/{address}

Balances and positions across venues, in USD

auth: public · scope: read

ParameterInRequired
addresspathyes
environmentqueryno

GET /v1/data/prices

USD prices (Chainlink on Arc, pegs, NAV)

auth: public · scope: read

ParameterInRequired
environmentqueryno
symbolsqueryno

GET /v1/data/protocols

The protocols mapped on Arc: status, TVL, APYs and routable adapters

auth: public · scope: read

ParameterInRequired
environmentqueryno

GET /v1/data/tokens

Token registry with prices and sources

auth: public · scope: read

ParameterInRequired
environmentqueryno

POST /v1/tx/explain

Explain a transaction in plain English

A mined transaction by hash (decoded calls and events), or an unsigned one (decoded, simulated, with a security verdict).

auth: public · scope: quote

Request body
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "hash": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{64}$"
        }
      },
      "required": [
        "hash"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "transaction": {
          "type": "object",
          "properties": {
            "from": {
              "type": "string"
            },
            "to": {
              "type": "string"
            },
            "data": {
              "type": "string",
              "pattern": "^0x(?:[0-9a-fA-F]{2}){0,24576}$"
            },
            "value": {
              "type": "string",
              "pattern": "^\\d{1,40}$"
            }
          },
          "required": [
            "from",
            "to",
            "data"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "transaction"
      ],
      "additionalProperties": false
    }
  ]
}

GET /v1/tx/explain/{hash}

Explain a mined transaction

auth: public · scope: read

ParameterInRequired
hashpathyes
environmentqueryno

Developers

GET /v1/developers/me

Profile, fee settings and usage

auth: session

POST /v1/developers/register

Become a developer

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "website": {
      "type": [
        "string",
        "null"
      ],
      "format": "uri"
    }
  },
  "required": [
    "name"
  ]
}

PUT /v1/developers/settings

Integrator fee (bps, capped) and its recipient

auth: session

Request body
{
  "type": "object",
  "properties": {
    "integratorFeeBps": {
      "type": "integer",
      "minimum": 0,
      "maximum": 50
    },
    "feeRecipient": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^0x[0-9a-fA-F]{40}$"
    }
  },
  "required": [
    "integratorFeeBps",
    "feeRecipient"
  ]
}

GET /v1/developers/usage

Requests today, the last seven days and per key

auth: session

Discover

GET /v1/activity

Recent activity

auth: public

ParameterInRequired
environmentqueryno

GET /v1/discover/launches

New token launches on Arc

auth: public

ParameterInRequired
environmentqueryno

GET /v1/perps/markets

Perpetual markets

auth: public

GET /v1/perps/markets/{market}

One perpetual market

auth: public

ParameterInRequired
marketpathyes

GET /v1/track/{hash}

Track a transaction on Arc

auth: public

ParameterInRequired
hashpathyes
environmentqueryno

GET /v1/watch

Watched addresses

auth: session

POST /v1/watch

Watch an address

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    }
  },
  "required": [
    "address"
  ]
}

DELETE /v1/watch/{address}

Stop watching an address

auth: session

ParameterInRequired
addresspathyes

Ecosystem

GET /v1/ecosystem

The protocols mapped on Arc, Circle's products, TVL and value routed by Lykia

auth: public

ParameterInRequired
environmentqueryno

Events

GET /v1/events

The account's events, newest first (what webhooks deliver)

auth: session · scope: read

ParameterInRequired
limitqueryno
cursorqueryno
sincequeryno
typequeryno

GET /v1/events/{id}

One event

auth: session · scope: read

ParameterInRequired
idpathyes

Fence

GET /v1/fence/default

The default Fence

auth: public

POST /v1/fence/evaluate

Evaluate a planned move against a Fence: allow, confirm or deny with reasons

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "fence": {},
    "facts": {
      "type": "object",
      "properties": {
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "signer": {
          "type": "string",
          "enum": [
            "wallet",
            "agent"
          ]
        },
        "owner": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$"
        },
        "proposedByAgent": {
          "type": "boolean"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "maxLength": 32
              },
              "kind": {
                "type": "string",
                "maxLength": 32
              },
              "venue": {
                "type": "string",
                "maxLength": 48
              },
              "usd": {
                "type": [
                  "string",
                  "null"
                ],
                "pattern": "^\\d{1,15}(?:\\.\\d{1,8})?$"
              },
              "tokens": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string",
                      "maxLength": 32
                    },
                    "address": {
                      "type": "string",
                      "pattern": "^0x[0-9a-fA-F]{40}$"
                    },
                    "listed": {
                      "type": "boolean"
                    },
                    "acquired": {
                      "type": "boolean"
                    },
                    "scent": {
                      "type": "string",
                      "enum": [
                        "verified",
                        "no-red-flags",
                        "caution",
                        "danger",
                        "unknown"
                      ]
                    }
                  },
                  "required": [
                    "symbol",
                    "address",
                    "listed",
                    "acquired"
                  ]
                },
                "maxItems

GET /v1/fence/templates

Fence templates

auth: public

POST /v1/fence/validate

Validate a Fence document (and diff it against a previous one)

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "fence": {},
    "previous": {}
  }
}

GET /v1/me/fence

The owner's Fence, kept on the server: its preset (Careful, Balanced or Bold, the risk profile), whether it was edited beyond the preset, and its hash. Chat, proposals and automations plan under it

auth: session

PUT /v1/me/fence

Pick a preset or save an edited Fence. Tightening applies at once; a loosening returns 403 FENCE_SIGNATURE_REQUIRED with the message to sign, then succeeds with signature

auth: session

Request body
{
  "type": "object",
  "properties": {
    "preset": {
      "type": "string",
      "enum": [
        "careful",
        "balanced",
        "bold"
      ]
    },
    "fence": {
      "type": "object",
      "additionalProperties": {}
    },
    "signature": {
      "type": "string",
      "maxLength": 4000,
      "description": "The owner's signature on the loosening message (403 FENCE_SIGNATURE_REQUIRED returns it); only a loosening needs one."
    },
    "migrated": {
      "type": "boolean",
      "description": "True when this Fence is the one a browser held from before, kept by the owner."
    }
  }
}

POST /v1/me/fence/migrated

The owner discarded the Fence a browser held from before; it is not proposed again

auth: session

Flock

GET /v1/flock/{address}

One balance sheet: wallet, Gateway and venue positions, priced

auth: public

ParameterInRequired
addresspathyes
environmentqueryno

GET /v1/flock/{address}/stream

Server-sent events: the Flock as it changes

auth: public

ParameterInRequired
addresspathyes
environmentqueryno

Fold

POST /v1/fold/answer

Answer a follow-up chip and write the exchange to the owner's shared thread

auth: session

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "question": {
      "type": "string",
      "enum": [
        "yield",
        "whatif",
        "week",
        "approvals"
      ]
    },
    "threadId": {
      "type": "string",
      "maxLength": 120
    },
    "shocks": {
      "type": "object",
      "properties": {
        "EURC": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "default": 0
        },
        "cirBTC": {
          "type": "number",
          "minimum": -90,
          "maximum": 90,
          "default": 0
        },
        "ratesBps": {
          "type": "integer",
          "minimum": -1000,
          "maximum": 1000,
          "default": 0
        }
      }
    }
  },
  "required": [
    "owner",
    "question"
  ]
}

GET /v1/fold/explain

A structured explanation (yield and fees, a what-if, this week's runs, open approvals) as label, value and note lines

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno
questionqueryyes

GET /v1/fold/feed

Every proposal transition of the last 30 days

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno

GET /v1/fold/insights/{address}

Lyko on watch: deterministic insights for an address (idle USDC, health factor, FX drift, runway, approvals, red-flag tokens, gas, caps, orders, agent budgets, unsettled steps, better rates), each with the figures behind it and an optional one-tap draft. Signed in as the owner: preferences, handled flags and the morning brief apply.

auth: public

ParameterInRequired
addresspathyes
environmentqueryno

GET /v1/fold/instructions

Herding: one list of every standing instruction (automations, standing orders and recurring payments, alerts, agent automations, LykiaOrders orders) with next run, last result and the expected Fence verdict, plus the proposals waiting for a signature

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno

GET /v1/fold/positions/{address}

Every position the address holds in every venue Lykia supports on Arc: the wallet, Aave V4 (Main and Forex Spokes), Morpho vaults (by curator: Galaxy, Keyrock, Steakhouse, Gauntlet, Bitwise) and Morpho Blue markets, Uniswap v3 and v4, Aerodrome Slipstream, Archery, Unitflow Finance V3 and SushiSwap V3 LP NFTs, USYC, the Circle Gateway unified balance and, for the proven owner, CCTP and Relay transfers in flight, open LykiaOrders orders and scheduled payments. Each position carries its amount, USD value, state (earning, idle, borrowing, at-risk, out-of-range, pending, escrowed, committed), what it is doing, APY, health, range and fees where they apply, one-tap Lyko actions, its source (chain, api, history), the block and an explorer link. A venue that cannot be read comes back unavailable with the reason, never as zero. Each venue is read with its own time limit and cached for 20 seconds per address.

auth: public

ParameterInRequired
addresspathyes
environmentqueryno
venuesqueryno

GET /v1/fold/proposals

The owner's proposals, newest first; plans that settled become done and plans that failed become stopped

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno
statusqueryno

POST /v1/fold/proposals

Draft a proposal: from an insight (its server-side draft is used), a holding action or a chat sentence (planned under the owner's Fence with the fee and the beta cap), or a Fence edit. Nothing is signed.

auth: session

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "source": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "insight",
            "chat",
            "fence",
            "holding"
          ]
        },
        "ref": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 120,
          "default": null
        }
      },
      "required": [
        "kind"
      ]
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "sentence": {
      "type": "string",
      "minLength": 3,
      "maxLength": 400
    },
    "fencePatch": {
      "type": "object",
      "additionalProperties": {}
    },
    "fence": {}
  },
  "required": [
    "owner",
    "source"
  ]
}

POST /v1/fold/proposals/{id}/approve

The owner accepted or started signing a proposal (proposed → approved)

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "note": {
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "owner"
  ]
}

POST /v1/fold/proposals/{id}/done

A proposal finished (approved → done)

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "note": {
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "owner"
  ]
}

POST /v1/fold/proposals/{id}/stop

Stop a proposal (its plan is stopped too)

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "note": {
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "owner"
  ]
}

POST /v1/fold/seen

Mark the morning brief as seen: the next brief lists only what changed after now

auth: session

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    }
  },
  "required": [
    "owner"
  ]
}

GET /v1/fold/summary/{address}

The Fold bar: today's spend against the Fence's daily cap and the beta cap, and the counts of rules running, orders waiting, agents working and proposals waiting

auth: public

ParameterInRequired
addresspathyes
environmentqueryno

GET /v1/fold/trails

Trails: settled steps with their Arc Memo, Fence verdict and digest and fee; plans running; failed and refused attempts; orders, alerts and proposals

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno

GET /v1/fold/whatif/{address}

The shared shock model on the live Flock: EURC and cirBTC price moves (percent) and a lending rate change (bps), with health factors and one sentence

auth: public

ParameterInRequired
addresspathyes
environmentqueryno
eurcqueryno
btcqueryno
ratesqueryno

DELETE /v1/me/preferences

Back to the default preferences

auth: session

GET /v1/me/preferences

Your Lyko: risk profile, liquidity floor, target mix, gas floor, insights and notifications and the Fold's layout, with the effect of each

auth: session

PUT /v1/me/preferences

Update Your Lyko (partial; validated). The risk profile is the Fence preset: a change that loosens the Fence needs fenceSignature, the owner's signature on the loosening message

auth: session

Request body
{
  "type": "object",
  "additionalProperties": {}
}

GET /v1/me/threads

The owner's shared threads (Ask Lyko and Lyko on watch), newest first, with size, last line and origin

auth: session

Integrations

GET /v1/integrations/adapters

List adapters

auth: public · scope: read

ParameterInRequired
minequeryno
statusqueryno

POST /v1/integrations/adapters

Submit a Lykia Adapter Manifest

A lykia.adapter/v1 document. validate: true runs the on-chain validation right away.

auth: secret · scope: build · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "manifest": {},
    "validate": {
      "type": "boolean"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    }
  },
  "additionalProperties": false
}

GET /v1/integrations/adapters/{id}

One adapter

auth: public · scope: read

ParameterInRequired
idpathyes

POST /v1/integrations/adapters/{id}/review

Admin review: approve, reject, route or suspend

auth: session · scope: admin

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "decision": {
      "type": "string",
      "enum": [
        "approve",
        "reject",
        "route",
        "suspend"
      ]
    },
    "note": {
      "type": "string",
      "maxLength": 400
    }
  },
  "required": [
    "decision"
  ],
  "additionalProperties": false
}

GET /v1/integrations/adapters/{id}/status

Adapter status and last validation

auth: public · scope: read

ParameterInRequired
idpathyes

POST /v1/integrations/adapters/{id}/validate

Validate an adapter on chain

eth_getCode for every contract, selectors in the ABI (and the bytecode, info only), every read callable, and a dry simulation of each capability with a sample amount.

auth: secret · scope: build

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    }
  },
  "additionalProperties": false
}

GET /v1/integrations/manifest

The adapter manifest spec and an example

auth: public · scope: read

Intents

POST /v1/intents

Plan an outcome (a sentence or actions), checked against the Fence

Returns the intent graph, the Fence verdict, the Outrun and the Lykia fee per step. The server never signs. `intent.preflight` lists what will go wrong before anything is signed (lykia.preflight/v1): each finding has a severity (block, warn, note), the figures it used with their source and read time, and fixes computed by code (a `replan` fix carries the sentence and the actions to plan instead). Example: 2 of 2.01 USDC to EURC on Arc leaves no USDC for gas, so a `gas-reserve` warning offers "Use 1.50 USDC".

auth: key · scope: build · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "actions": {
      "type": "array",
      "items": {},
      "maxItems": 12
    },
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "fence": {},
    "signer": {
      "type": "string",
      "enum": [
        "wallet",
        "agent"
      ]
    },
    "agent": {
      "type": "object",
      "properties": {
        "address": {
          "type": "string"
        },
        "agentId": {
          "type": "string",
          "pattern": "^\\d{1,30}$"
        }
      },
      "required": [
        "address"
      ]
    },
    "account": {
      "type": "string",
      "enum": [
        "eoa",
        "smart"
      ]
    },
    "dryRun": {
      "type": "boolean"
    },
    "proposedByAgent": {
      "type": "boolean"
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "tr",
        "es",
        "pt-BR",
        "zh-CN",
        "fr"
      ]
    }
  },
  "required": [
    "owner"
  ]
}

GET /v1/intents/{id}

An intent and its Outrun

auth: key

ParameterInRequired
idpathyes

GET /v1/intents/{id}/outrun

Where the money is: the Outrun

auth: key

ParameterInRequired
idpathyes

GET /v1/intents/{id}/preflight

Preflight read again now: blocks, warnings and notes with their fixes

Balances, gas, prices, Herding and recipients are read again; the findings are stored on the plan. `gate.blocked` means prepare refuses; `gate.needsAck` lists the warnings prepare wants acknowledged.

auth: key

ParameterInRequired
idpathyes

GET /v1/intents/{id}/steps/{sid}/attestation

The CCTP attestation of a bridge step

auth: key

ParameterInRequired
idpathyes
sidpathyes

POST /v1/intents/{id}/steps/{sid}/prepare

Unsigned calls, binding and memo for one step (or its whole stage), rebuilt now

Preflight is read again first (while no step has left the wallet): a `block` finding answers 409 PREFLIGHT_BLOCKED with the findings in details; `warn` findings answer 409 PREFLIGHT_ACK_REQUIRED until the call carries `acknowledge: true`; the answer carries `preflight`. A step whose amount is what the step before produced is first planned again with the amount that step's receipt shows (net Transfer logs), never the quote; the answer carries `replanned`. The Fence and the beta cap are evaluated again on the plan as it is now. With `stage: true` an EOA's steps that share the stage come back as one Multicall3From transaction (`stepIds`). A refusal (FENCE_DENIED, NO_ROUTE, INSUFFICIENT_BALANCE) is recorded on the step, so the plan reads as paused there until it is retried.

auth: key · scope: build · Idempotency-Key

ParameterInRequired
idpathyes
sidpathyes
Request body
{
  "type": "object",
  "properties": {
    "confirm": {
      "type": "boolean"
    },
    "stage": {
      "type": "boolean",
      "description": "Batch the steps that share this step's stage into one Multicall3From transaction (EOA signers)."
    },
    "acknowledge": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 120
          },
          "maxItems": 40
        }
      ],
      "description": "The owner read the plan's preflight warnings (intent.preflight, severity warn): true for all of them, or the ids of the ones shown. Without it a plan with warnings answers 409 PREFLIGHT_ACK_REQUIRED; a block always answers 409 PREFLIGHT_BLOCKED."
    }
  },
  "default": {}
}

POST /v1/intents/{id}/steps/{sid}/retry

Retry a paused step: back to ready with its old calls dropped

For a step refused at prepare or whose transaction reverted (nothing moved). Settled steps stay settled; nothing is signed.

auth: key · scope: build · Idempotency-Key

ParameterInRequired
idpathyes
sidpathyes

POST /v1/intents/{id}/steps/{sid}/submit

Record signed transaction hashes (or a userOpHash) for a step

auth: key · scope: execute · Idempotency-Key

ParameterInRequired
idpathyes
sidpathyes
Request body
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "hashes": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^0x[0-9a-fA-F]{64}$"
          },
          "minItems": 1,
          "maxItems": 4
        }
      },
      "required": [
        "hashes"
      ]
    },
    {
      "type": "object",
      "properties": {
        "userOpHash": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{64}$"
        }
      },
      "required": [
        "userOpHash"
      ]
    }
  ]
}

POST /v1/intents/{id}/stop

Stop every step that has not started

auth: key · scope: execute · Idempotency-Key

ParameterInRequired
idpathyes

GET /v1/intents/{id}/stream

Server-sent events: intent and Outrun updates

auth: key

ParameterInRequired
idpathyes

Invoices

GET /v1/invoices

List invoices

auth: secret · scope: read

ParameterInRequired
projectIdqueryno
statusqueryno

POST /v1/invoices

Create an invoice and its payment link

auth: secret · scope: payouts · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "token": {
      "type": "string",
      "minLength": 2,
      "maxLength": 42
    },
    "payee": {
      "type": "string"
    },
    "amount": {
      "type": "string",
      "pattern": "^(?:0|[1-9]\\d{0,17})(?:\\.\\d{1,18})?$"
    },
    "payer": {
      "type": "string"
    },
    "dueDate": {
      "type": "string",
      "maxLength": 40
    },
    "reference": {
      "type": "string",
      "maxLength": 64
    },
    "memo": {
      "type": "string",
      "maxLength": 200
    },
    "lineItems": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "quantity": {
            "type": "string",
            "maxLength": 24
          },
          "unitAmount": {
            "type": "string",
            "maxLength": 40
          }
        },
        "required": [
          "description",
          "quantity",
          "unitAmount"
        ]
      },
      "maxItems": 50
    },
    "allowPartial": {
      "type": "boolean"
    }
  },
  "required": [
    "token",
    "payee"
  ]
}

GET /v1/invoices/{id}

One invoice with its payments

auth: secret · scope: read

ParameterInRequired
idpathyes

POST /v1/invoices/{id}/pay

Plan the payer's transfer (unsigned)

auth: public

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "payer": {
      "type": "string"
    },
    "amount": {
      "type": "string",
      "pattern": "^(?:0|[1-9]\\d{0,17})(?:\\.\\d{1,18})?$"
    },
    "account": {
      "type": "string",
      "enum": [
        "eoa",
        "smart"
      ]
    }
  },
  "required": [
    "payer"
  ]
}

POST /v1/invoices/{id}/payments

Reconcile a payment by transaction hash

auth: public

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "hash": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{64}$"
    }
  },
  "required": [
    "hash"
  ]
}

GET /v1/invoices/{id}/public

What the hosted pay page reads

auth: public

ParameterInRequired
idpathyes

POST /v1/invoices/{id}/void

Void an unpaid invoice

auth: secret · scope: payouts

ParameterInRequired
idpathyes

Jobs

GET /v1/jobs/{id}

An escrowed job

auth: key

ParameterInRequired
idpathyes

POST /v1/jobs/{id}/complete

Complete a job (unsigned)

auth: key · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/jobs/{id}/fund

Fund a job (unsigned)

auth: key · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/jobs/{id}/refund

Refund a job (unsigned)

auth: key · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/jobs/{id}/reject

Reject a job (unsigned)

auth: key · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/jobs/draft

Draft an escrowed job

auth: key · scope: automation · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

Keys

GET /v1/developers/keys

List API keys

auth: session · scope: admin

POST /v1/developers/keys

Create an API key (live or test, scopes, IP allowlist, limits, version pin)

auth: session · scope: admin · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "label": {
      "type": "string",
      "minLength": 1,
      "maxLength": 48
    },
    "kind": {
      "type": "string",
      "enum": [
        "secret",
        "publishable"
      ],
      "default": "secret"
    },
    "mode": {
      "type": "string",
      "enum": [
        "live",
        "test"
      ],
      "description": "live (lk_live_…) or test (lk_test_…, testnet only). Omit for a legacy lk_sk_ key."
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "read",
          "quote",
          "build",
          "execute",
          "agents",
          "automation",
          "payouts",
          "admin",
          "plan",
          "webhooks"
        ]
      },
      "minItems": 1,
      "maxItems": 10
    },
    "allowedOrigins": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      },
      "maxItems": 10
    },
    "allowedIps": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 64,
        "description": "An IPv4/IPv6 address or a CIDR range"
      },
      "maxItems": 20
    },
    "perMinute": {
      "type": "integer",
      "minimum": 1,
      "maximum": 6000
    },
    "perDay": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5000000
    },
    "apiVersion": {
      "type": "string",
      "enum": [
        "2026-06-01",
        "2026-11-01"
      ]
    },
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$",
      "description": "Bind a secret key to one of your projects: the project's Fence and limits apply, and the key may act for owners who granted that project consent (POST /v1/consents)."
    }
  },
  "required": [
    "label"
  ]
}

GET /v1/developers/keys/{id}

One API key

auth: session · scope: admin

ParameterInRequired
idpathyes

PATCH /v1/developers/keys/{id}

Change a key's label, scopes, IP allowlist, origins, limits or version pin

auth: session · scope: admin

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "label": {
      "type": "string",
      "minLength": 1,
      "maxLength": 48
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "read",
          "quote",
          "build",
          "execute",
          "agents",
          "automation",
          "payouts",
          "admin",
          "plan",
          "webhooks"
        ]
      },
      "minItems": 1,
      "maxItems": 10
    },
    "allowedOrigins": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      },
      "maxItems": 10
    },
    "allowedIps": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 64,
        "description": "An IPv4/IPv6 address or a CIDR range"
      },
      "maxItems": 20
    },
    "perMinute": {
      "type": "integer",
      "minimum": 1,
      "maximum": 6000
    },
    "perDay": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5000000
    },
    "apiVersion": {
      "type": "string",
      "enum": [
        "2026-06-01",
        "2026-11-01"
      ]
    }
  }
}

POST /v1/developers/keys/{id}/revoke

Revoke a key (immediate, including any rotation overlap)

auth: session · scope: admin · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/developers/keys/{id}/rotate

Rotate a key: a new secret now, the old one keeps working for overlapSeconds (default 86400)

auth: session · scope: admin · Idempotency-Key

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "overlapSeconds": {
      "type": "integer",
      "minimum": 0,
      "maximum": 604800
    }
  }
}

Knowledge

GET /v1/capabilities

What Lyko can do: every action with the venues it routes through, bridge destinations per route, what each token can do, and the features to reach for

Built from the engine's executable venues, the CCTP, Across, Relay and Gateway route tables and the routable adapter manifests, so it changes when an adapter or venue is added. Lyko reads the same map (its `capabilities` tool).

auth: public

ParameterInRequired
environmentqueryno

GET /v1/knowledge

Lyko's knowledge of Arc venues, contracts and paths

auth: public

GET /v1/knowledge/contracts/{address}

What Lykia knows about a contract

auth: public

ParameterInRequired
addresspathyes

GET /v1/knowledge/paths

Known paths between assets

auth: public

GET /v1/knowledge/venues/{venue}

What Lykia knows about a venue

auth: public

ParameterInRequired
venuepathyes

Language

POST /v1/language/parse

Read a sentence into typed actions

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "owner": {
      "type": "string"
    }
  },
  "required": [
    "text"
  ]
}

League

GET /v1/admin/league

Admin: every League entry, requests first, and which official cities exist

auth: session · scope: admin

POST /v1/admin/league/seed

Admin: create the official cities that are missing (idempotent, owned by the first admin address)

auth: session · scope: admin

GET /v1/league

The League: listed cities (Lykia's sub-products and approved community projects) with their public project view and live usage

auth: public

PUT /v1/league/{id}

Admin: approve, reject, feature, unfeature, delist, relist, pause, resume or launch a city (audited)

auth: session · scope: admin

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "approve",
        "reject",
        "feature",
        "unfeature",
        "delist",
        "relist",
        "pause",
        "resume",
        "launch"
      ]
    },
    "note": {
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

GET /v1/league/{slug}

One listed city

auth: public

ParameterInRequired
slugpathyes

GET /v1/league/by-host

A listed city by one of its verified custom domains

auth: public

ParameterInRequired
hostqueryyes

GET /v1/league/by-slug/{slug}

A listed city by its project slug: what <slug>.<root domain> and /c/<slug> load

auth: public

ParameterInRequired
slugpathyes

POST /v1/projects/{id}/league/request

Ask for a community listing of your project; an admin reviews it

auth: session · scope: admin

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "tagline": {
      "type": "string",
      "minLength": 8,
      "maxLength": 90
    },
    "category": {
      "type": "string",
      "enum": [
        "payments",
        "agents",
        "trading",
        "treasury",
        "commerce",
        "tools"
      ]
    },
    "emblem": {
      "type": "string",
      "enum": [
        "lighthouse",
        "temple",
        "prow",
        "lyre",
        "triskeles",
        "flame"
      ]
    },
    "slug": {
      "type": "string",
      "maxLength": 32
    },
    "codename": {
      "type": "string",
      "maxLength": 24
    }
  },
  "required": [
    "tagline",
    "category"
  ],
  "additionalProperties": false
}

Leashes

GET /v1/leashes

List an owner's leashes

Each with live usage: spendable() and getLimit() read from the LykiaAccount are authoritative; Lykia's records count when larger.

auth: secret · scope: read

ParameterInRequired
ownerqueryno
environmentqueryno

POST /v1/leashes

Put an agent on a leash

One call: a Pack agent whose Fence is a strict subset of its parent's, a daily budget carved from the parent, the unsigned LykiaAccount session transaction (createSession from the owner, or createSubSession from the parent agent's session key) with per-token caps, payees, call rules, expiry and the Fence hash, a leash key shown once, a ready MCP config and optionally an ERC-8004 Tag registration. With spendFrom gateway the money is the owner's Circle Gateway balance: the response carries the owner's LykiaStile (its creation when there is none), addDelegate on Gateway Wallet and createSession on the Stile instead of a LykiaAccount session. Owner only: a Lykia-Session, or a secret key with the agents scope that may act for the owner.

auth: secret · scope: agents · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Defaults to the signed-in address; required with a project key acting through consent."
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "agent": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 48
        },
        "mission": {
          "type": "string",
          "maxLength": 400
        },
        "signer": {
          "type": "string",
          "description": "The agent's own address: it becomes the LykiaAccount session key. Lykia never sees its private key."
        }
      },
      "required": [
        "name",
        "signer"
      ]
    },
    "parentAgentId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 120,
      "description": "A Pack agent to carve the leash from (its Fence and budget bound the leash)."
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 48,
      "description": "With parentAgentId: the new sub-agent's name."
    },
    "signer": {
      "type": "string",
      "description": "With parentAgentId: the new sub-agent's session key address."
    },
    "template": {
      "type": "string",
      "enum": [
        "pay-invoices",
        "trade-small",
        "earn",
        "custom"
      ]
    },
    "fence": {
      "type": "object",
      "additionalProperties": {},
      "description": "\"custom\" only: a lykia.fence/v1 document."
    },
    "budget": {
      "type": "object",
      "properties": {
        "perStepUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "perDayUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "totalUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        }
      },
      "required": [
        "perStepUsd",
        "perDayUsd",
        "totalUsd"
      ]
    },
    "expiresAt": {
      "type": "string",
      "maxLength": 40
    },
    "venues": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 48
      },
      "maxItems": 20
    },
    "recipients": {
      "type": "ar

GET /v1/leashes/{id}

One leash with usage

The owner, or the leash's own key.

auth: key · scope: read

ParameterInRequired
idpathyes

POST /v1/leashes/{id}/plan

Plan inside a leash

For the leash key. The Fence with the leash's own spend, the leash's total, spendable() per token and the session's call rules and payees on chain, then a simulation from the session key. Inside: the intent and its first step as one transaction for the session key. Outside: 422 LEASH_DENIED with reason codes and the remaining budget. A Gateway leash plans one transfer: the burn intents (payment and Lykia's fee leg) and the reserve transaction on the owner's LykiaStile, in prepared.gateway.

auth: key · scope: build

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "actions": {
      "type": "array",
      "items": {},
      "maxItems": 12
    },
    "dryRun": {
      "type": "boolean"
    },
    "forward": {
      "type": "boolean",
      "description": "Gateway leashes: ask Circle's Forwarding Service to submit the mint on the destination (its fee comes from Gateway's estimate)."
    }
  }
}

POST /v1/leashes/{id}/renew

Renew a leash

A new carve, a new session and a new key; the old leash is revoked. Never an increase in place.

auth: secret · scope: agents

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "budget": {
      "type": "object",
      "properties": {
        "perStepUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "perDayUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        },
        "totalUsd": {
          "type": "string",
          "pattern": "^\\d{1,12}(?:\\.\\d{1,2})?$"
        }
      },
      "required": [
        "perStepUsd",
        "perDayUsd",
        "totalUsd"
      ]
    },
    "expiresAt": {
      "type": "string",
      "maxLength": 40
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 25
    },
    "venues": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 2,
        "maxLength": 48
      },
      "maxItems": 20
    },
    "signer": {
      "type": "string"
    }
  },
  "required": [
    "expiresAt"
  ]
}

POST /v1/leashes/{id}/revoke

Revoke a leash

The leash key stops working at once and the carve returns to the parent. Returns the unsigned revokeSession(id) for the owner's wallet; once signed the session and every sub-session under it end on chain.

auth: secret · scope: agents

ParameterInRequired
idpathyes

POST /v1/leashes/{id}/session

Bind the on-chain session

With txHash: read from its SessionCreated event. Without: found among the session ids issued since the leash was made.

auth: secret · scope: agents

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "txHash": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{64}$"
    }
  }
}

POST /v1/leashes/{id}/submit

Report a signed leash step

The hash of the transaction the session key sent. Checked against the prepared one, settled from its receipt, counted against the leash; the next step comes back prepared. For a Gateway leash the reservation is proven from its Reserved event, then the burn intents go to Gateway's /v1/transfer with contractSigner true; the attestation and the unsigned gatewayMint come back (status pending while Gateway cannot see the reservation yet: submit the same hash again).

auth: key · scope: execute

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "intentId": {
      "type": "string",
      "pattern": "^out_[A-Za-z0-9_-]{6,32}$"
    },
    "stepId": {
      "type": "string",
      "pattern": "^s\\d{1,2}$"
    },
    "hash": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{64}$"
    }
  },
  "required": [
    "intentId",
    "stepId",
    "hash"
  ]
}

GET /v1/leashes/{id}/trail

Everything done under a leash

Plans, denials and transactions, each cross-checked with the chain: chain-proven when the receipt succeeded, carries AgentCall or AgentTransfer for the session and its AgentMemo names the same intent, step and verdict. Session events Lykia has no record of are listed as source chain.

auth: key · scope: read

ParameterInRequired
idpathyes

GET /v1/leashes/templates

Leash templates and the enforcement split

pay-invoices, trade-small, earn and custom, with what LykiaAccount enforces on chain and what the API enforces; and, for spending from a Gateway balance through LykiaStile, where it is available, its destinations, ceilings and enforcement split.

auth: public

Logs

GET /v1/logs

Request logs of the account's keys, newest first

auth: session · scope: read

ParameterInRequired
keyIdqueryno
projectIdqueryno
statusqueryno
statusClassqueryno
methodqueryno
pathqueryno
sincequeryno
limitqueryno
cursorqueryno

GET /v1/logs/{requestId}

One logged request by X-Request-Id

auth: session · scope: read

ParameterInRequired
requestIdpathyes

MCP

DELETE /v1/mcp

Close an MCP session

auth: key

GET /v1/mcp

MCP session stream

auth: key

POST /v1/mcp

Model Context Protocol (streamable HTTP): plan, Scent, Flock, Fence and more as tools

Point any MCP client (IDE assistants, desktop chat apps, agent SDKs) at /v1/mcp with a Lykia-Key header.

auth: key · scope: build

Orders

GET /v1/orders

Limit orders of an owner

auth: key

POST /v1/orders

Place a signed limit order

auth: key · scope: automation · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/orders/{hash}/cancel-tx

The unsigned cancel transaction

auth: key

ParameterInRequired
hashpathyes

GET /v1/orders/{hash}/execute-tx

The unsigned execute transaction

auth: key

ParameterInRequired
hashpathyes

GET /v1/orders/config

Limit order configuration

auth: public

POST /v1/orders/draft

Draft a limit order for signing

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

Pack

GET /v1/pack

An owner's Pack of agents

auth: key

POST /v1/pack

Add an agent to the Pack

auth: key · scope: agents · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "name": {
      "type": "string"
    },
    "role": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "name",
    "role"
  ]
}

GET /v1/pack/{id}

One agent

auth: key

ParameterInRequired
idpathyes

GET /v1/pack/{id}/budget

An agent's budget and spend

auth: key

ParameterInRequired
idpathyes

POST /v1/pack/{id}/pause

Pause an agent

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/pack/{id}/resume

Resume an agent

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/pack/{id}/revoke

Revoke an agent and its sub-agents

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/pack/{id}/session

Record an agent's on-chain session

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/pack/{id}/session-tx

The unsigned sub-session transaction for an agent

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/pack/{id}/spawn

Spawn a sub-agent inside the parent's Fence

auth: key · scope: agents · Idempotency-Key

ParameterInRequired
idpathyes

GET /v1/pack/account

The owner's LykiaAccount

auth: key

POST /v1/pack/whistle

Blow the Whistle: stop all new risk

auth: key · scope: agents · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "owner"
  ]
}

GET /v1/whistle

What the Whistle holds for the owner: every automation, standing order, agent automation, Pack agent, leash and Autopilot it stopped, each with its state

auth: session

ParameterInRequired
ownerqueryyes
environmentqueryno

POST /v1/whistle

Blow the Whistle: pause every automation, standing order and recurring payment, agent automation, Pack agent, leash (its key is refused) and Autopilot for the owner, on the server, at once. Returns exactly what was stopped and the unsigned blowWhistle() for the owner's LykiaAccount when it exists

auth: session

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "reason": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "owner"
  ]
}

POST /v1/whistle/resume

Let one item the Whistle stopped run again ({ kind, id }), or every item when none is named. Things that were paused before the Whistle stay paused

auth: session

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "kind": {
      "type": "string",
      "enum": [
        "automation",
        "standing",
        "agent-automation",
        "agent",
        "leash",
        "autopilot",
        "alert"
      ]
    },
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    }
  },
  "required": [
    "owner"
  ]
}

Payouts

GET /v1/payouts

List payouts

auth: secret · scope: read

ParameterInRequired
projectIdqueryno
statusqueryno

POST /v1/payouts

Create a payout batch

Up to 100 rows (token, amount, reference, memo each). Checked by the security layer, the payer's balances, the Fence and the beta cap; built as Multicall3From batches with an Arc Memo per transfer.

auth: secret · scope: payouts · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "payer": {
      "type": "string",
      "description": "The paying wallet. Required unless circleWalletId is given; with it, the payer is that wallet's own address."
    },
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "fence": {
      "type": "object",
      "additionalProperties": {},
      "description": "A lykia.fence/v1 document (see /v1/fence/templates)."
    },
    "circleWalletId": {
      "type": "string",
      "format": "uuid",
      "description": "Opt-in servers only (LYKIA_CIRCLE_SERVER_WALLETS): execute from a Circle developer-controlled wallet you created through POST /v1/circle/wallets/agent. Its address becomes the payer; a wallet someone else created is refused."
    },
    "dryRun": {
      "type": "boolean"
    },
    "confirm": {
      "type": "boolean"
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "to": {
            "type": "string",
            "maxLength": 42
          },
          "token": {
            "type": "string",
            "minLength": 2,
            "maxLength": 42
          },
          "amount": {
            "type": "string",
            "maxLength": 40
          },
          "reference": {
            "type": "string",
            "maxLength": 64
          },
          "memo": {
            "type": "string",
            "maxLength": 120
          }
        },
        "required": [
          "to",
          "token",
          "amount"
        ]
      },
      "minItems": 1,
      "maxItems": 100
    }
  },
  "required": [
    "rows"
  ]
}

GET /v1/payouts/{id}

Payout status, row by row

auth: secret · scope: read

ParameterInRequired
idpathyes

POST /v1/payouts/{id}/batches/{index}/submit

Report a broadcast batch

The transaction must be exactly the prepared batch; rows settle from the receipt's Memo events.

auth: secret · scope: payouts · Idempotency-Key

ParameterInRequired
idpathyes
indexpathyes
Request body
{
  "type": "object",
  "properties": {
    "hash": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{64}$"
    }
  },
  "required": [
    "hash"
  ]
}

POST /v1/payouts/{id}/execute

Execute from the payout's Circle developer-controlled wallet

auth: secret · scope: payouts · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/payouts/import

Create a payout from CSV

Columns: to, token, amount, reference, memo (header optional).

auth: secret · scope: payouts · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "payer": {
      "type": "string",
      "description": "The paying wallet. Required unless circleWalletId is given; with it, the payer is that wallet's own address."
    },
    "projectId": {
      "type": "string",
      "pattern": "^prj_[a-z0-9]{12}$"
    },
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "fence": {
      "type": "object",
      "additionalProperties": {},
      "description": "A lykia.fence/v1 document (see /v1/fence/templates)."
    },
    "circleWalletId": {
      "type": "string",
      "format": "uuid",
      "description": "Opt-in servers only (LYKIA_CIRCLE_SERVER_WALLETS): execute from a Circle developer-controlled wallet you created through POST /v1/circle/wallets/agent. Its address becomes the payer; a wallet someone else created is refused."
    },
    "dryRun": {
      "type": "boolean"
    },
    "confirm": {
      "type": "boolean"
    },
    "csv": {
      "type": "string",
      "minLength": 1,
      "maxLength": 65536
    }
  },
  "required": [
    "csv"
  ]
}

POST /v1/payouts/parse-csv

Preview a payout CSV

auth: secret · scope: read

Request body
{
  "type": "object",
  "properties": {
    "csv": {
      "type": "string"
    }
  },
  "required": [
    "csv"
  ]
}

POST /v1/reconcile/tick

One full background pass: standing orders, conditional orders, alerts, webhook retries, payout receipts, invoice memos and automations

For external pingers on serverless hosts: send Authorization: Bearer $CRON_SECRET (or an admin session). Idempotent; ping it as often as schedules must hold.

auth: secret

Personal

GET /v1/contacts

Contacts

auth: session

POST /v1/contacts

Add a contact

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "aliases": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "name",
    "address"
  ]
}

DELETE /v1/contacts/{id}

Delete a contact

auth: session

ParameterInRequired
idpathyes

PUT /v1/contacts/{id}

Update a contact

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "aliases": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "name",
    "address"
  ]
}

GET /v1/memory

What Lyko remembers

auth: session

DELETE /v1/memory/{id}

Forget one item

auth: session

ParameterInRequired
idpathyes

GET /v1/memory/export

Export memory

auth: session

POST /v1/memory/forget

Forget intents, contacts or everything

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "what": {
      "type": "string",
      "enum": [
        "intents",
        "contacts",
        "all"
      ]
    }
  }
}

GET /v1/memory/intents

Remembered plans

auth: session

DELETE /v1/profile

Reset the profile

auth: session

GET /v1/profile

The owner's profile

auth: session

PUT /v1/profile

Update the profile (never loosens a Fence)

auth: session

Request body
{
  "type": "object",
  "properties": {}
}

Platform

GET /v1/openapi.json

This OpenAPI 3.1 document

auth: public

GET /v1/reference

The API reference as a web page

auth: public

GET /v1/versions

Dated API versions (send one as Lykia-Version)

auth: public

Projects

GET /v1/projects

The developer's projects

auth: session

POST /v1/projects

Create a white-label project

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "origins": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "modules": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "network": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    }
  },
  "required": [
    "name"
  ]
}

DELETE /v1/projects/{id}

Delete a project

auth: session

ParameterInRequired
idpathyes

GET /v1/projects/{id}

A project (owner view)

auth: session

ParameterInRequired
idpathyes

PATCH /v1/projects/{id}

Update a project

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/projects/{id}/fence

The project's default Fence

auth: public

ParameterInRequired
idpathyes

GET /v1/projects/{id}/keys

The project's publishable keys

auth: session

ParameterInRequired
idpathyes

POST /v1/projects/{id}/keys

Issue a publishable key bound to the project's origins

auth: session · Idempotency-Key

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "label": {
      "type": "string",
      "minLength": 1,
      "maxLength": 48
    }
  },
  "required": [
    "label"
  ]
}

GET /v1/projects/{id}/limits

A project's rate limits

auth: session · scope: read

ParameterInRequired
idpathyes

PUT /v1/projects/{id}/limits

Set a project's rate limits (up to the plan's)

auth: session · scope: admin

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "perMinute": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "perDay": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000000
    }
  }
}

POST /v1/projects/{id}/origins/challenge

The DNS TXT or /.well-known value proving an origin

auth: session · Idempotency-Key

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "origin": {
      "type": "string"
    }
  },
  "required": [
    "origin"
  ]
}

POST /v1/projects/{id}/origins/verify

Check an origin proof

auth: session · Idempotency-Key

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "origin": {
      "type": "string"
    },
    "method": {
      "type": "string",
      "enum": [
        "dns",
        "well-known"
      ]
    }
  },
  "required": [
    "origin",
    "method"
  ]
}

GET /v1/projects/{id}/public

Brand, modules, network and fee: what embeds read

auth: public

ParameterInRequired
idpathyes

GET /v1/projects/{id}/usage

Requests and plans per day

auth: session

ParameterInRequired
idpathyes

GET /v1/projects/{id}/usage/endpoints

A project's requests per endpoint and day

auth: session · scope: read

ParameterInRequired
idpathyes
daysqueryno

POST /v1/projects/{id}/webhook

Register the project's webhook URL (secret shown once)

auth: session · Idempotency-Key

ParameterInRequired
idpathyes

Routes

POST /v1/cctp/inbound

USDC burned elsewhere: attestation and the unsigned receiveMessage on Arc

auth: key · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "environment": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet"
      ]
    },
    "source": {
      "type": "string"
    },
    "txHash": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{64}$"
    },
    "from": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    }
  },
  "required": [
    "source",
    "txHash"
  ]
}

POST /v1/quote

Every live venue's option for a swap, earn or borrow, and the engine's pick

auth: key · scope: quote · Idempotency-Key

Request body
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "kind": {
          "const": "swap"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "from": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "to": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "amount": {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        }
      },
      "required": [
        "kind",
        "from",
        "to",
        "amount"
      ]
    },
    {
      "type": "object",
      "properties": {
        "kind": {
          "const": "earn"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "maxRisk": {
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high"
          ]
        }
      },
      "required": [
        "kind",
        "token"
      ]
    },
    {
      "type": "object",
      "properties": {
        "kind": {
          "const": "borrow"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "amount": {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        },
        "collateral": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "collateralAmount": {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        },
        "minHealth": {
          "type": "string"
        },
        "account": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$"
        }
      },
      "required": [
        "kind",
        "token",
        "amount",
        "account"
      ]
    }
  ]
}

GET /v1/rates

Live yields and borrow rates on Arc

auth: public

POST /v1/routes/search

Search multi-hop routes across Arc venues, each checked against the Fence

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

Scent

GET /v1/scent/{token}

What can be proven about a token before anyone touches it

auth: public

ParameterInRequired
tokenpathyes
environmentqueryno

Security

GET /v1/security/alerts

Security alerts

auth: session

GET /v1/security/approvals

Token approvals of an owner

auth: public

ParameterInRequired
ownerqueryno

GET /v1/security/audit

Audit trail

auth: session

POST /v1/security/check-address

Check an address before sending

auth: key · scope: quote · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    }
  },
  "required": [
    "address"
  ]
}

POST /v1/security/halt

Halt routing (admin)

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/security/pause

Pause an agent, venue or owner

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/security/pauses

Active pauses

auth: session

GET /v1/security/policy

The owner's security policy

auth: session

PUT /v1/security/policy

Update the security policy

auth: session

Request body
{
  "type": "object",
  "properties": {}
}

POST /v1/security/resume

Lift a pause

auth: session · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/security/scent/token/{token}

Scent report for a token

auth: public · scope: read

ParameterInRequired
tokenpathyes
environmentqueryno

GET /v1/security/screen/address/{address}

Screen an address

Blocklist (USDC/EURC), look-alikes against the owner's contacts, poisoning, contract Scent and Circle Compliance when configured.

auth: public · scope: read

ParameterInRequired
addresspathyes
environmentqueryno
ownerqueryno

GET /v1/security/status

Security layer status

auth: public

PUT /v1/security/venues/{id}

Set a venue's security status (admin)

auth: session

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {}
}

Standing

GET /v1/standing

Standing orders of an owner

auth: session

ParameterInRequired
ownerqueryno

POST /v1/standing

Arm a standing order

auth: session · scope: automation · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "text": {
      "type": "string"
    }
  },
  "required": [
    "owner"
  ]
}

DELETE /v1/standing/{id}

Cancel a standing order

auth: session · scope: automation

ParameterInRequired
idpathyes

GET /v1/standing/{id}

A standing order

auth: session

ParameterInRequired
idpathyes

POST /v1/standing/{id}/check

Check a standing order now

auth: session · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/standing/{id}/pause

Pause a standing order

auth: session · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/standing/{id}/resume

Resume a standing order

auth: session · scope: automation · Idempotency-Key

ParameterInRequired
idpathyes

System

GET /v1/fees

Lykia's protocol fee and the beta caps

auth: public

GET /v1/health

Service health and features

auth: public

GET /v1/stats

Public aggregate traction numbers (no personal data)

auth: public

Tags

GET /v1/tags/{agentId}

An agent's Tag (ERC-8004 identity and Fence hash)

auth: public

ParameterInRequired
agentIdpathyes
environmentqueryno

GET /v1/tags/{agentId}/policy-salt

The policy salt of a Tag

auth: public

ParameterInRequired
agentIdpathyes

POST /v1/tags/attest

Draft an ERC-8354 attestation of a verdict (unsigned)

auth: key · scope: build · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/tags/cards/{digest}

A Tag card by digest

auth: public

ParameterInRequired
digestpathyes

POST /v1/tags/draft

Draft a Tag registration (unsigned)

auth: key · scope: build · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {}
}

GET /v1/tags/verdicts/{hash}

A filed Fence verdict

auth: public

ParameterInRequired
hashpathyes

Telegram

POST /v1/telegram/link-code

A one-time code to link Telegram

auth: session · Idempotency-Key

POST /v1/telegram/setup

Register the bot webhook (admin)

auth: session · Idempotency-Key

GET /v1/telegram/status

Telegram link status

auth: session

Verdicts

GET /v1/verdicts/{digest}

Recompute and verify a Fence verdict

auth: public

ParameterInRequired
digestpathyes

POST /v1/verdicts/verify

Verify a verdict from a Fence and facts

auth: public

Request body
{
  "type": "object",
  "properties": {
    "digest": {
      "type": "string"
    },
    "fence": {
      "type": "object",
      "additionalProperties": {},
      "description": "A lykia.fence/v1 document (see /v1/fence/templates)."
    },
    "facts": {
      "type": "object",
      "properties": {
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "signer": {
          "type": "string",
          "enum": [
            "wallet",
            "agent"
          ]
        },
        "owner": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$"
        },
        "proposedByAgent": {
          "type": "boolean"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "maxLength": 32
              },
              "kind": {
                "type": "string",
                "maxLength": 32
              },
              "venue": {
                "type": "string",
                "maxLength": 48
              },
              "usd": {
                "type": [
                  "string",
                  "null"
                ],
                "pattern": "^\\d{1,15}(?:\\.\\d{1,8})?$"
              },
              "tokens": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string",
                      "maxLength": 32
                    },
                    "address": {
                      "type": "string",
                      "pattern": "^0x[0-9a-fA-F]{40}$"
                    },
                    "listed": {
                      "type": "boolean"
                    },
                    "acquired": {
                      "type": "boolean"
                    },
                    "scent": {
                      "type": "string",
                      "enum": [
                        "verified",
                        "no-red-flags",
                        "caution",
                        "danger",
                        "unknown"
                      ]
                    }
                  },
                  "required": [
 

Webhooks

GET /v1/developers/webhooks

Webhook endpoints and the events they can subscribe to

auth: session · scope: admin

POST /v1/developers/webhooks

Add a webhook endpoint (signing secret shown once)

auth: session · scope: admin · Idempotency-Key

Request body
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "maxLength": 500
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 3,
        "maxLength": 64
      },
      "maxItems": 64
    },
    "projects": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^prj_[a-z0-9]{12}$"
      },
      "maxItems": 20
    },
    "description": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 200
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false
}

PATCH /v1/developers/webhooks/{id}

Change an endpoint's events, projects or description

auth: session · scope: admin

ParameterInRequired
idpathyes
Request body
{
  "type": "object",
  "properties": {
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 3,
        "maxLength": 64
      },
      "minItems": 1,
      "maxItems": 64
    },
    "projects": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^prj_[a-z0-9]{12}$"
      },
      "maxItems": 20
    },
    "description": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 200
    }
  }
}

POST /v1/developers/webhooks/{id}/disable

Disable an endpoint

auth: session · scope: admin

ParameterInRequired
idpathyes

POST /v1/developers/webhooks/{id}/enable

Enable an endpoint again

auth: session · scope: admin

ParameterInRequired
idpathyes

POST /v1/developers/webhooks/{id}/rotate-secret

A new signing secret (shown once)

auth: session · scope: admin

ParameterInRequired
idpathyes

GET /v1/developers/webhooks/deliveries

Delivery log, newest first

auth: session · scope: admin

ParameterInRequired
limitqueryno
endpointIdqueryno
statusqueryno
eventqueryno

GET /v1/developers/webhooks/deliveries/{id}

One delivery with its attempts and body

auth: session · scope: admin

ParameterInRequired
idpathyes

POST /v1/developers/webhooks/deliveries/{id}/replay

Send a delivery again (same event id and body)

auth: session · scope: admin · Idempotency-Key

ParameterInRequired
idpathyes

POST /v1/developers/webhooks/test

Send a test event to one endpoint or all of them

auth: session · scope: admin

Request body
{
  "type": "object",
  "properties": {
    "endpointId": {
      "type": "string",
      "pattern": "^whe_[0-9a-f]{16}$"
    },
    "type": {
      "type": "string",
      "minLength": 3,
      "maxLength": 64
    }
  }
}

GET /v1/webhooks/events

The event catalogue: every event type, its group and older aliases

auth: public

x402

POST /v1/x402/fence/evaluate

Fence check, paid per call in USDC on Arc

auth: public · Idempotency-Key · x402

ParameterInRequired
X-PAYMENTheaderno
Request body
{
  "type": "object",
  "properties": {
    "fence": {},
    "facts": {
      "type": "object",
      "properties": {
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "signer": {
          "type": "string",
          "enum": [
            "wallet",
            "agent"
          ]
        },
        "owner": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$"
        },
        "proposedByAgent": {
          "type": "boolean"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "maxLength": 32
              },
              "kind": {
                "type": "string",
                "maxLength": 32
              },
              "venue": {
                "type": "string",
                "maxLength": 48
              },
              "usd": {
                "type": [
                  "string",
                  "null"
                ],
                "pattern": "^\\d{1,15}(?:\\.\\d{1,8})?$"
              },
              "tokens": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string",
                      "maxLength": 32
                    },
                    "address": {
                      "type": "string",
                      "pattern": "^0x[0-9a-fA-F]{40}$"
                    },
                    "listed": {
                      "type": "boolean"
                    },
                    "acquired": {
                      "type": "boolean"
                    },
                    "scent": {
                      "type": "string",
                      "enum": [
                        "verified",
                        "no-red-flags",
                        "caution",
                        "danger",
                        "unknown"
                      ]
                    }
                  },
                  "required": [
                    "symbol",
                    "address",
                    "listed",
                    "acquired"
                  ]
                },
                "maxItems

GET /v1/x402/health

Health of the paid x402 routes

auth: public

POST /v1/x402/quote

Route quote, paid per call

auth: public · Idempotency-Key · x402

ParameterInRequired
X-PAYMENTheaderno
Request body
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "kind": {
          "const": "swap"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "from": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "to": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "amount": {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        }
      },
      "required": [
        "kind",
        "from",
        "to",
        "amount"
      ]
    },
    {
      "type": "object",
      "properties": {
        "kind": {
          "const": "earn"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "maxRisk": {
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high"
          ]
        }
      },
      "required": [
        "kind",
        "token"
      ]
    },
    {
      "type": "object",
      "properties": {
        "kind": {
          "const": "borrow"
        },
        "environment": {
          "type": "string",
          "enum": [
            "mainnet",
            "testnet"
          ]
        },
        "token": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "amount": {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        },
        "collateral": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        },
        "collateralAmount": {
          "type": "string",
          "pattern": "^\\d{1,18}(?:\\.\\d{1,18})?$"
        },
        "minHealth": {
          "type": "string"
        },
        "account": {
          "type": "string",
          "pattern": "^0x[0-9a-fA-F]{40}$"
        }
      },
      "required": [
        "kind",
        "token",
        "amount",
        "account"
      ]
    }
  ]
}

GET /v1/x402/scent/{token}

Deep Scent report, paid per call

auth: public · x402

ParameterInRequired
tokenpathyes
environmentqueryno
X-PAYMENTheaderno