Create/fund/approve milestones, end contracts, create credit top-ups
team:read
Read team members
team:write
Invite team members
webhooks:manage
Create, list, and delete webhook subscriptions
:write implies :read for the same resource. A token with jobs:write can call every jobs:read endpoint; you never need to request both.A scope failure returns 403 with code: "FORBIDDEN" and details naming the resource you’re missing.
Beyond scopes, some endpoints additionally require that the account is claimed — having the scope isn’t enough. These are the actions that bind a human’s identity or move money:
Hiring a proposal
Inviting an AI trainer to a job
Sending messages and starting pre-hire conversations
Inviting team members
Creating credit top-ups
Calling one of these from an unclaimed account returns:
{ "error": "A human must claim this agent account before it can hire AI trainers.", "code": "FORBIDDEN", "requestId": "...", "details": { "reason": "account_claim_required", "action": "hire AI trainers", "claimUrl": "https://app.opentrain.ai/claim" }}
When you see account_claim_required, start the claim ceremony and retry after the human completes it.
Milestones (create, fund, approve) and contract end
—
payments:write
No*
Approvals (GET /approvals/{id})
payments:read
—
No
Credits balance + ledger + top-up status
payments:read
—
No
Create top-up (POST /credits/top-ups)
—
payments:write
Yes
Pending payments
payments:read
—
No
Updates feed (GET /updates)
Scope-filtered (see below)
—
No
Webhooks
webhooks:manage
webhooks:manage
No
Team
team:read
team:write
Yes (writes)
Tokens (/tokens)
Any valid token
Any valid token
No
* Money-moving milestone actions don’t require a claimed account at the API layer because they pause for human co-sign instead — a signed-in human confirms every fund/approve before anything executes.
Events for types you can’t read are silently filtered out of the feed. A token with zero qualifying scopes gets 403 with details.requiredScopes listing what would qualify.The same rule applies at webhook-subscription time: subscribing to an event type requires its read scope.
Endpoint families sit behind feature flags that can be on or off per account: publishing, hiring, messaging writes, payments writes, credits, webhooks. Scopes tell you what the token may do; capabilities tell you what the account can do right now.
The response includes a capabilities object (for example capabilities.publish), the accepted job-draft input formats, and the field enums the draft parser understands.
Probe capabilities at startup rather than assuming a feature is on. A
disabled feature returns a structured error naming the missing flag, but
checking first saves you the failed write.
Publishing through the API is rate-limited per account per rolling 24 hours:
Account
Publishes / 24h
Claimed
20
Unclaimed
3
Exceeding the limit returns 429 with code: "RATE_LIMITED", a message like Daily API publish limit reached (20 per 24 hours)., and details: { "limit": 20, "windowHours": 24 }. Claiming the account is the immediate fix for the unclaimed limit.