hosting
GET /v1/sites/{siteId}/apm/traces/{traceId}
Show where one kept request's milliseconds went.
Authentication
Send an API key as a bearer token. The key must carry the sites.view permission; a key without it is refused with 403, not 404.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X GET https://api.zinndigital.com/v1/sites/{siteId}/apm/traces/{traceId} \
-H "Authorization: Bearer zdk_live_…"Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
The function-level breakdown for one stored request: which WordPress plugin, PHP extension, PHP function or SQL query consumed the time, heaviest first, with the call site relative to the site's own document root. ⭐ SQL literals arrive already redacted by the vendor (`WHERE autoload IN ('xxx')`) and are neither restored nor re-redacted here. That redaction is why a slow query can be shown to a customer at all. ⛔ A trace past retention answers `404` rather than `410`: the customer's next action is identical, and a distinct code would be an oracle for which trace ids ever existed. Requires `sites.view` and the `request_profiling` entitlement. A trace belonging to another site answers `404`, never another tenant's data.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | Uuid | Yes | Site ID (UUIDv7). |
traceId (path) | string | Yes | One of our own trace ids, from `id` on the list row. ⭐ A UUID, unlike the sibling live surface's vendor task id: this is a primary key we minted, so a non-UUID really is *"no su… |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | — |
transaction | string | Yes | — |
method | string | Yes | — |
path | string | Yes | The path as traced, before normalisation — so a developer can reproduce the exact request, which the grouped transaction label deliberately cannot express. |
duration_ms | integer | Yes | — |
throttled_ms | integer | Yes | — |
io_throttled_ms | integer | Yes | — |
hit_limits | boolean | Yes | — |
has_error | boolean | Yes | — |
error_text | string | Yes | — |
cache_miss_reasons | string[] | Yes | Why this request bypassed the page cache; empty when it was cacheable. |
started_at | string | Yes | — |
costs | SiteApmTraceCost[] | Yes | — |
Errors this endpoint can return
401 · 403 · 404 · 422 · 429