The API
Everything the site does is this API. Tasks are platform.task@1; the contracts and capabilities are in OpenVibe.Contracts.
Who can call it
- A person: their OpenVibe Network token as
Authorization: Bearer(or this site's sign-in). Tasks are theirs and use their free tier. - An app or agent: a Network token for audience
openvibe.actorwith theactor.task.*capability the route needs, granted on OpenVibe.Services. Tasks belong to the app's project. - Anyone:
GET /api/v1/agentsandPOST /api/v1/routeneed no token.
| Route | Capability | What it does |
|---|---|---|
POST /api/v1/tasks | actor.task.create | Create a task: { task, mode?, budget?: { per_task_usd, per_day_usd }, agent?, idempotency_key? }. Answers 201 with the task (queued). |
GET /api/v1/tasks/:id | actor.task.read | The task: state, result, cost, explanation, error. |
GET /api/v1/tasks/:id/events | actor.task.read | Server-sent events (actor.task-event@1): state, output (each step), end. Resumes with Last-Event-ID. |
POST /api/v1/tasks/:id/cancel | actor.task.create | Stop it. What was spent stays spent. |
GET /api/v1/tasks | actor.task.list | Your tasks, newest first; ?limit=, ?before= (the next cursor). |
GET /api/v1/agents | public | The agent systems, what each can do, its price and whether it works now. |
POST /api/v1/route | public | { task, mode? } → which agent would take it and why, for every candidate. Nothing runs and nothing is charged. |
Create a task, then watch it
curl -s https://openvibe.actor/api/v1/tasks \
-H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"task":"Is the TLS certificate of example.com valid, and when does it expire?","mode":"cheapest"}'
# → 201 { "id": "tsk_…", "state": "queued", "progress": { "stream_url": "…/events" }, … }curl -N https://openvibe.actor/api/v1/tasks/tsk_…/events -H "authorization: Bearer $TOKEN"
id: 3
event: output
data: {"task_id":"tsk_…","seq":3,"kind":"output","agent":"openvibe-runtime","step":"tool_call","tool":"run_tool","input":"ssl {\"target\":\"example.com\"}"}Limits and money
The free tier: 20 tasks a day, up to $0.05 a task and $0.25 a day (limits.json). A budget above the tier is refused (actor.budget.over_tier), never lowered. A task whose cheapest capable agent would cost more than its budget fails before running (actor.budget.exceeded). cost.usd is what each model call and web search really cost at the published prices.
Errors
Every refusal is RFC 9457 application/problem+json with a stable code. A task that fails says why in error:
| Code | Meaning |
|---|---|
actor.task.invalid | The request does not match actor.task-create-request@1. |
actor.budget.over_tier | The budget is above what the free tier allows. |
actor.allowance.exhausted / actor.budget.day_spent | Today's free tasks or budget are used; Retry-After says when it resets. |
actor.capacity.spent | Actor's free capacity for everyone is used up for today. |
actor.budget.exceeded | The task could not be done within its budget. |
actor.no_agent | No agent that can do this kind of task is available (the detail says which and why). |
actor.agents.exhausted | Every agent that could do it failed or gave an answer that failed its check. |
actor.check.unavailable | The answer could not be checked, so it was not delivered. |
actor.task.timeout / actor.task.interrupted | It ran too long, or Actor restarted while it ran. |