On this page

Observability query API

Query projects, traces, services and releases, manage environment policy, run exports and privacy-request lookups, and read recent signals from a coding agent.

Two separate read surfaces.

APM query API (/v1/apm/*, sk_ server API key, collector hosts). Availability: customer and general capture are not yet available, and an approved proof-of-concept is limited to synthetic, no-personal-data telemetry. At the time of writing a server API key created in the Backoffice cannot carry read:apm, write:apm or read:privacy_request, so those operations are not callable with a self-service key yet; read:export can be selected.

Coding-agent read API (/v1/coding-agent/*, cak_ coding-agent key, on https://ingest.noxtica.com). Create a key under Integrations & API, Coding agent keys.

EnvironmentBase URL
Productionhttps://collect.noxtica.com
Productionhttps://ingest.noxtica.com

Credential: ApiKeyAuth, CodingAgentKeyAuth. See Authentication.

How this page is organisedBar length shows each section’s share of the text. Select a section to jump to it.

APM Observability

Coding Agent

3 operations

Operations in Observability query API

List APM projects

GET /v1/apm/projects

Lists tenant-owned observability projects from PostgreSQL authority. Results are cursor-paginated and never cached.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
limitqueryintegerNoMinimum 1, maximum 200. Default 50.
cursorquerystringNoAt least 1 character, at most 512 characters.

Responses

StatusMeaningError codesContent
200Project page.application/json ApmProjectList
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
itemsarray of ApmProjectYes
items[]object (ApmProject)No
items[].project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
items[].display_namestringYes
items[].statestringYes
items[].region_idstringYes
items[].data_plane_idstringYes
items[].capture_enabledbooleanYes
items[].enabled_signalsarray of stringYesAt most 2 items, unique items.
items[].authority_epochintegerYesMinimum 0.
items[].erasure_epochintegerYesMinimum 0.
items[].created_atstring (date-time)Yes
items[].updated_atstring (date-time)Yes
countintegerYesMinimum 0, maximum 200.
truncatedbooleanYes
next_cursorstring, nullableYes
freshnessconstYesAlways postgres_authority.
completenessstringYesAllowed values: complete, truncated.

Response example (200)

{
  "ok": true,
  "items": [
    {
      "project_id": "checkout",
      "display_name": "Checkout",
      "state": "active",
      "region_id": "us-central1",
      "data_plane_id": "primary",
      "capture_enabled": false,
      "enabled_signals": [
        "traces"
      ],
      "authority_epoch": 7,
      "erasure_epoch": 2,
      "created_at": "2026-08-01T00:00:00.000Z",
      "updated_at": "2026-09-01T00:00:00.000Z"
    }
  ],
  "count": 1,
  "truncated": false,
  "next_cursor": null,
  "freshness": "postgres_authority",
  "completeness": "complete"
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/projects" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/projects', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/projects",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

List project environments

GET /v1/apm/projects/{projectId}/environments

Lists environments belonging to one tenant-owned APM project from PostgreSQL authority.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
projectIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
limitqueryintegerNoMinimum 1, maximum 200. Default 50.
cursorquerystringNoAt least 1 character, at most 512 characters.

Responses

StatusMeaningError codesContent
200Environment page.application/json ApmEnvironmentList
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
itemsarray of ApmEnvironmentPolicyYes
items[]object (ApmEnvironmentPolicy)No
items[].project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
items[].environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
items[].display_namestringYes
items[].environment_kindstringYes
items[].statestringYes
items[].region_idstringYes
items[].data_plane_idstringYes
items[].capture_enabledbooleanYes
items[].allowed_signalsarray of stringYesAt most 2 items, unique items.
items[].sampling_policy_idone of ApmScopedId or any, nullableYes
items[].retention_policy_versionintegerYesMinimum 1.
items[].privacy_policy_versionintegerYesMinimum 1.
items[].authority_epochintegerYesMinimum 0.
items[].erasure_epochintegerYesMinimum 0.
items[].quota_manifest_revisionintegerYesMinimum 0.
items[].parser_manifest_revisionintegerYesMinimum 0.
items[].created_atstring (date-time)Yes
items[].updated_atstring (date-time)Yes
countintegerYesMinimum 0, maximum 200.
truncatedbooleanYes
next_cursorstring, nullableYes
freshnessconstYesAlways postgres_authority.
completenessstringYesAllowed values: complete, truncated.

Response example (200)

{
  "ok": true,
  "project_id": "checkout",
  "items": [
    {
      "project_id": "checkout",
      "environment_id": "prod",
      "display_name": "Production",
      "environment_kind": "production",
      "state": "active",
      "region_id": "us-central1",
      "data_plane_id": "primary",
      "capture_enabled": false,
      "allowed_signals": [
        "traces"
      ],
      "sampling_policy_id": "baseline",
      "retention_policy_version": 3,
      "privacy_policy_version": 2,
      "authority_epoch": 7,
      "erasure_epoch": 2,
      "quota_manifest_revision": 4,
      "parser_manifest_revision": 5,
      "created_at": "2026-08-01T00:00:00.000Z",
      "updated_at": "2026-09-01T00:00:00.000Z"
    }
  ],
  "count": 1,
  "truncated": false,
  "next_cursor": null,
  "freshness": "postgres_authority",
  "completeness": "complete"
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/projects/example-projectId/environments" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/projects/example-projectId/environments', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/projects/example-projectId/environments",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read an environment policy

GET /v1/apm/projects/{projectId}/environments/{environmentId}/policy

Returns the authoritative environment policy plus bounded sampling and retention policy inventories.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
projectIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environmentIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Responses

StatusMeaningError codesContent
200Policy snapshot.application/json ApmPolicySnapshot
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
policyobject (ApmEnvironmentPolicy)Yes
policy.project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
policy.environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
policy.display_namestringYes
policy.environment_kindstringYes
policy.statestringYes
policy.region_idstringYes
policy.data_plane_idstringYes
policy.capture_enabledbooleanYes
policy.allowed_signalsarray of stringYesAt most 2 items, unique items.
policy.sampling_policy_idone of ApmScopedId or any, nullableYes
policy.retention_policy_versionintegerYesMinimum 1.
policy.privacy_policy_versionintegerYesMinimum 1.
policy.authority_epochintegerYesMinimum 0.
policy.erasure_epochintegerYesMinimum 0.
policy.quota_manifest_revisionintegerYesMinimum 0.
policy.parser_manifest_revisionintegerYesMinimum 0.
policy.created_atstring (date-time)Yes
policy.updated_atstring (date-time)Yes
sampling_policiesarray of ApmSamplingPolicyYesAt most 100 items.
sampling_policies[]object (ApmSamplingPolicy)No
sampling_policies[].policy_idstringYes
sampling_policies[].policy_versionintegerYes
sampling_policies[].signalstringYes
sampling_policies[].schema_versionintegerYes
sampling_policies[].sampling_classstringYes
sampling_policies[].modestringYes
sampling_policies[].enabledbooleanYes
sampling_policies[].rate_ppminteger, nullableYes
sampling_policies[].tail_window_secondsinteger, nullableYes
sampling_policies[].tail_budget_eventsinteger, nullableYes
sampling_policies[].effective_fromstring (date-time)Yes
sampling_policies[].effective_untilstring (date-time), nullableYes
sampling_policy_countintegerYesMinimum 0, maximum 100.
sampling_policies_truncatedbooleanYes
retention_policiesarray of ApmRetentionPolicyYesAt most 100 items.
retention_policies[]object (ApmRetentionPolicy)No
retention_policies[].signalstringYes
retention_policies[].retention_classstringYes
retention_policies[].policy_versionintegerYes
retention_policies[].duration_secondsinteger, nullableYes
retention_policies[].minimum_secondsintegerYes
retention_policies[].maximum_secondsintegerYes
retention_policies[].region_idstringYes
retention_policies[].deletion_modestringYes
retention_policies[].legal_hold_statestringYes
retention_policies[].enabledbooleanYes
retention_policies[].effective_fromstring (date-time)Yes
retention_policies[].effective_untilstring (date-time), nullableYes
retention_policy_countintegerYesMinimum 0, maximum 100.
retention_policies_truncatedbooleanYes
freshnessobject (ApmAuthorityFreshness)Yes
freshness.sourceconstYesAlways postgres_authority.
freshness.updated_atstring (date-time)Yes
completenessobjectYes
completeness.sampling_policiesstringYesAllowed values: complete, truncated.
completeness.retention_policiesstringYesAllowed values: complete, truncated.

Response example (200)

{
  "ok": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "policy": {
    "project_id": "checkout",
    "environment_id": "prod",
    "display_name": "Production",
    "environment_kind": "production",
    "state": "active",
    "region_id": "us-central1",
    "data_plane_id": "primary",
    "capture_enabled": false,
    "allowed_signals": [
      "traces"
    ],
    "sampling_policy_id": "baseline",
    "retention_policy_version": 3,
    "privacy_policy_version": 2,
    "authority_epoch": 7,
    "erasure_epoch": 2,
    "quota_manifest_revision": 4,
    "parser_manifest_revision": 5,
    "created_at": "2026-08-01T00:00:00.000Z",
    "updated_at": "2026-09-01T00:00:00.000Z"
  },
  "sampling_policies": [],
  "sampling_policy_count": 0,
  "sampling_policies_truncated": false,
  "retention_policies": [],
  "retention_policy_count": 0,
  "retention_policies_truncated": false,
  "freshness": {
    "source": "postgres_authority",
    "updated_at": "2026-09-01T00:00:00.000Z"
  },
  "completeness": {
    "sampling_policies": "complete",
    "retention_policies": "complete"
  }
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/projects/example-projectId/environments/example-environmentId/policy" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/projects/example-projectId/environments/example-environmentId/policy', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/projects/example-projectId/environments/example-environmentId/policy",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Update an environment policy

PUT /v1/apm/projects/{projectId}/environments/{environmentId}/policy

Updates a closed allowlist using optimistic authority-epoch concurrency. While capture rollout is OFF, capture_enabled: true is unavailable and returns 409 capture_unavailable; clients may only leave it absent or set it false.

Authentication: Bearer token (ApiKeyAuth), scope write:apm.

Parameters

NameInTypeRequiredDescription
projectIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environmentIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Request body

Content type application/json, required.

FieldTypeRequiredDescription
expected_authority_epochintegerYesMinimum 1.
capture_enabledconstNotrue is unavailable while capture rollout is OFF. Always false.
allowed_signalsarray of stringNoAt most 2 items, unique items.
sampling_policy_idone of ApmScopedId or any, nullableNo
retention_policy_versionintegerNoMinimum 1.
privacy_policy_versionintegerNoMinimum 1.
region_idstringNoAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
data_plane_idstringNoAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Responses

StatusMeaningError codesContent
200Updated authoritative policy.application/json ApmPolicyUpdateResult
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
409Capture is unavailable or the expected authority epoch is stale.capture_unavailableapplication/json ApmConflict
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
409Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
policyobject (ApmEnvironmentPolicy)Yes
policy.project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
policy.environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
policy.display_namestringYes
policy.environment_kindstringYes
policy.statestringYes
policy.region_idstringYes
policy.data_plane_idstringYes
policy.capture_enabledbooleanYes
policy.allowed_signalsarray of stringYesAt most 2 items, unique items.
policy.sampling_policy_idone of ApmScopedId or any, nullableYes
policy.retention_policy_versionintegerYesMinimum 1.
policy.privacy_policy_versionintegerYesMinimum 1.
policy.authority_epochintegerYesMinimum 0.
policy.erasure_epochintegerYesMinimum 0.
policy.quota_manifest_revisionintegerYesMinimum 0.
policy.parser_manifest_revisionintegerYesMinimum 0.
policy.created_atstring (date-time)Yes
policy.updated_atstring (date-time)Yes
countconstYesAlways 1.
truncatedconstYesAlways false.
freshnessobject (ApmAuthorityFreshness)Yes
freshness.sourceconstYesAlways postgres_authority.
freshness.updated_atstring (date-time)Yes
completenessconstYesAlways complete.

Response example (200)

{
  "ok": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "policy": {
    "project_id": "checkout",
    "environment_id": "prod",
    "display_name": "Production",
    "environment_kind": "production",
    "state": "active",
    "region_id": "us-central1",
    "data_plane_id": "primary",
    "capture_enabled": false,
    "allowed_signals": [
      "traces"
    ],
    "sampling_policy_id": "baseline",
    "retention_policy_version": 3,
    "privacy_policy_version": 2,
    "authority_epoch": 8,
    "erasure_epoch": 2,
    "quota_manifest_revision": 4,
    "parser_manifest_revision": 5,
    "created_at": "2026-08-01T00:00:00.000Z",
    "updated_at": "2026-09-21T00:00:00.000Z"
  },
  "count": 1,
  "truncated": false,
  "freshness": {
    "source": "postgres_authority",
    "updated_at": "2026-09-21T00:00:00.000Z"
  },
  "completeness": "complete"
}

Example request

curl

curl -X PUT "https://collect.noxtica.com/v1/apm/projects/example-projectId/environments/example-environmentId/policy" \
  -H "Authorization: Bearer $NOXTICA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "expected_authority_epoch": 7,
  "capture_enabled": false,
  "allowed_signals": [
    "traces"
  ],
  "sampling_policy_id": "baseline"
}'

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/projects/example-projectId/environments/example-environmentId/policy', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    expected_authority_epoch: 7,
    capture_enabled: false,
    allowed_signals: [
      'traces',
    ],
    sampling_policy_id: 'baseline',
  }),
});
console.log(response.status, await response.text());

Python (standard library)

import json
import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/projects/example-projectId/environments/example-environmentId/policy",
    data=json.dumps({
        "expected_authority_epoch": 7,
        "capture_enabled": False,
        "allowed_signals": [
            "traces",
        ],
        "sampling_policy_id": "baseline",
    }).encode(),
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
        "Content-Type": "application/json",
    },
    method="PUT",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Search traces

GET /v1/apm/traces

Searches the warehouse within one explicit project/environment and a range no longer than 31 days. Rows expose only the query allowlist; completeness and freshness are not inferred.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
project_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
fromquerystring (date-time)YesInclusive RFC 3339 range start. The interval to to must not exceed 31 days.
toquerystring (date-time)YesExclusive RFC 3339 range end, after from; the interval must not exceed 31 days.
limitqueryintegerNoMinimum 1, maximum 200. Default 50.
cursorquerystringNoAt least 1 character, at most 512 characters.
service_namequerystringNoAt least 1 character, at most 256 characters. Pattern ^[A-Za-z0-9._:/-]+$.
release_idquerystringNoAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
statusquerystringNoAllowed values: ok, error.

Responses

StatusMeaningError codesContent
200Trace summary page.application/json ApmTraceSearchResult
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
500Unexpected internal trace-query failure.internal_errorapplication/json ApmError
503Warehouse query or mandatory access audit is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
500Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
availableconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
itemsarray of ApmTraceSummaryYesAt most 200 items.
items[]object (ApmTraceSummary)No
items[].traceIdstringYesPattern ^(?!0{32}$)[0-9a-f]{32}$.
items[].rootSpanNamestring, nullableNo
items[].rootServiceNamestring, nullableNo
items[].startTimestring (date-time), nullableNo
items[].endTimestring (date-time), nullableNo
items[].durationMsnumber, nullableNo
items[].spanCountinteger, nullableNoMinimum 0.
items[].errorCountinteger, nullableNoMinimum 0.
items[].statusstring, nullableNoAllowed values: ok, error, null.
items[].releaseIdstring, nullableNo
items[].buildIdstring, nullableNo
items[].samplingClassstring, nullableNo
items[].headSamplingDecisionstring, nullableNo
items[].tailSamplingDecisionstring, nullableNo
items[].samplingReasonstring, nullableNo
items[].retentionDecisionstring, nullableNo
items[].headStatestring, nullableNo
items[].tailStatestring, nullableNo
items[].partialboolean, nullableNo
items[].lateboolean, nullableNo
items[].completenessstring, nullableYes
items[].samplingPolicyIdstring, nullableNo
items[].retentionPolicyVersioninteger, nullableNo
items[].freshnessWatermarkstring (date-time), nullableNo
items[].ingestedAtstring (date-time), nullableNo
items[].schemaVersioninteger, nullableNo
countintegerYesMinimum 0, maximum 200.
truncatedbooleanYes
next_cursorstring, nullableYes
partialbooleanYes
completenessstringYes
freshnessobject (ApmFreshness)Yes
freshness.watermarkstring (date-time), nullableYes
freshness.ingested_atstring (date-time), nullableYes

Response example (200)

{
  "ok": true,
  "available": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "items": [
    {
      "traceId": "0123456789abcdef0123456789abcdef",
      "startTime": "2026-09-20T12:00:00.000Z",
      "partial": false,
      "completeness": "complete",
      "freshnessWatermark": "2026-09-20T12:01:00.000Z",
      "ingestedAt": "2026-09-20T12:01:01.000Z"
    }
  ],
  "count": 1,
  "truncated": false,
  "next_cursor": null,
  "partial": false,
  "completeness": "complete",
  "freshness": {
    "watermark": "2026-09-20T12:01:00.000Z",
    "ingested_at": "2026-09-20T12:01:01.000Z"
  }
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/traces?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/traces?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/traces?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read trace detail

GET /v1/apm/traces/{traceId}

Returns a trace summary and a bounded timeline. Parent-edge completeness is explicitly false in this launch contract.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
traceIdpathstringYesPattern ^(?!0{32}$)[0-9a-f]{32}$.
project_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
fromquerystring (date-time)YesInclusive RFC 3339 range start. The interval to to must not exceed 31 days.
toquerystring (date-time)YesExclusive RFC 3339 range end, after from; the interval must not exceed 31 days.
limitqueryintegerNoMinimum 1, maximum 200. Default 50.

Responses

StatusMeaningError codesContent
200Trace detail and timeline.application/json ApmTraceDetailResult
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
500Unexpected internal trace-query failure.internal_errorapplication/json ApmError
503Warehouse query or mandatory access audit is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
500Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
availableconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
summaryobject (ApmTraceSummary)Yes
summary.traceIdstringYesPattern ^(?!0{32}$)[0-9a-f]{32}$.
summary.rootSpanNamestring, nullableNo
summary.rootServiceNamestring, nullableNo
summary.startTimestring (date-time), nullableNo
summary.endTimestring (date-time), nullableNo
summary.durationMsnumber, nullableNo
summary.spanCountinteger, nullableNoMinimum 0.
summary.errorCountinteger, nullableNoMinimum 0.
summary.statusstring, nullableNoAllowed values: ok, error, null.
summary.releaseIdstring, nullableNo
summary.buildIdstring, nullableNo
summary.samplingClassstring, nullableNo
summary.headSamplingDecisionstring, nullableNo
summary.tailSamplingDecisionstring, nullableNo
summary.samplingReasonstring, nullableNo
summary.retentionDecisionstring, nullableNo
summary.headStatestring, nullableNo
summary.tailStatestring, nullableNo
summary.partialboolean, nullableNo
summary.lateboolean, nullableNo
summary.completenessstring, nullableYes
summary.samplingPolicyIdstring, nullableNo
summary.retentionPolicyVersioninteger, nullableNo
summary.freshnessWatermarkstring (date-time), nullableNo
summary.ingestedAtstring (date-time), nullableNo
summary.schemaVersioninteger, nullableNo
timelinearray of ApmTraceSpanYesAt most 200 items.
timeline[]object (ApmTraceSpan)No
timeline[].traceIdstringYesPattern ^(?!0{32}$)[0-9a-f]{32}$.
timeline[].spanIdstringYesPattern ^(?!0{16}$)[0-9a-f]{16}$.
timeline[].parentSpanIdstring, nullableNo
timeline[].spanNamestring, nullableNo
timeline[].serviceNamestring, nullableNo
timeline[].spanKindstring, nullableNo
timeline[].startTimestring (date-time), nullableNo
timeline[].endTimestring (date-time), nullableNo
timeline[].durationMsnumber, nullableNo
timeline[].statusCodestring, nullableNo
timeline[].statusMessagestring, nullableNo
timeline[].releaseIdstring, nullableNo
timeline[].buildIdstring, nullableNo
timeline[].claimedRumLinkIdstring, nullableNo
timeline[].confirmedRumLinkIdstring, nullableNo
timeline[].correlationStatestringNoAllowed values: confirmed, claimed, unavailable.
timeline[].completenessstring, nullableYes
timeline[].eventTimestring (date-time), nullableNo
timeline[].ingestedAtstring (date-time), nullableNo
countintegerYesMinimum 0, maximum 200.
truncatedbooleanYes
partialbooleanYes
completenessobjectYes
completeness.summarystringYes
completeness.timelinestringYes
freshnessobject (ApmFreshness)Yes
freshness.watermarkstring (date-time), nullableYes
freshness.ingested_atstring (date-time), nullableYes
parent_edges_completeconstYesAlways false.

Response example (200)

{
  "ok": true,
  "available": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "summary": {
    "traceId": "0123456789abcdef0123456789abcdef",
    "startTime": "2026-09-20T12:00:00.000Z",
    "partial": false,
    "completeness": "complete",
    "freshnessWatermark": "2026-09-20T12:01:00.000Z",
    "ingestedAt": "2026-09-20T12:01:01.000Z"
  },
  "timeline": [
    {
      "traceId": "0123456789abcdef0123456789abcdef",
      "spanId": "aaaaaaaaaaaaaaaa",
      "parentSpanId": "bbbbbbbbbbbbbbbb",
      "completeness": "partial",
      "ingestedAt": "2026-09-20T12:01:01.000Z"
    }
  ],
  "count": 1,
  "truncated": false,
  "partial": true,
  "completeness": {
    "summary": "complete",
    "timeline": "partial"
  },
  "freshness": {
    "watermark": "2026-09-20T12:01:00.000Z",
    "ingested_at": "2026-09-20T12:01:01.000Z"
  },
  "parent_edges_complete": false
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/traces/example-traceId?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/traces/example-traceId?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/traces/example-traceId?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

List service health

GET /v1/apm/services

Returns bounded aggregate health rows for one project/environment and a range no longer than 31 days.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
project_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
fromquerystring (date-time)YesInclusive RFC 3339 range start. The interval to to must not exceed 31 days.
toquerystring (date-time)YesExclusive RFC 3339 range end, after from; the interval must not exceed 31 days.
limitqueryintegerNoMinimum 1, maximum 200. Default 50.

Responses

StatusMeaningError codesContent
200Service health page.application/json ApmServiceListResult
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Warehouse query or mandatory access audit is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
availableconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
itemsarray of ApmServiceHealthYesAt most 200 items.
items[]object (ApmServiceHealth)No
items[].service_namestring, nullableYes
items[].trace_countnumber, nullableYes
items[].error_trace_countnumber, nullableYes
items[].error_ratenumber, nullableYes
items[].p50_duration_msnumber, nullableYes
items[].p95_duration_msnumber, nullableYes
items[].completenessstringYesAllowed values: partial, unknown.
items[].freshness_watermarkstring (date-time), nullableYes
countintegerYesMinimum 0, maximum 200.
truncatedbooleanYes
partialbooleanYes
completenessstringYesAllowed values: partial, unknown.
freshness_watermarkstring (date-time), nullableYes

Response example (200)

{
  "ok": true,
  "available": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "items": [
    {
      "service_name": "checkout-api",
      "trace_count": 120,
      "error_trace_count": 3,
      "error_rate": 0.025,
      "p50_duration_ms": 42,
      "p95_duration_ms": 310,
      "completeness": "unknown",
      "freshness_watermark": "2026-09-20T12:01:00.000Z"
    }
  ],
  "count": 1,
  "truncated": false,
  "partial": false,
  "completeness": "unknown",
  "freshness_watermark": "2026-09-20T12:01:00.000Z"
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/services?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/services?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/services?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read service health and dependencies

GET /v1/apm/services/{serviceName}/health

Returns health plus dependency aggregates. Either warehouse subquery may be unavailable; partial, availability booleans, and reason report that honestly.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
serviceNamepathstringYesAt least 1 character, at most 256 characters. Pattern ^[A-Za-z0-9._:/-]+$.
project_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
fromquerystring (date-time)YesInclusive RFC 3339 range start. The interval to to must not exceed 31 days.
toquerystring (date-time)YesExclusive RFC 3339 range end, after from; the interval must not exceed 31 days.
limitqueryintegerNoMinimum 1, maximum 200. Default 50.

Responses

StatusMeaningError codesContent
200Service health and dependencies.application/json ApmServiceHealthResult
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Warehouse query or mandatory access audit is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
availableconstYesAlways true.
partialbooleanYes
reasonstring, nullableYesAllowed values: partial_warehouse_unavailable, source_incomplete, null.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
service_namestringYes
healthone of ApmServiceHealth or any, nullableYes
health{ApmServiceHealth}object (ApmServiceHealth)No
health{ApmServiceHealth}.service_namestring, nullableYes
health{ApmServiceHealth}.trace_countnumber, nullableYes
health{ApmServiceHealth}.error_trace_countnumber, nullableYes
health{ApmServiceHealth}.error_ratenumber, nullableYes
health{ApmServiceHealth}.p50_duration_msnumber, nullableYes
health{ApmServiceHealth}.p95_duration_msnumber, nullableYes
health{ApmServiceHealth}.completenessstringYesAllowed values: partial, unknown.
health{ApmServiceHealth}.freshness_watermarkstring (date-time), nullableYes
health_availablebooleanYes
itemsarray of ApmDependencyHealthYesAt most 200 items.
items[]object (ApmDependencyHealth)No
items[].source_servicestring, nullableYes
items[].target_servicestring, nullableYes
items[].protocolstring, nullableYes
items[].request_countnumber, nullableYes
items[].error_countnumber, nullableYes
items[].p50_duration_msnumber, nullableYes
items[].p95_duration_msnumber, nullableYes
items[].p99_duration_msnumber, nullableYes
items[].freshness_watermarkstring (date-time), nullableYes
countintegerYesMinimum 0, maximum 200.
dependencies_availablebooleanYes
truncatedbooleanYes
completenessstringYesAllowed values: partial, unknown.
freshness_watermarkstring (date-time), nullableYes

Response example (200)

{
  "ok": true,
  "available": true,
  "partial": false,
  "reason": null,
  "project_id": "checkout",
  "environment_id": "prod",
  "service_name": "checkout-api",
  "health": {
    "service_name": "checkout-api",
    "trace_count": 120,
    "error_trace_count": 3,
    "error_rate": 0.025,
    "p50_duration_ms": 42,
    "p95_duration_ms": 310,
    "completeness": "unknown",
    "freshness_watermark": "2026-09-20T12:01:00.000Z"
  },
  "health_available": true,
  "items": [
    {
      "source_service": "checkout-api",
      "target_service": "payments",
      "protocol": "http",
      "request_count": 50,
      "error_count": 1,
      "p50_duration_ms": 25,
      "p95_duration_ms": 80,
      "p99_duration_ms": 140,
      "freshness_watermark": "2026-09-20T12:01:00.000Z"
    }
  ],
  "count": 1,
  "dependencies_available": true,
  "truncated": false,
  "completeness": "unknown",
  "freshness_watermark": "2026-09-20T12:01:00.000Z"
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/services/example-serviceName/health?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/services/example-serviceName/health?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/services/example-serviceName/health?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read release health

GET /v1/apm/releases/{releaseId}/health

Returns bounded aggregate health rows for one release within the required project/environment and time range.

Authentication: Bearer token (ApiKeyAuth), scope read:apm.

Parameters

NameInTypeRequiredDescription
releaseIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
project_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idquerystringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
fromquerystring (date-time)YesInclusive RFC 3339 range start. The interval to to must not exceed 31 days.
toquerystring (date-time)YesExclusive RFC 3339 range end, after from; the interval must not exceed 31 days.
limitqueryintegerNoMinimum 1, maximum 200. Default 50.

Responses

StatusMeaningError codesContent
200Release health page.application/json ApmReleaseHealthResult
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Warehouse query or mandatory access audit is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
availableconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
release_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
itemsarray of ApmReleaseHealthYesAt most 200 items.
items[]object (ApmReleaseHealth)No
items[].release_idstring, nullableYes
items[].build_idstring, nullableYes
items[].trace_countnumber, nullableYes
items[].error_trace_countnumber, nullableYes
items[].error_ratenumber, nullableYes
items[].p50_duration_msnumber, nullableYes
items[].p95_duration_msnumber, nullableYes
items[].completenessstringYesAllowed values: partial, unknown.
items[].freshness_watermarkstring (date-time), nullableYes
countintegerYesMinimum 0, maximum 200.
truncatedbooleanYes
partialbooleanYes
completenessstringYesAllowed values: partial, unknown.
freshness_watermarkstring (date-time), nullableYes

Response example (200)

{
  "ok": true,
  "available": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "release_id": "2026.09.20",
  "items": [
    {
      "release_id": "2026.09.20",
      "build_id": "build-42",
      "trace_count": 100,
      "error_trace_count": 2,
      "error_rate": 0.02,
      "p50_duration_ms": 40,
      "p95_duration_ms": 300,
      "completeness": "unknown",
      "freshness_watermark": "2026-09-20T12:01:00.000Z"
    }
  ],
  "count": 1,
  "truncated": false,
  "partial": false,
  "completeness": "unknown",
  "freshness_watermark": "2026-09-20T12:01:00.000Z"
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/releases/example-releaseId/health?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/releases/example-releaseId/health?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/releases/example-releaseId/health?project_id=example-project_id&environment_id=example-environment_id&from=2026-01-01T00%3A00%3A00Z&to=2026-01-01T00%3A00%3A00Z",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Create an asynchronous APM export

POST /v1/apm/exports

Creates a tenant-scoped manifest for a range no longer than 31 days. This endpoint never returns storage references, credentials, or a download URL.

Authentication: Bearer token (ApiKeyAuth), scope write:apm.

Request body

Content type application/json, required.

FieldTypeRequiredDescription
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
fromstring (date-time)YesRange start; interval must not exceed 31 days.
tostring (date-time)YesRange end after from; interval must not exceed 31 days.
fact_namesarray of stringYesAt least 1 item, at most 10 items, unique items.
purposestringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9][A-Za-z0-9 ._:/-]{0,127}$.
expires_in_secondsintegerNoMinimum 60, maximum 604800. Default 3600.

Responses

StatusMeaningError codesContent
201Pending export manifest.application/json ApmExportStatus
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
201Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (201, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
export_manifest_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
purposestringYes
fact_namesarray of stringYes
statestringYesAsynchronous manifest state reported by the runtime; consumers must tolerate future states.
row_countinteger, nullableYesMinimum 0.
byte_countinteger, nullableYesMinimum 0.
created_atstring (date-time), nullableYes
expires_atstring (date-time), nullableYes
completed_atstring (date-time), nullableYes

Response example (201)

{
  "ok": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "export_manifest_id": "550e8400-e29b-41d4-a716-446655440000",
  "purpose": "incident_review",
  "fact_names": [
    "apm_spans",
    "apm_trace_summaries"
  ],
  "state": "pending",
  "row_count": null,
  "byte_count": null,
  "created_at": "2026-09-21T00:00:00.000Z",
  "expires_at": "2026-09-21T01:00:00.000Z",
  "completed_at": null
}

Example request

curl

curl -X POST "https://collect.noxtica.com/v1/apm/exports" \
  -H "Authorization: Bearer $NOXTICA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "project_id": "checkout",
  "environment_id": "prod",
  "from": "2026-09-20T00:00:00.000Z",
  "to": "2026-09-21T00:00:00.000Z",
  "fact_names": [
    "apm_spans",
    "apm_trace_summaries"
  ],
  "purpose": "incident_review",
  "expires_in_seconds": 3600
}'

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/exports', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    project_id: 'checkout',
    environment_id: 'prod',
    from: '2026-09-20T00:00:00.000Z',
    to: '2026-09-21T00:00:00.000Z',
    fact_names: [
      'apm_spans',
      'apm_trace_summaries',
    ],
    purpose: 'incident_review',
    expires_in_seconds: 3600,
  }),
});
console.log(response.status, await response.text());

Python (standard library)

import json
import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/exports",
    data=json.dumps({
        "project_id": "checkout",
        "environment_id": "prod",
        "from": "2026-09-20T00:00:00.000Z",
        "to": "2026-09-21T00:00:00.000Z",
        "fact_names": [
            "apm_spans",
            "apm_trace_summaries",
        ],
        "purpose": "incident_review",
        "expires_in_seconds": 3600,
    }).encode(),
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
        "Content-Type": "application/json",
    },
    method="POST",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read asynchronous export status

GET /v1/apm/exports/{exportId}

Returns the safe manifest projection and its real asynchronous state; no object reference or signing credential is exposed.

Authentication: Bearer token (ApiKeyAuth), scope read:export.

Parameters

NameInTypeRequiredDescription
exportIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Responses

StatusMeaningError codesContent
200Export status.application/json ApmExportStatus
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
export_manifest_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
purposestringYes
fact_namesarray of stringYes
statestringYesAsynchronous manifest state reported by the runtime; consumers must tolerate future states.
row_countinteger, nullableYesMinimum 0.
byte_countinteger, nullableYesMinimum 0.
created_atstring (date-time), nullableYes
expires_atstring (date-time), nullableYes
completed_atstring (date-time), nullableYes

Response example (200)

{
  "ok": true,
  "project_id": "checkout",
  "environment_id": "prod",
  "export_manifest_id": "550e8400-e29b-41d4-a716-446655440000",
  "purpose": "incident_review",
  "fact_names": [
    "apm_spans"
  ],
  "state": "running",
  "row_count": null,
  "byte_count": null,
  "created_at": "2026-09-21T00:00:00.000Z",
  "expires_at": "2026-09-21T01:00:00.000Z",
  "completed_at": null
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/exports/example-exportId" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/exports/example-exportId', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/exports/example-exportId",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Request an export download grant

POST /v1/apm/exports/{exportId}/download-grant

Reports readiness only. Collector signing authority is intentionally unavailable, so this launch contract never returns a URL, object reference, bearer token, or credential.

Authentication: Bearer token (ApiKeyAuth), scope read:export.

Parameters

NameInTypeRequiredDescription
exportIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Request body

Content type application/json, optional.

FieldTypeRequiredDescription
expires_in_secondsintegerNoMinimum 1, maximum 300. Default 60.

Responses

StatusMeaningError codesContent
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
409Export is not ready or failed.application/json ApmGrantUnavailable
410Export expired or was deleted.application/json ApmGrantUnavailable
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Signing authority or control-plane storage is unavailable.application/json

Response headers

StatusHeaderTypeDescription
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
409Cache-ControlconstAPM control/query responses are never cacheable.
410Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Example request

curl

curl -X POST "https://collect.noxtica.com/v1/apm/exports/example-exportId/download-grant" \
  -H "Authorization: Bearer $NOXTICA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "expires_in_seconds": 60
}'

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/exports/example-exportId/download-grant', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    expires_in_seconds: 60,
  }),
});
console.log(response.status, await response.text());

Python (standard library)

import json
import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/exports/example-exportId/download-grant",
    data=json.dumps({
        "expires_in_seconds": 60,
    }).encode(),
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
        "Content-Type": "application/json",
    },
    method="POST",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read subject export status

GET /v1/apm/privacy/subjects/{subjectHandle}/exports/{requestId}

Hashes the opaque subject handle before repository access and returns only the safe export projection. The cleartext handle and its hash are never returned.

Authentication: Bearer token (ApiKeyAuth), scope read:privacy_request.

Parameters

NameInTypeRequiredDescription
subjectHandlepathstringYesOpaque subject handle; hashed before authentication, logging, storage, or repository access. At least 16 characters, at most 512 characters. Pattern ^[A-Za-z0-9._~:/+-]+$.
requestIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Responses

StatusMeaningError codesContent
200Subject export status.application/json ApmPrivacyExportStatus
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
privacy_request_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
export_manifest_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
purposestringYes
fact_namesarray of stringYes
statestringYesAsynchronous manifest state reported by the runtime; consumers must tolerate future states.
row_countinteger, nullableYesMinimum 0.
byte_countinteger, nullableYesMinimum 0.
created_atstring (date-time), nullableYes
expires_atstring (date-time), nullableYes
completed_atstring (date-time), nullableYes

Response example (200)

{
  "ok": true,
  "privacy_request_id": "dsar-42",
  "project_id": "checkout",
  "environment_id": "prod",
  "export_manifest_id": "550e8400-e29b-41d4-a716-446655440000",
  "purpose": "privacy_subject_export",
  "fact_names": [
    "apm_spans"
  ],
  "state": "pending",
  "row_count": null,
  "byte_count": null,
  "created_at": "2026-09-21T00:00:00.000Z",
  "expires_at": "2026-09-21T01:00:00.000Z",
  "completed_at": null
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/privacy/subjects/example-subjectHandle/exports/example-requestId" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/privacy/subjects/example-subjectHandle/exports/example-requestId', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/privacy/subjects/example-subjectHandle/exports/example-requestId",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read subject erasure status

GET /v1/apm/privacy/subjects/{subjectHandle}/erasures/{requestId}

Returns aggregate deletion progress only. Subject identifiers, per-store object references, SQL, credentials, and PII are never exposed.

Authentication: Bearer token (ApiKeyAuth), scope read:privacy_request.

Parameters

NameInTypeRequiredDescription
subjectHandlepathstringYesOpaque subject handle; hashed before authentication, logging, storage, or repository access. At least 16 characters, at most 512 characters. Pattern ^[A-Za-z0-9._~:/+-]+$.
requestIdpathstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.

Responses

StatusMeaningError codesContent
200Subject erasure status.application/json ApmErasureStatus
400Closed-input validation failed.invalid_requestapplication/json ApmError
401Missing, invalid, or ingest-only credential. An sk_apm_ key is never accepted here.Unauthorizedapplication/json ApmError
403The server API key lacks the operation’s required scope.API key does not have read:apm scopeapplication/json ApmError
404The tenant-scoped resource was not found.resource_not_foundapplication/json ApmError
429V1 read rate limit exceeded.Rate limit exceededapplication/json ApmRateLimitError
503Authoritative control-plane data is unavailable.application/json ApmUnavailable

Response headers

StatusHeaderTypeDescription
200Cache-ControlconstAPM control/query responses are never cacheable.
400Cache-ControlconstAPM control/query responses are never cacheable.
401Cache-ControlconstAPM control/query responses are never cacheable.
403Cache-ControlconstAPM control/query responses are never cacheable.
404Cache-ControlconstAPM control/query responses are never cacheable.
429Cache-ControlconstAPM control/query responses are never cacheable.
503Cache-ControlconstAPM control/query responses are never cacheable.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
okconstYesAlways true.
privacy_request_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
project_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
environment_idstringYesAt least 1 character, at most 128 characters. Pattern ^[A-Za-z0-9._:-]+$.
statestringYes
attemptsintegerYesMinimum 0.
created_atstring (date-time), nullableYes
updated_atstring (date-time), nullableYes
completed_atstring (date-time), nullableYes
storesobjectYes
stores.countintegerYesMinimum 0.
stores.pendingintegerYesMinimum 0.
stores.runningintegerYesMinimum 0.
stores.succeededintegerYesMinimum 0.
stores.failedintegerYesMinimum 0.
deletedobjectYes
deleted.rowsintegerYesMinimum 0.
deleted.objectsintegerYesMinimum 0.
deleted.bytesintegerYesMinimum 0.

Response example (200)

{
  "ok": true,
  "privacy_request_id": "dsar-42",
  "project_id": "checkout",
  "environment_id": "prod",
  "state": "running",
  "attempts": 1,
  "created_at": "2026-09-21T00:00:00.000Z",
  "updated_at": "2026-09-21T00:05:00.000Z",
  "completed_at": null,
  "stores": {
    "count": 3,
    "pending": 1,
    "running": 1,
    "succeeded": 1,
    "failed": 0
  },
  "deleted": {
    "rows": 120,
    "objects": 2,
    "bytes": 4096
  }
}

Example request

curl

curl "https://collect.noxtica.com/v1/apm/privacy/subjects/example-subjectHandle/erasures/example-requestId" \
  -H "Authorization: Bearer $NOXTICA_API_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://collect.noxtica.com/v1/apm/privacy/subjects/example-subjectHandle/erasures/example-requestId', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_API_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://collect.noxtica.com/v1/apm/privacy/subjects/example-subjectHandle/erasures/example-requestId",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_API_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

List recent findings for a coding agent

GET /v1/coding-agent/findings

Reads recent raw signals for your organisation, narrowed to the scopes the coding-agent key holds. Results from every scope the key holds are merged: this route has no single required scope, and a scope narrows what is read instead of denying the call. At the time of writing the scopes rum_errors, apm_traces, apm_errors, apm_metrics and logs have a findings source; the other scopes a key can carry (profiles, fingerprint_bot_signals, kyc_risk_summaries) add nothing to this route. The signal field names the scope a row came from. An empty array is a normal answer; this route never answers 404.

since defaults to 24 hours ago and limit to 50 (maximum 200). Create a coding-agent key in the Backoffice under Integrations & API, Coding agent keys; keys start with cak_.

Authentication: Bearer token (CodingAgentKeyAuth).

Base URL: https://ingest.noxtica.com (Production).

Parameters

NameInTypeRequiredDescription
sincequerystring (date-time)NoOnly signals observed at or after this RFC 3339 instant. Defaults to 24 hours ago.
limitqueryintegerNoMaximum number of signals to return. Defaults to 50; values above 200 are clamped to 200. Minimum 1, maximum 200. Default 50.

Responses

StatusMeaningError codesContent
200A (possibly empty) array of signals.application/json
400schema_invalid — since or limit could not be parsed.schema_invalidapplication/json CodingAgentError
401coding_agent_auth_missing (no Authorization header) or coding_agent_auth_invalid (a malformed, unknown, revoked or inactive coding-agent key).coding_agent_auth_invalid, coding_agent_auth_missingapplication/json CodingAgentError
429coding_agent_rate_limited — the per-key request limit was exceeded. Wait Retry-After seconds before retrying.coding_agent_rate_limitedapplication/json CodingAgentError
502coding_agent_query_failed — the read query failed. Retry with backoff.coding_agent_query_failedapplication/json CodingAgentError
503coding_agent_authority_unavailable (the key could not be checked) or coding_agent_bq_unavailable (the read store is not available). Retry with backoff.coding_agent_authority_unavailable, coding_agent_bq_unavailableapplication/json CodingAgentError

Response headers

StatusHeaderTypeDescription
429Retry-AfterintegerSeconds until the key may call again.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
[]object (CodingAgentSignal)No
[].signalstringYesThe key scope the row came from
[].reference_idstringYesThe id of the source record (event
[].excerptstringYesA short human-readable summary of the record.
[].observed_atstring (date-time)Yes
[].metric_valuenumberNoPresent when the record carries a numeric value.

Response example (200)

[
  {
    "signal": "rum_errors",
    "reference_id": "evt_8f1c2a",
    "excerpt": "error /checkout",
    "observed_at": "2026-10-27T09:58:12Z"
  }
]

Example request

curl

curl "https://ingest.noxtica.com/v1/coding-agent/findings" \
  -H "Authorization: Bearer $NOXTICA_CODING_AGENT_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://ingest.noxtica.com/v1/coding-agent/findings', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_CODING_AGENT_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://ingest.noxtica.com/v1/coding-agent/findings",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_CODING_AGENT_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read one trace for a coding agent

GET /v1/coding-agent/traces/{trace_id}

Returns the spans of one trace (a narrow projection: attributes, events and links are never returned) from roughly the last 30 days. Requires the apm_traces scope on the key; without it the route answers 403 coding_agent_scope_denied. An unknown trace id, or one that belongs to another organisation, is a normal 200 with an empty spans array: this route never answers 404.

Authentication: Bearer token (CodingAgentKeyAuth).

Base URL: https://ingest.noxtica.com (Production).

Parameters

NameInTypeRequiredDescription
trace_idpathstringYesThe trace id.

Responses

StatusMeaningError codesContent
200The trace; spans is empty when the id is unknown.application/json CodingAgentTrace
401coding_agent_auth_missing (no Authorization header) or coding_agent_auth_invalid (a malformed, unknown, revoked or inactive coding-agent key).coding_agent_auth_invalid, coding_agent_auth_missingapplication/json CodingAgentError
403coding_agent_scope_denied — the key is valid but lacks the scope this route requires.coding_agent_scope_deniedapplication/json CodingAgentError
429coding_agent_rate_limited — the per-key request limit was exceeded. Wait Retry-After seconds before retrying.coding_agent_rate_limitedapplication/json CodingAgentError
502coding_agent_query_failed — the read query failed. Retry with backoff.coding_agent_query_failedapplication/json CodingAgentError
503coding_agent_authority_unavailable (the key could not be checked) or coding_agent_bq_unavailable (the read store is not available). Retry with backoff.coding_agent_authority_unavailable, coding_agent_bq_unavailableapplication/json CodingAgentError

Response headers

StatusHeaderTypeDescription
429Retry-AfterintegerSeconds until the key may call again.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
trace_idstringYes
spansarray of CodingAgentSpanYes
spans[]object (CodingAgentSpan)No
spans[].span_idstringYes
spans[].parent_span_idstringNo
spans[].service_namestringYes
spans[].operation_namestringYes
spans[].start_timestring (date-time)Yes
spans[].end_timestring (date-time)Yes
spans[].duration_nsinteger (int64)Yes
spans[].status_codestringYes
spans[].status_messagestringNo

Response example (200)

{
  "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
  "spans": [
    {
      "span_id": "00f067aa0ba902b7",
      "service_name": "checkout-api",
      "operation_name": "GET /health",
      "start_time": "2026-10-27T09:58:00Z",
      "end_time": "2026-10-27T09:58:00.010Z",
      "duration_ns": 10000000,
      "status_code": "STATUS_CODE_OK"
    }
  ]
}

Example request

curl

curl "https://ingest.noxtica.com/v1/coding-agent/traces/example-trace_id" \
  -H "Authorization: Bearer $NOXTICA_CODING_AGENT_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://ingest.noxtica.com/v1/coding-agent/traces/example-trace_id', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_CODING_AGENT_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://ingest.noxtica.com/v1/coding-agent/traces/example-trace_id",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_CODING_AGENT_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

Read one error group for a coding agent

GET /v1/coding-agent/errors/{error_group_id}

Returns one error group with its aggregate counts and a bounded list of recent occurrences (a narrow projection: stack frames are never returned) from roughly the last 30 days. Requires the apm_errors scope on the key; without it the route answers 403 coding_agent_scope_denied. 404 coding_agent_error_group_not_found means the group is unknown or belongs to another organisation; the two cases are indistinguishable by design.

Authentication: Bearer token (CodingAgentKeyAuth).

Base URL: https://ingest.noxtica.com (Production).

Parameters

NameInTypeRequiredDescription
error_group_idpathstringYesThe error group id.

Responses

StatusMeaningError codesContent
200The error group.application/json CodingAgentErrorGroup
401coding_agent_auth_missing (no Authorization header) or coding_agent_auth_invalid (a malformed, unknown, revoked or inactive coding-agent key).coding_agent_auth_invalid, coding_agent_auth_missingapplication/json CodingAgentError
403coding_agent_scope_denied — the key is valid but lacks the scope this route requires.coding_agent_scope_deniedapplication/json CodingAgentError
404coding_agent_error_group_not_found — the group is unknown or belongs to another organisation.coding_agent_error_group_not_foundapplication/json CodingAgentError
429coding_agent_rate_limited — the per-key request limit was exceeded. Wait Retry-After seconds before retrying.coding_agent_rate_limitedapplication/json CodingAgentError
502coding_agent_query_failed — the read query failed. Retry with backoff.coding_agent_query_failedapplication/json CodingAgentError
503coding_agent_authority_unavailable (the key could not be checked) or coding_agent_bq_unavailable (the read store is not available). Retry with backoff.coding_agent_authority_unavailable, coding_agent_bq_unavailableapplication/json CodingAgentError

Response headers

StatusHeaderTypeDescription
429Retry-AfterintegerSeconds until the key may call again.

Response fields (200, application/json)

FieldTypeAlways returnedDescription
error_group_idstringYes
first_seenstring (date-time)Yes
last_seenstring (date-time)Yes
occurrence_countinteger (int64)Yes
affected_release_idsarray of stringYes
occurrencesarray of CodingAgentErrorOccurrenceYes
occurrences[]object (CodingAgentErrorOccurrence)No
occurrences[].occurrence_idstringYes
occurrences[].exception_typestringYes
occurrences[].exception_messagestringNo
occurrences[].observed_atstring (date-time)Yes
occurrences[].release_idstringNo

Response example (200)

{
  "error_group_id": "eg_5d41402abc4b2a76",
  "first_seen": "2026-10-26T08:00:00Z",
  "last_seen": "2026-10-27T09:58:12Z",
  "occurrence_count": 42,
  "affected_release_ids": [
    "2026.10.26"
  ],
  "occurrences": [
    {
      "occurrence_id": "occ_91",
      "exception_type": "TypeError",
      "exception_message": "Cannot read properties of undefined",
      "observed_at": "2026-10-27T09:58:12Z",
      "release_id": "2026.10.26"
    }
  ]
}

Example request

curl

curl "https://ingest.noxtica.com/v1/coding-agent/errors/example-error_group_id" \
  -H "Authorization: Bearer $NOXTICA_CODING_AGENT_KEY"

Node.js (global fetch, Node 18 or later)

const response = await fetch('https://ingest.noxtica.com/v1/coding-agent/errors/example-error_group_id', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.NOXTICA_CODING_AGENT_KEY}`,
  },
});
console.log(response.status, await response.text());

Python (standard library)

import os
import urllib.request

request = urllib.request.Request(
    "https://ingest.noxtica.com/v1/coding-agent/errors/example-error_group_id",
    headers={
        "Authorization": f"Bearer {os.environ['NOXTICA_CODING_AGENT_KEY']}",
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(response.status, response.read().decode())

This page is generated from the Noxtica OpenAPI specification release v0.4.0: v1.yaml version 1.3.0-2026-10-27 (SHA-256 3fd15257a022). Do not edit it by hand.