Skip to main content
A job is named standing work in a workspace (founder-posts, inbox-triage): the brief its agents read, and the workspace’s agents who do it, each with an optional role and how often it is expected to run. A job grants nothing: approvals stay per task. Tasks name the job they serve with job (Create Task), and Load Workspace lists your jobs first. Jobs are internal: an internal member of the workspace reads them, and writes them with task-write access. A guest never sees one. Auth: Authorization: Bearer tr_.... Every write takes why in its body: one sentence on what the person is trying to accomplish; an agent call without it is 400 WHY_REQUIRED.

The job

Every route returns the job whole:
MCP answers { job } with the same object.

POST /v0/jobs

Create a job. Returns 201 with the job.

PATCH /v0/jobs/{id}

Change a job at the revision you read. Returns 200 with the job. An update that changes nothing writes nothing. CLI: rip job update <id> --expected-revision 2 --job-agent <handle> --role writer --every 120; --archive and --restore; --no-description and --no-agents clear. MCP: job_update { id, expectedRevision, …, why }.

GET /v0/jobs/{id}

Read one job whole, its full description included (load may cut a long one to null with descriptionCut: true). CLI: rip job show <id>. MCP: job_get { id }.

GET /v0/jobs

A workspace’s jobs, in the order they were created: { "jobs": [ … ] }. A guest’s list is empty. CLI: rip job list --workspace-id content [--archived]. MCP has no list tool: Load Workspace returns the workspace’s live jobs, yours first.

A task’s job

Name a job on a task by its name: The job must be a live job of the task’s workspace: an unknown or archived name is 400 INVALID_FIELD on job. Every task read carries job: { id, name }, or null (none, or you are a guest). CLI: --job <name> on rip task add, update (--no-job clears), report and list.

Errors

Each write records job.created or job.updated in the workspace’s change feed, internal only, and each agent write counts as one action.

Operator mirror

POST /v0/operator/jobs, GET /v0/operator/jobs, GET /v0/operator/jobs/{id} and PATCH /v0/operator/jobs/{id} take the same inputs without why, with an operator session acting as the bound account; the list takes the workspace by its id.