observability
Covers 95 API operations in the observability category.
| Method | Path | Description |
|---|---|---|
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/capabilities | Whether the event store exists and which observability features work |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/query | Run a query over invocations, log events or spans |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/keys | Field names seen in a window, with their types (facets) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/values | The top 20 values of one key in a window |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/patterns | Log lines clustered by template, with counts, first seen and trend |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/requests/{requestId} | One request — its record, log events, spans, error events and links |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries | Saved queries of this project and the org-wide ones |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries | Save a query (member or higher) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId} | One saved query |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId} | Replace a saved query's name, description, tags and body (member or higher) |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId} | Delete a saved query (member or higher) |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}/star | Star a saved query for yourself |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}/star | Remove your star |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/pipeline | The log pipeline applied at ingest |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/pipeline | Replace the log pipeline (admin) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/scanner | The sensitive data scanner |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/scanner | Replace the sensitive data scanner (admin) |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/scanner/test | Run a scanner over a sample string; nothing is stored |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/logs-config | The whole ingest configuration as .runlot/logs.json |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/log-metrics | Log-to-metrics definitions |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/log-metrics/{name} | Create or replace a log-to-metrics definition (admin) |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/log-metrics/{name} | Delete a log-to-metrics definition (admin) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards | List dashboards |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards | Create a dashboard |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId} | Get a dashboard |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId} | Replace a dashboard |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId} | Delete a dashboard |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/export | Export a dashboard as code |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/share | Make a public read-only link |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/share | Revoke the public link |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/widgets/{widgetId}/data | Read one widget's data |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboard-settings | Get the public-link switch |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboard-settings | Turn public dashboard links on or off |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/markers | Deploy and OOM markers |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/insights | List Watchdog insights |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/insights/{insightId}/resolve | Resolve an insight |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/synthetics | List synthetic checks |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/synthetics/{checkId} | Create or replace a synthetic check |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/synthetics/{checkId} | Delete a synthetic check |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/synthetics/{checkId}/runs | List a synthetic check's runs |
| GET | /v1/shared/dashboards/{token} | Read a public dashboard |
| POST | /v1/shared/dashboards/{token}/widgets/{widgetId}/data | Read one widget of a public dashboard |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/overview | Requests, errors, status classes and wall-time quantiles |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/memory | Memory against its limit, per role |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/infrastructure | CPU, pressure, I/O, exits, wakes and Durable Objects |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/custom | One custom metric's series |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/custom/names | Custom metric names and this month's series meter |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/routes | Route templates and where they came from |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/routes | Pin, reject or release a learned route template |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/routes | RED per route and handler |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/routes/{route}/breakdown | A route's wall time by span kind |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/service-map | The project's service map |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/compare | Two deployment versions side by side |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/traces | The trace explorer |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/overview | RUM overview |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/pages | RUM by page template |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/devices | RUM by device class |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/views | RUM page views |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/views/{viewId} | One RUM page view |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/traces/{traceId} | One trace's waterfall |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters | Trace retention filters |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters | Add a trace retention filter |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters/{filterId} | Replace a trace retention filter |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters/{filterId} | Remove a trace retention filter |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/database/queries | env.db statement fingerprints |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/database/queries/{fingerprint} | One fingerprint's sample statement and hourly series |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/database/health | Database size, tables, indexes and deferred HNSW tombstones |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiler | Get the continuous profiler switch |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiler | Turn the continuous profiler on or off |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/sampling | Get the sampling override |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/sampling | Set the sampling override |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles | List profiling windows |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/near | Profiling windows within a minute of an instant |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/flamegraph | Merged flame graph |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/top | Top functions by self time |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/compare | Compare two versions' profiles |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/heap-snapshots | List heap snapshots |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/heap-snapshots | Take a heap snapshot |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/heap-snapshots/{snapshotId} | Download a heap snapshot |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/permissions | My observability permissions on this project |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/roles | Every member's observability grants on this project |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/roles/{userId} | Replace one member's observability grants on this project |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/roles/{userId} | Return one member to their role's default grants |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/audit | The project's observability audit trail |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/data | Where the project's observability data is kept and where it is exported |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/caps | Every observability meter's cap, use and projected cost |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/observability/caps | Raise, lower or remove an observability cap |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports | The project's export destinations (OTLP, Logpush) |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports | Add an export destination |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports/{exportId} | One export destination with its delivery state |
| PATCH | /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports/{exportId} | Change an export destination |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports/{exportId} | Remove an export destination |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rehydrations | The project's rehydration jobs |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rehydrations | Load an archived range back into the store for seven days |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/observability/rehydrations/{jobId} | One rehydration job |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/capabilities
store is false where the control plane has no event store (self-hosted without
ClickHouse). Then every read below answers { "available": false }; the live tail,
pipelines and the scanner still work. Viewer or higher.
operationId getObservabilityCapabilities
| Status code | Description | Response body |
|---|---|---|
| 200 | Capability flag | ObsCapabilities |
| 403 | — | — |
| 404 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/query
A query is JSON, compiled into parameterised SQL; there is no raw SQL. Built-in keys
start with $ ($request.path, $response.status, $wall_ms, $outcome, $level,
$message, $span.name, $duration_ms, …); bare keys are your own fields. $cpu_ms (an
invocation's JavaScript CPU) is joined from its CPU reading and is null where none was
measured; it cannot be used by pipelines or log metrics, which run at ingest. Filters AND
together. The timeframe is clamped to your plan's retention (clamped says so). At most
1,000 rows, 20 filters, 10 calculations and 5 groupBy keys; a query runs for at most
10 seconds. Counts over log events are weighted, so they stay estimates of the real
volume past the daily cap. Viewer or higher.
operationId queryObservability
Request body: application/json · ObsQuery
| Status code | Description | Response body |
|---|---|---|
| 200 | Result, or { "available": false } without an event store | ObsQueryResult |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 422 | The query ran too long or needed too much memory. code is query_too_slow or query_too_large | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/keys
Field names seen in a window, with their types (facets)
operationId listObservabilityKeys
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
since | query | No | string | — |
until | query | No | string | — |
view | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | Built-in keys and the user keys seen in the newest 10,000 rows of the window | ObsKeys |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/values
The top 20 values of one key in a window
operationId listObservabilityValues
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
key | query | Yes | string | — |
since | query | No | string | — |
until | query | No | string | — |
view | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | Values with counts | ObsValues |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/patterns
Log lines clustered by template, with counts, first seen and trend
operationId listObservabilityPatterns
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
since | query | No | string | — |
until | query | No | string | — |
level | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | Up to 100 patterns, largest first | ObsPatterns |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/requests/{requestId}
The request ID is the runlot-request-id header and the trace ID. A record whose
process died (workerExited) shows the cause the process exit explains:
exceededMemory when the project's own memory limit killed it, internalError
with the signal otherwise. Viewer or higher.
operationId getObservabilityRequest
| Status code | Description | Response body |
|---|---|---|
| 200 | The request view | ObsRequestView |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries
Saved queries of this project and the org-wide ones
operationId listSavedQueries
| Status code | Description | Response body |
|---|---|---|
| 200 | Saved queries, newest first, with your stars | SavedQueryList |
| 403 | — | — |
| 404 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries
The body is validated by the same compiler that runs it. scope: org makes it visible
from every project of the org. Free keeps 10 per project (and 10 org-wide); Pro has no
limit — past it the answer is 403 plan_limit.
operationId createSavedQuery
Request body: application/json · SavedQueryInput
| Status code | Description | Response body |
|---|---|---|
| 201 | Saved | SavedQuery |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}
One saved query
operationId getSavedQuery
| Status code | Description | Response body |
|---|---|---|
| 200 | The saved query | SavedQuery |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}
Replace a saved query's name, description, tags and body (member or higher)
operationId updateSavedQuery
Request body: application/json · SavedQueryInput
| Status code | Description | Response body |
|---|---|---|
| 200 | Updated | SavedQuery |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}
Delete a saved query (member or higher)
operationId deleteSavedQuery
| Status code | Description | Response body |
|---|---|---|
| 204 | Deleted | — |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}/star
Star a saved query for yourself
operationId starSavedQuery
| Status code | Description | Response body |
|---|---|---|
| 200 | The saved query | SavedQuery |
| 403 | — | — |
| 404 | — | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/saved-queries/{queryId}/star
Remove your star
operationId unstarSavedQuery
| Status code | Description | Response body |
|---|---|---|
| 200 | The saved query | SavedQuery |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/pipeline
source is default (JSON parse only), dashboard, or repo (from .runlot/logs.json, applied when its deployment went live).
operationId getObservabilityPipeline
| Status code | Description | Response body |
|---|---|---|
| 200 | The pipeline | ObsPipeline |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/pipeline
Processors run in order at ingest, before storage and export: json_parse, kv,
regex (RE2 with named groups), rename, level, url, user_agent, drop and
sample. At most 32. A dashboard edit stands until the next deploy that carries
a repository config.
operationId putObservabilityPipeline
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 200 | The pipeline now in force | ObsPipeline |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/scanner
A built-in rule absent from builtins redacts. The same scanner runs over error events.
operationId getObservabilityScanner
| Status code | Description | Response body |
|---|---|---|
| 200 | The scanner | ObsScanner |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/scanner
Replace the sensitive data scanner (admin)
operationId putObservabilityScanner
Request body: application/json · ObsScannerConfig
| Status code | Description | Response body |
|---|---|---|
| 200 | The scanner now in force | ObsScanner |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/scanner/test
Run a scanner over a sample string; nothing is stored
operationId testObservabilityScanner
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 200 | The sample after the scanner | ObsScanResult |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/logs-config
Commit it as .runlot/logs.json (the CLI places it in the manifest's observability.logs) to keep the configuration with the code.
operationId exportObservabilityLogsConfig
| Status code | Description | Response body |
|---|---|---|
| 200 | The configuration document | ObsLogsConfig |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/log-metrics
Log-to-metrics definitions
operationId listObservabilityLogMetrics
| Status code | Description | Response body |
|---|---|---|
| 200 | Definitions and the per-project limit | object |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/log-metrics/{name}
Computed at ingest before sampling and before the daily cap, so the metric stays
exact while stored logs are sampled. Emitted as the custom metric log.<name>;
each groupBy key becomes a tag. At most 50 per project.
operationId putObservabilityLogMetric
Request body: application/json · ObsLogMetric
| Status code | Description | Response body |
|---|---|---|
| 200 | The definition | ObsLogMetric |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/log-metrics/{name}
Delete a log-to-metrics definition (admin)
operationId deleteObservabilityLogMetric
| Status code | Description | Response body |
|---|---|---|
| 204 | Deleted | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards
The built-in dashboards (Overview, APM, Database, Infrastructure, Errors, Crons and one per Durable Object class; defined by the platform and read-only) and the project's custom dashboards. Viewer.
operationId listDashboards
| Status code | Description | Response body |
|---|---|---|
| 200 | Dashboards | DashboardList |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards
Every widget is a §7 query, a metric query, or a reference (issues, an SLO, monitors, the service map, markdown). Unknown fields are refused anywhere in the body, so no field can carry SQL. At most 50 widgets and 64 KiB. Free allows 3 custom dashboards per project (403 plan_required past it); Pro is unlimited. key may be omitted. Member.
operationId createDashboard
Request body: application/json · DashboardInput
| Status code | Description | Response body |
|---|---|---|
| 201 | The stored dashboard | Dashboard |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused, or the plan's dashboard limit is reached | — |
| 404 | Request refused | — |
| 409 | Another dashboard of the project has the key | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}
One dashboard with its widgets. url is the member share link. Viewer.
operationId getDashboard
| Status code | Description | Response body |
|---|---|---|
| 200 | The dashboard | Dashboard |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}
Built-ins (409 dashboard_builtin) and dashboards from .runlot/dashboards/ (409 dashboard_managed_by_repo) are read-only here. Member.
operationId putDashboard
Request body: application/json · DashboardInput
| Status code | Description | Response body |
|---|---|---|
| 200 | The stored dashboard | Dashboard |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
| 409 | Read-only, or the key is taken | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}
Member. A repository dashboard is removed by deleting its file and deploying.
operationId deleteDashboard
| Status code | Description | Response body |
|---|---|---|
| 204 | Deleted | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
| 409 | The dashboard comes from the repository | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/export
The JSON a .runlot/dashboards/<key>.json file holds, and a valid create body (a built-in exports with the key custom-<key>). Viewer.
operationId exportDashboard
| Status code | Description | Response body |
|---|---|---|
| 200 | The dashboard as code | DashboardInput |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/share
Returns a new token (shown once; stored hashed) and replaces any previous one. The link answers only while the project's publicDashboards switch is on and public is true. Raw rows (log streams, issue lists, event tables) are never served through it. Admin.
operationId shareDashboard
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 200 | The link token | DashboardShare |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
| 409 | Built-in dashboards cannot be shared publicly | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/share
Admin.
operationId unshareDashboard
| Status code | Description | Response body |
|---|---|---|
| 204 | Revoked | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboards/{dashboardId}/widgets/{widgetId}/data
Runs the stored widget with the given range (default the last hour, at most 31 days, clamped to the plan's metric retention) and the dashboard's declared variables. 501 not_available for a source whose engine is not on this installation. Viewer.
operationId getDashboardWidgetData
Request body: application/json · WidgetDataRequest
| Status code | Description | Response body |
|---|---|---|
| 200 | The widget's data | WidgetData |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
| 501 | The widget's source is not available on this installation | — |
| 503 | The observability store is not configured | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboard-settings
Viewer.
operationId getDashboardSettings
| Status code | Description | Response body |
|---|---|---|
| 200 | Settings | DashboardSettings |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/dashboard-settings
Off by default. While off, every public link of the project answers 404. Admin.
operationId putDashboardSettings
Request body: application/json · DashboardSettings
| Status code | Description | Response body |
|---|---|---|
| 200 | Settings | DashboardSettings |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/markers
Live switches and out-of-memory exits in the range, for drawing on every time series. Viewer.
operationId getObservabilityMarkers
| Status code | Description | Response body |
|---|---|---|
| 200 | Markers | MarkerList |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/insights
What Watchdog noticed with no monitor configured: deploy regressions (every plan) and, on Pro, seasonal anomalies and new log patterns, each with root-cause hints and, when it began at a deploy, the deployment comparison. Viewer.
operationId listInsights
| Status code | Description | Response body |
|---|---|---|
| 200 | Insights | InsightList |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/insights/{insightId}/resolve
Member.
operationId resolveInsight
| Status code | Description | Response body |
|---|---|---|
| 204 | Resolved | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/synthetics
The uptime checks under their observability name; the same checks and answers as …/uptime-checks. Viewer.
operationId listSynthetics
| Status code | Description | Response body |
|---|---|---|
| 200 | Checks | UptimeCheckList |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/synthetics/{checkId}
As PUT …/uptime-checks/{checkId}, including multi-step API checks. Admin.
operationId putSynthetic
Request body: application/json · UptimeCheckInput
| Status code | Description | Response body |
|---|---|---|
| 200 | The stored check | UptimeCheck |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 402 | The plan's check limit is reached | — |
| 403 | Request refused, or the interval is below the plan's | — |
| 404 | Request refused | — |
| 409 | The check ID belongs to another project | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/synthetics/{checkId}
Admin.
operationId deleteSynthetic
| Status code | Description | Response body |
|---|---|---|
| 204 | Deleted | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/synthetics/{checkId}/runs
Newest first, the last seven days. Viewer.
operationId listSyntheticRuns
| Status code | Description | Response body |
|---|---|---|
| 200 | Runs | UptimeRunList |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/shared/dashboards/{token}
No credential: the token is the link. 404 unless the project's public links are on and the dashboard is public. Rate-limited per address and per token (429 with Retry-After).
operationId getSharedDashboard
| Status code | Description | Response body |
|---|---|---|
| 200 | The dashboard's layout | SharedDashboard |
| 404 | No such public dashboard | — |
| 429 | Too many requests | — |
POST /v1/shared/dashboards/{token}/widgets/{widgetId}/data
Only the range and the dashboard's declared variables come from the caller; the query is the stored widget's. Raw rows are refused with 403 not_shared.
operationId getSharedDashboardWidgetData
Request body: application/json · WidgetDataRequest
| Status code | Description | Response body |
|---|---|---|
| 200 | The widget's data | WidgetData |
| 400 | Request refused | — |
| 403 | The widget shows raw rows | — |
| 404 | No such public dashboard or widget | — |
| 429 | Too many requests | — |
| 501 | The widget's source is not available on this installation | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/overview
Viewer and project:read. Quantiles are merged from per-minute (ranges inside 15 days) or hourly t-digest sketches, never averaged. Deploy and out-of-memory markers in range. Synthetic traffic is excluded by default. groupBy=version splits by deployment version. 503 no_event_store without ClickHouse.
operationId getObsMetricsOverview
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
version | query | No | integer | — |
handler | query | No | string | fetch, scheduled, queue, email, alarm, rpc, websocket |
route | query | No | string | — |
synthetic | query | No | string | — |
groupBy | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsMetricsOverview |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/memory
Viewer. 10-second samples inside the last 24 h (ranges up to 6 h), per-minute inside 15 days, hourly beyond. memory.high throttle events are marked throttled; OOM and deploy markers.
operationId getObsMetricsMemory
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsMetricsMemory |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/infrastructure
Viewer. Per role in split mode. Wakes and cold starts come from the invocation records, so they reach back only as far as the plan keeps them.
operationId getObsMetricsInfrastructure
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsMetricsInfrastructure |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/custom
Viewer. agg is count, sum, min, max, avg, last or a quantile (p50 to p999, merged from sketches). tags=k:v,k2:v2 filters; groupBy splits by a tag (at most 50 groups, largest first).
operationId getObsMetricsCustom
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
name | query | Yes | string | — |
agg | query | No | string | — |
tags | query | No | string | — |
groupBy | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsCustomMetric |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/metrics/custom/names
Viewer. usage.refused counts new series the cardinality bound refused this month.
operationId getObsMetricsCustomNames
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsCustomNames |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/routes
Viewer. The live deployment's framework and declared template sets with their coverage, and the learned templates (segment rule or folded), pinned or rejected.
operationId listObsRoutes
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsRoutes |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/routes
Member. A pinned template is always applied; a rejected one never is (for a folded template, the position is not folded again). It changes only how this project's own data is grouped.
operationId putObsRoute
Request body: application/json · ObsRouteStateInput
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsLearnedRoute |
| 400 | — | — |
| 403 | — | — |
| 409 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/routes
Viewer. Free lists the top routes only (limit), with no breakdown, service map or comparison.
operationId getObsAPMRoutes
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
version | query | No | integer | — |
handler | query | No | string | fetch, scheduled, queue, email, alarm, rpc, websocket |
route | query | No | string | — |
synthetic | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsAPMRoutes |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/routes/{route}/breakdown
Viewer, Pro. Own code is wall time minus span time; spans that overlap are shown as
shares of span time (overlapping). The basis is the sampled invocations inside the
plan's raw retention.
operationId getObsAPMBreakdown
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
version | query | No | integer | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsBreakdown |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/service-map
Viewer, Pro. Nodes are the project, its bindings, Durable Object classes, other projects reached through service bindings and external hosts; edges carry rate, error rate and p95. Drawn from spans.
operationId getObsAPMServiceMap
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
version | query | No | integer | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsServiceMap |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/compare
Viewer, Pro. RED per route, the breakdown, memory peak while each was newest, and error groups first seen in b. Default range is the last 15 days.
operationId getObsAPMCompare
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Default 24 hours ago; clamped to the plan's retention. |
to | query | No | string | Default now. |
step | query | No | string | Bucket width: seconds or a duration such as 5m. Chosen from the range when omitted. |
a | query | Yes | integer | — |
b | query | Yes | integer | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsCompare |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/traces
Viewer. Both tiers: sampled invocations inside the plan's retention, and long-kept traces (errors, the slowest 1 % of their route, retention filters) for 30 days on Pro. Newest first, 50 a page; pass next back as before.
operationId listObsAPMTraces
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | — |
to | query | No | string | — |
before | query | No | string | Unix milliseconds, from the previous page's next. |
route | query | No | string | — |
status | query | No | string | A code (502) or a class (5xx). |
minDuration | query | No | number | — |
hasError | query | No | boolean | — |
version | query | No | integer | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsTraceList |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/overview
Viewer, Pro. Page views, sessions and p75 Web Vitals (LCP, INP, CLS, TTFB) over time from the browser agent (§17.12), plus this month's metered and refused (past the RUM session cap) sessions. Every value is a claim from the visitor's browser.
operationId getObsRUMOverview
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | — |
to | query | No | string | — |
step | query | No | string | Seconds or a duration such as 5m. |
template | query | No | string | One page template, such as /users/:id. |
device | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsRUMOverview |
| 400 | — | — |
| 403 | plan_required: real user monitoring is a Pro feature | Error |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/pages
Viewer, Pro. Page templates (paths with ids folded to :id, no query) by page views, with p75 vitals, long tasks and resource and fetch timing summaries by initiator kind and first- or third-party host. At most 500.
operationId listObsRUMPages
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | — |
to | query | No | string | — |
step | query | No | string | Seconds or a duration such as 5m. |
template | query | No | string | One page template, such as /users/:id. |
device | query | No | string | — |
sort | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsRUMPages |
| 400 | — | — |
| 403 | plan_required: real user monitoring is a Pro feature | Error |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/devices
Viewer, Pro. The same aggregates per device class (mobile, tablet, desktop: from the viewport and the pointer, never a user agent).
operationId listObsRUMDevices
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | — |
to | query | No | string | — |
step | query | No | string | Seconds or a duration such as 5m. |
template | query | No | string | One page template, such as /users/:id. |
device | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsRUMDevices |
| 400 | — | — |
| 403 | plan_required: real user monitoring is a Pro feature | Error |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/views
Viewer, Pro. Page views newest first (or slowest LCP first), inside the plan's event retention. A document view names serverRequestId, the request that rendered the page (its trace ID).
operationId listObsRUMViews
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | — |
to | query | No | string | — |
step | query | No | string | Seconds or a duration such as 5m. |
template | query | No | string | One page template, such as /users/:id. |
device | query | No | string | — |
session | query | No | string | — |
sort | query | No | string | — |
limit | query | No | integer | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsRUMViewList |
| 400 | — | — |
| 403 | plan_required: real user monitoring is a Pro feature | Error |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rum/views/{viewId}
Viewer, Pro. One page view with its timing summaries and the server requests it caused: the document's rendering request, and the requests whose traceparent named the view as parent (§11). Correlation from browser claims, not proof.
operationId getObsRUMView
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsRUMView |
| 400 | — | — |
| 403 | plan_required: real user monitoring is a Pro feature | Error |
| 404 | — | — |
| 503 | no_event_store: this control plane has no event store | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/apm/traces/{traceId}
Viewer. Spans with depth and offset, the invocation that started the trace while it is kept, and its log events.
operationId getObsAPMTrace
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsTrace |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters
Viewer. A trace matching an enabled filter is kept for the long retention (30 days, Pro).
operationId listObsTraceFilters
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsTraceFilterList |
| 403 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters
Admin, Pro. At most 20 per project. Long-kept bytes past the normal retention are billed as GB-months.
operationId createObsTraceFilter
Request body: application/json · ObsTraceFilterInput
| Status code | Description | Response body |
|---|---|---|
| 201 | Created | ObsTraceFilter |
| 400 | — | — |
| 403 | — | — |
| 409 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters/{filterId}
Admin, Pro.
operationId updateObsTraceFilter
Request body: application/json · ObsTraceFilterInput
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsTraceFilter |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/trace-filters/{filterId}
Admin.
operationId deleteObsTraceFilter
| Status code | Description | Response body |
|---|---|---|
| 204 | Removed | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/database/queries
Viewer. Per fingerprint: calls, total and mean time, bucketed p95/p99, errors by SQLSTATE and the routes that issued it, from the statement histograms (48 hours). waits is absent until spans carry db.wait_ms; plans is not available on the deployed engine yet.
operationId listObsDBQueries
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Clamped to the last 48 hours. |
to | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsDBQueries |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/database/queries/{fingerprint}
Viewer. The sample is the normalised, scrubbed shape; literals never reach the CP.
operationId getObsDBQuery
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
from | query | No | string | Clamped to the last 48 hours. |
to | query | No | string | — |
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsDBQuery |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/database/health
Member and db:read. Fixed read-only catalog statements over the console's wire path, never customer SQL; a statement the engine does not answer is reported in errors. Size history from hourly usage.
operationId getObsDBHealth
| Status code | Description | Response body |
|---|---|---|
| 200 | OK | ObsDBHealth |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiler
Whether the project's next generation launches profiled, the stored setting (null is the default) and whether the plan allows it (Pro). Viewer.
operationId getObsProfilerSettings
| Status code | Description | Response body |
|---|---|---|
| 200 | Settings | ObsProfilerSettings |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiler
Takes effect with the next deployment or restart of the app: the profiler attaches through an inspector the process is launched with, and nothing restarts it to add or remove one. null returns to the default. Turning it on needs Pro (403 plan_required). Admin.
operationId putObsProfilerSettings
Request body: application/json · ObsProfilerSettingsInput
| Status code | Description | Response body |
|---|---|---|
| 200 | Settings | ObsProfilerSettings |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused, or plan_required | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/sampling
The dashboard's override of the live deployment's observability.logs / observability.traces sampling. Each null field is the manifest's. Viewer.
operationId getObsSampling
| Status code | Description | Response body |
|---|---|---|
| 200 | Override | ObsSampling |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/sampling
Replaces all four fields; an absent or null field hands it back to the manifest. Requests take it at the next map refresh; scheduled, queue, email and alarm invocations take it from the app's next start. Admin.
operationId putObsSampling
Request body: application/json · ObsSampling
| Status code | Description | Response body |
|---|---|---|
| 200 | Override | ObsSampling |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles
Each stored ten-second CPU profile window, newest first. Profiles are kept twice the plan's event retention. Viewer.
operationId listObsProfiles
| Status code | Description | Response body |
|---|---|---|
| 200 | Windows | ObsProfileList |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
| 503 | This control plane keeps no event store | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/near
The windows that started within one minute either side of ts — the profile linked from a slow trace of the same minute. Viewer.
operationId nearObsProfiles
| Status code | Description | Response body |
|---|---|---|
| 200 | Windows | ObsProfileList |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/flamegraph
The window's folded stacks merged into one tree under all. Frames are symbolicated with the deployment's source maps as function (source:line:col) [module:line:col], the raw frame in brackets. Bounded to 128 levels, 64 children per node and 5,000 nodes; what does not fit is an (other) child, so totals still add up. Viewer.
operationId getObsFlamegraph
| Status code | Description | Response body |
|---|---|---|
| 200 | Flame graph | ObsFlamegraph |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/top
Functions (a frame without its line and column, so one function's lines add up) by samples whose leaf they were, with their inclusive samples and share of the window. Viewer.
operationId getObsProfileTop
| Status code | Description | Response body |
|---|---|---|
| 200 | Functions | ObsProfileTop |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/profiles/compare
Each function's share of self time in version a and version b, largest change first (at most 200). Shares rather than samples, because two versions are never profiled for the same number of windows. Viewer.
operationId compareObsProfiles
| Status code | Description | Response body |
|---|---|---|
| 200 | Comparison | ObsProfileCompare |
| 400 | Request refused | — |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/heap-snapshots
The project's snapshots, newest first (at most 50). Admin.
operationId listObsHeapSnapshots
| Status code | Description | Response body |
|---|---|---|
| 200 | Snapshots | ObsHeapSnapshotList |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/heap-snapshots
Starts one V8 heap snapshot of the running app and answers at once with its ID; poll the list until it is ready. A snapshot pauses the app while it is taken and holds whatever the app held in memory, secrets included, so it is admin and audit-logged, one at a time and at most one every 10 minutes (429 with Retry-After), and it expires after 7 days. Needs Pro (403 plan_required) and the profiler on for the running version (409 inspector_unavailable).
operationId createObsHeapSnapshot
| Status code | Description | Response body |
|---|---|---|
| 202 | Started | ObsHeapSnapshot |
| 401 | Request refused | — |
| 403 | Request refused, or plan_required | — |
| 404 | Request refused | — |
| 409 | inspector_unavailable, heap_snapshot_running or not_running | — |
| 429 | rate_limited | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/heap-snapshots/{snapshotId}
A ready snapshot as a Chrome DevTools .heapsnapshot file. 409 heap_snapshot_not_ready while it is being taken, heap_snapshot_failed with the reason when it failed. Admin; each download is audit-logged.
operationId downloadObsHeapSnapshot
| Status code | Description | Response body |
|---|---|---|
| 200 | The snapshot | string |
| 401 | Request refused | — |
| 403 | Request refused | — |
| 404 | Request refused | — |
| 409 | heap_snapshot_not_ready or heap_snapshot_failed | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/permissions
The caller's grants from their organization role (viewer and member: observability:read;
admin: read, pii and admin) or the project's override for them, and effective, the
grants this credential can use once its token scopes narrow them.
operationId getObservabilityPermissions
| Status code | Description | Response body |
|---|---|---|
| 200 | The grants | ObservabilityPermissions |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/roles
Needs observability:admin on the project.
operationId listObservabilityRoles
| Status code | Description | Response body |
|---|---|---|
| 200 | Members with their default and effective grants | object |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/roles/{userId}
The override replaces the organization role's default for this person on this project,
wider or narrower. observability:pii and observability:admin need
observability:read beside them; [] grants nothing. You cannot remove your own
observability:admin (409 self_lockout). Audited.
operationId putObservabilityRole
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 200 | The override | object |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 409 | — | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/roles/{userId}
Return one member to their role's default grants
operationId deleteObservabilityRole
| Status code | Description | Response body |
|---|---|---|
| 204 | Reset | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/audit
Configuration changes (caps, exports, rehydration, role overrides, and the pipelines,
scanners and monitors that record here) and reads of PII-scoped data, newest first.
Reads by Runlot operators (through a bug report or the operations console) appear with
actorKind: operator. Needs observability:admin.
operationId listObservabilityAudit
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
limit | query | No | integer | — |
before | query | No | string | An auditId; returns older entries |
| Status code | Description | Response body |
|---|---|---|
| 200 | A page of the trail | object |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/data
Where the project's observability data is kept and where it is exported
operationId getObservabilityData
| Status code | Description | Response body |
|---|---|---|
| 200 | The data page | ObservabilityData |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/caps
Every observability meter's cap, use and projected cost
operationId getObservabilityCaps
| Status code | Description | Response body |
|---|---|---|
| 200 | The caps | ObservabilityCaps |
| 403 | — | — |
| 404 | — | — |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/observability/caps
Each meter takes a number, -1 (no cap) or null (the plan's included amount); a meter
left out is unchanged. Every cap is on by default at the included amount. Any plan may
lower one; raising or removing one needs Pro (403 plan_required), and usage past the
included amount is billed within the organization's spending limit. The answer carries
the projected month's cost at the current rate. Needs the admin role and
observability:admin. Audited.
operationId putObservabilityCaps
Request body: application/json · ObservabilityCapsUpdate
| Status code | Description | Response body |
|---|---|---|
| 200 | The caps after the change | ObservabilityCaps |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports
The project's export destinations (OTLP, Logpush)
operationId listObservabilityExports
| Status code | Description | Response body |
|---|---|---|
| 200 | Destinations, with no secret values | object |
| 403 | — | — |
| 404 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports
otlp: OTLP/HTTP JSON to an HTTPS collector on port 443 or 4318 at a public address,
with optional headers (sealed; only their names are ever shown again). Signals logs,
traces, metrics. persist: false exports logs and traces without storing them,
unless another destination of the project keeps them.
logpush: hourly gzipped NDJSON objects (<prefix>/yyyy/mm/dd/hh/<signal>-<n>.ndjson.gz)
of logs and invocations to an S3-compatible bucket (SigV4; the secret key is sealed)
or to the project's own env.storage bucket. Pro only, up to 5 per project. Needs
observability:admin. Audited.
operationId createObservabilityExport
Request body: application/json · ObservabilityExportCreate
| Status code | Description | Response body |
|---|---|---|
| 201 | The destination | ObservabilityExport |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 409 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports/{exportId}
One export destination with its delivery state
operationId getObservabilityExport
| Status code | Description | Response body |
|---|---|---|
| 200 | The destination | ObservabilityExport |
| 403 | — | — |
| 404 | — | — |
PATCH /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports/{exportId}
Named fields only; kind cannot change. A change clears the failure state. Audited.
operationId updateObservabilityExport
Request body: application/json · ObservabilityExportUpdate
| Status code | Description | Response body |
|---|---|---|
| 200 | The destination | ObservabilityExport |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/observability/exports/{exportId}
Remove an export destination
operationId deleteObservabilityExport
| Status code | Description | Response body |
|---|---|---|
| 204 | Removed | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rehydrations
The project's rehydration jobs
operationId listObservabilityRehydrations
| Status code | Description | Response body |
|---|---|---|
| 200 | Newest first | object |
| 403 | — | — |
| 404 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/observability/rehydrations
Reads a Logpush destination's objects for from–to (at most 72 hours) and loads the
part older than the plan's retention back, so the same queries answer for it for seven
days. Rehydrated rows are not exported again and do not change the metric rollups.
Pro only. 409 still_stored when the whole range is still inside retention. Needs
observability:admin. Audited.
operationId createObservabilityRehydration
Request body: application/json · object
| Status code | Description | Response body |
|---|---|---|
| 202 | Queued | ObservabilityRehydration |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 409 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/observability/rehydrations/{jobId}
One rehydration job
operationId getObservabilityRehydration
| Status code | Description | Response body |
|---|---|---|
| 200 | The job | ObservabilityRehydration |
| 403 | — | — |
| 404 | — | — |