DocsDevelopers
REST API · v1

API reference

Telos exposes a REST API over the same service layer the app uses. Every response includes a HATEOAS actions array, and every error includes a machine-actionable suggestion. OpenAPI 3.1 spec at /api/v1/openapi.json.

Auth

Authentication

Authenticate with a bearer token in the Authorization header. Keys start with telos_live_ and carry a role (engineer, pm, em, executive, admin) that determines which fields are returned. Keys are issued from inside the app at Configurations → API Keys; Telos is invite-only today, so request access via the waitlist.

Third-party OAuth apps authenticate the same way with access tokens starting telos_oat_, issued by POST /api/oauth/token (authorization_code with PKCE, refresh_token rotation). Send users to GET /oauth/authorize with client_id, redirect_uri, response_type=code, scope, and state to request consent; an org admin approves on the consent screen. Unlike API keys, an OAuth token's granted scopes are its entire permission set.

Add actor=app to the authorize URL for a grant that acts as your app rather than the approving admin: it survives the admin leaving the org and its writes are attributed to the app. The token endpoint accepts client credentials in the body or as HTTP Basic auth, and POST /api/oauth/revoke (RFC 7009) revokes a token and its refresh family, e.g. on uninstall.

curl
curl -X GET 'https://www.telos-app.com/api/v1/visions' \
  -H 'Authorization: Bearer telos_live_…'
Lists

Pagination

List endpoints use cursor pagination. Pass cursorfrom the previous response's meta.pagination.nextCursor to fetch the next page. Default page size is 50; max is 200 via the limit parameter. The same actions array surfaces the next page as a rel: "next" link, so agents can walk pagination without parsing meta.

response
{
  "ok": true,
  "data": [ /* … items … */ ],
  "meta": {
    "requestId": "01H8X3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-05-18T14:23:11.842Z",
    "pagination": {
      "cursor": null,
      "nextCursor": "eyJpZCI6IjAxIH0=",
      "hasMore": true
    }
  },
  "actions": [
    { "rel": "next", "href": "/api/v1/visions?cursor=eyJpZCI6IjAxIH0=" }
  ]
}
Failure modes

Errors

Errors return a non-2xx status with a body in the standard envelope. The suggestion field is written for LLMs: it states what the caller should do differently. Status codes: 400 validation, 401 missing/invalid credentials, 403 role-gated, 404 not found, 409 conflict (idempotency or state), 422 business-rule violation (e.g. validation gate), 429 rate-limited, 5xx internal.

response
{
  "ok": false,
  "error": {
    "code": "validation_failed",
    "message": "Field 'narrative' must be at least 1 character",
    "suggestion": "Provide a non-empty narrative. The minimum is 1 character."
  },
  "meta": { "requestId": "01H8X3F4S0Z9KMQ4N6PYZR7C5A", "timestamp": "…" }
}
One round trip

Batch

POST /api/v1/batch executes up to 20 operations in a single request. Each operation runs independently; the response is a 207 multi-status whose data contains the per-operation envelopes keyed by the id you supplied. Send an Idempotency-Key header on the batch request to make retries safe.

request body
{
  "operations": [
    { "id": "1", "method": "POST", "path": "/api/v1/objectives", "body": { /* … */ } },
    { "id": "2", "method": "GET",  "path": "/api/v1/visions/abc" }
  ]
}
Throughput

Rate limits

Each key gets 600 requests/minute on a sliding window. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (epoch seconds). Over the limit returns 429 with a Retry-After header — back off for that many seconds, or fold several calls into one POST /api/v1/batch.

For agents

Assembled context

GET /api/v1/ai/context/vision/{id} returns a vision and its objectives, metrics, opportunities, and tasks assembled into one payload alongside a ready-to-use system prompt and a list of the mutation endpoints an agent can call next — so a model can ground itself in one request instead of walking the graph. Requires vision:read.

Resource

Visions

GET/api/v1/visions

List visions

List strategic visions with cursor pagination: the company vision first, then product visions. Optionally filter by kind (company, product).

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
kindquery · stringoptional
Vision kind filter
Returns · 200 — List visions
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
kind"company" | "product"required
narrativestringrequired
versionintegerrequired
ownerIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/visions' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "number": 0,
      "kind": "company",
      "narrative": "string",
      "version": 0,
      "ownerId": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/visions

Create a vision

Create a vision: the company vision (kind 'company', one per org) or a product vision (kind 'product'). The narrative is the persuasive 2-5 year story, not a slogan.

Request body · required
namestringrequired
kind"company" | "product"optional
narrativestringrequired
Returns · 201 — Create a vision
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
kind"company" | "product"required
narrativestringrequired
versionintegerrequired
ownerIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/visions' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "kind": "company",
    "narrative": "string",
    "version": 0,
    "ownerId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/visions/{id}

Get a vision

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a vision
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
kind"company" | "product"required
narrativestringrequired
versionintegerrequired
ownerIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/visions/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "kind": "company",
    "narrative": "string",
    "version": 0,
    "ownerId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/visions/{id}

Update a vision

Update a vision's name or narrative. Edits are versioned.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
narrativestringoptional
Returns · 200 — Update a vision
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
kind"company" | "product"required
narrativestringrequired
versionintegerrequired
ownerIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/visions/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "kind": "company",
    "narrative": "string",
    "version": 0,
    "ownerId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/visions/{id}/versions

List a vision's version history

Version snapshots of a vision, newest first, with cursor pagination. Every name or narrative edit creates one.

Parameters
idpath · stringrequired
id path parameter
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List a vision's version history
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/visions/{id}/versions' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/visions/{id}/objectives

List objectives for a vision

The objectives anchored to this vision, with cursor pagination.

Parameters
idpath · stringrequired
id path parameter
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List objectives for a vision
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/visions/{id}/objectives' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Objectives

GET/api/v1/objectives

List objectives

List strategic objectives with cursor pagination. Optionally scope to a vision.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
visionIdquery · string<uuid>optional
Vision UUID filter
Returns · 200 — List objectives
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
visionIdstring<uuid>required
numberintegerrequired
titlestringrequired
descriptionobjectrequired
metricIdstring<uuid>required
targetOperator"gte" | "lte" | "eq"required
targetNumericstringrequired
startNumericobjectrequired
driIdstring<uuid>required
deadlineobjectrequired
status"active" | "achieved" | "abandoned"required
visionVersionintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/objectives' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "visionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "number": 0,
      "title": "string",
      "description": null,
      "metricId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "targetOperator": "gte",
      "targetNumeric": "string",
      "startNumeric": null,
      "driId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "deadline": null,
      "status": "active",
      "visionVersion": 0,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/objectives

Create an objective

Create a strategic objective under a vision. The objective IS the commitment to a number: it requires a DRI and a metric block (metricId, operator, target).

Request body · required
titlestringrequired
descriptionstringoptional
deadlinestring<date-time>optional
visionIdstring<uuid>required
driIdstring<uuid>required
metricobjectrequired
Show child attributes ›
metricIdstring<uuid>required
operator"gte" | "lte" | "eq"required
targetnumberrequired
startValueobjectoptional
Returns · 201 — Create an objective
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
visionIdstring<uuid>required
numberintegerrequired
titlestringrequired
descriptionobjectrequired
metricIdstring<uuid>required
targetOperator"gte" | "lte" | "eq"required
targetNumericstringrequired
startNumericobjectrequired
driIdstring<uuid>required
deadlineobjectrequired
status"active" | "achieved" | "abandoned"required
visionVersionintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/objectives' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "visionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "title": "string",
    "description": null,
    "metricId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "targetOperator": "gte",
    "targetNumeric": "string",
    "startNumeric": null,
    "driId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deadline": null,
    "status": "active",
    "visionVersion": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/objectives/{id}

Get an objective

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get an objective
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
visionIdstring<uuid>required
numberintegerrequired
titlestringrequired
descriptionobjectrequired
metricIdstring<uuid>required
targetOperator"gte" | "lte" | "eq"required
targetNumericstringrequired
startNumericobjectrequired
driIdstring<uuid>required
deadlineobjectrequired
status"active" | "achieved" | "abandoned"required
visionVersionintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/objectives/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "visionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "title": "string",
    "description": null,
    "metricId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "targetOperator": "gte",
    "targetNumeric": "string",
    "startNumeric": null,
    "driId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deadline": null,
    "status": "active",
    "visionVersion": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/objectives/{id}

Update an objective

Update an objective's title, description, deadline, DRI, or status.

Parameters
idpath · stringrequired
id path parameter
Request body · required
titlestringoptional
descriptionstringoptional
deadlineobjectoptional
driIdstring<uuid>optional
status"active" | "achieved" | "abandoned"optional
Returns · 200 — Update an objective
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
visionIdstring<uuid>required
numberintegerrequired
titlestringrequired
descriptionobjectrequired
metricIdstring<uuid>required
targetOperator"gte" | "lte" | "eq"required
targetNumericstringrequired
startNumericobjectrequired
driIdstring<uuid>required
deadlineobjectrequired
status"active" | "achieved" | "abandoned"required
visionVersionintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/objectives/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "visionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "title": "string",
    "description": null,
    "metricId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "targetOperator": "gte",
    "targetNumeric": "string",
    "startNumeric": null,
    "driId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deadline": null,
    "status": "active",
    "visionVersion": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/objectives/{id}

Delete an objective

Permanently delete an objective.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete an objective
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/objectives/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/objectives/{objectiveId}/opportunities

List opportunities for an objective

The opportunities linked to this objective, with their link metadata.

Parameters
objectiveIdpath · stringrequired
objectiveId path parameter
Returns · 200 — List opportunities for an objective
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/objectives/{objectiveId}/opportunities' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/objectives/{objectiveId}/set-metric

Set an objective's metric

Replace which metric an objective points at, and/or change its target shape (operator, target, start value). An objective has exactly one metric.

Parameters
objectiveIdpath · stringrequired
objectiveId path parameter
Request body · required
metricIdstring<uuid>required
operator"gte" | "lte" | "eq"required
targetnumberrequired
startValueobjectoptional
Returns · 200 — Set an objective's metric
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
visionIdstring<uuid>required
numberintegerrequired
titlestringrequired
descriptionobjectrequired
metricIdstring<uuid>required
targetOperator"gte" | "lte" | "eq"required
targetNumericstringrequired
startNumericobjectrequired
driIdstring<uuid>required
deadlineobjectrequired
status"active" | "achieved" | "abandoned"required
visionVersionintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/objectives/{objectiveId}/set-metric' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "visionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "title": "string",
    "description": null,
    "metricId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "targetOperator": "gte",
    "targetNumeric": "string",
    "startNumeric": null,
    "driId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deadline": null,
    "status": "active",
    "visionVersion": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Metrics

GET/api/v1/metrics

List metrics

List metrics tracked by the organisation, with cursor pagination.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List metrics
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
numberintegerrequired
namestringrequired
descriptionobjectrequired
currentValueobjectrequired
unit"percentage" | "count" | "currency" | "ratio" | "duration" | "custom"required
stewardIdobjectrequired
dataSourceType"manual" | "integration" | "system"required
dataSourceConfigobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/metrics' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "number": 0,
      "name": "string",
      "description": null,
      "currentValue": null,
      "unit": "percentage",
      "stewardId": null,
      "dataSourceType": "manual",
      "dataSourceConfig": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/metrics

Create a metric

Create a metric (name, unit, optional data source and steward).

Request body · required
namestringrequired
descriptionstringoptional
currentValuenumberoptional
unit"percentage" | "count" | "currency" | "ratio" | "duration" | "custom"required
dataSourceType"manual" | "integration" | "system"optional
dataSourceConfigobjectoptional
stewardIdstring<uuid>optional
Returns · 201 — Create a metric
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
numberintegerrequired
namestringrequired
descriptionobjectrequired
currentValueobjectrequired
unit"percentage" | "count" | "currency" | "ratio" | "duration" | "custom"required
stewardIdobjectrequired
dataSourceType"manual" | "integration" | "system"required
dataSourceConfigobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/metrics' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "name": "string",
    "description": null,
    "currentValue": null,
    "unit": "percentage",
    "stewardId": null,
    "dataSourceType": "manual",
    "dataSourceConfig": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/metrics/{id}

Get a metric

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a metric
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
numberintegerrequired
namestringrequired
descriptionobjectrequired
currentValueobjectrequired
unit"percentage" | "count" | "currency" | "ratio" | "duration" | "custom"required
stewardIdobjectrequired
dataSourceType"manual" | "integration" | "system"required
dataSourceConfigobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/metrics/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "name": "string",
    "description": null,
    "currentValue": null,
    "unit": "percentage",
    "stewardId": null,
    "dataSourceType": "manual",
    "dataSourceConfig": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/metrics/{id}

Update a metric

Update a metric's name, description, unit, data source, or steward.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
descriptionstringoptional
currentValuenumberoptional
unit"percentage" | "count" | "currency" | "ratio" | "duration" | "custom"optional
dataSourceType"manual" | "integration" | "system"optional
dataSourceConfigobjectoptional
stewardIdobjectoptional
Returns · 200 — Update a metric
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
numberintegerrequired
namestringrequired
descriptionobjectrequired
currentValueobjectrequired
unit"percentage" | "count" | "currency" | "ratio" | "duration" | "custom"required
stewardIdobjectrequired
dataSourceType"manual" | "integration" | "system"required
dataSourceConfigobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/metrics/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "number": 0,
    "name": "string",
    "description": null,
    "currentValue": null,
    "unit": "percentage",
    "stewardId": null,
    "dataSourceType": "manual",
    "dataSourceConfig": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/metrics/{id}

Delete a metric

Permanently delete a metric.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a metric
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/metrics/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/metrics/{metricId}/values

List metric values

Recorded values for a metric, ascending by recorded time; when limit caps the count, the newest values are kept. Optionally filter by date (since).

Parameters
metricIdpath · stringrequired
metricId path parameter
Returns · 200 — List metric values
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/metrics/{metricId}/values' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/metrics/{metricId}/values

Record a metric value

Record an observed value for a metric. recordedAt defaults to now; pass it to backfill history.

Parameters
metricIdpath · stringrequired
metricId path parameter
Request body · required
valuenumberrequired
recordedAtstring<date-time>optional
notestringoptional
source"manual" | "integration" | "system"optional
Returns · 201 — Record a metric value
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/metrics/{metricId}/values' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Opportunities

GET/api/v1/opportunities

List opportunities

List opportunities with cursor pagination. Optionally filter by lifecycle state or team.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
statequery · stringoptional
Opportunity lifecycle state filter
teamIdquery · string<uuid>optional
Team UUID filter
Returns · 200 — List opportunities
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
titlestringrequired
numberintegerrequired
estimatedCostobjectrequired
costEstimatorIdobjectrequired
leadIdobjectrequired
teamIdobjectrequired
workflowIdobjectrequired
status"backlog" | "in_progress" | "completed" | "cancelled"required
cancellationCategoryobjectrequired
cancellationReasonobjectrequired
cancelledAtobjectrequired
cancelledByUserIdobjectrequired
priorityobjectrequired
visionVersionobjectrequired
visionPathobjectrequired
strategyVersionStampobjectrequired
prdobjectrequired
prototypesobjectrequired
aiSynthesisobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
categoryIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/opportunities' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "title": "string",
      "number": 0,
      "estimatedCost": null,
      "costEstimatorId": null,
      "leadId": null,
      "teamId": null,
      "workflowId": null,
      "status": "backlog",
      "cancellationCategory": null,
      "cancellationReason": null,
      "cancelledAt": null,
      "cancelledByUserId": null,
      "priority": null,
      "visionVersion": null,
      "visionPath": null,
      "strategyVersionStamp": null,
      "prd": null,
      "prototypes": null,
      "aiSynthesis": null,
      "plannedStart": null,
      "plannedDurationDays": null,
      "dueDate": null,
      "isHardDeadline": true,
      "categoryId": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/opportunities

Create an opportunity

Create a work opportunity. The description seeds the PRD (or a PRD template does, when omitted). Optionally set lead, team, workflow, category, initial objective links, and tags. Financial fields are ACL-gated.

Request body · required
titlestringrequired
descriptionstringoptional
leadIdstring<uuid>optional
teamIdobjectoptional
workflowIdstring<uuid>optional
initialState"backlog" | "in_progress"optional
categoryIdobjectoptional
objectiveLinksobject[]optional
Show child attributes ›
objectiveIdstring<uuid>required
tagIdsstring<uuid>[]optional
dueDatestring<date>optional
prdTemplateIdobjectoptional
Returns · 201 — Create an opportunity
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
titlestringrequired
numberintegerrequired
estimatedCostobjectrequired
costEstimatorIdobjectrequired
leadIdobjectrequired
teamIdobjectrequired
workflowIdobjectrequired
status"backlog" | "in_progress" | "completed" | "cancelled"required
cancellationCategoryobjectrequired
cancellationReasonobjectrequired
cancelledAtobjectrequired
cancelledByUserIdobjectrequired
priorityobjectrequired
visionVersionobjectrequired
visionPathobjectrequired
strategyVersionStampobjectrequired
prdobjectrequired
prototypesobjectrequired
aiSynthesisobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
categoryIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/opportunities' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "title": "string",
    "number": 0,
    "estimatedCost": null,
    "costEstimatorId": null,
    "leadId": null,
    "teamId": null,
    "workflowId": null,
    "status": "backlog",
    "cancellationCategory": null,
    "cancellationReason": null,
    "cancelledAt": null,
    "cancelledByUserId": null,
    "priority": null,
    "visionVersion": null,
    "visionPath": null,
    "strategyVersionStamp": null,
    "prd": null,
    "prototypes": null,
    "aiSynthesis": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "categoryId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/opportunities/{id}

Get an opportunity

Get a specific opportunity by id.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get an opportunity
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
titlestringrequired
numberintegerrequired
estimatedCostobjectrequired
costEstimatorIdobjectrequired
leadIdobjectrequired
teamIdobjectrequired
workflowIdobjectrequired
status"backlog" | "in_progress" | "completed" | "cancelled"required
cancellationCategoryobjectrequired
cancellationReasonobjectrequired
cancelledAtobjectrequired
cancelledByUserIdobjectrequired
priorityobjectrequired
visionVersionobjectrequired
visionPathobjectrequired
strategyVersionStampobjectrequired
prdobjectrequired
prototypesobjectrequired
aiSynthesisobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
categoryIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/opportunities/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "title": "string",
    "number": 0,
    "estimatedCost": null,
    "costEstimatorId": null,
    "leadId": null,
    "teamId": null,
    "workflowId": null,
    "status": "backlog",
    "cancellationCategory": null,
    "cancellationReason": null,
    "cancelledAt": null,
    "cancelledByUserId": null,
    "priority": null,
    "visionVersion": null,
    "visionPath": null,
    "strategyVersionStamp": null,
    "prd": null,
    "prototypes": null,
    "aiSynthesis": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "categoryId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/opportunities/{id}

Update an opportunity

Update an opportunity's title, lead, team, or PRD body. Lifecycle moves go through write_handoff (workflow steps) or reject_opportunity, not here.

Parameters
idpath · stringrequired
id path parameter
Request body · required
titlestringoptional
leadIdobjectoptional
teamIdobjectoptional
categoryIdobjectoptional
prdobjectoptional
Returns · 200 — Update an opportunity
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
titlestringrequired
numberintegerrequired
estimatedCostobjectrequired
costEstimatorIdobjectrequired
leadIdobjectrequired
teamIdobjectrequired
workflowIdobjectrequired
status"backlog" | "in_progress" | "completed" | "cancelled"required
cancellationCategoryobjectrequired
cancellationReasonobjectrequired
cancelledAtobjectrequired
cancelledByUserIdobjectrequired
priorityobjectrequired
visionVersionobjectrequired
visionPathobjectrequired
strategyVersionStampobjectrequired
prdobjectrequired
prototypesobjectrequired
aiSynthesisobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
categoryIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/opportunities/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "title": "string",
    "number": 0,
    "estimatedCost": null,
    "costEstimatorId": null,
    "leadId": null,
    "teamId": null,
    "workflowId": null,
    "status": "backlog",
    "cancellationCategory": null,
    "cancellationReason": null,
    "cancelledAt": null,
    "cancelledByUserId": null,
    "priority": null,
    "visionVersion": null,
    "visionPath": null,
    "strategyVersionStamp": null,
    "prd": null,
    "prototypes": null,
    "aiSynthesis": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "categoryId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/opportunities/{id}

Delete an opportunity

Permanently delete an opportunity and its dependency edges. Prefer reject_opportunity to record a won't-build decision; delete is for mistakes, not outcomes.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete an opportunity
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/opportunities/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/opportunities/{id}/tasks

List tasks attached to an opportunity

The tasks attached to this opportunity, with cursor pagination.

Parameters
idpath · stringrequired
id path parameter
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List tasks attached to an opportunity
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/opportunities/{id}/tasks' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/opportunities/{ref}/context

Get an opportunity's full context bundle

Get everything needed to act on an opportunity in one call: the opportunity and PRD, linked objectives, the customer(s), comments, linked insights, the active workflow step, and any linked PRs. Sections you lack the read capability for (e.g. customers, insights) come back null. Pass the opportunity ref (e.g. OPP-23).

Parameters
refpath · stringrequired
ref path parameter
Returns · 200 — Get an opportunity's full context bundle
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/opportunities/{ref}/context' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/opportunities/{id}/scorecard

Get an opportunity's scorecard

Get an opportunity's scorecard: the org's active scoring criteria (name, weight, invert), the shared 1-5 values with attribution, and the computed 0-100 total (null until every criterion is scored).

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get an opportunity's scorecard
oktruerequired
dataobjectrequired
Show child attributes ›
evidenceobjectrequired
Show child attributes ›
linkedCustomerCountintegerrequired
linkedArrTotalnumberrequired
mustCountintegerrequired
shouldCountintegerrequired
criteriaobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
weightnumberrequired
invertbooleanrequired
positionintegerrequired
valuesobject[]required
Show child attributes ›
criterionIdstring<uuid>required
valueintegerrequired
updatedAtstringrequired
scoredByobjectrequired
totalobjectrequired
scoredCountintegerrequired
activeCountintegerrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/opportunities/{id}/scorecard' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "evidence": {
      "linkedCustomerCount": 0,
      "linkedArrTotal": 0,
      "mustCount": 0,
      "shouldCount": 0
    },
    "criteria": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "name": "string",
        "weight": 0,
        "invert": true,
        "position": 0
      }
    ],
    "values": [
      {
        "criterionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "value": 0,
        "updatedAt": "string",
        "scoredBy": null
      }
    ],
    "total": null,
    "scoredCount": 0,
    "activeCount": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/opportunities/{opportunityId}/scores/{criterionId}

Set a scorecard value

Set one scorecard value on an opportunity: a shared 1-5 value for one of the org's scoring criteria (last write wins, attributed to the caller). Use get_opportunity_scorecard for criteria ids and the computed total.

Parameters
opportunityIdpath · stringrequired
opportunityId path parameter
criterionIdpath · stringrequired
criterionId path parameter
Request body · required
valueintegerrequired
Score value on the 1-5 scale
Returns · 200 — Set a scorecard value
oktruerequired
dataobjectrequired
Show child attributes ›
evidenceobjectrequired
Show child attributes ›
linkedCustomerCountintegerrequired
linkedArrTotalnumberrequired
mustCountintegerrequired
shouldCountintegerrequired
criteriaobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
weightnumberrequired
invertbooleanrequired
positionintegerrequired
valuesobject[]required
Show child attributes ›
criterionIdstring<uuid>required
valueintegerrequired
updatedAtstringrequired
scoredByobjectrequired
totalobjectrequired
scoredCountintegerrequired
activeCountintegerrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/opportunities/{opportunityId}/scores/{criterionId}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "evidence": {
      "linkedCustomerCount": 0,
      "linkedArrTotal": 0,
      "mustCount": 0,
      "shouldCount": 0
    },
    "criteria": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "name": "string",
        "weight": 0,
        "invert": true,
        "position": 0
      }
    ],
    "values": [
      {
        "criterionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "value": 0,
        "updatedAt": "string",
        "scoredBy": null
      }
    ],
    "total": null,
    "scoredCount": 0,
    "activeCount": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/opportunities/{opportunityId}/scores/{criterionId}

Clear a scorecard value

Clear one scorecard value on an opportunity (the total returns to null until re-scored).

Parameters
opportunityIdpath · stringrequired
opportunityId path parameter
criterionIdpath · stringrequired
criterionId path parameter
Returns · 200 — Clear a scorecard value
oktruerequired
dataobjectrequired
Show child attributes ›
evidenceobjectrequired
Show child attributes ›
linkedCustomerCountintegerrequired
linkedArrTotalnumberrequired
mustCountintegerrequired
shouldCountintegerrequired
criteriaobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
weightnumberrequired
invertbooleanrequired
positionintegerrequired
valuesobject[]required
Show child attributes ›
criterionIdstring<uuid>required
valueintegerrequired
updatedAtstringrequired
scoredByobjectrequired
totalobjectrequired
scoredCountintegerrequired
activeCountintegerrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/opportunities/{opportunityId}/scores/{criterionId}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "evidence": {
      "linkedCustomerCount": 0,
      "linkedArrTotal": 0,
      "mustCount": 0,
      "shouldCount": 0
    },
    "criteria": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "name": "string",
        "weight": 0,
        "invert": true,
        "position": 0
      }
    ],
    "values": [
      {
        "criterionId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "value": 0,
        "updatedAt": "string",
        "scoredBy": null
      }
    ],
    "total": null,
    "scoredCount": 0,
    "activeCount": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/opportunities/{opportunityId}/link-objective

Link an objective to an opportunity

Tie an opportunity to an objective (membership only: 'this bet claims to matter for that number'). Impact evidence lives on insights, not the link.

Parameters
opportunityIdpath · stringrequired
opportunityId path parameter
Request body · required
objectiveIdstring<uuid>required
Returns · 201 — Link an objective to an opportunity
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/opportunities/{opportunityId}/link-objective' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/opportunities/{opportunityId}/reject-via-workflow

Reject an opportunity and skip remaining workflow steps

Reject an opportunity: skips remaining workflow steps, lands it on the Cancelled terminal step (or flips a workflow-less one to cancelled), and records the categorized won't-build decision on the thread.

Parameters
opportunityIdpath · stringrequired
opportunityId path parameter
Request body · required
category"no_demand" | "not_aligned" | "not_viable" | "not_now" | "duplicate" | "other"required
reasonstringrequired
Returns · 200 — Reject an opportunity and skip remaining workflow steps
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/opportunities/{opportunityId}/reject-via-workflow' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/opportunities/{opportunityId}/post-update

Post an opportunity status update

Post a status update on an opportunity, authored by the key's user. It lands in the opportunity's updates stream and flows into every linked customer's feed. For a plain discussion comment, use create_comment.

Parameters
opportunityIdpath · stringrequired
opportunityId path parameter
Request body · required
bodystringrequired
The update text
Returns · 201 — Post an opportunity status update
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/opportunities/{opportunityId}/post-update' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Tasks

GET/api/v1/tasks

List tasks

List tasks with cursor pagination. Optionally filter by opportunity, status, priority, or team.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
opportunityIdquery · string<uuid>optional
Opportunity UUID filter
statusquery · stringoptional
Task status filter
priorityquery · stringoptional
Task priority filter
teamIdquery · string<uuid>optional
Team UUID filter
Returns · 200 — List tasks
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
opportunityIdobjectrequired
teamIdobjectrequired
ownerUserIdobjectrequired
parentTaskIdobjectrequired
subtaskPositionobjectrequired
handoffPendingFromIdobjectrequired
subtaskMode"standalone" | "sequential"required
workflowIdobjectrequired
categoryIdobjectrequired
titlestringrequired
prefixstringrequired
numberintegerrequired
descriptionobjectrequired
contentobjectrequired
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"required
completedAtobjectrequired
priority"low" | "medium" | "high" | "urgent"required
visionPathobjectrequired
estimateMinutesobjectrequired
phaseInstanceIdobjectrequired
onboardingStepInstanceIdobjectrequired
phaseIdobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
queuePositionintegerrequired
recurrenceIdobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/tasks' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "opportunityId": null,
      "teamId": null,
      "ownerUserId": null,
      "parentTaskId": null,
      "subtaskPosition": null,
      "handoffPendingFromId": null,
      "subtaskMode": "standalone",
      "workflowId": null,
      "categoryId": null,
      "title": "string",
      "prefix": "string",
      "number": 0,
      "description": null,
      "content": null,
      "status": "backlog",
      "completedAt": null,
      "priority": "low",
      "visionPath": null,
      "estimateMinutes": null,
      "phaseInstanceId": null,
      "onboardingStepInstanceId": null,
      "phaseId": null,
      "plannedStart": null,
      "plannedDurationDays": null,
      "dueDate": null,
      "isHardDeadline": true,
      "queuePosition": 0,
      "recurrenceId": null,
      "createdByUserId": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/tasks

Create a task

Create a task, attached to an opportunity (opportunityId) or standalone (bug fixes and maintenance are first-class). Optionally seed subtasks, owner, team, category, workflow, and tags in the same call.

Request body · required
titlestringrequired
descriptionstringoptional
contentstringoptional
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"optional
priority"low" | "medium" | "high" | "urgent"optional
opportunityIdstring<uuid>optional
teamIdobjectoptional
ownerIdobjectoptional
categoryIdobjectoptional
parentTaskIdstring<uuid>optional
subtaskPositionintegeroptional
subtaskMode"standalone" | "sequential"optional
subtasksobject[]optional
Show child attributes ›
titlestringrequired
ownerIdobjectoptional
positionintegeroptional
dueDatestring<date-time>optional
workflowIdstring<uuid>optional
onboardingStepInstanceIdstring<uuid>optional
estimateMinutesintegeroptional
dueDatestring<date-time>optional
tagIdsstring<uuid>[]optional
Returns · 201 — Create a task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
opportunityIdobjectrequired
teamIdobjectrequired
ownerUserIdobjectrequired
parentTaskIdobjectrequired
subtaskPositionobjectrequired
handoffPendingFromIdobjectrequired
subtaskMode"standalone" | "sequential"required
workflowIdobjectrequired
categoryIdobjectrequired
titlestringrequired
prefixstringrequired
numberintegerrequired
descriptionobjectrequired
contentobjectrequired
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"required
completedAtobjectrequired
priority"low" | "medium" | "high" | "urgent"required
visionPathobjectrequired
estimateMinutesobjectrequired
phaseInstanceIdobjectrequired
onboardingStepInstanceIdobjectrequired
phaseIdobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
queuePositionintegerrequired
recurrenceIdobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/tasks' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "opportunityId": null,
    "teamId": null,
    "ownerUserId": null,
    "parentTaskId": null,
    "subtaskPosition": null,
    "handoffPendingFromId": null,
    "subtaskMode": "standalone",
    "workflowId": null,
    "categoryId": null,
    "title": "string",
    "prefix": "string",
    "number": 0,
    "description": null,
    "content": null,
    "status": "backlog",
    "completedAt": null,
    "priority": "low",
    "visionPath": null,
    "estimateMinutes": null,
    "phaseInstanceId": null,
    "onboardingStepInstanceId": null,
    "phaseId": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "queuePosition": 0,
    "recurrenceId": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/tasks/{id}

Get a task

Get a specific task by id.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
opportunityIdobjectrequired
teamIdobjectrequired
ownerUserIdobjectrequired
parentTaskIdobjectrequired
subtaskPositionobjectrequired
handoffPendingFromIdobjectrequired
subtaskMode"standalone" | "sequential"required
workflowIdobjectrequired
categoryIdobjectrequired
titlestringrequired
prefixstringrequired
numberintegerrequired
descriptionobjectrequired
contentobjectrequired
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"required
completedAtobjectrequired
priority"low" | "medium" | "high" | "urgent"required
visionPathobjectrequired
estimateMinutesobjectrequired
phaseInstanceIdobjectrequired
onboardingStepInstanceIdobjectrequired
phaseIdobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
queuePositionintegerrequired
recurrenceIdobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/tasks/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "opportunityId": null,
    "teamId": null,
    "ownerUserId": null,
    "parentTaskId": null,
    "subtaskPosition": null,
    "handoffPendingFromId": null,
    "subtaskMode": "standalone",
    "workflowId": null,
    "categoryId": null,
    "title": "string",
    "prefix": "string",
    "number": 0,
    "description": null,
    "content": null,
    "status": "backlog",
    "completedAt": null,
    "priority": "low",
    "visionPath": null,
    "estimateMinutes": null,
    "phaseInstanceId": null,
    "onboardingStepInstanceId": null,
    "phaseId": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "queuePosition": 0,
    "recurrenceId": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/tasks/{id}

Update a task

Update a task's fields (title, description, content, priority, opportunity, team, category, subtask mode, estimate, due date). For a bare status move prefer set-status, which also auto-assigns an owner to ownerless work.

Parameters
idpath · stringrequired
id path parameter
Request body · required
titlestringoptional
descriptionstringoptional
contentobjectoptional
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"optional
priority"low" | "medium" | "high" | "urgent"optional
opportunityIdobjectoptional
teamIdobjectoptional
workflowIdstring<uuid>optional
categoryIdobjectoptional
subtaskMode"standalone" | "sequential"optional
estimateMinutesobjectoptional
dueDateobjectoptional
Returns · 200 — Update a task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
opportunityIdobjectrequired
teamIdobjectrequired
ownerUserIdobjectrequired
parentTaskIdobjectrequired
subtaskPositionobjectrequired
handoffPendingFromIdobjectrequired
subtaskMode"standalone" | "sequential"required
workflowIdobjectrequired
categoryIdobjectrequired
titlestringrequired
prefixstringrequired
numberintegerrequired
descriptionobjectrequired
contentobjectrequired
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"required
completedAtobjectrequired
priority"low" | "medium" | "high" | "urgent"required
visionPathobjectrequired
estimateMinutesobjectrequired
phaseInstanceIdobjectrequired
onboardingStepInstanceIdobjectrequired
phaseIdobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
queuePositionintegerrequired
recurrenceIdobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/tasks/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "opportunityId": null,
    "teamId": null,
    "ownerUserId": null,
    "parentTaskId": null,
    "subtaskPosition": null,
    "handoffPendingFromId": null,
    "subtaskMode": "standalone",
    "workflowId": null,
    "categoryId": null,
    "title": "string",
    "prefix": "string",
    "number": 0,
    "description": null,
    "content": null,
    "status": "backlog",
    "completedAt": null,
    "priority": "low",
    "visionPath": null,
    "estimateMinutes": null,
    "phaseInstanceId": null,
    "onboardingStepInstanceId": null,
    "phaseId": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "queuePosition": 0,
    "recurrenceId": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/tasks/{id}

Delete a task

Permanently delete a task. Its time entries, tags, checklist items, and insight links go with it, and its dependency edges are cleared; any subtasks are detached and survive as standalone tasks. To retire work without losing the record, set its status to cancelled instead.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/tasks/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/tasks/{id}/set-status

Set a task's status

Set a task's status. Moving an ownerless task to todo/in_progress assigns the caller as its owner — work in flight is never ownerless.

Parameters
idpath · stringrequired
id path parameter
Request body · required
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"required
Returns · 200 — Set a task's status
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
opportunityIdobjectrequired
teamIdobjectrequired
ownerUserIdobjectrequired
parentTaskIdobjectrequired
subtaskPositionobjectrequired
handoffPendingFromIdobjectrequired
subtaskMode"standalone" | "sequential"required
workflowIdobjectrequired
categoryIdobjectrequired
titlestringrequired
prefixstringrequired
numberintegerrequired
descriptionobjectrequired
contentobjectrequired
status"backlog" | "todo" | "in_progress" | "completed" | "cancelled" | "duplicate"required
completedAtobjectrequired
priority"low" | "medium" | "high" | "urgent"required
visionPathobjectrequired
estimateMinutesobjectrequired
phaseInstanceIdobjectrequired
onboardingStepInstanceIdobjectrequired
phaseIdobjectrequired
plannedStartobjectrequired
plannedDurationDaysobjectrequired
dueDateobjectrequired
isHardDeadlinebooleanrequired
queuePositionintegerrequired
recurrenceIdobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
autoAssignedOwnerstring<uuid>optional
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/tasks/{id}/set-status' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "opportunityId": null,
    "teamId": null,
    "ownerUserId": null,
    "parentTaskId": null,
    "subtaskPosition": null,
    "handoffPendingFromId": null,
    "subtaskMode": "standalone",
    "workflowId": null,
    "categoryId": null,
    "title": "string",
    "prefix": "string",
    "number": 0,
    "description": null,
    "content": null,
    "status": "backlog",
    "completedAt": null,
    "priority": "low",
    "visionPath": null,
    "estimateMinutes": null,
    "phaseInstanceId": null,
    "onboardingStepInstanceId": null,
    "phaseId": null,
    "plannedStart": null,
    "plannedDurationDays": null,
    "dueDate": null,
    "isHardDeadline": true,
    "queuePosition": 0,
    "recurrenceId": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string",
    "autoAssignedOwner": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/tasks/{ref}/context

Get a task's full context bundle

Get everything needed to act on a task in one call: the task spec, its parent opportunity and PRD, the customer(s), comments, linked insights, the active workflow step, and any linked PRs. Sections you lack the read capability for (e.g. the parent opportunity, customers, insights) come back null. Pass the task ref (e.g. TF-24).

Parameters
refpath · stringrequired
ref path parameter
Returns · 200 — Get a task's full context bundle
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/tasks/{ref}/context' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/tasks/handoff

Write a subtask handoff note

Post the handoff note for a completed subtask in a sequential task, briefing the next owner. Complete the subtask first (set-status), then write the note; it lands on the parent task's thread and clears the pending-note reminder.

Request body · required
fromTaskIdstring<uuid>required
notestringrequired
Returns · 200 — Write a subtask handoff note
oktruerequired
dataobjectrequired
Show child attributes ›
commentIdobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/tasks/handoff' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "commentId": null
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Recurring Tasks

GET/api/v1/recurring-tasks

List recurring tasks

List recurring-task definitions with cursor pagination: each one's schedule (human-readable cadence + next occurrence), team, owner, and template. These are the definitions a background sweep materializes into real tasks; use list to see the tasks they produced.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List recurring tasks
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdstring<uuid>required
namestringrequired
rrulestringrequired
dtstartstringrequired
tzidstringrequired
activebooleanrequired
titlestringrequired
descriptionobjectrequired
contentobjectrequired
priority"low" | "medium" | "high" | "urgent"required
ownerUserIdobjectrequired
categoryIdobjectrequired
workflowIdobjectrequired
estimateMinutesobjectrequired
tagIdsobjectrequired
dueOffsetDaysintegerrequired
lastMaterializedOccurrenceobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/recurring-tasks' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "teamId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "rrule": "string",
      "dtstart": "string",
      "tzid": "string",
      "active": true,
      "title": "string",
      "description": null,
      "content": null,
      "priority": "low",
      "ownerUserId": null,
      "categoryId": null,
      "workflowId": null,
      "estimateMinutes": null,
      "tagIds": null,
      "dueOffsetDays": 0,
      "lastMaterializedOccurrence": null,
      "createdByUserId": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/recurring-tasks

Create a recurring task

Define a recurring task: an RRULE schedule plus a task template. A background sweep creates one real task for the given team on every occurrence (status todo, due = occurrence + dueOffsetDays). This creates the DEFINITION, not a single task — use create for a one-off. rrule is an iCal RRULE string (e.g. 'FREQ=WEEKLY;BYDAY=MO'); dtstart/tzid default to now/UTC and it never backfills.

Request body · required
namestringrequired
Label for the recurring-task definition (not the task title)
teamIdstring<uuid>required
Team the generated tasks belong to
rrulestringrequired
iCal RRULE string, e.g. 'FREQ=WEEKLY;BYDAY=MO' or 'FREQ=MONTHLY;BYMONTHDAY=1'
dtstartstring<date-time>optional
Recurrence start (ISO 8601). Defaults to now
tzidstringoptional
IANA timezone the cadence reads in. Defaults to UTC
activebooleanoptional
titlestringrequired
descriptionstringoptional
contentstringoptional
priority"low" | "medium" | "high" | "urgent"optional
ownerUserIdstring<uuid>required
Required. Owns every task this definition generates.
categoryIdobjectoptional
workflowIdobjectoptional
estimateMinutesobjectoptional
tagIdsstring<uuid>[]optional
dueOffsetDaysintegeroptional
Returns · 201 — Create a recurring task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdstring<uuid>required
namestringrequired
rrulestringrequired
dtstartstringrequired
tzidstringrequired
activebooleanrequired
titlestringrequired
descriptionobjectrequired
contentobjectrequired
priority"low" | "medium" | "high" | "urgent"required
ownerUserIdobjectrequired
categoryIdobjectrequired
workflowIdobjectrequired
estimateMinutesobjectrequired
tagIdsobjectrequired
dueOffsetDaysintegerrequired
lastMaterializedOccurrenceobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/recurring-tasks' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "rrule": "string",
    "dtstart": "string",
    "tzid": "string",
    "active": true,
    "title": "string",
    "description": null,
    "content": null,
    "priority": "low",
    "ownerUserId": null,
    "categoryId": null,
    "workflowId": null,
    "estimateMinutes": null,
    "tagIds": null,
    "dueOffsetDays": 0,
    "lastMaterializedOccurrence": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/recurring-tasks/{id}

Get a recurring task

Get a recurring-task definition by id.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a recurring task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdstring<uuid>required
namestringrequired
rrulestringrequired
dtstartstringrequired
tzidstringrequired
activebooleanrequired
titlestringrequired
descriptionobjectrequired
contentobjectrequired
priority"low" | "medium" | "high" | "urgent"required
ownerUserIdobjectrequired
categoryIdobjectrequired
workflowIdobjectrequired
estimateMinutesobjectrequired
tagIdsobjectrequired
dueOffsetDaysintegerrequired
lastMaterializedOccurrenceobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/recurring-tasks/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "rrule": "string",
    "dtstart": "string",
    "tzid": "string",
    "active": true,
    "title": "string",
    "description": null,
    "content": null,
    "priority": "low",
    "ownerUserId": null,
    "categoryId": null,
    "workflowId": null,
    "estimateMinutes": null,
    "tagIds": null,
    "dueOffsetDays": 0,
    "lastMaterializedOccurrence": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/recurring-tasks/{id}

Update a recurring task

Update a definition's schedule, template, or active flag. Editing the schedule recomputes forward from now, never retroactively.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
Label for the recurring-task definition (not the task title)
teamIdstring<uuid>optional
Team the generated tasks belong to
rrulestringoptional
iCal RRULE string, e.g. 'FREQ=WEEKLY;BYDAY=MO' or 'FREQ=MONTHLY;BYMONTHDAY=1'
dtstartstring<date-time>optional
Recurrence start (ISO 8601). Defaults to now
tzidstringoptional
IANA timezone the cadence reads in. Defaults to UTC
activebooleanoptional
titlestringoptional
descriptionstringoptional
contentstringoptional
priority"low" | "medium" | "high" | "urgent"optional
ownerUserIdstring<uuid>optional
Required. Owns every task this definition generates.
categoryIdobjectoptional
workflowIdobjectoptional
estimateMinutesobjectoptional
tagIdsstring<uuid>[]optional
dueOffsetDaysintegeroptional
Returns · 200 — Update a recurring task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdstring<uuid>required
namestringrequired
rrulestringrequired
dtstartstringrequired
tzidstringrequired
activebooleanrequired
titlestringrequired
descriptionobjectrequired
contentobjectrequired
priority"low" | "medium" | "high" | "urgent"required
ownerUserIdobjectrequired
categoryIdobjectrequired
workflowIdobjectrequired
estimateMinutesobjectrequired
tagIdsobjectrequired
dueOffsetDaysintegerrequired
lastMaterializedOccurrenceobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/recurring-tasks/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "rrule": "string",
    "dtstart": "string",
    "tzid": "string",
    "active": true,
    "title": "string",
    "description": null,
    "content": null,
    "priority": "low",
    "ownerUserId": null,
    "categoryId": null,
    "workflowId": null,
    "estimateMinutes": null,
    "tagIds": null,
    "dueOffsetDays": 0,
    "lastMaterializedOccurrence": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/recurring-tasks/{id}

Delete a recurring task

Delete a recurring-task definition. Tasks it already created stay; no new ones are generated.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a recurring task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/recurring-tasks/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/recurring-tasks/{id}/set-active

Pause or resume a recurring task

Pause or resume a recurring-task definition. Paused definitions stop materializing tasks; resuming never backfills the paused gap.

Parameters
idpath · stringrequired
id path parameter
Request body · required
activeobjectrequired
true to resume, false to pause
Returns · 200 — Pause or resume a recurring task
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdstring<uuid>required
namestringrequired
rrulestringrequired
dtstartstringrequired
tzidstringrequired
activebooleanrequired
titlestringrequired
descriptionobjectrequired
contentobjectrequired
priority"low" | "medium" | "high" | "urgent"required
ownerUserIdobjectrequired
categoryIdobjectrequired
workflowIdobjectrequired
estimateMinutesobjectrequired
tagIdsobjectrequired
dueOffsetDaysintegerrequired
lastMaterializedOccurrenceobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/recurring-tasks/{id}/set-active' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "rrule": "string",
    "dtstart": "string",
    "tzid": "string",
    "active": true,
    "title": "string",
    "description": null,
    "content": null,
    "priority": "low",
    "ownerUserId": null,
    "categoryId": null,
    "workflowId": null,
    "estimateMinutes": null,
    "tagIds": null,
    "dueOffsetDays": 0,
    "lastMaterializedOccurrence": null,
    "createdByUserId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Customers

GET/api/v1/customers

List customers

List customers with cursor pagination. Optionally filter by status.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
statusquery · stringoptional
Customer status filter
Returns · 200 — List customers
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
logoUrlobjectrequired
logoFileIdobjectrequired
websiteobjectrequired
contentstringrequired
arrobjectrequired
status"prospect" | "onboarding" | "pilot" | "live" | "churned" | "lost"required
healthobjectrequired
healthChangedAtobjectrequired
ownerIdobjectrequired
onboardingWorkflowIdobjectrequired
customerSinceobjectrequired
lastReviewedAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/customers' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "number": 0,
      "logoUrl": null,
      "logoFileId": null,
      "website": null,
      "content": "string",
      "arr": null,
      "status": "prospect",
      "health": null,
      "healthChangedAt": null,
      "ownerId": null,
      "onboardingWorkflowId": null,
      "customerSince": null,
      "lastReviewedAt": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/customers

Create a customer

Create a customer account (name plus optional profile, owner, ARR, and lifecycle status; status defaults to prospect).

Request body · required
namestringrequired
logoUrlobjectoptional
websiteobjectoptional
contentstringoptional
status"prospect" | "onboarding" | "pilot" | "live" | "churned" | "lost"optional
ownerIdstring<uuid>optional
arrstringoptional
customerSinceobjectoptional
ISO 8601 date or datetime
Returns · 201 — Create a customer
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
logoUrlobjectrequired
logoFileIdobjectrequired
websiteobjectrequired
contentstringrequired
arrobjectrequired
status"prospect" | "onboarding" | "pilot" | "live" | "churned" | "lost"required
healthobjectrequired
healthChangedAtobjectrequired
ownerIdobjectrequired
onboardingWorkflowIdobjectrequired
customerSinceobjectrequired
lastReviewedAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/customers' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "logoUrl": null,
    "logoFileId": null,
    "website": null,
    "content": "string",
    "arr": null,
    "status": "prospect",
    "health": null,
    "healthChangedAt": null,
    "ownerId": null,
    "onboardingWorkflowId": null,
    "customerSince": null,
    "lastReviewedAt": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/customers/{id}

Get a customer

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a customer
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
logoUrlobjectrequired
logoFileIdobjectrequired
websiteobjectrequired
contentstringrequired
arrobjectrequired
status"prospect" | "onboarding" | "pilot" | "live" | "churned" | "lost"required
healthobjectrequired
healthChangedAtobjectrequired
ownerIdobjectrequired
onboardingWorkflowIdobjectrequired
customerSinceobjectrequired
lastReviewedAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/customers/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "logoUrl": null,
    "logoFileId": null,
    "website": null,
    "content": "string",
    "arr": null,
    "status": "prospect",
    "health": null,
    "healthChangedAt": null,
    "ownerId": null,
    "onboardingWorkflowId": null,
    "customerSince": null,
    "lastReviewedAt": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/customers/{id}

Update a customer

Update a customer's profile, owner, ARR, health, or lifecycle status. Moving to churned/lost requires a reason (stored as an insight rooted at the customer); moving to onboarding activates the org's default onboarding workflow.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
logoUrlobjectoptional
logoFileIdobjectoptional
websiteobjectoptional
contentstringoptional
status"prospect" | "onboarding" | "pilot" | "live" | "churned" | "lost"optional
health"healthy" | "at_risk" | "critical"optional
ownerIdobjectoptional
arrobjectoptional
customerSinceobjectoptional
reasonstringoptional
Returns · 200 — Update a customer
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
logoUrlobjectrequired
logoFileIdobjectrequired
websiteobjectrequired
contentstringrequired
arrobjectrequired
status"prospect" | "onboarding" | "pilot" | "live" | "churned" | "lost"required
healthobjectrequired
healthChangedAtobjectrequired
ownerIdobjectrequired
onboardingWorkflowIdobjectrequired
customerSinceobjectrequired
lastReviewedAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/customers/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "logoUrl": null,
    "logoFileId": null,
    "website": null,
    "content": "string",
    "arr": null,
    "status": "prospect",
    "health": null,
    "healthChangedAt": null,
    "ownerId": null,
    "onboardingWorkflowId": null,
    "customerSince": null,
    "lastReviewedAt": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/customers/{id}

Delete a customer

Hard-delete an account and its insights. Contacts, events, reviews, updates, and opportunity links go with it; linked opportunities survive.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a customer
oktruerequired
dataobjectrequired
Show child attributes ›
deletedtruerequired
idstring<uuid>required
namestringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/customers/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "deleted": true,
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/customers/{customerId}/contacts

List a customer's contacts

List the named people on a customer account, primary contact first, then newest. Use a contact's id to attribute an insight to the person who said it.

Parameters
customerIdpath · stringrequired
customerId path parameter
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List a customer's contacts
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdstring<uuid>required
namestringrequired
titleobjectrequired
role"economic_buyer" | "champion" | "decision_maker" | "technical" | "end_user" | "executive" | "other"required
emailobjectrequired
phoneobjectrequired
notesobjectrequired
isPrimarybooleanrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/customers/{customerId}/contacts' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "customerId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "title": null,
      "role": "economic_buyer",
      "email": null,
      "phone": null,
      "notes": null,
      "isPrimary": true,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/customers/{customerId}/contacts

Add a contact to a customer

Add a named person to a customer account (name plus optional title, role, email, phone, and notes). Marking the contact primary demotes the account's existing primary.

Parameters
customerIdpath · stringrequired
customerId path parameter
Request body · required
namestringrequired
titlestringoptional
role"economic_buyer" | "champion" | "decision_maker" | "technical" | "end_user" | "executive" | "other"optional
emailobjectoptional
phonestringoptional
notesstringoptional
isPrimarybooleanoptional
Returns · 201 — Add a contact to a customer
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdstring<uuid>required
namestringrequired
titleobjectrequired
role"economic_buyer" | "champion" | "decision_maker" | "technical" | "end_user" | "executive" | "other"required
emailobjectrequired
phoneobjectrequired
notesobjectrequired
isPrimarybooleanrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/customers/{customerId}/contacts' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "customerId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "title": null,
    "role": "economic_buyer",
    "email": null,
    "phone": null,
    "notes": null,
    "isPrimary": true,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/customers/{customerId}/contacts/{id}

Update a customer contact

Update a contact's details. Promoting a contact to primary demotes the account's existing primary.

Parameters
customerIdpath · stringrequired
customerId path parameter
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
titleobjectoptional
role"economic_buyer" | "champion" | "decision_maker" | "technical" | "end_user" | "executive" | "other"optional
emailobjectoptional
phoneobjectoptional
notesobjectoptional
isPrimarybooleanoptional
Returns · 200 — Update a customer contact
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdstring<uuid>required
namestringrequired
titleobjectrequired
role"economic_buyer" | "champion" | "decision_maker" | "technical" | "end_user" | "executive" | "other"required
emailobjectrequired
phoneobjectrequired
notesobjectrequired
isPrimarybooleanrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/customers/{customerId}/contacts/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "customerId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "title": null,
    "role": "economic_buyer",
    "email": null,
    "phone": null,
    "notes": null,
    "isPrimary": true,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/customers/{customerId}/contacts/{id}

Delete a customer contact

Remove a contact from a customer account. Insights attributed to the contact survive and fall back to the customer as their demand root.

Parameters
customerIdpath · stringrequired
customerId path parameter
idpath · stringrequired
id path parameter
Returns · 200 — Delete a customer contact
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/customers/{customerId}/contacts/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Comments

POST/api/v1/comments

Post a comment

Post a comment on a task or opportunity, authored by the key's user. It lands on the entity's discussion thread. For an opportunity status broadcast that flows into linked customers' feeds, use post_opportunity_update instead.

Request body · required
entityType"task" | "opportunity"required
entityIdstring<uuid>required
bodystringrequired
kind"user" | "update"optional
Returns · 201 — Post a comment
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
authorIdstring<uuid>required
entityTypestringrequired
entityIdstring<uuid>required
kindstringrequired
externalAuthorobjectrequired
externalSourceobjectrequired
bodystringrequired
parentIdobjectrequired
editedAtobjectrequired
createdAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/comments' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "authorId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "entityType": "string",
    "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "kind": "string",
    "externalAuthor": null,
    "externalSource": null,
    "body": "string",
    "parentId": null,
    "editedAt": null,
    "createdAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Insights

GET/api/v1/insights

List insights

List customer insights (the customer-voice evidence layer). Optionally filter by lifecycle status or customer.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
statusquery · stringoptional
Insight lifecycle status filter
customerIdquery · string<uuid>optional
Customer UUID filter
Returns · 200 — List insights
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdobjectrequired
customerNameobjectrequired
customerRefobjectrequired
customerLogoUrlobjectrequired
customerLogoFileIdobjectrequired
stakeholderUserIdobjectrequired
stakeholderNameobjectrequired
stakeholderUserSlugobjectrequired
stakeholderAvatarUrlobjectrequired
externalStakeholderIdobjectrequired
externalStakeholderNameobjectrequired
contactIdobjectrequired
contactNameobjectrequired
verbatimstringrequired
sourcestringrequired
status"created" | "review" | "need_context" | "active" | "rejected" | "delivered" | "stale"required
statusChangedAtobjectrequired
statusNoteobjectrequired
reviewTeamIdobjectrequired
reviewTeamNameobjectrequired
reviewRequestedAtobjectrequired
rejectionCategoryobjectrequired
moscowobjectrequired
deadlineobjectrequired
recordedByUserIdstring<uuid>required
recordedByUserNameobjectrequired
recordedByUserAvatarUrlobjectrequired
recordedAtstringrequired
archivedAtobjectrequired
pinnedbooleanoptional
goLivebooleanoptional
linksobject[]required
Show child attributes ›
entityType"opportunity" | "task" | "objective"required
entityIdstring<uuid>required
titlestringoptional
refstringoptional
state"backlog" | "in_progress" | "completed" | "cancelled"optional
blockingbooleanoptional
tagsobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
themeIdobjectrequired
themeNameobjectrequired
colorobjectrequired
themeColorobjectrequired
impactsobject[]required
Show child attributes ›
objectiveIdstring<uuid>required
objectiveTitlestringrequired
objectiveRefstringrequired
estimatedDeltaobjectrequired
metricUnitobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/insights' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "customerId": null,
      "customerName": null,
      "customerRef": null,
      "customerLogoUrl": null,
      "customerLogoFileId": null,
      "stakeholderUserId": null,
      "stakeholderName": null,
      "stakeholderUserSlug": null,
      "stakeholderAvatarUrl": null,
      "externalStakeholderId": null,
      "externalStakeholderName": null,
      "contactId": null,
      "contactName": null,
      "verbatim": "string",
      "source": "string",
      "status": "created",
      "statusChangedAt": null,
      "statusNote": null,
      "reviewTeamId": null,
      "reviewTeamName": null,
      "reviewRequestedAt": null,
      "rejectionCategory": null,
      "moscow": null,
      "deadline": null,
      "recordedByUserId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "recordedByUserName": null,
      "recordedByUserAvatarUrl": null,
      "recordedAt": "string",
      "archivedAt": null,
      "pinned": true,
      "goLive": true,
      "links": [
        {
          "entityType": "opportunity",
          "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
          "title": "string",
          "ref": "string",
          "state": "backlog",
          "blocking": true
        }
      ],
      "tags": [
        {
          "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
          "name": "string",
          "themeId": null,
          "themeName": null,
          "color": null,
          "themeColor": null
        }
      ],
      "impacts": [
        {
          "objectiveId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
          "objectiveTitle": "string",
          "objectiveRef": "string",
          "estimatedDelta": null,
          "metricUnit": null
        }
      ]
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/insights

Create an insight

Record a customer insight (one discrete signal, not a whole document). Roots at exactly one demand source: a customer, an internal stakeholder (org user), or an other stakeholder (externalStakeholderId — a named voice with no Telos seat). Optionally set source, moscow priority, deadline, tagIds for clustering, a reviewTeamId to route it into a team's review queue, and attach to an opportunity/task/objective.

Request body · required
customerIdobjectoptional
stakeholderUserIdobjectoptional
externalStakeholderIdobjectoptional
contactIdobjectoptional
verbatimstringrequired
source"interview" | "support" | "sales" | "async" | "observation" | "submission" | "community"required
moscowobjectoptional
deadlineobjectoptional
reviewTeamIdobjectoptional
attachToOpportunityIdstring<uuid>optional
attachToTaskIdstring<uuid>optional
attachToObjectiveIdstring<uuid>optional
pinnedbooleanoptional
tagIdsstring<uuid>[]optional
Returns · 201 — Create an insight
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdobjectrequired
customerNameobjectrequired
customerRefobjectrequired
customerLogoUrlobjectrequired
customerLogoFileIdobjectrequired
stakeholderUserIdobjectrequired
stakeholderNameobjectrequired
stakeholderUserSlugobjectrequired
stakeholderAvatarUrlobjectrequired
externalStakeholderIdobjectrequired
externalStakeholderNameobjectrequired
contactIdobjectrequired
contactNameobjectrequired
verbatimstringrequired
sourcestringrequired
status"created" | "review" | "need_context" | "active" | "rejected" | "delivered" | "stale"required
statusChangedAtobjectrequired
statusNoteobjectrequired
reviewTeamIdobjectrequired
reviewTeamNameobjectrequired
reviewRequestedAtobjectrequired
rejectionCategoryobjectrequired
moscowobjectrequired
deadlineobjectrequired
recordedByUserIdstring<uuid>required
recordedByUserNameobjectrequired
recordedByUserAvatarUrlobjectrequired
recordedAtstringrequired
archivedAtobjectrequired
pinnedbooleanoptional
goLivebooleanoptional
linksobject[]required
Show child attributes ›
entityType"opportunity" | "task" | "objective"required
entityIdstring<uuid>required
titlestringoptional
refstringoptional
state"backlog" | "in_progress" | "completed" | "cancelled"optional
blockingbooleanoptional
tagsobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
themeIdobjectrequired
themeNameobjectrequired
colorobjectrequired
themeColorobjectrequired
impactsobject[]required
Show child attributes ›
objectiveIdstring<uuid>required
objectiveTitlestringrequired
objectiveRefstringrequired
estimatedDeltaobjectrequired
metricUnitobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/insights' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "customerId": null,
    "customerName": null,
    "customerRef": null,
    "customerLogoUrl": null,
    "customerLogoFileId": null,
    "stakeholderUserId": null,
    "stakeholderName": null,
    "stakeholderUserSlug": null,
    "stakeholderAvatarUrl": null,
    "externalStakeholderId": null,
    "externalStakeholderName": null,
    "contactId": null,
    "contactName": null,
    "verbatim": "string",
    "source": "string",
    "status": "created",
    "statusChangedAt": null,
    "statusNote": null,
    "reviewTeamId": null,
    "reviewTeamName": null,
    "reviewRequestedAt": null,
    "rejectionCategory": null,
    "moscow": null,
    "deadline": null,
    "recordedByUserId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "recordedByUserName": null,
    "recordedByUserAvatarUrl": null,
    "recordedAt": "string",
    "archivedAt": null,
    "pinned": true,
    "goLive": true,
    "links": [
      {
        "entityType": "opportunity",
        "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "title": "string",
        "ref": "string",
        "state": "backlog",
        "blocking": true
      }
    ],
    "tags": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "name": "string",
        "themeId": null,
        "themeName": null,
        "color": null,
        "themeColor": null
      }
    ],
    "impacts": [
      {
        "objectiveId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "objectiveTitle": "string",
        "objectiveRef": "string",
        "estimatedDelta": null,
        "metricUnit": null
      }
    ]
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/insights/{id}

Get an insight

Get an insight with its demand root, links, tags, and committed impacts.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get an insight
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdobjectrequired
customerNameobjectrequired
customerRefobjectrequired
customerLogoUrlobjectrequired
customerLogoFileIdobjectrequired
stakeholderUserIdobjectrequired
stakeholderNameobjectrequired
stakeholderUserSlugobjectrequired
stakeholderAvatarUrlobjectrequired
externalStakeholderIdobjectrequired
externalStakeholderNameobjectrequired
contactIdobjectrequired
contactNameobjectrequired
verbatimstringrequired
sourcestringrequired
status"created" | "review" | "need_context" | "active" | "rejected" | "delivered" | "stale"required
statusChangedAtobjectrequired
statusNoteobjectrequired
reviewTeamIdobjectrequired
reviewTeamNameobjectrequired
reviewRequestedAtobjectrequired
rejectionCategoryobjectrequired
moscowobjectrequired
deadlineobjectrequired
recordedByUserIdstring<uuid>required
recordedByUserNameobjectrequired
recordedByUserAvatarUrlobjectrequired
recordedAtstringrequired
archivedAtobjectrequired
pinnedbooleanoptional
goLivebooleanoptional
linksobject[]required
Show child attributes ›
entityType"opportunity" | "task" | "objective"required
entityIdstring<uuid>required
titlestringoptional
refstringoptional
state"backlog" | "in_progress" | "completed" | "cancelled"optional
blockingbooleanoptional
tagsobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
themeIdobjectrequired
themeNameobjectrequired
colorobjectrequired
themeColorobjectrequired
impactsobject[]required
Show child attributes ›
objectiveIdstring<uuid>required
objectiveTitlestringrequired
objectiveRefstringrequired
estimatedDeltaobjectrequired
metricUnitobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/insights/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "customerId": null,
    "customerName": null,
    "customerRef": null,
    "customerLogoUrl": null,
    "customerLogoFileId": null,
    "stakeholderUserId": null,
    "stakeholderName": null,
    "stakeholderUserSlug": null,
    "stakeholderAvatarUrl": null,
    "externalStakeholderId": null,
    "externalStakeholderName": null,
    "contactId": null,
    "contactName": null,
    "verbatim": "string",
    "source": "string",
    "status": "created",
    "statusChangedAt": null,
    "statusNote": null,
    "reviewTeamId": null,
    "reviewTeamName": null,
    "reviewRequestedAt": null,
    "rejectionCategory": null,
    "moscow": null,
    "deadline": null,
    "recordedByUserId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "recordedByUserName": null,
    "recordedByUserAvatarUrl": null,
    "recordedAt": "string",
    "archivedAt": null,
    "pinned": true,
    "goLive": true,
    "links": [
      {
        "entityType": "opportunity",
        "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "title": "string",
        "ref": "string",
        "state": "backlog",
        "blocking": true
      }
    ],
    "tags": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "name": "string",
        "themeId": null,
        "themeName": null,
        "color": null,
        "themeColor": null
      }
    ],
    "impacts": [
      {
        "objectiveId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "objectiveTitle": "string",
        "objectiveRef": "string",
        "estimatedDelta": null,
        "metricUnit": null
      }
    ]
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/insights/{id}

Update an insight

Update an insight's verbatim, source, demand root, contact, moscow priority, or deadline. The service keeps exactly one demand root after the merge.

Parameters
idpath · stringrequired
id path parameter
Request body · required
verbatimstringoptional
source"interview" | "support" | "sales" | "async" | "observation" | "submission" | "community"optional
customerIdobjectoptional
stakeholderUserIdobjectoptional
externalStakeholderIdobjectoptional
contactIdobjectoptional
moscowobjectoptional
deadlineobjectoptional
Returns · 200 — Update an insight
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
customerIdobjectrequired
customerNameobjectrequired
customerRefobjectrequired
customerLogoUrlobjectrequired
customerLogoFileIdobjectrequired
stakeholderUserIdobjectrequired
stakeholderNameobjectrequired
stakeholderUserSlugobjectrequired
stakeholderAvatarUrlobjectrequired
externalStakeholderIdobjectrequired
externalStakeholderNameobjectrequired
contactIdobjectrequired
contactNameobjectrequired
verbatimstringrequired
sourcestringrequired
status"created" | "review" | "need_context" | "active" | "rejected" | "delivered" | "stale"required
statusChangedAtobjectrequired
statusNoteobjectrequired
reviewTeamIdobjectrequired
reviewTeamNameobjectrequired
reviewRequestedAtobjectrequired
rejectionCategoryobjectrequired
moscowobjectrequired
deadlineobjectrequired
recordedByUserIdstring<uuid>required
recordedByUserNameobjectrequired
recordedByUserAvatarUrlobjectrequired
recordedAtstringrequired
archivedAtobjectrequired
pinnedbooleanoptional
goLivebooleanoptional
linksobject[]required
Show child attributes ›
entityType"opportunity" | "task" | "objective"required
entityIdstring<uuid>required
titlestringoptional
refstringoptional
state"backlog" | "in_progress" | "completed" | "cancelled"optional
blockingbooleanoptional
tagsobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
themeIdobjectrequired
themeNameobjectrequired
colorobjectrequired
themeColorobjectrequired
impactsobject[]required
Show child attributes ›
objectiveIdstring<uuid>required
objectiveTitlestringrequired
objectiveRefstringrequired
estimatedDeltaobjectrequired
metricUnitobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/insights/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "customerId": null,
    "customerName": null,
    "customerRef": null,
    "customerLogoUrl": null,
    "customerLogoFileId": null,
    "stakeholderUserId": null,
    "stakeholderName": null,
    "stakeholderUserSlug": null,
    "stakeholderAvatarUrl": null,
    "externalStakeholderId": null,
    "externalStakeholderName": null,
    "contactId": null,
    "contactName": null,
    "verbatim": "string",
    "source": "string",
    "status": "created",
    "statusChangedAt": null,
    "statusNote": null,
    "reviewTeamId": null,
    "reviewTeamName": null,
    "reviewRequestedAt": null,
    "rejectionCategory": null,
    "moscow": null,
    "deadline": null,
    "recordedByUserId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "recordedByUserName": null,
    "recordedByUserAvatarUrl": null,
    "recordedAt": "string",
    "archivedAt": null,
    "pinned": true,
    "goLive": true,
    "links": [
      {
        "entityType": "opportunity",
        "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "title": "string",
        "ref": "string",
        "state": "backlog",
        "blocking": true
      }
    ],
    "tags": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "name": "string",
        "themeId": null,
        "themeName": null,
        "color": null,
        "themeColor": null
      }
    ],
    "impacts": [
      {
        "objectiveId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "objectiveTitle": "string",
        "objectiveRef": "string",
        "estimatedDelta": null,
        "metricUnit": null
      }
    ]
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/insights/{id}

Delete an insight

Permanently delete an insight and its links. Prefer the review lifecycle (reject/archive) to record an outcome; delete is for mistakes.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete an insight
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/insights/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/insights/{insightId}/attach

Attach an insight

Link an existing insight to an opportunity, task, or objective (optionally pinned).

Parameters
insightIdpath · stringrequired
insightId path parameter
Request body · required
entityType"opportunity" | "task" | "objective"required
entityIdstring<uuid>required
pinnedbooleanoptional
Returns · 200 — Attach an insight
oktruerequired
dataobjectrequired
Show child attributes ›
oktruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/insights/{insightId}/attach' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "ok": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Messages

GET/api/v1/messages

List a room's messages

List a room's top-level messages, newest first, with cursor pagination (service-capped at 100 per page). Rows carry author, reactions, attachments, and thread reply counts; fetch a thread's replies with the thread action. Requires read access to the room (member, or any org user for an open group channel).

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
roomIdquery · string<uuid>required
Room UUID
Returns · 200 — List a room's messages
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
roomIdstring<uuid>required
authorIdobjectrequired
authorNameobjectrequired
authorAvatarUrlobjectrequired
kind"user" | "system" | "vibe" | "customer_update"required
bodystringrequired
payloadobjectrequired
editedAtobjectrequired
pinnedAtobjectrequired
createdAtstringrequired
replyCountintegerrequired
lastReplyAtobjectrequired
reactionsobject[]required
Show child attributes ›
emojistringrequired
countintegerrequired
userIdsstring<uuid>[]required
userNamesstring[]required
hasMebooleanrequired
attachmentsobject[]required
Show child attributes ›
fileIdstring<uuid>required
originalNamestringrequired
mimeTypestringrequired
sizeBytesnumberrequired
thumbnailKeyobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/messages' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "roomId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "authorId": null,
      "authorName": null,
      "authorAvatarUrl": null,
      "kind": "user",
      "body": "string",
      "payload": null,
      "editedAt": null,
      "pinnedAt": null,
      "createdAt": "string",
      "replyCount": 0,
      "lastReplyAt": null,
      "reactions": [
        {
          "emoji": "string",
          "count": 0,
          "userIds": [
            "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
          ],
          "userNames": [
            "string"
          ],
          "hasMe": true
        }
      ],
      "attachments": [
        {
          "fileId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
          "originalName": "string",
          "mimeType": "string",
          "sizeBytes": 0,
          "thumbnailKey": null
        }
      ]
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/messages

Post a message

Post a message to a room you can read, authored by the key's user. Pass parentId (a top-level message UUID) to reply in its thread; threads are two-level. @Name mentions in the body notify the named org members.

Request body · required
roomIdstring<uuid>required
Room UUID
bodystringrequired
Message body (markdown, max 10000 chars)
parentIdstring<uuid>optional
Top-level message UUID to reply to in its thread
Returns · 201 — Post a message
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
roomIdstring<uuid>required
authorIdobjectrequired
authorNameobjectrequired
authorAvatarUrlobjectrequired
kind"user" | "system" | "vibe" | "customer_update"required
bodystringrequired
payloadobjectrequired
editedAtobjectrequired
pinnedAtobjectrequired
createdAtstringrequired
replyCountintegerrequired
lastReplyAtobjectrequired
reactionsobject[]required
Show child attributes ›
emojistringrequired
countintegerrequired
userIdsstring<uuid>[]required
userNamesstring[]required
hasMebooleanrequired
attachmentsobject[]required
Show child attributes ›
fileIdstring<uuid>required
originalNamestringrequired
mimeTypestringrequired
sizeBytesnumberrequired
thumbnailKeyobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/messages' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "roomId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "authorId": null,
    "authorName": null,
    "authorAvatarUrl": null,
    "kind": "user",
    "body": "string",
    "payload": null,
    "editedAt": null,
    "pinnedAt": null,
    "createdAt": "string",
    "replyCount": 0,
    "lastReplyAt": null,
    "reactions": [
      {
        "emoji": "string",
        "count": 0,
        "userIds": [
          "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
        ],
        "userNames": [
          "string"
        ],
        "hasMe": true
      }
    ],
    "attachments": [
      {
        "fileId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "originalName": "string",
        "mimeType": "string",
        "sizeBytes": 0,
        "thumbnailKey": null
      }
    ]
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/messages/{id}/thread

List a message's thread replies

List the replies threaded under a top-level message, newest first, with cursor pagination. Requires read access to the message's room.

Parameters
idpath · stringrequired
id path parameter
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List a message's thread replies
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
roomIdstring<uuid>required
authorIdobjectrequired
authorNameobjectrequired
authorAvatarUrlobjectrequired
kind"user" | "system" | "vibe" | "customer_update"required
bodystringrequired
payloadobjectrequired
editedAtobjectrequired
pinnedAtobjectrequired
createdAtstringrequired
replyCountintegerrequired
lastReplyAtobjectrequired
reactionsobject[]required
Show child attributes ›
emojistringrequired
countintegerrequired
userIdsstring<uuid>[]required
userNamesstring[]required
hasMebooleanrequired
attachmentsobject[]required
Show child attributes ›
fileIdstring<uuid>required
originalNamestringrequired
mimeTypestringrequired
sizeBytesnumberrequired
thumbnailKeyobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/messages/{id}/thread' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "roomId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "authorId": null,
      "authorName": null,
      "authorAvatarUrl": null,
      "kind": "user",
      "body": "string",
      "payload": null,
      "editedAt": null,
      "pinnedAt": null,
      "createdAt": "string",
      "replyCount": 0,
      "lastReplyAt": null,
      "reactions": [
        {
          "emoji": "string",
          "count": 0,
          "userIds": [
            "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
          ],
          "userNames": [
            "string"
          ],
          "hasMe": true
        }
      ],
      "attachments": [
        {
          "fileId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
          "originalName": "string",
          "mimeType": "string",
          "sizeBytes": 0,
          "thumbnailKey": null
        }
      ]
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/messages/{id}

Edit a message

Edit one of your own messages; it is marked edited. Only the author may edit a message, and system messages cannot be edited.

Parameters
idpath · stringrequired
id path parameter
Request body · required
bodystringrequired
Message body (markdown, max 10000 chars)
Returns · 200 — Edit a message
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
roomIdstring<uuid>required
orgIdstring<uuid>required
authorIdobjectrequired
kindstringrequired
bodystringrequired
payloadobjectrequired
parentIdobjectrequired
pinnedAtobjectrequired
editedAtobjectrequired
deletedAtobjectrequired
createdAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/messages/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "roomId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "authorId": null,
    "kind": "string",
    "body": "string",
    "payload": null,
    "parentId": null,
    "pinnedAt": null,
    "editedAt": null,
    "deletedAt": null,
    "createdAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/messages/{id}

Delete a message

Delete one of your own messages (soft delete; attachments are swept). Only the author may delete it on this surface.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a message
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/messages/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Notifications

GET/api/v1/notifications

List notifications

List the authenticated user's notifications, newest first, with cursor pagination. Filter to unread only, pinned only, or a set of notification types.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
unreadOnlyqueryoptional
Only return unread notifications
pinnedOnlyqueryoptional
Only return pinned notifications
typesqueryoptional
Only return these notification types. JSON array on MCP, comma-separated on REST and CLI. One of: strategy.published, strategy.updated, vision.published, customer.update_posted, customer.went_live, insight.assigned, insight.needs_context, insight.rejected, opportunity.completed, opportunity.cancelled, objective.committed_date_breach, workflow.step_assigned, task.handoff, task.agent_run_completed, task.agent_run_failed, task.agent_run_cancelled, comment.mention, comment.thread_reply, doc.mention, room.invited, room.mentioned, community.mentioned, good_vibes.shoutout
Returns · 200 — List notifications
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
userIdstring<uuid>required
typestringrequired
entityTypestringrequired
entityIdstring<uuid>required
actorIdobjectrequired
sourceIdobjectrequired
titlestringrequired
bodystringrequired
linkUrlobjectrequired
readAtobjectrequired
pinnedAtobjectrequired
groupKeyobjectrequired
createdAtstringrequired
actorobjectrequired
myReactionobjectrequired
repliedbooleanrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/notifications' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "userId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "type": "string",
      "entityType": "string",
      "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "actorId": null,
      "sourceId": null,
      "title": "string",
      "body": "string",
      "linkUrl": null,
      "readAt": null,
      "pinnedAt": null,
      "groupKey": null,
      "createdAt": "string",
      "actor": null,
      "myReaction": null,
      "replied": true
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/notifications/unread-count

Get unread notification count

Count the authenticated user's unread notifications.

Returns · 200 — Get unread notification count
oktruerequired
dataobjectrequired
Show child attributes ›
countintegerrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/notifications/unread-count' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "count": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/notifications/{id}/read

Mark a notification read

Mark one of your notifications read.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Mark a notification read
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
userIdstring<uuid>required
typestringrequired
entityTypestringrequired
entityIdstring<uuid>required
actorIdobjectrequired
sourceIdobjectrequired
titlestringrequired
bodystringrequired
linkUrlobjectrequired
readAtobjectrequired
pinnedAtobjectrequired
groupKeyobjectrequired
createdAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/notifications/{id}/read' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "userId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "type": "string",
    "entityType": "string",
    "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "actorId": null,
    "sourceId": null,
    "title": "string",
    "body": "string",
    "linkUrl": null,
    "readAt": null,
    "pinnedAt": null,
    "groupKey": null,
    "createdAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/notifications/read-all

Mark all notifications read

Mark all of your notifications read.

Request body · required

Empty object.

Returns · 200 — Mark all notifications read
oktruerequired
dataobjectrequired
Show child attributes ›
oktruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/notifications/read-all' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "ok": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/notifications/{id}/pin

Pin a notification

Pin one of your notifications so it stays at the top of the inbox.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Pin a notification
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
userIdstring<uuid>required
typestringrequired
entityTypestringrequired
entityIdstring<uuid>required
actorIdobjectrequired
sourceIdobjectrequired
titlestringrequired
bodystringrequired
linkUrlobjectrequired
readAtobjectrequired
pinnedAtobjectrequired
groupKeyobjectrequired
createdAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/notifications/{id}/pin' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "userId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "type": "string",
    "entityType": "string",
    "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "actorId": null,
    "sourceId": null,
    "title": "string",
    "body": "string",
    "linkUrl": null,
    "readAt": null,
    "pinnedAt": null,
    "groupKey": null,
    "createdAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/notifications/{id}/unpin

Unpin a notification

Unpin one of your notifications.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Unpin a notification
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
userIdstring<uuid>required
typestringrequired
entityTypestringrequired
entityIdstring<uuid>required
actorIdobjectrequired
sourceIdobjectrequired
titlestringrequired
bodystringrequired
linkUrlobjectrequired
readAtobjectrequired
pinnedAtobjectrequired
groupKeyobjectrequired
createdAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/notifications/{id}/unpin' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "userId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "type": "string",
    "entityType": "string",
    "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "actorId": null,
    "sourceId": null,
    "title": "string",
    "body": "string",
    "linkUrl": null,
    "readAt": null,
    "pinnedAt": null,
    "groupKey": null,
    "createdAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/notifications/{id}/unsubscribe

Unsubscribe at notification source

Unsubscribe from the entity a notification came from, muting its future notifications for you.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Unsubscribe at notification source
oktruerequired
dataobjectrequired
Show child attributes ›
entityTypestringrequired
entityIdstring<uuid>required
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/notifications/{id}/unsubscribe' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "entityType": "string",
    "entityId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Prd Templates

GET/api/v1/prd-templates

List PRD templates

List the PRD templates visible to the key's user: shared (org-wide) templates plus those owned by the user's teams.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List PRD templates
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdobjectrequired
namestringrequired
contentstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/prd-templates' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "teamId": null,
      "name": "string",
      "content": "string",
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/prd-templates

Create a PRD template

Create a PRD template (markdown scaffold for opportunity PRDs). teamId scopes it to a team; omit for a shared org-wide template, which requires the prd_template:update capability.

Request body · required
namestringrequired
contentstringrequired
teamIdobjectoptional
Returns · 201 — Create a PRD template
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdobjectrequired
namestringrequired
contentstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/prd-templates' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": null,
    "name": "string",
    "content": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/prd-templates/{id}

Get a PRD template

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a PRD template
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdobjectrequired
namestringrequired
contentstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/prd-templates/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": null,
    "name": "string",
    "content": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/prd-templates/{id}

Update a PRD template

Update a PRD template's name, content, or team scope.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
contentstringoptional
teamIdobjectoptional
Returns · 200 — Update a PRD template
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
teamIdobjectrequired
namestringrequired
contentstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/prd-templates/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "teamId": null,
    "name": "string",
    "content": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/prd-templates/{id}

Delete a PRD template

Delete a PRD template. Opportunities that already applied it keep their PRD content.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a PRD template
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/prd-templates/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Rooms

GET/api/v1/rooms

List your rooms

List the rooms the authenticated user is a member of (DMs, group channels, system rooms), with unread counts and your per-room state, most recently active first.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List your rooms
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
kindstringrequired
visibilitystringrequired
systemTypeobjectrequired
nameobjectrequired
slugstringrequired
dmKeyobjectrequired
descriptionobjectrequired
createdByIdobjectrequired
archivedAtobjectrequired
lastMessageAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
unreadCountintegerrequired
pinnedAtobjectrequired
notificationLevel"all" | "mentions" | "muted"required
lastReadAtobjectrequired
myRoleobjectrequired
dmUserobjectrequired
draftBodyobjectrequired
draftUpdatedAtobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/rooms' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "kind": "string",
      "visibility": "string",
      "systemType": null,
      "name": null,
      "slug": "string",
      "dmKey": null,
      "description": null,
      "createdById": null,
      "archivedAt": null,
      "lastMessageAt": null,
      "createdAt": "string",
      "updatedAt": "string",
      "unreadCount": 0,
      "pinnedAt": null,
      "notificationLevel": "all",
      "lastReadAt": null,
      "myRole": null,
      "dmUser": null,
      "draftBody": null,
      "draftUpdatedAt": null
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/rooms

Create a group channel

Create a group channel with at least one other org member; the creator becomes its admin. Visibility 'open' (default) lets any org user read and join; 'private' is invite-only. DMs are started in-app, not here.

Request body · required
namestringrequired
descriptionstringoptional
memberIdsstring<uuid>[]required
visibility"open" | "private"optional
Returns · 201 — Create a group channel
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
kindstringrequired
visibilitystringrequired
systemTypeobjectrequired
nameobjectrequired
slugstringrequired
dmKeyobjectrequired
descriptionobjectrequired
createdByIdobjectrequired
archivedAtobjectrequired
lastMessageAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/rooms' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "kind": "string",
    "visibility": "string",
    "systemType": null,
    "name": null,
    "slug": "string",
    "dmKey": null,
    "description": null,
    "createdById": null,
    "archivedAt": null,
    "lastMessageAt": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/rooms/{id}

Get a room

Get a room by UUID with your membership role. Members always read; any org user reads an open group channel; a private group, DM, or system room without a membership row is forbidden.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a room
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
kindstringrequired
visibilitystringrequired
systemTypeobjectrequired
nameobjectrequired
slugstringrequired
dmKeyobjectrequired
descriptionobjectrequired
createdByIdobjectrequired
archivedAtobjectrequired
lastMessageAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
myRoleobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/rooms/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "kind": "string",
    "visibility": "string",
    "systemType": null,
    "name": null,
    "slug": "string",
    "dmKey": null,
    "description": null,
    "createdById": null,
    "archivedAt": null,
    "lastMessageAt": null,
    "createdAt": "string",
    "updatedAt": "string",
    "myRole": null
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/rooms/{id}

Update a group channel

Rename a group channel or edit its description. Room-admin only; DMs and system rooms cannot be edited.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
descriptionstringoptional
Returns · 200 — Update a group channel
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
kindstringrequired
visibilitystringrequired
systemTypeobjectrequired
nameobjectrequired
slugstringrequired
dmKeyobjectrequired
descriptionobjectrequired
createdByIdobjectrequired
archivedAtobjectrequired
lastMessageAtobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/rooms/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "kind": "string",
    "visibility": "string",
    "systemType": null,
    "name": null,
    "slug": "string",
    "dmKey": null,
    "description": null,
    "createdById": null,
    "archivedAt": null,
    "lastMessageAt": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/rooms/{id}/archive

Archive a group channel

Archive a group channel, removing it from everyone's room list. Terminal: rooms have no hard delete. Room-admin only; DMs and system rooms cannot be archived.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Archive a group channel
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
archivedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/rooms/{id}/archive' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "archived": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Strategies

GET/api/v1/strategies

List strategies

List strategies with cursor pagination. Optionally filter by status (draft, active, archived).

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
statusquery · stringoptional
Strategy status filter
Returns · 200 — List strategies
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
contentstringrequired
versionintegerrequired
ownerIdobjectrequired
statusstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/strategies' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "number": 0,
      "content": "string",
      "version": 0,
      "ownerId": null,
      "status": "string",
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/strategies

Create a strategy

Create a strategy (name plus a markdown content body). Starts as a draft.

Request body · required
namestringrequired
contentstringrequired
status"draft" | "active" | "archived"optional
Returns · 201 — Create a strategy
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
contentstringrequired
versionintegerrequired
ownerIdobjectrequired
statusstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/strategies' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "content": "string",
    "version": 0,
    "ownerId": null,
    "status": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/strategies/{id}

Get a strategy

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a strategy
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
contentstringrequired
versionintegerrequired
ownerIdobjectrequired
statusstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/strategies/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "content": "string",
    "version": 0,
    "ownerId": null,
    "status": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/strategies/{id}

Update a strategy

Update a strategy's name or content. An optional changeNote labels the version this edit creates. Owner-only; ACL enforced by the service.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
contentstringoptional
changeNotestringoptional
Returns · 200 — Update a strategy
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
contentstringrequired
versionintegerrequired
ownerIdobjectrequired
statusstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/strategies/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "content": "string",
    "version": 0,
    "ownerId": null,
    "status": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/strategies/{id}/publish

Publish a strategy

Publish a draft strategy, making it the active version. Owner-only; ACL enforced by the service.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Publish a strategy
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
contentstringrequired
versionintegerrequired
ownerIdobjectrequired
statusstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/strategies/{id}/publish' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "content": "string",
    "version": 0,
    "ownerId": null,
    "status": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/strategies/{id}/archive

Archive a strategy

Archive a strategy, retiring it from the active set. Owner-only; ACL enforced by the service.

Parameters
idpath · stringrequired
id path parameter
Request body · required

Empty object.

Returns · 200 — Archive a strategy
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
numberintegerrequired
contentstringrequired
versionintegerrequired
ownerIdobjectrequired
statusstringrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/strategies/{id}/archive' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "number": 0,
    "content": "string",
    "version": 0,
    "ownerId": null,
    "status": "string",
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/strategies/{id}/versions

List a strategy's version history

Version snapshots of a strategy, newest first, with cursor pagination. Every content edit creates one.

Parameters
idpath · stringrequired
id path parameter
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List a strategy's version history
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/strategies/{id}/versions' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Tags

GET/api/v1/tags

List tags

List tags (with usage counts) so you can cluster insights onto existing tags instead of minting duplicates.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List tags
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
namestringrequired
themeIdobjectrequired
themeNameobjectrequired
themeColorobjectrequired
colorobjectrequired
effectiveColorobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
usageCountintegerrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/tags' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "themeId": null,
      "themeName": null,
      "themeColor": null,
      "color": null,
      "effectiveColor": null,
      "createdByUserId": null,
      "createdAt": "string",
      "usageCount": 0
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/tags

Create a tag

Create a tag for clustering insights. List existing tags first (list_tags) and reuse them rather than minting duplicates.

Request body · required
namestringrequired
themeIdobjectoptional
colorobjectoptional
Returns · 201 — Create a tag
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
namestringrequired
themeIdobjectrequired
themeNameobjectrequired
themeColorobjectrequired
colorobjectrequired
effectiveColorobjectrequired
createdByUserIdobjectrequired
createdAtstringrequired
usageCountintegerrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/tags' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "themeId": null,
    "themeName": null,
    "themeColor": null,
    "color": null,
    "effectiveColor": null,
    "createdByUserId": null,
    "createdAt": "string",
    "usageCount": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Teams

GET/api/v1/teams

List teams

List teams in the organisation, with cursor pagination.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List teams
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
slugstringrequired
prefixstringrequired
descriptionobjectrequired
defaultPrdTemplateIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/teams' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "slug": "string",
      "prefix": "string",
      "description": null,
      "defaultPrdTemplateId": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/teams

Create a team

Create a team. The 2-4 character prefix becomes the team's task ref prefix (e.g. ENG-42).

Request body · required
namestringrequired
descriptionstringoptional
prefixstringoptional
Returns · 201 — Create a team
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
slugstringrequired
prefixstringrequired
descriptionobjectrequired
defaultPrdTemplateIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/teams' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "slug": "string",
    "prefix": "string",
    "description": null,
    "defaultPrdTemplateId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/teams/{id}

Get a team

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a team
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
slugstringrequired
prefixstringrequired
descriptionobjectrequired
defaultPrdTemplateIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/teams/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "slug": "string",
    "prefix": "string",
    "description": null,
    "defaultPrdTemplateId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/teams/{id}

Update a team

Update a team's name, description, ref prefix, or default PRD template.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
descriptionstringoptional
defaultPrdTemplateIdobjectoptional
prefixstringoptional
Returns · 200 — Update a team
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
slugstringrequired
prefixstringrequired
descriptionobjectrequired
defaultPrdTemplateIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/teams/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "slug": "string",
    "prefix": "string",
    "description": null,
    "defaultPrdTemplateId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/teams/{id}

Delete a team

Delete a team. Its opportunities/tasks keep their rows (team unset, refs stable); memberships and team-scoped config are removed. Refuses to delete the org's only team.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a team
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/teams/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/teams/{teamId}/members

List team members

Parameters
teamIdpath · stringrequired
teamId path parameter
Returns · 200 — List team members
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/teams/{teamId}/members' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/teams/{teamId}/members

Add a team member

Add a user to a team's roster.

Parameters
teamIdpath · stringrequired
teamId path parameter
Request body · required
userIdstring<uuid>required
Returns · 201 — Add a team member
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/teams/{teamId}/members' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/teams/{teamId}/members/{userId}

Remove a team member

Remove a user from a team's roster.

Parameters
teamIdpath · stringrequired
teamId path parameter
userIdpath · stringrequired
userId path parameter
Returns · 200 — Remove a team member
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/teams/{teamId}/members/{userId}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Time Entries

GET/api/v1/time-entries

List time entries

List time entries in a date range (from/to, max 366 days), newest first, with cursor pagination. Defaults to the authenticated user's own entries. engineerId reads another engineer's entries and requires the salary read permission (compensation:read); a team-scoped grant admits only engineers on the caller's teams.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
fromquery · stringrequired
Range start (YYYY-MM-DD, inclusive)
toquery · stringrequired
Range end (YYYY-MM-DD, inclusive; max 366 days after from)
engineerIdquery · string<uuid>optional
Another engineer's user UUID; requires compensation:read
Returns · 200 — List time entries
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
engineerIdstring<uuid>required
entryDatestringrequired
opportunityIdobjectrequired
taskIdobjectrequired
miscCategoryIdobjectrequired
hoursstringrequired
hourlyRateSnapshotobjectrequired
noteobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/time-entries' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "engineerId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "entryDate": "string",
      "opportunityId": null,
      "taskId": null,
      "miscCategoryId": null,
      "hours": "string",
      "hourlyRateSnapshot": null,
      "note": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/time-entries

Log a time entry

Log time for the authenticated user against exactly one target: an opportunity (opportunityId), a task (taskId), or a misc workflow category (miscCategoryId, which requires a note). Hours are 0-24 per entry.

Request body · required
entryDatestringrequired
opportunityIdobjectoptional
taskIdobjectoptional
miscCategoryIdobjectoptional
hoursnumberrequired
noteobjectoptional
Returns · 201 — Log a time entry
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
engineerIdstring<uuid>required
entryDatestringrequired
opportunityIdobjectrequired
taskIdobjectrequired
miscCategoryIdobjectrequired
hoursstringrequired
hourlyRateSnapshotobjectrequired
noteobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/time-entries' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "engineerId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "entryDate": "string",
    "opportunityId": null,
    "taskId": null,
    "miscCategoryId": null,
    "hours": "string",
    "hourlyRateSnapshot": null,
    "note": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/time-entries/{id}

Update a time entry

Update one of your own time entries (entryDate, hours, note). Only the engineer who logged an entry may edit it.

Parameters
idpath · stringrequired
id path parameter
Request body · required
entryDatestringoptional
hoursnumberoptional
noteobjectoptional
Returns · 200 — Update a time entry
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
engineerIdstring<uuid>required
entryDatestringrequired
opportunityIdobjectrequired
taskIdobjectrequired
miscCategoryIdobjectrequired
hoursstringrequired
hourlyRateSnapshotobjectrequired
noteobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/time-entries/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "engineerId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "entryDate": "string",
    "opportunityId": null,
    "taskId": null,
    "miscCategoryId": null,
    "hours": "string",
    "hourlyRateSnapshot": null,
    "note": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/time-entries/{id}

Delete a time entry

Delete one of your own time entries. Only the engineer who logged an entry may delete it.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a time entry
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/time-entries/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/time-entries/aggregate-by-category

Aggregate time by workflow category

Total hours in a date range bucketed by workflow category, across all engineers in the org (optionally filtered to one team's members). Cost reporting: requires an org-wide cost:read grant.

Returns · 200 — Aggregate time by workflow category
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/time-entries/aggregate-by-category' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/time-entries/for-range

List all engineers' time entries with cost

Hydrated time entries for every engineer in a date range (hours, derived cost, engineer, category, target), capped at 5000 rows; `truncated` flags the cap. Cost reporting: requires an org-wide cost:read grant.

Returns · 200 — List all engineers' time entries with cost
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/time-entries/for-range' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/time-entries/actual-cost-for-opportunity/{opportunityId}

Actual labor cost of an opportunity

Sum of hours times each entry's snapshotted hourly rate for every time entry logged against the opportunity. Returns 0 when nothing is logged. Requires an org-wide cost:read grant.

Parameters
opportunityIdpath · stringrequired
opportunityId path parameter
Returns · 200 — Actual labor cost of an opportunity
oktruerequired
dataobjectrequired
Show child attributes ›
actualCostnumberrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/time-entries/actual-cost-for-opportunity/{opportunityId}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "actualCost": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/time-entries/actual-cost-for-task/{taskId}

Actual labor cost of a task

Sum of hours times each entry's snapshotted hourly rate for every time entry logged against the task. Returns 0 when nothing is logged. Requires an org-wide cost:read grant.

Parameters
taskIdpath · stringrequired
taskId path parameter
Returns · 200 — Actual labor cost of a task
oktruerequired
dataobjectrequired
Show child attributes ›
actualCostnumberrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/time-entries/actual-cost-for-task/{taskId}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "actualCost": 0
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Users

GET/api/v1/users

List users

List org members with cursor pagination.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List users
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
kind"human" | "agent" | "system"required
emailstringrequired
namestringrequired
slugstringrequired
avatarUrlobjectrequired
imageobjectrequired
emailVerifiedobjectrequired
passwordHashobjectrequired
totpSecretobjectrequired
totpEnabledAtobjectrequired
salaryMonthlyobjectrequired
salaryCurrencyobjectrequired
weeklyHoursintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/users' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "kind": "human",
      "email": "string",
      "name": "string",
      "slug": "string",
      "avatarUrl": null,
      "image": null,
      "emailVerified": null,
      "passwordHash": null,
      "totpSecret": null,
      "totpEnabledAt": null,
      "salaryMonthly": null,
      "salaryCurrency": null,
      "weeklyHours": 0,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/users/{id}

Get a user

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a user
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
kind"human" | "agent" | "system"required
emailstringrequired
namestringrequired
slugstringrequired
avatarUrlobjectrequired
imageobjectrequired
emailVerifiedobjectrequired
passwordHashobjectrequired
totpSecretobjectrequired
totpEnabledAtobjectrequired
salaryMonthlyobjectrequired
salaryCurrencyobjectrequired
weeklyHoursintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/users/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "kind": "human",
    "email": "string",
    "name": "string",
    "slug": "string",
    "avatarUrl": null,
    "image": null,
    "emailVerified": null,
    "passwordHash": null,
    "totpSecret": null,
    "totpEnabledAt": null,
    "salaryMonthly": null,
    "salaryCurrency": null,
    "weeklyHours": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/users/{id}

Update a user

Update an org member's profile (name, weekly hours). Salary fields require a leadership role and travel as a pair; role changes need org:manage, which API keys never carry.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
salaryMonthlynumberoptional
salaryCurrency"USD" | "EUR" | "GBP" | "CAD" | "AUD" | "CHF" | "SEK" | "NOK" | "DKK" | "JPY"optional
weeklyHoursintegeroptional
role"engineer" | "pm" | "em" | "executive" | "admin" | "sales" | "operations"optional
orgRoleIdobjectoptional
Returns · 200 — Update a user
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
kind"human" | "agent" | "system"required
emailstringrequired
namestringrequired
slugstringrequired
avatarUrlobjectrequired
imageobjectrequired
emailVerifiedobjectrequired
passwordHashobjectrequired
totpSecretobjectrequired
totpEnabledAtobjectrequired
salaryMonthlyobjectrequired
salaryCurrencyobjectrequired
weeklyHoursintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/users/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "kind": "human",
    "email": "string",
    "name": "string",
    "slug": "string",
    "avatarUrl": null,
    "image": null,
    "emailVerified": null,
    "passwordHash": null,
    "totpSecret": null,
    "totpEnabledAt": null,
    "salaryMonthly": null,
    "salaryCurrency": null,
    "weeklyHours": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Webhook Subscriptions

GET/api/v1/webhook-subscriptions

List webhook subscriptions

List the org's outbound webhook subscriptions. Secrets are write-once and never returned.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List webhook subscriptions
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
urlstringrequired
eventTypesstring[]required
activebooleanrequired
descriptionobjectrequired
createdByAppIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/webhook-subscriptions' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "url": "string",
      "eventTypes": [
        "string"
      ],
      "active": true,
      "description": null,
      "createdByAppId": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/webhook-subscriptions

Create a webhook subscription

Subscribe an HTTPS endpoint to outbound events. Deliveries are signed with the secret (t=/v1= scheme); the secret is encrypted at rest and never returned, so store it now.

Request body · required
urlstring<uri>required
secretstringrequired
eventTypes"opportunity.status_changed" | "task.status_changed" | "metric.value_updated" | "metric.created" | "metric.updated" | "metric.deleted" | "vision.created" | "vision.updated" | "vision.deleted" | "objective.created" | "objective.updated" | "objective.deleted" | "objective.metric_link_updated" | "team.created" | "team.updated" | "team.deleted" | "team.member_added" | "team.member_removed" | "team.invite_sent" | "team.invite_revoked" | "team.invite_accepted" | "support.access_granted" | "support.access_revoked" | "support.access_expired" | "user.updated" | "task.created" | "task.updated" | "task.owner_changed" | "workflow.created" | "workflow.updated" | "workflow.deleted" | "workflow.assigned" | "workflow.step_status_changed" | "workflow.step_added" | "workflow.step_updated" | "workflow.step_removed" | "opportunity.created" | "opportunity.updated" | "opportunity.deleted" | "opportunity.completed" | "opportunity.cancelled" | "opportunity.update_posted" | "opportunity.score_set" | "opportunity.score_cleared" | "scoring_criterion.created" | "scoring_criterion.updated" | "scoring_criterion.deleted" | "task.deleted" | "opportunity.synthesized" | "opportunity.risk_vote_cast" | "opportunity.risk_vote_changed" | "opportunity.tags_changed" | "task.tags_changed" | "opportunity.prototype_added" | "opportunity.prototype_removed" | "opportunity.objective_linked" | "opportunity.objective_unlinked" | "opportunity.objective_link_updated" | "insight.created" | "insight.updated" | "insight.archived" | "insight.deleted" | "insight.pinned" | "insight.unpinned" | "insight.status_changed" | "insight.linked" | "insight.unlinked" | "insight.rejected" | "insight.needs_context" | "insight.review_team_changed" | "tag.created" | "tag.updated" | "tag.deleted" | "tag_theme.created" | "tag_theme.updated" | "tag_theme.deleted" | "prd_template.created" | "prd_template.updated" | "prd_template.deleted" | "time_entry.created" | "time_entry.updated" | "time_entry.deleted" | "time_entry.range_upserted" | "strategy.created" | "strategy.updated" | "strategy.published" | "strategy.archived" | "comment.created" | "comment.updated" | "comment.deleted" | "customer.created" | "customer.updated" | "customer.deleted" | "customer.opportunity_linked" | "customer.opportunity_unlinked" | "customer.update_posted" | "customer.contact_added" | "customer.onboarding_started" | "customer.went_live" | "opportunity.content_updated" | "room.created" | "room.updated" | "room.archived" | "room.member_added" | "room.member_removed" | "room.pinned" | "room.unpinned" | "room.notification_level_changed" | "room.marked_read" | "message.created" | "message.edited" | "message.deleted" | "message.pinned" | "message.unpinned" | "message.reaction_added" | "message.reaction_removed" | "subscription.created" | "subscription.muted" | "good_vibes.posted" | "team_queue.reordered" | "team_queue.chain_added" | "team_queue.chain_removed" | "team_queue.cross_team_chain_added" | "team_queue.window_set" | "webhook_subscription.created" | "webhook_subscription.updated" | "webhook_subscription.deleted" | "external_ref.attached"[]required
descriptionstringoptional
Returns · 201 — Create a webhook subscription
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
urlstringrequired
eventTypesstring[]required
activebooleanrequired
descriptionobjectrequired
createdByAppIdobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/webhook-subscriptions' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "url": "string",
    "eventTypes": [
      "string"
    ],
    "active": true,
    "description": null,
    "createdByAppId": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/webhook-subscriptions/{id}

Delete a webhook subscription

Delete a webhook subscription. Deliveries stop immediately.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a webhook subscription
oktruerequired
dataobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/webhook-subscriptions/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": null,
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Workflow Categories

GET/api/v1/workflow-categories

List workflow categories

List the org's workflow categories in display order (used to group workflows and to classify time entries).

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List workflow categories
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
slugstringrequired
labelstringrequired
colorstringrequired
sortOrderintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/workflow-categories' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "slug": "string",
      "label": "string",
      "color": "string",
      "sortOrder": 0,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/workflow-categories

Create a workflow category

Create a workflow category. The slug is derived from the label; color is a theme token or hex value.

Request body · required
labelstringrequired
colorstringrequired
sortOrderintegeroptional
Returns · 201 — Create a workflow category
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
slugstringrequired
labelstringrequired
colorstringrequired
sortOrderintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/workflow-categories' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "slug": "string",
    "label": "string",
    "color": "string",
    "sortOrder": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/workflow-categories/{id}

Get a workflow category

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a workflow category
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
slugstringrequired
labelstringrequired
colorstringrequired
sortOrderintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/workflow-categories/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "slug": "string",
    "label": "string",
    "color": "string",
    "sortOrder": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/workflow-categories/{id}

Update a workflow category

Update a category's label, color, or sort order. The slug never changes.

Parameters
idpath · stringrequired
id path parameter
Request body · required
labelstringoptional
colorstringoptional
sortOrderintegeroptional
Returns · 200 — Update a workflow category
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
slugstringrequired
labelstringrequired
colorstringrequired
sortOrderintegerrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/workflow-categories/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "slug": "string",
    "label": "string",
    "color": "string",
    "sortOrder": 0,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/workflow-categories/{id}

Delete a workflow category

Delete a workflow category. The system Bug and Incident categories can't be deleted, nor can a category time entries still reference.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a workflow category
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/workflow-categories/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
Resource

Workflows

GET/api/v1/workflows

List workflows

List the org's workflow templates with cursor pagination, each with its category label.

Parameters
cursorquery · stringoptional
Opaque pagination cursor from a previous response
limitquery · numberoptional
Number of items per page (default 50, max 200)
sortquery · stringoptional
Sort order: field:asc or field:desc
Returns · 200 — List workflows
oktruerequired
dataobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
descriptionobjectrequired
defaultEntityTypeobjectrequired
isDefaultbooleanrequired
isSystembooleanrequired
createdAtstringrequired
updatedAtstringrequired
categoryLabelobjectrequired
categoryColorobjectrequired
categorySlugobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/workflows' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": [
    {
      "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
      "name": "string",
      "description": null,
      "defaultEntityType": null,
      "isDefault": true,
      "isSystem": true,
      "createdAt": "string",
      "updatedAt": "string",
      "categoryLabel": null,
      "categoryColor": null,
      "categorySlug": null
    }
  ],
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/workflows

Create a workflow

Create a workflow template. Optionally set a categoryId to group it. Every workflow closes with system-managed Completed and Cancelled steps; add real steps with create-step.

Request body · required
namestringrequired
descriptionstringoptional
defaultEntityType"task" | "opportunity" | "customer"optional
Returns · 201 — Create a workflow
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
descriptionobjectrequired
defaultEntityTypeobjectrequired
isDefaultbooleanrequired
isSystembooleanrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/workflows' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "description": null,
    "defaultEntityType": null,
    "isDefault": true,
    "isSystem": true,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
GET/api/v1/workflows/{id}

Get a workflow

Get a workflow template with its ordered steps. The terminal Completed/Cancelled pair is system-managed and not included.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Get a workflow
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
descriptionobjectrequired
defaultEntityTypeobjectrequired
isDefaultbooleanrequired
isSystembooleanrequired
createdAtstringrequired
updatedAtstringrequired
stepsobject[]required
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
workflowIdstring<uuid>required
positionintegerrequired
titlestringrequired
descriptionobjectrequired
defaultDriRoleobjectrequired
defaultDriUserIdobjectrequired
slaTargetHoursobjectrequired
expectedDaysobjectrequired
terminalKindobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
GET request
curl -X GET 'https://www.telos-app.com/api/v1/workflows/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "description": null,
    "defaultEntityType": null,
    "isDefault": true,
    "isSystem": true,
    "createdAt": "string",
    "updatedAt": "string",
    "steps": [
      {
        "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "workflowId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
        "position": 0,
        "title": "string",
        "description": null,
        "defaultDriRole": null,
        "defaultDriUserId": null,
        "slaTargetHours": null,
        "expectedDays": null,
        "terminalKind": null,
        "createdAt": "string",
        "updatedAt": "string"
      }
    ]
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/workflows/{id}

Update a workflow

Update a workflow's name, description, category, or default entity type.

Parameters
idpath · stringrequired
id path parameter
Request body · required
namestringoptional
descriptionobjectoptional
defaultEntityTypeobjectoptional
Returns · 200 — Update a workflow
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
namestringrequired
descriptionobjectrequired
defaultEntityTypeobjectrequired
isDefaultbooleanrequired
isSystembooleanrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/workflows/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "name": "string",
    "description": null,
    "defaultEntityType": null,
    "isDefault": true,
    "isSystem": true,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/workflows/{id}

Delete a workflow

Delete a workflow template. Refused while active tasks or opportunities are using it.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a workflow
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/workflows/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/workflows/{workflowId}/steps

Add a workflow step

Append a step to a workflow, ahead of the terminal pair. Owner defaults to the caller when defaultDriUserId is omitted.

Parameters
workflowIdpath · stringrequired
workflowId path parameter
Request body · required
titlestringrequired
descriptionstringoptional
defaultDriRole"engineer" | "pm" | "em" | "executive" | "admin" | "sales" | "operations"optional
defaultDriUserIdstring<uuid>optional
slaTargetHoursintegeroptional
Returns · 201 — Add a workflow step
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
workflowIdstring<uuid>required
positionintegerrequired
titlestringrequired
descriptionobjectrequired
defaultDriRoleobjectrequired
defaultDriUserIdobjectrequired
slaTargetHoursobjectrequired
expectedDaysobjectrequired
terminalKindobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/workflows/{workflowId}/steps' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "workflowId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "position": 0,
    "title": "string",
    "description": null,
    "defaultDriRole": null,
    "defaultDriUserId": null,
    "slaTargetHours": null,
    "expectedDays": null,
    "terminalKind": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
PATCH/api/v1/workflows/steps/{id}

Update a workflow step

Update a step's title, description, position, owner, or SLA. Terminal steps are system-managed and can't be edited.

Parameters
idpath · stringrequired
id path parameter
Request body · required
positionintegeroptional
titlestringoptional
descriptionstringoptional
defaultDriRoleobjectoptional
defaultDriUserIdstring<uuid>optional
slaTargetHoursobjectoptional
Returns · 200 — Update a workflow step
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
orgIdstring<uuid>required
workflowIdstring<uuid>required
positionintegerrequired
titlestringrequired
descriptionobjectrequired
defaultDriRoleobjectrequired
defaultDriUserIdobjectrequired
slaTargetHoursobjectrequired
expectedDaysobjectrequired
terminalKindobjectrequired
createdAtstringrequired
updatedAtstringrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
PATCH request
curl -X PATCH 'https://www.telos-app.com/api/v1/workflows/steps/{id}' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "orgId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "workflowId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "position": 0,
    "title": "string",
    "description": null,
    "defaultDriRole": null,
    "defaultDriUserId": null,
    "slaTargetHours": null,
    "expectedDays": null,
    "terminalKind": null,
    "createdAt": "string",
    "updatedAt": "string"
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
DELETE/api/v1/workflows/steps/{id}

Delete a workflow step

Delete a step and close the position gap. Refused for terminal steps and for steps active work is currently on.

Parameters
idpath · stringrequired
id path parameter
Returns · 200 — Delete a workflow step
oktruerequired
dataobjectrequired
Show child attributes ›
idstring<uuid>required
deletedtruerequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
DELETE request
curl -X DELETE 'https://www.telos-app.com/api/v1/workflows/steps/{id}' \
  -H 'Authorization: Bearer telos_live_…'
response
{
  "ok": true,
  "data": {
    "id": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "deleted": true
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}
POST/api/v1/workflows/handoff

Write a workflow handoff

Move an opportunity or customer-onboarding workflow to a step and post a handoff message for it. Jumps to the target step instance (optionally completing the rest) and records the handoff note on the entity's thread. For a subtask sequence inside a task, use write_task_handoff instead.

Request body · required
targetStepInstanceIdstring<uuid>required
markCompletebooleanoptional
messagestringoptional
mentionsobjectoptional
Show child attributes ›
userIdsstring<uuid>[]optional
teamIdsstring<uuid>[]optional
mentionLinkUrlstringoptional
Returns · 200 — Write a workflow handoff
oktruerequired
dataobjectrequired
Show child attributes ›
stepInstanceIdstring<uuid>required
commentIdobjectrequired
metaobjectrequired
Show child attributes ›
requestIdstring<uuid>required
timestampstring<date-time>required
version"v1"required
idempotencyKeystringoptional
paginationobjectoptional
Show child attributes ›
cursorobjectrequired
hasMorebooleanrequired
linksobjectrequired
actionsobject[]optional
Show child attributes ›
namestringrequired
method"GET" | "POST" | "PATCH" | "DELETE"required
hrefstringrequired
bodyobjectoptional
POST request
curl -X POST 'https://www.telos-app.com/api/v1/workflows/handoff' \
  -H 'Authorization: Bearer telos_live_…' \
  -H 'Content-Type: application/json' \
  -d '{ … }'
response
{
  "ok": true,
  "data": {
    "stepInstanceId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "commentId": null
  },
  "meta": {
    "requestId": "01J9Z3F4S0Z9KMQ4N6PYZR7C5A",
    "timestamp": "2026-06-26T14:23:11.842Z",
    "version": "v1",
    "idempotencyKey": "string"
  },
  "pagination": {
    "cursor": null,
    "hasMore": true
  },
  "links": {},
  "actions": [
    {
      "name": "string",
      "method": "GET",
      "href": "string",
      "body": {}
    }
  ]
}