← BACK TO DOCSDOCS / TASKS API

Tasks API

Headless task management for customer portals and server-side agents. One secret API key per integration; pass an actor on each write so your end-users are attributed without Tensient logins.

Machine-readable

openapi.json — REST paths and schemas for agents and codegen.

llms.txt — agent index (MCP + REST + auth).

MCP tools list_tasks, create_task, etc. use the same logic — see /docs/tools.

Authentication & rate limits

Secret keys only (tns_...). Same keys as MCP and Feedback. Default limit: 120 requests/minute per key (override with EXTERNAL_TASKS_RATE_LIMIT_PER_MINUTE).

Authorization: Bearer tns_YOUR_KEY_HERE

In local dev, use your app origin (e.g. http://localhost:3000/api/external/tasks) — docs show production URLs for copy-paste into customer repos.

End-user attribution (actor)

You do not need a Tensient API key per customer user. Use one integration key on your server, then include actor on POST/PATCH (tasks) and POST (comments):

"actor": { "externalId": "usr_123", // your platform user id (recommended) "email": "alex@example.com", "name": "Alex Smith" }

Tensient upserts a workspace_people record (same model as assignees). Creates set createdByDisplayName; updates set updatedByDisplayName; comments show authorPersonId and name. The API key still proves your server is allowed to write — the actor is who did it on your product.

Endpoints

GEThttps://tensient.com/api/external/tasks

List tasks — query: status, archived=true

POSThttps://tensient.com/api/external/tasks

Create task

GEThttps://tensient.com/api/external/tasks/{id}

Get task + linked feedback

PATCHhttps://tensient.com/api/external/tasks/{id}

Update task (partial)

DELETEhttps://tensient.com/api/external/tasks/{id}

Hard delete

GEThttps://tensient.com/api/external/tasks/{id}/comments

List comments

POSThttps://tensient.com/api/external/tasks/{id}/comments

Add comment (markdown body)

POSThttps://tensient.com/api/external/tasks/{id}/feedback-links

Link feedback ticket

DELETEhttps://tensient.com/api/external/tasks/{id}/feedback-links?feedbackSubmissionId=...

Unlink feedback

GEThttps://tensient.com/api/external/feedback?search=checkout

Search feedback to link (search required)

GEThttps://tensient.com/api/external/task-categories

List categories

POSThttps://tensient.com/api/external/task-categories

Create category — body: { name }

GEThttps://tensient.com/api/external/milestones

List milestones with task counts

POSThttps://tensient.com/api/external/milestones

Create milestone — body: name, description?, targetDate?

GEThttps://tensient.com/api/external/people

List assignable people (members + placeholders)

POSThttps://tensient.com/api/external/people

Register person — body: externalId?, email?, name?

Example — create with actor

curl -X POST "https://tensient.com/api/external/tasks" \
  -H "Authorization: Bearer tns_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Fix checkout bug",
    "status": "todo",
    "actor": {
      "externalId": "usr_123",
      "email": "alex@customer.com",
      "name": "Alex Smith"
    }
  }'