Developer docs

Reference

Every operation of the customer API: method, path, scope, parameters, an example response and the errors it can return.

Every operation below belongs to the customer API under https://app.sip.coach/api/public/v1 and requires the key scope named in the Authorization header (except /me). Every response also carries X-Request-Id and the RateLimit-* headers; every POST operation accepts Idempotency-Key — details on the overview page. This page is generated from the same code as openapi.v1.json and therefore always reflects the operations that are actually reachable.

Account

GET /me no scope
Get the current tenant
Tenant, scopes, rate limit and privacy switches of the API key used.

Example response:

{
  "kind": "team",
  "privacy": {
    "member_detail_enabled": true
  },
  "rate_limit_per_min": 600,
  "scopes": [
    "users:read",
    "trainings:read"
  ],
  "tenant_id": "6a9c3e3e-9b8e-4b7b-9e9d-2b7b1a2c3d4e"
}
401 unauthorized403 api_disabled422 validation_error429 rate_limited503 unavailable

Members

GET /users scope: users:read
List members
Active and invited team members. email is present only when the team's member_detail_enabled switch is on.
ParameterType
cursor (Query, optional)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "email": "anna@example.com",
      "id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
      "joined_at": "2026-09-01T08:00:00Z",
      "role": "member",
      "status": "active",
      "user_id": "2c0f3c4d-5e6f-7081-92a3-b4c5d6e7f809"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error429 rate_limited503 unavailable
POST /users scope: users:write
Invite a member
Invites a new team member by email. 409 seat_limit_reached if no seat is free; 409 conflict if the email already belongs to a member of this team or is the team's owner. A role other than member grants that role's rights and follows the same rules as PATCH /users/{member_id} (403 insufficient_scope otherwise). Rate limited to 60 invitations per hour per team.

Request body:

FieldTypeRequired
emailstringyes
rolestringno
langstringno

Example request:

{
  "email": "jordan@example.com",
  "role": "member"
}

Example response:

{
  "email": "anna@example.com",
  "id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
  "joined_at": "2026-09-01T08:00:00Z",
  "role": "member",
  "status": "active",
  "user_id": "2c0f3c4d-5e6f-7081-92a3-b4c5d6e7f809"
}
401 unauthorized403 insufficient_scope/api_disabled409 conflict/seat_limit_reached422 validation_error/idempotency_mismatch429 rate_limited503 unavailable
GET /users/{member_id} scope: users:read
Get a member
A single team member; a foreign id returns 404.
ParameterType
member_id (path, required)string

Example response:

{
  "email": "anna@example.com",
  "id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
  "joined_at": "2026-09-01T08:00:00Z",
  "role": "member",
  "status": "active",
  "user_id": "2c0f3c4d-5e6f-7081-92a3-b4c5d6e7f809"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable
PATCH /users/{member_id} scope: users:write
Change a member's role
409 last_admin if this would leave the team without any admin member; 409 owner for the team's owner. Granting or revoking the admin role requires a key created by the team's owner or an active admin, otherwise 403 insufficient_scope. email is present only when the team's member_detail_enabled switch is on.
ParameterType
member_id (path, required)string

Request body:

FieldTypeRequired
rolestringyes

Example request:

{
  "role": "admin"
}

Example response:

{
  "email": "anna@example.com",
  "id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
  "joined_at": "2026-09-01T08:00:00Z",
  "role": "member",
  "status": "active",
  "user_id": "2c0f3c4d-5e6f-7081-92a3-b4c5d6e7f809"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found409 owner/last_admin422 validation_error429 rate_limited503 unavailable
DELETE /users/{member_id} scope: users:write
End a membership
409 owner if the member is the team's owner; 409 last_admin if the member is the team's only active admin. Revokes any learning assignments in the same step.
ParameterType
member_id (path, required)string

Example response:

{
  "ok": true
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found409 owner/last_admin422 validation_error429 rate_limited503 unavailable

Trainings

GET /trainings scope: trainings:read
List trainings
Training sessions of active members, filtered by user_id, status, since and assignment_id. Requires member_detail_enabled on the team; otherwise 403 privacy_restricted.
ParameterType
cursor (Query, optional)string
user_id (Query, optional)string
status (Query, optional)string
since (Query, optional)date-time
assignment_id (Query, optional)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "created_at": "2026-10-14T08:30:00Z",
      "duration_s": 900,
      "finished_at": "2026-10-14T08:42:10Z",
      "id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
      "industry_id": "saas",
      "personality_id": "skeptiker",
      "role_id": "einkauf",
      "situation_id": "kaltakquise",
      "source": "app",
      "status": "scored",
      "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted422 validation_error429 rate_limited503 unavailable
GET /trainings/{training_id} scope: trainings:read
Get a training
Metadata of a single training session; no transcript in v1.
ParameterType
training_id (path, required)string

Example response:

{
  "created_at": "2026-10-14T08:30:00Z",
  "duration_s": 900,
  "finished_at": "2026-10-14T08:42:10Z",
  "id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
  "industry_id": "saas",
  "personality_id": "skeptiker",
  "role_id": "einkauf",
  "situation_id": "kaltakquise",
  "source": "app",
  "status": "scored",
  "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted404 not_found422 validation_error429 rate_limited503 unavailable

Evaluations

GET /evaluations scope: evaluations:read
List scored trainings
Scored training sessions for reconciliation via ?updated_since=; same shape as GET /trainings.
ParameterType
cursor (Query, optional)string
updated_since (Query, optional)date-time
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "created_at": "2026-10-14T08:30:00Z",
      "duration_s": 900,
      "finished_at": "2026-10-14T08:42:10Z",
      "id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
      "industry_id": "saas",
      "personality_id": "skeptiker",
      "role_id": "einkauf",
      "situation_id": "kaltakquise",
      "source": "app",
      "status": "scored",
      "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted422 validation_error429 rate_limited503 unavailable
GET /trainings/{training_id}/evaluation scope: evaluations:read
Get an evaluation
Score, five dimensions, goal, strongest point, biggest lever and up to five tips of a scored training. 404 until scored.
ParameterType
training_id (path, required)string

Example response:

{
  "biggest_lever": "Close earlier",
  "goal": "partial",
  "methodology": "needs_qual",
  "score": {
    "dimensions": {
      "closing": 72,
      "conversation_control": 78,
      "needs_analysis": 71,
      "objection_handling": 80,
      "value_argument": 69
    },
    "spread": 3,
    "total": 74
  },
  "strongest": "Good discovery questions",
  "tips": [
    {
      "impact": "sounds more confident",
      "issue": "too hesitant",
      "moment": "Line 4",
      "principle": "State it clearly",
      "rewrite": "Let's lock that in."
    }
  ],
  "training_id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
  "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted404 not_found422 validation_error429 rate_limited503 unavailable

Assignments

GET /assignments scope: assignments:read
List assignments
Team assignments. Requires member_detail_enabled on the team; otherwise 403 privacy_restricted.
ParameterType
cursor (Query, optional)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "created_at": "2026-10-01T09:00:00Z",
      "due_date": "2026-10-20",
      "id": "9a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
      "industry_id": "saas",
      "member_email": "anna@example.com",
      "member_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
      "personality_id": "skeptiker",
      "situation_id": "kaltakquise",
      "status": "open",
      "title": "Practise cold calling"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted422 validation_error429 rate_limited503 unavailable
POST /assignments scope: assignments:write
Create an assignment
Checks the combination against the recipient's effective policy; 403 vorgabe_gesperrt if blocked.

Request body:

FieldTypeRequired
member_idstringyes
titlestringyes
situation_idstringyes
personality_idstringyes
industry_idstringyes
notestringno
due_datedateno

Example request:

{
  "member_id": "b3b2b1a0-1234-4a3b-8c9d-0e1f2a3b4c5d",
  "title": "Objection handling drill",
  "situation_id": "kaltakquise",
  "personality_id": "skeptiker",
  "industry_id": "saas",
  "due_date": "2026-10-15"
}

Example response:

{
  "created_at": "2026-10-01T09:00:00Z",
  "due_date": "2026-10-20",
  "id": "9a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
  "industry_id": "saas",
  "member_email": "anna@example.com",
  "member_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
  "personality_id": "skeptiker",
  "situation_id": "kaltakquise",
  "status": "open",
  "title": "Practise cold calling"
}
401 unauthorized403 insufficient_scope/api_disabled/vorgabe_gesperrt422 validation_error/idempotency_mismatch/kombination_ungueltig429 rate_limited503 unavailable
GET /assignments/{assignment_id} scope: assignments:read
Get an assignment
A single team assignment; a foreign id returns 404. Requires member_detail_enabled on the team; otherwise 403 privacy_restricted.
ParameterType
assignment_id (path, required)string

Example response:

{
  "created_at": "2026-10-01T09:00:00Z",
  "due_date": "2026-10-20",
  "id": "9a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
  "industry_id": "saas",
  "member_email": "anna@example.com",
  "member_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
  "personality_id": "skeptiker",
  "situation_id": "kaltakquise",
  "status": "open",
  "title": "Practise cold calling"
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted404 not_found422 validation_error429 rate_limited503 unavailable
PATCH /assignments/{assignment_id} scope: assignments:write
Update an assignment
Updates status, note and/or due_date. 404 for a foreign or unknown id.
ParameterType
assignment_id (path, required)string

Request body:

FieldTypeRequired
statusstringno
notestringno
due_datedateno

Example request:

{
  "status": "done"
}

Example response:

{
  "created_at": "2026-10-01T09:00:00Z",
  "due_date": "2026-10-20",
  "id": "9a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
  "industry_id": "saas",
  "member_email": "anna@example.com",
  "member_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
  "personality_id": "skeptiker",
  "situation_id": "kaltakquise",
  "status": "open",
  "title": "Practise cold calling"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable
DELETE /assignments/{assignment_id} scope: assignments:write
Delete an assignment
Deletes the assignment. 404 for a foreign or unknown id.
ParameterType
assignment_id (path, required)string

Example response:

{
  "ok": true
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable

Cases

GET /cases scope: cases:read
List cases
Team cases only — a member's private case is never returned. Requires member_detail_enabled on the team; otherwise 403 privacy_restricted.
ParameterType
cursor (Query, optional)string
user_id (Query, optional)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "created_at": "2026-09-20T07:00:00Z",
      "external_ref": {
        "id": "123",
        "object": "deal",
        "system": "hubspot"
      },
      "fields": {},
      "id": "5c6d7e8f-9011-4213-8495-c6d7e8f90123",
      "persona_id": "kaltakquise:skeptiker:saas",
      "title": "Deal Acme Corp",
      "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted422 validation_error429 rate_limited503 unavailable
POST /cases scope: cases:write
Create a case
user_id must be an active member of the calling team; a foreign or unknown id returns 404.

Request body:

FieldTypeRequired
user_idstringyes
titlestringno
fieldsobjectno
persona_idstringno
external_refobjectno

Example request:

{
  "user_id": "b3b2b1a0-1234-4a3b-8c9d-0e1f2a3b4c5d",
  "title": "Acme Corp — renewal",
  "fields": {
    "amount": 12000,
    "stage": "negotiation"
  }
}

Example response:

{
  "created_at": "2026-09-20T07:00:00Z",
  "external_ref": {
    "id": "123",
    "object": "deal",
    "system": "hubspot"
  },
  "fields": {},
  "id": "5c6d7e8f-9011-4213-8495-c6d7e8f90123",
  "persona_id": "kaltakquise:skeptiker:saas",
  "title": "Deal Acme Corp",
  "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error/idempotency_mismatch429 rate_limited503 unavailable
GET /cases/{case_id} scope: cases:read
Get a case
A single team case; a foreign id returns 404. Requires member_detail_enabled on the team; otherwise 403 privacy_restricted.
ParameterType
case_id (path, required)string

Example response:

{
  "created_at": "2026-09-20T07:00:00Z",
  "external_ref": {
    "id": "123",
    "object": "deal",
    "system": "hubspot"
  },
  "fields": {},
  "id": "5c6d7e8f-9011-4213-8495-c6d7e8f90123",
  "persona_id": "kaltakquise:skeptiker:saas",
  "title": "Deal Acme Corp",
  "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
}
401 unauthorized403 insufficient_scope/api_disabled/privacy_restricted404 not_found422 validation_error429 rate_limited503 unavailable
PATCH /cases/{case_id} scope: cases:write
Update a case
Updates title, fields, persona_id and/or external_ref. 404 for a foreign or unknown id.
ParameterType
case_id (path, required)string

Request body:

FieldTypeRequired
titlestringno
fieldsobjectno
persona_idstringno
external_refobjectno

Example request:

{
  "fields": {
    "stage": "won"
  }
}

Example response:

{
  "created_at": "2026-09-20T07:00:00Z",
  "external_ref": {
    "id": "123",
    "object": "deal",
    "system": "hubspot"
  },
  "fields": {},
  "id": "5c6d7e8f-9011-4213-8495-c6d7e8f90123",
  "persona_id": "kaltakquise:skeptiker:saas",
  "title": "Deal Acme Corp",
  "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable
DELETE /cases/{case_id} scope: cases:write
Delete a case
Deletes the case. 404 for a foreign or unknown id.
ParameterType
case_id (path, required)string

Example response:

{
  "ok": true
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable

Catalog

GET /catalog scope: catalog:read
Get the catalog
Platform catalog restricted to the team's effective policy, labelled by Accept-Language.

Example response:

{
  "industry": [
    {
      "icon": "cloud",
      "id": "saas",
      "name": "SaaS"
    }
  ],
  "methodology": [
    {
      "icon": "list",
      "id": "needs_qual",
      "name": "Needs qualification"
    }
  ],
  "personality": [
    {
      "icon": "shield",
      "id": "skeptiker",
      "name": "Skeptic"
    }
  ],
  "role": [
    {
      "icon": "briefcase",
      "id": "einkauf",
      "name": "Procurement"
    }
  ],
  "situation": [
    {
      "icon": "phone",
      "id": "kaltakquise",
      "name": "Cold calling"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error429 rate_limited503 unavailable

Analytics

GET /analytics/team scope: analytics:read
Get team analytics
Aggregated team analytics; members is empty unless the team has member_detail_enabled and leaderboard_enabled on and at least 5 active members.

Example response:

{
  "dimensions": [
    {
      "dimension": "needs_analysis",
      "value": 71
    }
  ],
  "members": [],
  "skill_gaps": [
    "closing"
  ],
  "totals": {
    "active_members": 9,
    "avg_score": 71.5,
    "scored": 38,
    "sessions": 42
  },
  "trend": [
    {
      "score": 68
    },
    {
      "score": 72
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error429 rate_limited503 unavailable

CRM

GET /crm/deals scope: cases:read
List synchronized CRM deals
owner_user_id is present only when member_detail_enabled is on for the team; otherwise the field is left out (other fields are unaffected).
ParameterType
cursor (Query, optional)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "amount": "1000.00",
      "close_date": "2026-11-01",
      "currency": "EUR",
      "external_id": "123",
      "id": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809",
      "industry_id": "saas",
      "last_activity_at": "2026-10-10T09:00:00Z",
      "outcome": "open",
      "owner_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
      "pipeline_id": "default",
      "probability": 60,
      "stage_id": "contractsent",
      "synced_at": "2026-10-14T06:00:00Z",
      "title": "Acme Corp"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error429 rate_limited503 unavailable
GET /crm/objections scope: cases:read
List the team's objection catalog
The team's synchronized objection catalog, paginated.
ParameterType
cursor (Query, optional)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "category": "price",
      "created_at": "2026-10-09T11:00:00Z",
      "deal_id": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809",
      "id": "42",
      "lang": "en",
      "text": "Too expensive compared to the incumbent."
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error429 rate_limited503 unavailable

Webhooks

GET /webhook-endpoints scope: webhooks:manage
List webhook endpoints
Webhook endpoints of the calling tenant. secret is never included (only the response to POST carries it, once).

Example response:

{
  "data": [
    {
      "api_version": "2026-10",
      "created_at": "2026-10-01T09:00:00Z",
      "description": "CRM sync",
      "events": [
        "training.completed",
        "evaluation.completed"
      ],
      "id": "7c3b2a1d-0000-4000-8000-0123456789ab",
      "last_success_at": "2026-10-14T08:00:00Z",
      "status": "active",
      "url": "https://hooks.example.com/sip"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error429 rate_limited503 unavailable
POST /webhook-endpoints scope: webhooks:manage
Create a webhook endpoint
The target URL must be HTTPS and publicly routable. secret is returned only in this response — it is never shown again.

Request body:

FieldTypeRequired
urlstringyes
descriptionstringno
eventsarrayyes

Example request:

{
  "url": "https://example.com/webhooks/sip-coach",
  "description": "Production",
  "events": [
    "training.completed",
    "evaluation.completed"
  ]
}

Example response:

{
  "api_version": "2026-10",
  "created_at": "2026-10-01T09:00:00Z",
  "description": "CRM sync",
  "events": [
    "training.completed",
    "evaluation.completed"
  ],
  "id": "7c3b2a1d-0000-4000-8000-0123456789ab",
  "last_success_at": "2026-10-14T08:00:00Z",
  "secret": "whsec_7f3c1a2b3c4d5e6f70819293a4b5c6d7",
  "status": "active",
  "url": "https://hooks.example.com/sip"
}
401 unauthorized403 insufficient_scope/api_disabled422 validation_error/idempotency_mismatch429 rate_limited503 unavailable
PATCH /webhook-endpoints/{endpoint_id} scope: webhooks:manage
Update a webhook endpoint
Updates url, description, events and/or status. 404 for a foreign or unknown id.
ParameterType
endpoint_id (path, required)string

Request body:

FieldTypeRequired
urlstringno
descriptionstringno
eventsarrayno
statusstringno

Example request:

{
  "status": "active"
}

Example response:

{
  "api_version": "2026-10",
  "created_at": "2026-10-01T09:00:00Z",
  "description": "CRM sync",
  "events": [
    "training.completed",
    "evaluation.completed"
  ],
  "id": "7c3b2a1d-0000-4000-8000-0123456789ab",
  "last_success_at": "2026-10-14T08:00:00Z",
  "status": "active",
  "url": "https://hooks.example.com/sip"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable
DELETE /webhook-endpoints/{endpoint_id} scope: webhooks:manage
Delete a webhook endpoint
Deletes the endpoint; queued deliveries for it are dropped. 404 for a foreign or unknown id.
ParameterType
endpoint_id (path, required)string

Example response:

{
  "ok": true
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable
POST /webhook-endpoints/{endpoint_id}/test scope: webhooks:manage
Send a test event
Queues a single ping event for delivery by the background delivery loop (picked up within seconds); the outcome appears in GET .../deliveries under the returned delivery_id.
ParameterType
endpoint_id (path, required)string

Example response:

{
  "delivery_id": "42",
  "status": "pending"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error/idempotency_mismatch429 rate_limited503 unavailable
POST /webhook-deliveries/{delivery_id}/retry scope: webhooks:manage
Retry a failed delivery now
Retries a failed or given-up delivery now, instead of waiting for the next scheduled attempt. 404 for a foreign or unknown delivery id.
ParameterType
delivery_id (path, required)string

Example response:

{
  "attempt": 1,
  "created_at": "2026-10-14T07:59:00Z",
  "event_type": "training.completed",
  "id": "42",
  "next_try_at": "2026-10-14T08:00:00Z",
  "response_code": 200,
  "response_excerpt": "ok",
  "response_ms": 120,
  "status": "ok"
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error/idempotency_mismatch429 rate_limited503 unavailable
GET /webhook-endpoints/{endpoint_id}/deliveries scope: webhooks:manage
List recent deliveries of an endpoint
The most recent delivery attempts for one endpoint, newest first. 404 for a foreign or unknown endpoint id.
ParameterType
endpoint_id (path, required)string
limit (Query, optional)integer

Example response:

{
  "data": [
    {
      "attempt": 1,
      "created_at": "2026-10-14T07:59:00Z",
      "event_type": "training.completed",
      "id": "42",
      "next_try_at": "2026-10-14T08:00:00Z",
      "response_code": 200,
      "response_excerpt": "ok",
      "response_ms": 120,
      "status": "ok"
    }
  ]
}
401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable