API ReferenceIntroduction
API Reference
Documentation version
API v1 · sha256:a5cd8e66988c9c8b615f339b37d49e7572853f4f1e6eb040361a39174365e687
This ID links the page to its Markdown and OpenAPI exports.
Connect your tools to Tellagen. Create incidents from alerts, add timeline events, and keep your service catalog up to date.
Search all guides and API reference text. Method and scope filter endpoints only.
Base URL
https://{company}.api.tellagen.com/api/v1/Replace {company} with your company subdomain.
Content type
All requests and JSON responses use application/json unless an endpoint documents an empty response.
Rate limits
Authenticated requests share a workspace limit. Anonymous requests and failed authentication attempts use the trusted client IP. Responses include X-RateLimit-Limit and X-RateLimit-Remaining. A 429 Too Many Requests response also includes Retry-After.
Authentication
Send your API key in the Authorization header.
Authorization: Bearer tllg_YOUR_TOKEN
Create an API key in Settings > API keys. Keys start with tllg_. Tellagen shows each key once, when you create it.
Make your first request
Start with a list of incidents. This request does not change your workspace.
Before you start
You need an API key with the incidents:read scope and a terminal with curl.
For example, the workspace https://acme.tellagen.com uses the API address https://acme.api.tellagen.com.
List incidents
- Replace
{company}with your workspace subdomain, such asacme. - Replace
<token>with your API key. - Run the request in your terminal.
curl --request GET \
--url 'https://{company}.api.tellagen.com/api/v1/incidents?limit=50' \
--header 'Authorization: Bearer <token>'Read the response
HTTP 200 means that the request succeeded. An empty workspace returns this response:
{
"incidents": [],
"has_more": false,
"pagination": {
"limit": 50,
"has_more": false
}
}Retries and updates
A request can time out, or someone else can edit the same incident. These examples explain what to do next.
Create once, even if a request times out
Your alert script creates an incident, but the connection closes before the response arrives. The incident can already exist.
An Idempotency-Key identifies one create request. Tellagen remembers the key for 24 hours and returns the saved result for a repeat request.
- Send a unique
Idempotency-Keyon the first create attempt. - Within 24 hours, retry with the same key and identical request body.
- For a new incident, use a new key.
Idempotency-Key: payments-alert-2026-09-14-001Where you can use an Idempotency-Key
| Create | Endpoint |
|---|---|
| Incident | POST /api/v1/incidents |
| Timeline event | POST /api/v1/incidents/{id}/timeline |
| Service | POST /api/v1/services |
| Team | POST /api/v1/teams |
If a create request returns an error
| Result | Next step |
|---|---|
idempotency_in_progress | Wait for Retry-After. Then send the same body and key. |
idempotency_key_reused | Send the original body for this key. Use a new key for a different create request. |
idempotency_outcome_unknown | Do not retry automatically. Read the resource list to check whether the create succeeded. If the result remains unclear, contact support. |
| The 24-hour retention has expired | Check whether the resource exists. If you still need to create it, use a new key. |
Update without overwriting someone else’s changes
Each incident has a version number called revision. An update sends the version that you last read.
If someone changes the incident first, Tellagen returns 412 instead of saving your update.
- Read the incident with
GET /api/v1/incidents/{id}. - Copy its
revisionor theTellagen-Resource-Versionresponse header. - Send that number in the
If-Tellagen-Resource-Versionheader of your PATCH request.
Example: change an incident title
Suppose you read incident 42 at version 7. You want to change its title after a rollback.
Your API key needs both incidents:read and incidents:write. Its owner needs an active responder seat.
PATCH /api/v1/incidents/42 HTTP/1.1
Host: acme.api.tellagen.com
Authorization: Bearer <token>
Content-Type: application/json
If-Tellagen-Resource-Version: 7
{
"title": "Payments API recovered after rollback"
}If someone edits the incident first
A teammate changes incident 42 before your request arrives. Its version is now 8, so your request with version 7 returns 412.
- Read the incident again.
- Compare your title with the latest changes.
- If your edit is still needed, send it with the new version.
Which updates need a version?
These five PATCH endpoints require If-Tellagen-Resource-Version for API keys. Each key also needs the matching read scope.
| Update | Endpoint |
|---|---|
| Incident | PATCH /api/v1/incidents/{id} |
| Timeline event | PATCH /api/v1/timeline/{id} |
| Service | PATCH /api/v1/services/{id} |
| Team | PATCH /api/v1/teams/{id} |
| Custom field | PATCH /api/v1/custom-fields/{id} |
Other updates
The team-member, incident custom-field, and Slack channel-name PATCH endpoints do not use this header. Their endpoint pages describe the required fields.
The resolve request accepts an optional expected_revision field in the JSON body.
If you reach the rate limit
A 429 response includes Retry-After, which gives the wait time in seconds.
- Wait for
Retry-Afterbefore the next attempt. - Set a maximum number of attempts in your client.
- If several workers share a workspace, add a small random delay between their retries.
Request size and support
The API accepts one JSON document per write request, up to 1 MiB. It rejects unknown fields and invalid JSON.
Each response includes an X-Request-ID. This ID helps support find the request.
Versioning
All endpoints in this reference use /api/v1 and are supported.
- Compatible changes
- Tellagen can add optional response fields or enum values. Ignore response fields that your client does not use.
- Breaking changes
- Tellagen uses a new major version for incompatible changes.
- Deprecated endpoints
- Tellagen marks an endpoint deprecated at least 180 days before removal. Deprecated responses identify the replacement endpoint.
Scopes
A scope controls what an API key can do. Without the required scope, a request returns 403 Forbidden.
| Scope | Description |
|---|---|
incidents:read | List and retrieve incidents, and discover writable workflow statuses and severities |
incidents:write | Create and update incidents and timeline events. Requires an active responder seat for the key owner. |
slack_context:read | Read Slack context collected for incident investigation |
services:read | List and retrieve services, and discover writable service tiers |
services:write | Create, update, and archive services. Requires an active responder seat and the manage_settings role permission. |
teams:read | List and retrieve teams and members |
teams:write | Create, update, and archive teams; manage members. Requires an active responder seat and the manage_teams role permission. |
custom_fields:read | List and retrieve custom field definitions and values |
custom_fields:write | Create, update, and archive custom fields; set incident field values. Definition changes require the manage_settings role permission. Incident value changes require an active responder seat. |
webhooks:manage | Create, pause, resume, revoke, and rotate workspace webhook subscriptions. Requires the manage_settings role permission. |
customer_revenue:read | Read customer revenue and financial impact. Requires the view_customer_revenue role permission and an active key owner membership. |
status_updates:email | Email recorded status updates to the workspace's email groups (never to typed-in addresses). Not granted by default. Requires an active responder seat for the key owner and incidents:write. |
Prerequisite definitions
A write operation can require these conditions in addition to its API scope.
active_responder- The API key owner must have an active responder seat.
manage_settings- The API key owner must have the manage_settings role permission.
manage_teams- The API key owner must have the manage_teams role permission.
mutable_incident- The incident must not be archived. Workflow-state restrictions are described by each operation.
slack_channel- The incident must have a linked Slack channel.
Errors
Errors always include stable code and human-readable message fields. They can also include field, details, and request_id. You can send X-Request-ID with a request. If you omit it, the API generates one. The response header and error body return the same value. Send that value to support when you report an unexpected error.
For support, include the request ID, method, path, response status, and time. Omit tokens and private request bodies.
Example error responses
Missing scope (403)
{
"code": "missing_scope",
"message": "insufficient scope: incidents:write required",
"details": {
"required_scope": "incidents:write"
},
"request_id": "01JEXAMPLE8R4N5W6Y7Z"
}Stale resource version (412)
{
"code": "precondition_failed",
"message": "the resource changed; fetch it again and retry with the current resource version",
"field": "If-Tellagen-Resource-Version",
"request_id": "01JEXAMPLE8R4N5W6Y7Z"
}Rate limit (429)
{
"code": "rate_limited",
"message": "rate limit exceeded",
"details": {
"retry_after_seconds": 1
},
"request_id": "01JEXAMPLE8R4N5W6Y7Z"
}| Code | Meaning | Next action | Retry |
|---|---|---|---|
authentication_required | The request has no valid API token or session. | Send an active Bearer token for this workspace. Replace an expired or revoked key. | After correcting authentication. |
missing_scope | The token lacks the scope named in details.required_scope. | Read details.required_scope. Ask a workspace manager for a replacement key with that scope. | After correcting access. |
responder_seat_required | The key owner needs the seat named in details.required_seat. | Ask a workspace manager to review the key owner’s responder seat. | After correcting access. |
missing_role_permission | The key owner lacks details.required_permission or one of details.required_roles. | Ask a workspace manager to review the owner’s role and the permission named in details. | After correcting access. |
permission_denied | Access is denied without exposing private authorization state. | Verify the workspace, key owner, and resource access with a workspace manager. | After correcting access. |
invalid_resource_state | The operation is not valid for the current resource state. | Read the current resource. Restore an archived resource or choose an operation allowed in its current state. | After reconciling state. |
invalid_relationship_state | Restore requires a retained owner or parent relationship to identify an active resource. | Restore the retained parent or owning team before restoring this resource. | After correcting the relationship. |
duplicate_slug | A team already uses the requested slug. | Read the existing team or choose a different slug. | After changing the request. |
invalid_json | The request body is not one valid JSON document. | Send one valid JSON object with Content-Type: application/json. | After correcting the body. |
unknown_field | The request contains an unsupported JSON property named in field. | Remove or correct the property named in field. Use the request schema, not the response schema. | After correcting the body. |
request_body_too_large | The request body is larger than 1 MiB. | Reduce the body to 1 MiB or less. | After reducing the body. |
multiple_json_values | The request body contains more than one JSON document. | Send one JSON document rather than concatenated documents. | After correcting the body. |
idempotency_key_reused | The key was already used with different request content. | Recover the original request for this key. Use a new key only for a different intended operation. | Do not resend changed content with the same key. |
idempotency_in_progress | An equal request with this key is still running. Retry later. | Wait for Retry-After, then resend the identical body with the same key. | After the indicated delay. |
idempotency_outcome_unknown | An earlier request may have completed, but its result could not be stored. Do not retry it automatically. | Read the resource state and contact support with the request ID before deciding whether to create again. | Never retry automatically. |
precondition_required | An API-key PATCH request omitted If-Tellagen-Resource-Version. | Read the resource, then send its Tellagen-Resource-Version as If-Tellagen-Resource-Version. | After adding the current version. |
invalid_precondition | If-Tellagen-Resource-Version is not a positive integer. | Use the positive integer version returned for this resource. Do not use an ETag or a timestamp. | After correcting the header. |
precondition_failed | The resource changed after the client read it. | Read the resource again. Reconcile your intended change with the current state before using its new version. | After reconciling the change. |
rate_limited | Retry after details.retry_after_seconds or the Retry-After header. | Wait for Retry-After or details.retry_after_seconds. Limit concurrency across the workspace. | After the indicated delay, with the original idempotency key where supported. |
internal | The server failed without exposing an internal error. | Keep the request ID. Read current state before retrying a write whose outcome is uncertain. | Retry reads with bounded backoff. Follow operation-specific rules for writes. |
invalid_slack_channel_name_request | The channel-name request is invalid. | Use custom mode with name, or workspace_template mode without name. | After correcting the request. |
slack_not_configured | The workspace has no usable Slack integration. | Ask a workspace manager to connect or repair Slack. | After repairing the integration. |
incident_slack_channel_missing | The incident has no linked Slack channel. | Link a channel through the incident workspace before requesting a rename. | After linking a channel. |
slack_channel_not_found | Slack cannot find the linked channel. | Verify the channel still exists and that the integration can access it. | After repairing channel access. |
slack_channel_name_taken | Another Slack channel uses the requested name. | Choose another custom name or revise the workspace naming template. | After choosing an available name. |
invalid_idempotency_key | The idempotency key has an invalid length or character. | Use 1–128 visible, non-space ASCII characters. A UUID is suitable. | After correcting the key. |
| Status | Meaning |
|---|---|
400 | Bad Request — invalid input or missing required fields |
401 | Unauthorized — missing or invalid token |
403 | Forbidden — insufficient scope or responder access |
404 | Not Found — resource does not exist |
409 | Conflict — resource state prevents the request |
412 | Precondition Failed — the supplied resource version is stale |
428 | Precondition Required — this operation needs If-Tellagen-Resource-Version |
429 | Too Many Requests — rate limit exceeded |
500 | Internal Server Error |
Browse endpoints
Choose a resource to see its requests, fields, and examples.