Nurtra API v1 Authenticate every request with an organisation API key, minted under Settings → API & Integrations in the CRM: Authorization: Bearer nk_live_... Or sign in as a person (the mobile app's way) and use the session token the same way: POST /v1/auth/login {"email": "...", "password": "...", "device": "iPhone 15 · Nurtra 1.0"} → {"token": "nk_user_...", ...} POST /v1/auth/login/google {"idToken": "...", "device": "..."} → the same, from a Google sign-in on the phone POST /v1/auth/login/microsoft {"idToken": "...", "device": "..."} → the same, from a Microsoft sign-in on the phone POST /v1/auth/login/apple {"idToken": "...", "authorizationCode": "...", "nonce": "...", "device": "..."} → the same, or 401 apple_not_linked with a linkToken to send with one of the sign-ins above POST /v1/auth/logout ends that session; a password reset or a disabled account ends it too Endpoints: GET /v1/me who this key or person is — organisation, permissions, centres, connected Apple ID POST|DELETE /v1/me/identities/apple connect or disconnect the signed-in person's Apple ID GET /v1/centres the centres the key may see GET /v1/pipeline the pipeline's stages GET /v1/leads families, newest first (search, stage, centreId, createdSince, page, pageSize) — search is the CRM's search box: family, guardian or child name, phone or email, best match first GET /v1/leads/{id} one family POST /v1/leads create an enquiry (Idempotency-Key header honoured; duplicates answer 409) GET /v1/tours every family's tour, soonest first (status, centreId, from, to, order, page, pageSize) GET /v1/tours/{leadId} one family's tour — the same shape, with the centre, host, notes and outcome GET /v1/waitlist the children waiting for a place, longest wait first (centreId, order, page, pageSize) Website chats with prospective parents, for signed-in people who work families (a key has nobody to answer as): GET /v1/chats conversations, newest activity first (status=open|closed|all, waiting=true, centreId, page, pageSize) GET /v1/chats/{id} one conversation with its messages — after= for only the newer ones, which is how to poll POST /v1/chats/{id}/reply {"body": "..."} → the reply, under the person's name; the family's widget shows it within seconds POST /v1/chats/{id}/close end the conversation; a family on record gets the transcript on their timeline POST /v1/chats/{id}/lead {"leadId": "..."} → tie the conversation to a family on record A family's message queues a push to the registered phones (data.type "chat", with the threadId) — once per stretch of waiting. The dashboard's AI, for signed-in people (a key has nobody to answer for): GET /v1/ai/ask the ask bar's suggested questions, and whether a model is switched on POST /v1/ai/ask {"question": "..."} → an answer from the person's own pipeline, with pages worth opening GET /v1/ai/findings the findings card — kind=dashboard (default) | consultants | demand POST /v1/ai/findings/refresh regenerate the findings now, as the card's Refresh button does Rate limit: 120 requests a minute per key, over a one-minute window. Past it the API answers 429 with an error whose code is "rate_limited" and a Retry-After header saying how many seconds to wait. Page through /v1/leads and /v1/tours with page and pageSize (up to 200) rather than polling one family at a time. The AI endpoints are limited separately, to 20 a minute per session, because each may reach the model. Try it in the browser: https://api.nurtra.ai/docs Reference (OpenAPI): https://api.nurtra.ai/openapi/v1.json