- Home
- Entwickler
- Referenz
Referenz
Jede Operation der Kunden-API: Methode, Pfad, Scope, Parameter, Beispielantwort und mögliche Fehler.
Jede Operation unten gehört zur Kunden-API unter
https://app.sip.coach/api/public/v1 und verlangt den im Kopf
Authorization genannten Schlüssel-Scope (Ausnahme /me). Jede
Antwort trägt zusätzlich X-Request-Id und die RateLimit-*-Köpfe;
jede POST-Operation akzeptiert Idempotency-Key — Details dazu auf
der Übersichtsseite. Diese Seite wird aus demselben Code erzeugt
wie openapi.v1.json und bildet deshalb immer die
tatsächlich erreichbaren Operationen ab.
Konto
/me
kein Scope
Beispielantwort:
{
"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 unavailableMitglieder
/users
scope: users:read
email erscheint nur, wenn der Schalter member_detail_enabled des Teams an ist.| Parameter | Typ |
|---|---|
cursor (Query, optional) | string |
limit (Query, optional) | integer |
Beispielantwort:
{
"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/users
scope: users:write
seat_limit_reached, wenn kein Platz frei ist; 409 conflict, wenn die E-Mail bereits einem Mitglied dieses Teams oder dem Inhaber gehört. Eine andere Rolle als member gewährt deren Rechte und folgt denselben Regeln wie PATCH /users/{member_id} (sonst 403 insufficient_scope). Begrenzt auf 60 Einladungen pro Stunde und Team.Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
email | string | ja |
role | string | nein |
lang | string | nein |
Beispielanfrage:
{
"email": "jordan@example.com",
"role": "member"
}Beispielantwort:
{
"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/users/{member_id}
scope: users:read
| Parameter | Typ |
|---|---|
member_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"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/users/{member_id}
scope: users:write
last_admin, wenn das Team dadurch ohne admin-Mitglied bliebe; 409 owner beim Inhaber des Teams. Die Rolle admin zu vergeben oder zu entziehen verlangt einen Schlüssel des Inhabers oder eines aktiven Admins, sonst 403 insufficient_scope. email erscheint nur, wenn der Schalter member_detail_enabled des Teams an ist.| Parameter | Typ |
|---|---|
member_id (Pfad, Pflicht) | string |
Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
role | string | ja |
Beispielanfrage:
{
"role": "admin"
}Beispielantwort:
{
"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/users/{member_id}
scope: users:write
owner, wenn das Mitglied der Inhaber des Teams ist; 409 last_admin, wenn es der einzige aktive Administrator ist. Zieht in derselben Transaktion alle Lernzuweisungen zurück.| Parameter | Typ |
|---|---|
member_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"ok": true
}401 unauthorized403 insufficient_scope/api_disabled404 not_found409 owner/last_admin422 validation_error429 rate_limited503 unavailableTrainings
/trainings
scope: trainings:read
user_id, status, since und assignment_id. Verlangt member_detail_enabled am Team; sonst 403 privacy_restricted.| Parameter | Typ |
|---|---|
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 |
Beispielantwort:
{
"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/trainings/{training_id}
scope: trainings:read
| Parameter | Typ |
|---|---|
training_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"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 unavailableBewertungen
/evaluations
scope: evaluations:read
?updated_since=; dieselbe Form wie GET /trainings.| Parameter | Typ |
|---|---|
cursor (Query, optional) | string |
updated_since (Query, optional) | date-time |
limit (Query, optional) | integer |
Beispielantwort:
{
"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/trainings/{training_id}/evaluation
scope: evaluations:read
| Parameter | Typ |
|---|---|
training_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"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 unavailableZuweisungen
/assignments
scope: assignments:read
member_detail_enabled am Team; sonst 403 privacy_restricted.| Parameter | Typ |
|---|---|
cursor (Query, optional) | string |
limit (Query, optional) | integer |
Beispielantwort:
{
"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/assignments
scope: assignments:write
vorgabe_gesperrt, wenn gesperrt.Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
member_id | string | ja |
title | string | ja |
situation_id | string | ja |
personality_id | string | ja |
industry_id | string | ja |
note | string | nein |
due_date | date | nein |
Beispielanfrage:
{
"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"
}Beispielantwort:
{
"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/assignments/{assignment_id}
scope: assignments:read
member_detail_enabled am Team; sonst 403 privacy_restricted.| Parameter | Typ |
|---|---|
assignment_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"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/assignments/{assignment_id}
scope: assignments:write
status, note und/oder due_date. 404 für eine fremde oder unbekannte Kennung.| Parameter | Typ |
|---|---|
assignment_id (Pfad, Pflicht) | string |
Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
status | string | nein |
note | string | nein |
due_date | date | nein |
Beispielanfrage:
{
"status": "done"
}Beispielantwort:
{
"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/assignments/{assignment_id}
scope: assignments:write
| Parameter | Typ |
|---|---|
assignment_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"ok": true
}401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailableFälle
/cases
scope: cases:read
member_detail_enabled am Team; sonst 403 privacy_restricted.| Parameter | Typ |
|---|---|
cursor (Query, optional) | string |
user_id (Query, optional) | string |
limit (Query, optional) | integer |
Beispielantwort:
{
"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/cases
scope: cases:write
user_id muss ein aktives Mitglied des aufrufenden Teams sein; eine fremde oder unbekannte Kennung liefert 404.Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
user_id | string | ja |
title | string | nein |
fields | object | nein |
persona_id | string | nein |
external_ref | object | nein |
Beispielanfrage:
{
"user_id": "b3b2b1a0-1234-4a3b-8c9d-0e1f2a3b4c5d",
"title": "Acme Corp — renewal",
"fields": {
"amount": 12000,
"stage": "negotiation"
}
}Beispielantwort:
{
"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/cases/{case_id}
scope: cases:read
member_detail_enabled am Team; sonst 403 privacy_restricted.| Parameter | Typ |
|---|---|
case_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"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/cases/{case_id}
scope: cases:write
title, fields, persona_id und/oder external_ref. 404 für eine fremde oder unbekannte Kennung.| Parameter | Typ |
|---|---|
case_id (Pfad, Pflicht) | string |
Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
title | string | nein |
fields | object | nein |
persona_id | string | nein |
external_ref | object | nein |
Beispielanfrage:
{
"fields": {
"stage": "won"
}
}Beispielantwort:
{
"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/cases/{case_id}
scope: cases:write
| Parameter | Typ |
|---|---|
case_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"ok": true
}401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailableKatalog
/catalog
scope: catalog:read
Accept-Language.Beispielantwort:
{
"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 unavailableAuswertung
/analytics/team
scope: analytics:read
members bleibt leer, solange member_detail_enabled und leaderboard_enabled nicht beide an sind oder weniger als 5 aktive Mitglieder betroffen sind.Beispielantwort:
{
"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 unavailableCRM
/crm/deals
scope: cases:read
owner_user_id steht nur drin, wenn member_detail_enabled am Team an ist; die übrigen Felder sind davon unberührt.| Parameter | Typ |
|---|---|
cursor (Query, optional) | string |
limit (Query, optional) | integer |
Beispielantwort:
{
"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/crm/objections
scope: cases:read
| Parameter | Typ |
|---|---|
cursor (Query, optional) | string |
limit (Query, optional) | integer |
Beispielantwort:
{
"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 unavailableWebhooks
/webhook-endpoints
scope: webhooks:manage
secret ist nie enthalten (nur die Antwort auf POST trägt es, einmalig).Beispielantwort:
{
"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/webhook-endpoints
scope: webhooks:manage
secret steht nur in dieser Antwort — danach wird es nie wieder angezeigt.Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
url | string | ja |
description | string | nein |
events | array | ja |
Beispielanfrage:
{
"url": "https://example.com/webhooks/sip-coach",
"description": "Production",
"events": [
"training.completed",
"evaluation.completed"
]
}Beispielantwort:
{
"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/webhook-endpoints/{endpoint_id}
scope: webhooks:manage
url, description, events und/oder status. 404 für eine fremde oder unbekannte Kennung.| Parameter | Typ |
|---|---|
endpoint_id (Pfad, Pflicht) | string |
Anfragekörper:
| Feld | Typ | Pflicht |
|---|---|---|
url | string | nein |
description | string | nein |
events | array | nein |
status | string | nein |
Beispielanfrage:
{
"status": "active"
}Beispielantwort:
{
"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/webhook-endpoints/{endpoint_id}
scope: webhooks:manage
| Parameter | Typ |
|---|---|
endpoint_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"ok": true
}401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error429 rate_limited503 unavailable/webhook-endpoints/{endpoint_id}/test
scope: webhooks:manage
ping-Ereignis zur Zustellung über die Hintergrundschleife ein (innerhalb von Sekunden abgeholt); das Ergebnis erscheint unter GET .../deliveries zur zurückgegebenen delivery_id.| Parameter | Typ |
|---|---|
endpoint_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"delivery_id": "42",
"status": "pending"
}401 unauthorized403 insufficient_scope/api_disabled404 not_found422 validation_error/idempotency_mismatch429 rate_limited503 unavailable/webhook-deliveries/{delivery_id}/retry
scope: webhooks:manage
| Parameter | Typ |
|---|---|
delivery_id (Pfad, Pflicht) | string |
Beispielantwort:
{
"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/webhook-endpoints/{endpoint_id}/deliveries
scope: webhooks:manage
| Parameter | Typ |
|---|---|
endpoint_id (Pfad, Pflicht) | string |
limit (Query, optional) | integer |
Beispielantwort:
{
"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