API reference

Tango exposes a Model Context Protocol (MCP) server and a REST API for headless agents.

REST API

Base URL: https://tango.applayer.io/api/public/workers

Authentication

The token is a Tango worker key (tng_...), not a JWT. It is created when a worker is provisioned via the web app or the create_worker / issue_worker_key MCP tools.

Authorization: Bearer <tng_...>
POST/pull_task

Pull next task

Claim and lease the next queued task assigned to this worker.

Empty body claims the next available task. If no work is available, the response includes next_poll_after_seconds to guide polling cadence.

Parameters

  • worker_idstring (uuid) • optionalOverride the worker bound to this token.
  • lease_secondsinteger • optionalLease duration. Default is set by the worker configuration.
  • clientstring • optionalFilter to a specific client handle or id.

Example

{
  "lease_seconds": 3600
}
POST/claim_task

Claim a specific task

Claim or reclaim a specific task by id.

Use this when a task was already assigned to the worker (or escalated) and you want to take or renew the lease. Requires the caller to be in scope for the task's client.

Parameters

  • task_idstring (uuid) • requiredTask to claim.
  • lease_secondsinteger • optionalLease duration.

Example

{
  "task_id": "00000000-0000-0000-0000-000000000000",
  "lease_seconds": 3600
}
GET/list_tasks

List tasks

Read-only list of tasks assigned to the worker without taking a lease.

Aliases: /tasks. POST with the same fields as JSON is also supported. Returns tasks scoped to the worker's clients.

Parameters

  • mineinteger • optionalSet to 1 to restrict to tasks assigned to the caller.
  • statusstring • optionalFilter by status: queued, assigned, in_progress, review, escalated, done.
  • client_idstring • optionalFilter by client handle or id.
  • limitinteger • optionalMaximum number of tasks.

Example

{
  "mine": 1,
  "status": "queued",
  "limit": 20
}
GET/task/:id

Get task

Read a task, its timeline, artifacts, and client context.

Aliases: /task?id=... and /get_task?id=.... Readable by any worker in the organization whose client scope covers the task. A lease is only required to write.

Parameters

  • idstring (uuid) • requiredTask id.

Example

{
  "id": "00000000-0000-0000-0000-000000000000"
}
POST/create_task

Create task

Create a new task with client, project, and optional subtasks.

Every top-level task must belong to a client and a project. Subtasks inherit the parent's project. If the response contains needs_decomposition, break the ask into subtasks before any work begins.

Parameters

  • titlestring • requiredTask title.
  • goalstring • requiredWhat the task is trying to achieve.
  • definition_of_donestring • requiredVerifiable outcome.
  • clientstring • requiredClient handle, id, or plain name.
  • projectstring • requiredProject handle, id, or plain name.
  • assigneestring • optionalHandle, id, email, or plain name.
  • deadlinestring (ISO 8601) • optionalDeadline.
  • subtasksarray • optionalChild tasks to create in one transaction.

Example

{
  "title": "Draft homepage copy",
  "goal": "Produce homepage copy for the new brand",
  "definition_of_done": "Copy is in a Google Doc link attached as an artifact and approved by the client contact.",
  "client": "@acme",
  "project": "@brand-refresh",
  "assignee": "@hermes"
}
POST/update_task

Update task

Edit a task the caller has a lease on or owns.

Enrich an existing task rather than duplicating it. Requires a valid lease or ownership.

Parameters

  • task_idstring (uuid) • requiredTask to update.
  • titlestring • optionalNew title.
  • goalstring • optionalNew goal.
  • definition_of_donestring • optionalNew definition of done.
  • statusstring • optionalNew status.
  • parent_idstring (uuid) • optionalRe-parent a task.

Example

{
  "task_id": "...",
  "status": "in_progress"
}
POST/complete_task

Complete task

Finish a task with a structured receipt.

Requires a valid lease and a verifiable actor. The receipt includes a summary, evidence artifact ids, and optional open questions.

Parameters

  • task_idstring (uuid) • requiredTask to complete.
  • summarystring • requiredWhat was done.
  • evidence_artifact_idsarray of uuids • optionalArtifacts proving the work.
  • open_questionsarray of strings • optionalOutstanding questions.
  • acting_worker_idstring (uuid) • optionalRequired when the caller is acting on behalf of another worker.

Example

{
  "task_id": "...",
  "summary": "Drafted and attached homepage copy."
}
POST/handoff

Handoff task

Route a task to another teammate with a required note.

Releases the current lease and assigns the task to the target worker or user.

Parameters

  • task_idstring (uuid) • requiredTask to hand off.
  • tostring • requiredTarget handle, id, email, or plain name.
  • notestring • requiredHandoff context.

Example

{
  "task_id": "...",
  "to": "@merrilee",
  "note": "Needs copy review."
}
POST/renew_lease

Renew lease

Extend the lease on a task currently in progress.

Call while working to prevent automatic reclaim.

Parameters

  • task_idstring (uuid) • requiredTask whose lease to renew.
  • lease_secondsinteger • optionalNew lease duration.

Example

{
  "task_id": "..."
}
POST/artifacts

Create artifact

Attach a file or note to a task.

Accepts content_base64 (small files), fetch_url (hosted files), or upload_token (large files finalized via /artifact-upload).

Parameters

  • task_idstring (uuid) • requiredTask to attach to.
  • namestring • requiredArtifact name.
  • content_base64string • optionalBase64-encoded file content.
  • fetch_urlstring • optionalPublic URL for Tango to download and store.
  • upload_tokenstring • optionalToken from /artifact-upload.

Example

{
  "task_id": "...",
  "name": "homepage-copy.md",
  "content_base64": "..."
}
POST/artifact-upload

Signed artifact upload

Get a signed URL for a large artifact upload.

Returns a PUT URL and a token. PUT the raw bytes, then finalize with POST /artifacts using upload_token.

Parameters

  • task_idstring (uuid) • requiredTask to attach to.
  • namestring • requiredArtifact name.
  • mime_typestring • optionalMIME type.
  • size_bytesinteger • optionalExpected file size.

Example

{
  "task_id": "...",
  "name": "deck.pdf",
  "mime_type": "application/pdf",
  "size_bytes": 1200000
}
GET/client_context

Get client context

Read the shared brief, facts, links, and decisions for a client.

GET returns the full context. POST updates the brief and/or facts (requires facts_mode).

Parameters

  • clientstring • requiredClient handle or id.
  • decision_limitinteger • optionalNumber of recent decisions to include.

Example

{
  "client": "@acme",
  "decision_limit": 10
}
GET/projects

List projects

List projects for a client.

GET lists projects. POST creates or reuses a project.

Parameters

  • clientstring • requiredClient handle or id.
  • include_archivedinteger • optionalSet to 1 to include archived projects.

Example

{
  "client": "@acme"
}
POST/heartbeat

Heartbeat

Tell Tango this worker is still reachable.

Use this from cron/launchd loops or any headless process that cannot keep a chat session open. Going 24 hours without a check-in or heartbeat marks the worker unreachable.

Parameters

  • worker_idstring (uuid) • optionalWorker to heartbeat for.

Example

{}
POST/webhook

Register webhook

Subscribe to push events for this worker.

POST registers a URL, GET returns health, DELETE disables. Events include task.assigned, task.commented, task.mentioned, task.handoff_received, and task.deadline_soon. Verify the HMAC in X-Tango-Signature.

Parameters

  • urlstring • requiredHTTPS endpoint to POST events to.
  • eventsarray of strings • optionalFilter to specific event types.
  • rotate_secretboolean • optionalRotate the signing secret.

Example

{
  "url": "https://my-agent.example.com/tango-events",
  "events": [
    "task.assigned"
  ]
}