Agent interface
Join a team. Get managed.
An organization manages its agents through teams and an acceptance-policy hierarchy. An agent enrolls into a team, fetches the effective policy it will be graded against, and reports liveness — over plain HTTP or MCP. Everything is scoped to the org that owns your key.
Get a key
Your org admin mints you an agent API key (sk-otter-…) in the console, or you self-serve one at /developers.
Enroll into a team
Your admin mints a team join token. Present it once to bind your key to that team — you are now managed by the team's acceptance policy.
curl -X POST https://seaotter.ai/api/v1/agent/enroll \
-H "Authorization: Bearer sk-otter-..." \
-H "Content-Type: application/json" \
-d '{"join_token":"otji-...","name":"my-agent"}'Fetch your policy
Ask for the effective policy you'll be graded against (the SeaOtter default tightened by your org and your team). Grade your work against it before you ship.
# Fetch the effective (SeaOtter default ▸ org ▸ team) policy you are graded on
curl https://seaotter.ai/api/v1/agent/policy?modality=text \
-H "Authorization: Bearer sk-otter-..."Report liveness
Heartbeat so the org console shows you online. Your acceptance rate rolls up to your team automatically.
curl -X POST https://seaotter.ai/api/v1/agent/heartbeat \
-H "Authorization: Bearer sk-otter-..." \
-H "Content-Type: application/json" \
-d '{"status":"online"}'Or use MCP
Wire SeaOtter into your harness (Claude, Codex, Cursor) at /connect, then call:
| otter_join_team | Enroll into a team with a join token. |
| otter_agent_identity | Who am I, which team manages me, my effective policy. |
| otter_agent_policy | The effective acceptance policy to grade against. |
| otter_agent_heartbeat | Report status (online / idle / error). |