Open App

How to get an API key

OtoCo’s MCP server and REST /v1 API share one capability registry. Public tools work with no key. Anything that touches your entities, payments, files, or banking needs an API key.

How to get an API key

Follow these steps once — then paste the key into Cursor, Claude, or any REST client.

  1. Open DashPanel → Developer.
  2. Sign in (connect your wallet if prompted).
  3. Click Create API key (user key).
  4. Copy the full token immediately — it is shown only once. It looks like: otoco_sk_<keyId>_<secret>
  5. Use it as: Authorization: Bearer otoco_sk_…
Treat keys like passwords

Never commit an API key to git or paste it into public chats. If it leaks, revoke it in DashPanel → Developer and create a new one.

Next: connect your agent

After you have a key, follow Connect your AI agent or try a request in the API playground.

Key format

Formatotoco_sk_<keyId>_<secret>
HeaderAuthorization: Bearer otoco_sk_… (raw token without Bearer is also accepted)
ManageDashPanel → Developer — create, rotate, revoke

Public vs API-key tools

AccessHeaderWhat you get
PublicNoneDiscovery, name checks, public entity lookup, Instant/Standalone email checkout
API keyAuthorization: Bearer otoco_sk_…Public tools + your entity, document, file, payment, banking, and account tools (per scopes on the key)
Check what your key can do

Call user_me / GET /v1/me to see keyKind and keyScopes for the key you are using.

Scopes

Public capabilities need no scope. These user scopes apply to API keys:

ScopeGrants
(none)Public discovery tools
entities:readList/get owned entities
entities:writeEntity formation checkout
documents:readDocument definitions and temp download links
files:readList entity files; temp download links
files:writeDelete entity files
payments:readList payments and subscriptions
payments:writeCreate payment links; cancel subscriptions
finance:readBalances, transactions, notes
finance:writeAdd/remove transaction notes
points:readPoints balance and history
forms:readAvailable forms and submissions
forms:writeSubmit entity forms
banking:readEIN / Mercury / Meow / virtual mailing status
banking:writeSubmit EIN; create Mercury/Meow applications; reset rejected Meow
user:readProfile (/me), list own API keys
user:writeRevoke own API keys (confirmation-gated)

Security properties

  • Secret hashed at rest (SHA-256); compared with timingSafeEqual
  • Full token never stored or returned after creation
  • Revocable; optional expiry enforced at auth time
  • Optional IP allowlist (allowedIps) — exact match
  • Max 10 active user keys per member

Rate limits

CallerLimitOn exceed
No key (per IP)30 req/min429 + Retry-After
API key120 req/min per key429 + Retry-After
Auth failures (per IP)20 req/minstricter bucket

Confirmation-gated actions

These tools require a preview call, then confirm: true on a second call after your explicit approval:

  • entities_creation_checkout, entities_series_box_checkout, entities_byoe_checkout
  • payments_create_link, subscriptions_cancel
  • files_delete, forms_submit, user_keys_revoke
  • banking_ein_submit, banking_mercury_apply, banking_meow_apply, banking_meow_reset

Money-moving confirms must also pass back paymentAttemptId and confirmationToken from the preview.

REST response shape

Success:

{ "ok": true, "data": { } }

Error:

{ "ok": false, "error": "..." }
StatusMeaning
400Invalid input
401Invalid API key
403Missing scope or not authorized for the entity
404Not found
429Rate limit exceeded
500Internal error
Last updated · Jul 22, 2026Edit this page →