Get a session timeline (LLM-ready)
Return a compact, chronological timeline of the session — the AI-summarization view, NOT the raw rrweb stream. Turns the event stream into an ordered sequence of meaningful steps (page journey, dwell time, form submissions, field inputs, identify, and custom events). Replay heartbeat/start markers, engagement pings, web vitals and Replay Vision $recording_observed events (answers about the visit, not steps of it) are dropped. Contains no PII — form and input values are excluded, only field metadata. sessionId must be a UUIDv7 (all recording session ids are). Feed data to a model to summarize what the visitor did and where they dropped off.
With include=logs, each log row keeps its absolute time (t with milliseconds, and timestamp). Inside the timeline (from its first to its last event) it also carries seconds_from_start, measured from the same origin as the events, and in_recording: true. A log before the first or after the last event is still listed, with in_recording: false and no seconds_from_start: it is never clamped onto the session's first or last moment. Event times come from the visitor's browser, log times from your server, so a skewed server clock shifts its log rows.
curl -X GET "https://mythic-analytics.gulp.workers.dev/client/v1/data/replays/example_string/timeline?location_id=example_string&limit=500&include=logs&log_levels=example_string" \
-H "Content-Type: application/json" \
-H "X-Location-Id: example_string" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://mythic-analytics.gulp.workers.dev/client/v1/data/replays/example_string/timeline?location_id=example_string&limit=500&include=logs&log_levels=example_string"
headers = {
"Content-Type": "application/json",
"X-Location-Id": "example_string",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://mythic-analytics.gulp.workers.dev/client/v1/data/replays/example_string/timeline?location_id=example_string&limit=500&include=logs&log_levels=example_string", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-Location-Id": "example_string",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://mythic-analytics.gulp.workers.dev/client/v1/data/replays/example_string/timeline?location_id=example_string&limit=500&include=logs&log_levels=example_string", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Location-Id", "example_string")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://mythic-analytics.gulp.workers.dev/client/v1/data/replays/example_string/timeline?location_id=example_string&limit=500&include=logs&log_levels=example_string')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['X-Location-Id'] = 'example_string'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"success": true,
"rows": 42,
"truncated": true,
"data": [
{
"t": "example_string",
"seconds_from_start": 3.14,
"timestamp": "2024-12-25T10:00:00Z",
"in_recording": true,
"level": "example_string",
"service": "example_string",
"uuid": "example_string",
"trace_id": "example_string",
"event": "$pageview",
"path": "example_string",
"detail": "example_string"
}
],
"meta": {
"logs": "ok",
"logs_count": 10,
"logs_truncated": true
}
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Forbidden",
"message": "You don't have permission to access this resource",
"code": 403
}
/replays/{sessionId}/timelineTarget server for requests. Edit to use your own host.
Agency key (ak_) or location secret key (sk_) as a bearer token. Format: Bearer ak_... or Bearer sk_.... Scoped keys (mcp_) are accepted too and need replays:read; the session logs route, and include=logs on the timeline, also need logs:read. See Using an mcp_ key over HTTP.
ak_) or location secret key (sk_) as a bearer token. Format: Bearer ak_... or Bearer sk_.... Scoped keys (mcp_) are accepted too and need replays:read; the session logs route, and include=logs on the timeline, also need logs:read. See Using an mcp_ key over HTTP.
The session id from the list endpoint.
Alternative to the X-Location-Id header for agency (ak_) keys. Ignored for secret (sk_) keys.
Max timeline rows (1–2000).
logs merges the session's server log records into data (rows with event: log; up to 500, and never past 2000 rows in total). They are added only when the key may read logs (logs:read for an mcp_ key), the plan includes Logs and the location is not HIPAA. Otherwise the timeline is returned without them and meta.logs says why. Without include the response is unchanged.
With include=logs: comma list of levels to merge, e.g. warn,error,fatal. Default all.
Location to scope the request to. Required for agency (ak_) keys. Ignored for secret (sk_) keys, which resolve their own location.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Agency key (ak_) or location secret key (sk_) as a bearer token. Format: Bearer ak_... or Bearer sk_.... Scoped keys (mcp_) are accepted too and need replays:read; the session logs route, and include=logs on the timeline, also need logs:read. See Using an mcp_ key over HTTP.
Path Parameters
The session id from the list endpoint.
Query Parameters
Alternative to the X-Location-Id header for agency (ak_) keys. Ignored for secret (sk_) keys.
Max timeline rows (1–2000).
logs merges the session's server log records into data (rows with event: log; up to 500, and never past 2000 rows in total). They are added only when the key may read logs (logs:read for an mcp_ key), the plan includes Logs and the location is not HIPAA. Otherwise the timeline is returned without them and meta.logs says why. Without include the response is unchanged.
logsWith include=logs: comma list of levels to merge, e.g. warn,error,fatal. Default all.
Headers
Location to scope the request to. Required for agency (ak_) keys. Ignored for secret (sk_) keys, which resolve their own location.
Responses
True when the row cap was hit; the most-recent rows (the session outcome) are kept and earlier rows dropped.
Present only with include=logs.