API ReferenceTimeline
All endpoints

Timeline

Creates, lists, reads, updates, and removes events from incident timelines.

GET/api/v1/incidents/{id}/timelineList timeline events

#

Returns one bounded page ordered by (started_at, id), ascending by default. Descending order reverses both fields. Dimensions combine with AND; selected tags and groups each combine with OR. matched_count describes the complete active predicate before cursor/limit. filter_counts includes suggestions and applies only time bounds. latest_started_at is incident-global, independent of all filters. Time bounds use [started_from, started_to). New opaque v2 cursors bind the incident, order and canonical filters; reuse with a different scope returns 400. Legacy timestamp/ID cursors are accepted only with ascending, time-only filters and suggestions included. Pagination is keyset traversal, not a cross-request snapshot; concurrent edits can move rows.

Operation ID
listTimelineEvents
Prerequisites
None
Retry guidance
This operation is repeat-safe. Respect Retry-After and use bounded retries. Retry rules

Example request

Replace {company}, <token>, and any other placeholders with your values.

bash
curl --request GET \
  --url 'https://{company}.api.tellagen.com/api/v1/incidents/{id}/timeline' \
  --header 'Authorization: Bearer <token>'

Success: 200

Returns timeline events, pagination fields, and counts for the complete filtered collection.

Success response JSON
json
{
  "events": [
    {
      "id": 100,
      "revision": 4,
      "incident_id": 1,
      "started_at": "2026-08-31T12:10:00Z",
      "at": "2026-08-31T12:10:00Z",
      "ended_at": null,
      "is_ongoing": false,
      "group_id": null,
      "is_key": false,
      "source": "api",
      "source_ref": "api:123:deploy-42",
      "type": "change",
      "icon": "🔧",
      "title": "Payment service restart",
      "body": "Restarted the payment service.",
      "collaboration_generation": 0,
      "tags": [],
      "ai_context": "",
      "created_by": "[email protected]",
      "comment_count": 0,
      "attachments": [
        {
          "id": 501,
          "timeline_event_id": 100,
          "filename": "restart-log.txt",
          "url": "https://files.example.com/signed/restart-log.txt",
          "url_available": true,
          "content_type": "text/plain",
          "size_bytes": 2048,
          "created_at": "2026-08-31T12:11:00Z",
          "created_by": "[email protected]"
        }
      ],
      "source_window_started_at": null,
      "source_window_ended_at": null,
      "evidence_links": []
    }
  ],
  "filter_counts": {
    "all_events": 1,
    "type_counts": {
      "change": 1
    },
    "source_counts": {
      "api": 1
    },
    "tag_counts": {}
  },
  "matched_count": 1,
  "latest_started_at": "2026-08-31T12:10:00Z",
  "has_more": false,
  "pagination": {
    "limit": 50,
    "has_more": false
  }
}
Request and response contract

Path parameters

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Path parameters
FieldTypeRequiredDescription
idintegerYesA positive numeric incident ID returned by this API. The permanent incident reference is suitable for stored references and external links.

Minimum: 1.

Query parameters

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Query parameters
FieldTypeRequiredDescription
limitintegerNoThe maximum number of items in one page. The default is 50, and the maximum is 100.

Minimum: 1. · Maximum: 100. · Default: 50.

cursorstringNoThe next_cursor value from the previous page. Clients treat this value as opaque and do not create, inspect, or change it.

Minimum length: 1 characters. · Maximum length: 4096 characters.

orderstringNoSort direction for both started_at and id.

Default: "asc".

Allowed values: "asc""desc"
type_or_sourcestringNoCase-insensitive type or source, with outer whitespace ignored. ai matches sources ai, ai_investigation, investigation, or type investigation with source manual.
tagstring[]NoMatch any repeated tag case-insensitively. Tag whitespace is significant.
key_onlybooleanNoInclude only key events when true. Accepts true or false.

Default: false.

groupinteger | string[]NoMatch any repeated positive group ID or ungrouped for null group.
Allowed values: "ungrouped"
qstringNoLiteral case-insensitive substring of title, body, ai_context, space-joined tags or group name; outer query whitespace is ignored. Percent and underscore are literal characters. Fields match independently. Null group text is no group ungrouped; empty or unavailable group name is unknown group followed by a hash and its ID.
suggestionsstringNoInclude, exclude or select only ai_suggested events, identified by lowercase type without trimming. Only mode applies other predicates only when explicitly supplied; it does not inherit workspace filters.

Default: "include".

Allowed values: "include""exclude""only"
started_fromstring (RFC 3339)NoIncludes events with started_at equal to or later than this RFC 3339 time.
started_tostring (RFC 3339)NoIncludes events with started_at earlier than this RFC 3339 time.

Response 200

Returns timeline events, pagination fields, and counts for the complete filtered collection.

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response fields
FieldTypeReturnedDescription
eventsobject[]AlwaysThe timeline events in this page.
events[].idintegerAlwaysThe positive numeric ID of the timeline event.
events[].revisionintegerAlwaysThe resource version for concurrency control.

Minimum: 1.

events[].incident_idintegerAlwaysThe positive numeric ID of the incident.
events[].started_atstring (RFC 3339)AlwaysThe event start time.
events[].atstring (RFC 3339)AlwaysA deprecated response alias for started_at. Both fields contain the same value.
events[].ended_atstring (RFC 3339) | nullAlwaysThe event end time. A null value means that the event has no end time.
events[].is_ongoingbooleanAlwaysIndicates whether the event is still in progress.
events[].group_idinteger | nullAlwaysThe timeline-group ID. A null value means that the event has no group.
events[].is_keybooleanAlwaysIndicates whether responders marked this as a key incident event.
events[].sourcestringAlwaysThe system or actor that created the event.
events[].source_refstringAlwaysThe source-specific reference for the event.
events[].typestringAlwaysThe event type used for grouping and display.
events[].iconstringAlwaysThe event icon. The maximum length is 8 Unicode characters.

Maximum length: 8 characters.

events[].titlestringAlwaysThe optional display title of the event.
events[].bodystringAlwaysThe event description.
events[].collaboration_generationintegerAlwaysThe version of collaborative content associated with the event.
events[].tagsstring[]AlwaysThe normalized event tags.
events[].ai_contextstringAlwaysThe saved AI context for a generated event. An empty string means that no context is stored.
events[].created_bystringAlwaysThe identifier of the user or system that created the event.
events[].comment_countintegerAlwaysThe number of comments on the event.
events[].attachmentsobject[]AlwaysThe files attached to the event.
events[].attachments[].idintegerAlwaysThe positive numeric ID of the attachment.
events[].attachments[].timeline_event_idintegerAlwaysThe positive numeric ID of the timeline event.
events[].attachments[].filenamestringAlwaysThe original file name.
events[].attachments[].urlstringAlwaysA temporary download URL. An empty string means that no URL is currently available.
events[].attachments[].url_availablebooleanAlwaysIndicates whether url contains an available download URL.
events[].attachments[].content_typestringAlwaysThe media type of the attached file.
events[].attachments[].size_bytesintegerAlwaysThe file size in bytes.
events[].attachments[].created_atstring (RFC 3339)AlwaysThe attachment creation time.
events[].attachments[].created_bystringAlwaysThe identifier of the user who attached the file.
events[].source_window_started_atstring (RFC 3339) | nullAlwaysThe start of the source-data window. A null value means that no window is recorded.
events[].source_window_ended_atstring (RFC 3339) | nullAlwaysThe end of the source-data window. A null value means that no window is recorded.
events[].evidence_linksobject[]AlwaysThe evidence references associated with the event.
events[].evidence_links[].sourcestringAlwaysThe system or provider that supplied the evidence.
events[].evidence_links[].urlstringAlwaysThe absolute URL of the evidence.
events[].evidence_links[].labelstringOptionalA short display name for the evidence.
events[].evidence_links[].summarystringOptionalA short summary of the evidence.
events[].evidence_links[].artifact_idstringOptionalThe identifier of a stored evidence artifact.
events[].evidence_links[].artifact_digeststringOptionalThe digest used to make sure that the artifact content did not change.
events[].evidence_links[].result_bytesintegerOptionalThe original evidence result size in bytes.
events[].evidence_links[].truncatedbooleanOptionalIndicates whether the stored evidence omits part of the original result.
filter_countsobjectAlwaysCounts for all events that match the timeline time filters.
filter_counts.all_eventsintegerAlwaysThe total number of events in the time-filtered collection.
filter_counts.type_countsobjectAlwaysEvent counts keyed by event type.
filter_counts.source_countsobjectAlwaysEvent counts keyed by event source.
filter_counts.tag_countsobjectAlwaysEvent counts keyed by tag.
matched_countintegerAlwaysComplete active predicate count before cursor and limit.

Minimum: 0.

latest_started_atstring (RFC 3339) | nullAlwaysLatest started_at in the incident independent of filters; null for an empty incident.
has_morebooleanAlwaysIndicates whether another page is available.
next_cursorstringOptionalThe opaque cursor for the next page. This field is absent on the final page.
paginationobjectAlwaysPagination details for a collection response.
pagination.limitintegerAlwaysThe maximum number of items requested for this page.

Minimum: 1. · Maximum: 100.

pagination.has_morebooleanAlwaysIndicates whether another page is available.
pagination.next_cursorstringOptionalThe opaque cursor for the next page. This field is absent on the final page.
Errors and recovery (7)

Error responses (7)

400
The API rejected the request because its syntax or one of its values is invalid.
401
The request does not contain valid authentication.
403
Authentication succeeded, but the caller lacks the required API scope or workspace permission.
404
The requested resource does not exist or is not available to the caller.
409
The request conflicts with the current resource state. idempotency_key_reused means that the key belongs to different request content. idempotency_in_progress means that an identical request is still in progress. idempotency_outcome_unknown means that an earlier request may have completed, but its result could not be stored and must not be retried automatically.
429
The workspace exceeded an active request limit.
500
An internal server error prevented completion of the request.

POST/api/v1/incidents/{id}/timelineCreate timeline event

#

Creates a timeline event. For API-key requests, the API sets source to api. The API controls source, AI context, evidence provenance, and reserved event types.

Operation ID
createTimelineEvent
Retry guidance
Retry an identical request with the same Idempotency-Key used on the first attempt, within 24 hours. Never retry an unknown outcome automatically. Retry rules

Example request

Replace {company}, <token>, and any other placeholders with your values.

For <idempotency-key>, choose a unique key on the first attempt. Reuse it only when retrying the identical request.

bash
curl --request POST \
  --url 'https://{company}.api.tellagen.com/api/v1/incidents/{id}/timeline' \
  --header 'Authorization: Bearer <token>' \
  --header 'Idempotency-Key: <idempotency-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "body": "Restarted the payment service.",
  "started_at": "2026-08-31T12:10:00Z",
  "type": "change",
  "icon": "🔧",
  "external_reference": "deploy-42"
}'

Success: 201

Returns the created timeline event.

Success response JSON
json
{
  "event": {
    "id": 100,
    "revision": 4,
    "incident_id": 1,
    "started_at": "2026-08-31T12:10:00Z",
    "at": "2026-08-31T12:10:00Z",
    "ended_at": null,
    "is_ongoing": false,
    "group_id": null,
    "is_key": false,
    "source": "api",
    "source_ref": "api:123:deploy-42",
    "type": "change",
    "icon": "🔧",
    "title": "Payment service restart",
    "body": "Restarted the payment service.",
    "collaboration_generation": 0,
    "tags": [],
    "ai_context": "",
    "created_by": "[email protected]",
    "comment_count": 0,
    "attachments": [
      {
        "id": 501,
        "timeline_event_id": 100,
        "filename": "restart-log.txt",
        "url": "https://files.example.com/signed/restart-log.txt",
        "url_available": true,
        "content_type": "text/plain",
        "size_bytes": 2048,
        "created_at": "2026-08-31T12:11:00Z",
        "created_by": "[email protected]"
      }
    ],
    "source_window_started_at": null,
    "source_window_ended_at": null,
    "evidence_links": []
  }
}
Request and response contract

Path parameters

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Path parameters
FieldTypeRequiredDescription
idintegerYesA positive numeric incident ID returned by this API. The permanent incident reference is suitable for stored references and external links.

Minimum: 1.

Request headers

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Request headers
FieldTypeRequiredDescription
Idempotency-KeystringNoA key for safe retries of a create request. It must contain 1–128 visible, non-space ASCII characters. The same key applies only to an identical request.

Minimum length: 1 characters. · Maximum length: 128 characters. · Pattern: ^[\x21-\x7E]+$.

Request body

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Request body fields
FieldTypeRequiredDescription
bodystringYesThe event description. It must contain at least one non-space character.

Minimum length: 1 characters.

started_atstring (RFC 3339)NoThe RFC 3339 start time. If the request omits started_at, the API uses the current time.
atstring (RFC 3339)NoA deprecated request alias for started_at. If both fields are present, their values must match.
ended_atstring (RFC 3339)NoThe RFC 3339 end time. It must be later than started_at.
is_ongoingbooleanNoControls whether the event is ongoing. If this value is true, ended_at must be omitted.
group_idinteger | nullNoThe positive timeline-group ID for this incident. A null value creates an event without a group.
is_keybooleanNoControls whether responders see this as a key incident event.
typestringNoThe client-defined event type. The API rejects event types reserved for generated events.
iconstringNoThe event icon. The maximum length is 8 Unicode characters.

Maximum length: 8 characters.

titlestringNoThe optional display title of the event.
tagsstring[]NoThe event tags. The API normalizes each value.
external_referencestringNoA client correlation reference for API-key requests. The API trims, limits, and namespaces the value. The maximum length is 200 characters.

Maximum length: 200 characters.

Response 201

Returns the created timeline event.

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response fields
FieldTypeReturnedDescription
eventobjectAlwaysThe complete public record for a timeline event.
event.idintegerAlwaysThe positive numeric ID of the timeline event.
event.revisionintegerAlwaysThe resource version for concurrency control.

Minimum: 1.

event.incident_idintegerAlwaysThe positive numeric ID of the incident.
event.started_atstring (RFC 3339)AlwaysThe event start time.
event.atstring (RFC 3339)AlwaysA deprecated response alias for started_at. Both fields contain the same value.
event.ended_atstring (RFC 3339) | nullAlwaysThe event end time. A null value means that the event has no end time.
event.is_ongoingbooleanAlwaysIndicates whether the event is still in progress.
event.group_idinteger | nullAlwaysThe timeline-group ID. A null value means that the event has no group.
event.is_keybooleanAlwaysIndicates whether responders marked this as a key incident event.
event.sourcestringAlwaysThe system or actor that created the event.
event.source_refstringAlwaysThe source-specific reference for the event.
event.typestringAlwaysThe event type used for grouping and display.
event.iconstringAlwaysThe event icon. The maximum length is 8 Unicode characters.

Maximum length: 8 characters.

event.titlestringAlwaysThe optional display title of the event.
event.bodystringAlwaysThe event description.
event.collaboration_generationintegerAlwaysThe version of collaborative content associated with the event.
event.tagsstring[]AlwaysThe normalized event tags.
event.ai_contextstringAlwaysThe saved AI context for a generated event. An empty string means that no context is stored.
event.created_bystringAlwaysThe identifier of the user or system that created the event.
event.comment_countintegerAlwaysThe number of comments on the event.
event.attachmentsobject[]AlwaysThe files attached to the event.
event.attachments[].idintegerAlwaysThe positive numeric ID of the attachment.
event.attachments[].timeline_event_idintegerAlwaysThe positive numeric ID of the timeline event.
event.attachments[].filenamestringAlwaysThe original file name.
event.attachments[].urlstringAlwaysA temporary download URL. An empty string means that no URL is currently available.
event.attachments[].url_availablebooleanAlwaysIndicates whether url contains an available download URL.
event.attachments[].content_typestringAlwaysThe media type of the attached file.
event.attachments[].size_bytesintegerAlwaysThe file size in bytes.
event.attachments[].created_atstring (RFC 3339)AlwaysThe attachment creation time.
event.attachments[].created_bystringAlwaysThe identifier of the user who attached the file.
event.source_window_started_atstring (RFC 3339) | nullAlwaysThe start of the source-data window. A null value means that no window is recorded.
event.source_window_ended_atstring (RFC 3339) | nullAlwaysThe end of the source-data window. A null value means that no window is recorded.
event.evidence_linksobject[]AlwaysThe evidence references associated with the event.
event.evidence_links[].sourcestringAlwaysThe system or provider that supplied the evidence.
event.evidence_links[].urlstringAlwaysThe absolute URL of the evidence.
event.evidence_links[].labelstringOptionalA short display name for the evidence.
event.evidence_links[].summarystringOptionalA short summary of the evidence.
event.evidence_links[].artifact_idstringOptionalThe identifier of a stored evidence artifact.
event.evidence_links[].artifact_digeststringOptionalThe digest used to make sure that the artifact content did not change.
event.evidence_links[].result_bytesintegerOptionalThe original evidence result size in bytes.
event.evidence_links[].truncatedbooleanOptionalIndicates whether the stored evidence omits part of the original result.

Response headers

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response headers
FieldTypeReturnedDescription
Tellagen-Resource-VersionintegerAlwaysThe positive resource version for If-Tellagen-Resource-Version in the next API-key PATCH request.

Minimum: 1.

Errors and recovery (7)

Error responses (7)

400
The API rejected the request because its syntax or one of its values is invalid.
401
The request does not contain valid authentication.
403
Authentication succeeded, but the caller lacks the required API scope or workspace permission.
404
The requested resource does not exist or is not available to the caller.
409
The request conflicts with the current resource state. idempotency_key_reused means that the key belongs to different request content. idempotency_in_progress means that an identical request is still in progress. idempotency_outcome_unknown means that an earlier request may have completed, but its result could not be stored and must not be retried automatically.
429
The workspace exceeded an active request limit.
500
An internal server error prevented completion of the request.

GET/api/v1/timeline/{id}Get timeline event

#

Returns one timeline event. Attachment download URLs expire. If url_available is false or a URL expires, a new GET request can return a new URL.

Operation ID
getTimelineEvent
Prerequisites
None
Retry guidance
This operation is repeat-safe. Respect Retry-After and use bounded retries. Retry rules

Example request

Replace {company}, <token>, and any other placeholders with your values.

bash
curl --request GET \
  --url 'https://{company}.api.tellagen.com/api/v1/timeline/{id}' \
  --header 'Authorization: Bearer <token>'

Success: 200

Returns the timeline event.

Success response JSON
json
{
  "event": {
    "id": 100,
    "revision": 4,
    "incident_id": 1,
    "started_at": "2026-08-31T12:10:00Z",
    "at": "2026-08-31T12:10:00Z",
    "ended_at": null,
    "is_ongoing": false,
    "group_id": null,
    "is_key": false,
    "source": "api",
    "source_ref": "api:123:deploy-42",
    "type": "change",
    "icon": "🔧",
    "title": "Payment service restart",
    "body": "Restarted the payment service.",
    "collaboration_generation": 0,
    "tags": [],
    "ai_context": "",
    "created_by": "[email protected]",
    "comment_count": 0,
    "attachments": [
      {
        "id": 501,
        "timeline_event_id": 100,
        "filename": "restart-log.txt",
        "url": "https://files.example.com/signed/restart-log.txt",
        "url_available": true,
        "content_type": "text/plain",
        "size_bytes": 2048,
        "created_at": "2026-08-31T12:11:00Z",
        "created_by": "[email protected]"
      }
    ],
    "source_window_started_at": null,
    "source_window_ended_at": null,
    "evidence_links": []
  }
}
Request and response contract

Path parameters

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Path parameters
FieldTypeRequiredDescription
idintegerYesA positive numeric timeline-event ID returned by this API.

Minimum: 1.

Response 200

Returns the timeline event.

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response fields
FieldTypeReturnedDescription
eventobjectAlwaysThe complete public record for a timeline event.
event.idintegerAlwaysThe positive numeric ID of the timeline event.
event.revisionintegerAlwaysThe resource version for concurrency control.

Minimum: 1.

event.incident_idintegerAlwaysThe positive numeric ID of the incident.
event.started_atstring (RFC 3339)AlwaysThe event start time.
event.atstring (RFC 3339)AlwaysA deprecated response alias for started_at. Both fields contain the same value.
event.ended_atstring (RFC 3339) | nullAlwaysThe event end time. A null value means that the event has no end time.
event.is_ongoingbooleanAlwaysIndicates whether the event is still in progress.
event.group_idinteger | nullAlwaysThe timeline-group ID. A null value means that the event has no group.
event.is_keybooleanAlwaysIndicates whether responders marked this as a key incident event.
event.sourcestringAlwaysThe system or actor that created the event.
event.source_refstringAlwaysThe source-specific reference for the event.
event.typestringAlwaysThe event type used for grouping and display.
event.iconstringAlwaysThe event icon. The maximum length is 8 Unicode characters.

Maximum length: 8 characters.

event.titlestringAlwaysThe optional display title of the event.
event.bodystringAlwaysThe event description.
event.collaboration_generationintegerAlwaysThe version of collaborative content associated with the event.
event.tagsstring[]AlwaysThe normalized event tags.
event.ai_contextstringAlwaysThe saved AI context for a generated event. An empty string means that no context is stored.
event.created_bystringAlwaysThe identifier of the user or system that created the event.
event.comment_countintegerAlwaysThe number of comments on the event.
event.attachmentsobject[]AlwaysThe files attached to the event.
event.attachments[].idintegerAlwaysThe positive numeric ID of the attachment.
event.attachments[].timeline_event_idintegerAlwaysThe positive numeric ID of the timeline event.
event.attachments[].filenamestringAlwaysThe original file name.
event.attachments[].urlstringAlwaysA temporary download URL. An empty string means that no URL is currently available.
event.attachments[].url_availablebooleanAlwaysIndicates whether url contains an available download URL.
event.attachments[].content_typestringAlwaysThe media type of the attached file.
event.attachments[].size_bytesintegerAlwaysThe file size in bytes.
event.attachments[].created_atstring (RFC 3339)AlwaysThe attachment creation time.
event.attachments[].created_bystringAlwaysThe identifier of the user who attached the file.
event.source_window_started_atstring (RFC 3339) | nullAlwaysThe start of the source-data window. A null value means that no window is recorded.
event.source_window_ended_atstring (RFC 3339) | nullAlwaysThe end of the source-data window. A null value means that no window is recorded.
event.evidence_linksobject[]AlwaysThe evidence references associated with the event.
event.evidence_links[].sourcestringAlwaysThe system or provider that supplied the evidence.
event.evidence_links[].urlstringAlwaysThe absolute URL of the evidence.
event.evidence_links[].labelstringOptionalA short display name for the evidence.
event.evidence_links[].summarystringOptionalA short summary of the evidence.
event.evidence_links[].artifact_idstringOptionalThe identifier of a stored evidence artifact.
event.evidence_links[].artifact_digeststringOptionalThe digest used to make sure that the artifact content did not change.
event.evidence_links[].result_bytesintegerOptionalThe original evidence result size in bytes.
event.evidence_links[].truncatedbooleanOptionalIndicates whether the stored evidence omits part of the original result.

Response headers

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response headers
FieldTypeReturnedDescription
Tellagen-Resource-VersionintegerAlwaysThe positive resource version for If-Tellagen-Resource-Version in the next API-key PATCH request.

Minimum: 1.

Errors and recovery (7)

Error responses (7)

400
The API rejected the request because its syntax or one of its values is invalid.
401
The request does not contain valid authentication.
403
Authentication succeeded, but the caller lacks the required API scope or workspace permission.
404
The requested resource does not exist or is not available to the caller.
409
The request conflicts with the current resource state. idempotency_key_reused means that the key belongs to different request content. idempotency_in_progress means that an identical request is still in progress. idempotency_outcome_unknown means that an earlier request may have completed, but its result could not be stored and must not be retried automatically.
429
The workspace exceeded an active request limit.
500
An internal server error prevented completion of the request.

PATCH/api/v1/timeline/{id}Update timeline event

#

Validates the final event state, then updates the supplied fields. If the request changes no value, the API returns 400 without side effects.

Operation ID
updateTimelineEvent
Retry guidance
Read the current resource and reconcile changes before retrying with its current version. A stale version returns 412. Retry rules

Example request

Replace {company}, <token>, and any other placeholders with your values.

Use the Tellagen-Resource-Version header from a GET of this resource for <resource-version>.

bash
curl --request PATCH \
  --url 'https://{company}.api.tellagen.com/api/v1/timeline/{id}' \
  --header 'Authorization: Bearer <token>' \
  --header 'If-Tellagen-Resource-Version: <resource-version>' \
  --header 'Content-Type: application/json' \
  --data '{
  "body": "Restarted the payment service and confirmed recovery.",
  "ended_at": "2026-08-31T12:18:00Z"
}'

Success: 200

Returns the updated timeline event.

Success response JSON
json
{
  "event": {
    "id": 100,
    "revision": 4,
    "incident_id": 1,
    "started_at": "2026-08-31T12:10:00Z",
    "at": "2026-08-31T12:10:00Z",
    "ended_at": "2026-08-31T12:18:00Z",
    "is_ongoing": false,
    "group_id": null,
    "is_key": false,
    "source": "api",
    "source_ref": "api:123:deploy-42",
    "type": "change",
    "icon": "🔧",
    "title": "Payment service restart",
    "body": "Restarted the payment service and confirmed recovery.",
    "collaboration_generation": 0,
    "tags": [],
    "ai_context": "",
    "created_by": "[email protected]",
    "comment_count": 0,
    "attachments": [
      {
        "id": 501,
        "timeline_event_id": 100,
        "filename": "restart-log.txt",
        "url": "https://files.example.com/signed/restart-log.txt",
        "url_available": true,
        "content_type": "text/plain",
        "size_bytes": 2048,
        "created_at": "2026-08-31T12:11:00Z",
        "created_by": "[email protected]"
      }
    ],
    "source_window_started_at": null,
    "source_window_ended_at": null,
    "evidence_links": []
  }
}
Request and response contract

Path parameters

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Path parameters
FieldTypeRequiredDescription
idintegerYesA positive numeric timeline-event ID returned by this API.

Minimum: 1.

Request headers

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Request headers
FieldTypeRequiredDescription
If-Tellagen-Resource-VersionintegerYesThe current positive resource version from the latest response. API-key PATCH requests must send this value.

Minimum: 1.

Request body

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Request body fields
FieldTypeRequiredDescription
bodystringNoThe replacement event description. It must contain at least one non-space character.

Minimum length: 1 characters.

titlestringNoThe replacement event title. An empty string removes the title.
started_atstring (RFC 3339)NoThe replacement RFC 3339 start time.
atstring (RFC 3339)NoA deprecated request alias for started_at. If both fields are present, their values must match.
ended_atstring (RFC 3339)NoThe replacement RFC 3339 end time. It must be later than started_at.
clear_ended_atbooleanNoA true value removes ended_at.
is_ongoingbooleanNoControls whether the event is ongoing.
group_idinteger | nullNoThe positive timeline-group ID. A null value removes the event from its current group.
is_keybooleanNoControls whether responders see this as a key incident event.
typestringNoThe client-defined event type. The API rejects event types reserved for generated events.
iconstringNoThe replacement event icon. The maximum length is 8 Unicode characters.

Maximum length: 8 characters.

tagsstring[]NoThe complete replacement list of event tags. The API normalizes each value.

Response 200

Returns the updated timeline event.

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response fields
FieldTypeReturnedDescription
eventobjectAlwaysThe complete public record for a timeline event.
event.idintegerAlwaysThe positive numeric ID of the timeline event.
event.revisionintegerAlwaysThe resource version for concurrency control.

Minimum: 1.

event.incident_idintegerAlwaysThe positive numeric ID of the incident.
event.started_atstring (RFC 3339)AlwaysThe event start time.
event.atstring (RFC 3339)AlwaysA deprecated response alias for started_at. Both fields contain the same value.
event.ended_atstring (RFC 3339) | nullAlwaysThe event end time. A null value means that the event has no end time.
event.is_ongoingbooleanAlwaysIndicates whether the event is still in progress.
event.group_idinteger | nullAlwaysThe timeline-group ID. A null value means that the event has no group.
event.is_keybooleanAlwaysIndicates whether responders marked this as a key incident event.
event.sourcestringAlwaysThe system or actor that created the event.
event.source_refstringAlwaysThe source-specific reference for the event.
event.typestringAlwaysThe event type used for grouping and display.
event.iconstringAlwaysThe event icon. The maximum length is 8 Unicode characters.

Maximum length: 8 characters.

event.titlestringAlwaysThe optional display title of the event.
event.bodystringAlwaysThe event description.
event.collaboration_generationintegerAlwaysThe version of collaborative content associated with the event.
event.tagsstring[]AlwaysThe normalized event tags.
event.ai_contextstringAlwaysThe saved AI context for a generated event. An empty string means that no context is stored.
event.created_bystringAlwaysThe identifier of the user or system that created the event.
event.comment_countintegerAlwaysThe number of comments on the event.
event.attachmentsobject[]AlwaysThe files attached to the event.
event.attachments[].idintegerAlwaysThe positive numeric ID of the attachment.
event.attachments[].timeline_event_idintegerAlwaysThe positive numeric ID of the timeline event.
event.attachments[].filenamestringAlwaysThe original file name.
event.attachments[].urlstringAlwaysA temporary download URL. An empty string means that no URL is currently available.
event.attachments[].url_availablebooleanAlwaysIndicates whether url contains an available download URL.
event.attachments[].content_typestringAlwaysThe media type of the attached file.
event.attachments[].size_bytesintegerAlwaysThe file size in bytes.
event.attachments[].created_atstring (RFC 3339)AlwaysThe attachment creation time.
event.attachments[].created_bystringAlwaysThe identifier of the user who attached the file.
event.source_window_started_atstring (RFC 3339) | nullAlwaysThe start of the source-data window. A null value means that no window is recorded.
event.source_window_ended_atstring (RFC 3339) | nullAlwaysThe end of the source-data window. A null value means that no window is recorded.
event.evidence_linksobject[]AlwaysThe evidence references associated with the event.
event.evidence_links[].sourcestringAlwaysThe system or provider that supplied the evidence.
event.evidence_links[].urlstringAlwaysThe absolute URL of the evidence.
event.evidence_links[].labelstringOptionalA short display name for the evidence.
event.evidence_links[].summarystringOptionalA short summary of the evidence.
event.evidence_links[].artifact_idstringOptionalThe identifier of a stored evidence artifact.
event.evidence_links[].artifact_digeststringOptionalThe digest used to make sure that the artifact content did not change.
event.evidence_links[].result_bytesintegerOptionalThe original evidence result size in bytes.
event.evidence_links[].truncatedbooleanOptionalIndicates whether the stored evidence omits part of the original result.

Response headers

Always means present when the parent object exists. A present field can be null. Child fields apply to each array item.

Response headers
FieldTypeReturnedDescription
Tellagen-Resource-VersionintegerAlwaysThe positive resource version for If-Tellagen-Resource-Version in the next API-key PATCH request.

Minimum: 1.

Errors and recovery (9)

Error responses (9)

400
The API rejected the request because its syntax or one of its values is invalid.
401
The request does not contain valid authentication.
403
Authentication succeeded, but the caller lacks the required API scope or workspace permission.
404
The requested resource does not exist or is not available to the caller.
409
The request conflicts with the current resource state. idempotency_key_reused means that the key belongs to different request content. idempotency_in_progress means that an identical request is still in progress. idempotency_outcome_unknown means that an earlier request may have completed, but its result could not be stored and must not be retried automatically.
412
The resource changed after the client obtained its If-Tellagen-Resource-Version value.
428
An API-key PATCH request did not include the required If-Tellagen-Resource-Version header.
429
The workspace exceeded an active request limit.
500
An internal server error prevented completion of the request.

DELETE/api/v1/timeline/{id}Delete timeline event

#

Deletes the event and its attachment records. The API removes stored attachment objects asynchronously. Findings promoted from the event return to draft. A repeated request returns 404. Concurrent attachment changes return 409. The request is safe to retry after this conflict.

Operation ID
deleteTimelineEvent
Retry guidance
Do not retry automatically after an uncertain outcome. Read the resource state and follow this operation’s recovery guidance. Retry rules

Example request

Replace {company}, <token>, and any other placeholders with your values.

bash
curl --request DELETE \
  --url 'https://{company}.api.tellagen.com/api/v1/timeline/{id}' \
  --header 'Authorization: Bearer <token>'

Success: 204

No response body. Do not try to parse this response as JSON.

Request and response contract

Path parameters

Nested fields apply when their parent is supplied. Optional does not imply nullable. Read each field’s clearing rules.

Path parameters
FieldTypeRequiredDescription
idintegerYesA positive numeric timeline-event ID returned by this API.

Minimum: 1.

Returns 204 with no body.

Errors and recovery (7)

Error responses (7)

400
The API rejected the request because its syntax or one of its values is invalid.
401
The request does not contain valid authentication.
403
Authentication succeeded, but the caller lacks the required API scope or workspace permission.
404
The requested resource does not exist or is not available to the caller.
409
The request conflicts with the current resource state. idempotency_key_reused means that the key belongs to different request content. idempotency_in_progress means that an identical request is still in progress. idempotency_outcome_unknown means that an earlier request may have completed, but its result could not be stored and must not be retried automatically.
429
The workspace exceeded an active request limit.
500
An internal server error prevented completion of the request.

Read this resource as Markdown · OpenAPI contract