API reference
The route list verified against the backend routers, grouped by task, with the key scope each needs, plus the generated OpenAPI document.
Two references, and which to trust for what:
- The route list on this page is read from the backend's routers and is the complete public surface, with the key scope each route requires. It is the authoritative list.
- The generated OpenAPI document (
/openapi/anybio-v1.json) carries request and response schemas for the documented handlers. It is a subset of the route list. The API also serves the document for the deployed version atGET /api-docs/openapi.json,GET /api-docs/openapi.yamland a browsable UI at/swagger-ui/.
Where the generated document and the mounted routes differ, this page uses the mounted paths: /api/v1/developer/keys and /api/v1/ingest/sessions/start.
Conventions
- Base URL
https://api.anybio.io. Paths below are absolute. - Authentication
Authorization: Bearer <key>. API keys are created in the dashboard (Write scope keys start withsk_sandbox_orsk_prod_; older keys start withorg_). A key is bound to one environment; the request's environment is the key's. Browser sessions (the dashboard) and short-lived SDK tokens (POST /api/v1/sdk/token) use the same header. - Scopes
Read,Write,Admin,Sdk. Each group below states what its reads and writes need. A handful of routes additionally require a signed-in staff member and refuse API keys outright; they are marked. - Environment header A dashboard session may send
X-Environment-Idon writes; a mismatch with the session's environment is a409. API keys do not need it. - Caching Responses that carry patient identifiers are sent
Cache-Control: no-store; every error response isno-store. - Rate limits Per-session limits on the authenticated API and per-IP limits on the public routes return
429. Sandbox organizations are capped, never invoiced; a write against an expired sandbox trial returns402. - Path parameters are written
{name}. Ids are UUIDs unless the name says otherwise (project_id,key_id,biosignal_idare integers).
Programs
Read scope for GET, Write for the rest.
| Method | Path | Notes |
|---|---|---|
| GET | /api/v1/episode-profiles | filters project_id, status |
| GET | /api/v1/episode-profiles/count | |
| GET | /api/v1/episode-profiles/{id} | |
| GET | /api/v1/episode-profiles/{id}/status | |
| GET | /api/v1/episode-profiles/{id}/protocol-state | authoring draft state |
| GET | /api/v1/episode-profiles/{id}/symptom-readiness | program-scoped readiness ladder |
| GET | /api/v1/episode-profiles/{id}/enrollments/count | |
| GET | /api/v1/episode-profiles/{id}/qr.png | enrollment QR |
| GET | /api/v1/episode-profiles/{id}/versions | |
| GET | /api/v1/episode-profiles/sessions | authoring sessions |
| GET | /api/v1/biosignals/available | signals a program may require |
| POST | /api/v1/episode-profiles | create (201) |
| POST | /api/v1/episode-profiles/validate | validate a spec without saving |
| POST | /api/v1/episode-profiles/sessions | start an authoring session |
| PATCH | /api/v1/episode-profiles/{id} | |
| DELETE | /api/v1/episode-profiles/{id} | soft delete |
| POST | /api/v1/episode-profiles/{id}/activate | |
| POST | /api/v1/episode-profiles/{id}/deprecate | |
| POST | /api/v1/episode-profiles/{id}/toggle-active | |
| POST | /api/v1/episode-profiles/{id}/clone | body target_project_id |
| POST | /api/v1/episode-profiles/{slug}/enroll | body xuser_id, optional project_id, metadata |
Program authoring with the assistant: GET /api/v1/profile-authoring/tools (Read), POST /api/v1/profile-authoring/start, POST /api/v1/profile-authoring/conversations/{conversation_id}/message, POST /api/v1/profile-authoring/conversations/{conversation_id}/stream (per-IP rate limited).
Episodes and attention
Read for GET, Write for the rest.
| Method | Path | Notes |
|---|---|---|
| GET | /api/v1/episodes | filters xuser_id, project_id, episode_profile_id, status, attention_gte, limit, offset |
| GET | /api/v1/episodes/resolve | |
| GET | /api/v1/episodes/{id} | |
| GET | /api/v1/episodes/{id}/attention | the attention breakdown |
| GET | /api/v1/episodes/{id}/fhir | the episode as a FHIR bundle |
| GET | /api/v1/episodes/{id}/artifacts | |
| GET | /api/v1/episodes/{episode_id}/artifacts/{artifact_id}/download | |
| GET | /api/v1/episodes/{id}/summaries | |
| GET | /api/v1/episodes/{id}/progress | |
| GET | /api/v1/episodes/{id}/sdk-config | |
| GET | /api/v1/episodes/{episode_id}/timeline | also /timeline/stats |
| GET | /api/v1/episodes/{episode_id}/observations | |
| POST | /api/v1/episodes | create by hand |
| PATCH | /api/v1/episodes/{id} | |
| DELETE | /api/v1/episodes/{id} | |
| POST | /api/v1/episodes/{id}/close | |
| POST | /api/v1/episodes/{id}/reopen | |
| POST | /api/v1/episodes/{id}/attention/acknowledge | lower the floor |
| POST | /api/v1/episodes/{episode_id}/questionnaire-response | submit a PRO response |
Also GET /api/v1/timeline (project-wide), GET /api/v1/xusers/{xuser_id}/timeline and /patient-timeline (Read).
Rules
Read for GET, Write for the rest.
| Method | Path |
|---|---|
| GET | /api/v1/policies |
| GET | /api/v1/policies/{policy_id} |
| GET | /api/v1/policies/{policy_id}/executions |
| POST | /api/v1/policies |
| PUT | /api/v1/policies/{policy_id} |
| DELETE | /api/v1/policies/{policy_id} |
| POST | /api/v1/policies/{policy_id}/test |
Patients and contact points
Read for GET, Write for the rest.
| Method | Path | Notes |
|---|---|---|
| GET | /api/v1/xusers | |
| GET | /api/v1/xusers/{xuser_id} | |
| GET | /api/v1/xusers/{xuser_id}/vitals-summary | |
| GET | /api/v1/xusers/{xuser_id}/health-metrics | |
| GET | /api/v1/xusers/stats/unassociated | |
| POST | /api/v1/xusers | create or get by identifier |
| POST | /api/v1/xusers/add_to_project | |
| PATCH | /api/v1/xusers/{xuser_id} | |
| DELETE | /api/v1/xusers/{xuser_id} | soft delete |
| GET | /api/v1/contact_points | also GET /fhir/ContactPoint |
| POST | /api/v1/contact_points | |
| PATCH | /api/v1/contact_points/{id} | |
| DELETE | /api/v1/contact_points/{id} | and POST .../{id}/restore |
| PUT | /api/v1/xusers/{xuser_id}/phone | body value (E.164 or null) |
Observations
Read for GET, Write for POST. Direct writes link to the episode_ids you pass and do not evaluate rules.
| Method | Path |
|---|---|
| GET | /api/v1/observations |
| GET | /api/v1/observations/latest |
| GET | /api/v1/observations/trend |
| GET | /api/v1/observations/{id} |
| POST | /api/v1/observations |
| POST | /api/v1/observations/batch |
| POST | /api/v1/xusers/{xuser_id}/observations/journal |
Device ingest and inbound webhooks
| Method | Path | Auth |
|---|---|---|
| POST | /webhooks/<provider>/{project_key} | cellular device hub; shared secret in Authorization; public route |
| POST | /webhooks/<sms-provider>/sms/{project_key} | inbound SMS; provider signature; public route |
| POST | /ingest/image | Write |
| POST | /ingest/captures | Write; 8 MB |
| POST | /ingest/raw-packet | Write; SDK streaming |
| GET | /api/v1/images, /api/v1/images/{image_id}, /api/v1/images/{image_id}/file | Read |
| POST | /api/v1/images/reprocess | Write |
Wearable account webhooks are mounted per provider under /webhooks/ and verified per provider. Ingest sessions and signal streams (/api/v1/ingest/sessions/..., /api/v1/sessions/{session_id}/signal-streams, /api/v1/signal-streams/{stream_id}/...) are the SDK's streaming surface; see Stream on iOS.
Symptom interviews, agents and conversations
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/agents, /api/v1/agents/{id}, /api/v1/agents/{agent_id}/runs, /api/v1/agents/{agent_id}/runs/{run_id}, /api/v1/agents/{agent_id}/preview | Read |
| GET | /api/v1/episode-profiles/{profile_id}/agents | Read |
| GET | /api/v1/agent-runs, /api/v1/agent-runs/{run_id} | Read |
| GET | /api/v1/agent-runs/pending-reviews | Read; the review queue of agent runs |
| POST | /api/v1/agents/{agent_id}/invoke | Write |
| POST | /api/v1/agent-runs/{run_id}/review | Write; staff session required |
| POST, PATCH, DELETE | /api/v1/agents, /api/v1/agents/{id}, /api/v1/agents/{agent_id}/attach, /api/v1/agent-profile-links/{link_id} | Admin |
| GET | /api/v1/conversations, /api/v1/conversations/{id} | Read |
| POST | /api/v1/conversations, .../{conversation_id}/messages, .../{conversation_id}/tool-results, .../{id}/archive | Write |
The symptom interview has no route of its own: it is opened by a rule, driven by inbound SMS, and read through agent runs, observations and the timeline.
The gate: policies and decision records
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/compliance/policies | Read |
| GET | /api/v1/compliance/policies/active | Read; project_id optional |
| PATCH | /api/v1/compliance/policies/active | Write; upsert a new active version |
| POST | /api/v1/compliance/policies/draft | Write; assistant-drafted policy |
| POST | /api/v1/compliance/policies/validate | Write; normalize and warn |
| POST | /api/v1/compliance/policies/{policy_id}/activate | Write |
| GET | /api/v1/compliance/checks | Admin; filters and a release-status histogram |
| POST | /api/v1/compliance/checks | Admin; records a decision already made |
| GET | /api/v1/compliance/checks/{check_id} | Admin |
| POST | /api/v1/compliance/checks/{check_id}/release | Admin; staff session required |
| POST | /api/v1/compliance/checks/{check_id}/reject | Admin; staff session required |
Govern: the gate for AI that is not ours
Govern is authenticated differently from the rest of this list. The runtime routes take an application key (gk_..., created with the application), not an organization API key, and they are the only routes in the public surface that do. Management routes take an organization key or a dashboard session. The four hand-off actions take a dashboard session only and refuse keys outright: claiming or resolving a hand-off is a person's act and the record names them.
The @anybio/govern SDK wraps the runtime routes.
Runtime. Application key.
| Method | Path | Notes |
|---|---|---|
| POST | /api/v1/govern/evaluate | Evaluate one turn before it is sent. turn_id is the idempotency key |
| GET | /api/v1/govern/decisions/{decision_id} | The decision with its review state; the first hold-resolution path |
| POST | /api/v1/govern/decisions/{decision_id}/outcome | What was delivered. One outcome per decision |
| POST | /api/v1/govern/disclosures | Record the AI-identity disclosure shown at the start of a conversation |
| POST | /api/v1/govern/patients/state | The patient's state. A POST so the reference travels in the body |
| POST | /api/v1/govern/patients/consent | Consent granted or revoked |
| POST | /api/v1/govern/patients/opt-out | A patient opting out, or back in |
| GET | /api/v1/govern/webhook-deliveries | The webhook delivery log, newest first |
| POST | /api/v1/govern/transcripts | A batch of past turns, evaluated observe-only |
| GET | /api/v1/govern/transcripts/{job_id} | A transcript job's status and counts |
| GET | /api/v1/govern/transcripts/{job_id}/turns | The job's turns in batch order with their decisions |
Applications, keys and reports. Every route here takes an organization admin's dashboard session or an Admin scope organization key; lower key scopes are refused. The same screens are in the dashboard under Govern, Applications.
| Method | Path | Notes |
|---|---|---|
| GET | /api/v1/govern/applications | The organization's applications in this environment |
| POST | /api/v1/govern/applications | Creates the application and mints its first key |
| GET | /api/v1/govern/applications/{application_id} | One application, with its channel modes |
| PATCH | /api/v1/govern/applications/{application_id} | A mode change is audited with the actor |
| GET | /api/v1/govern/applications/{application_id}/keys | Key metadata, never a secret |
| POST | /api/v1/govern/applications/{application_id}/keys/rotate | Mints a new key and ages out the previous |
| POST | /api/v1/govern/applications/{application_id}/webhook-secret/rotate | The new secret is in the response only |
| GET | /api/v1/govern/applications/{application_id}/observe-report | Counts by decision, policy and channel over a window |
| GET | /api/v1/govern/applications/{application_id}/observe-report.csv | The buckets the counts were summed from |
| GET | /api/v1/govern/applications/{application_id}/observe-report.pdf | The document an account holder sends to a reviewer |
| DELETE | /api/v1/govern/applications/{application_id}/patients | Purges patient state and ledger for the application |
Hand-offs. Reads take a key or a session; every action below requires a signed-in staff member and refuses an API key.
| Method | Path | Notes |
|---|---|---|
| GET | /api/v1/govern/handoffs | Read |
| GET | /api/v1/govern/handoffs/{handoff_id} | Read; its events and the decisions that opened or joined it |
| POST | /api/v1/govern/handoffs/{handoff_id}/claim | expected_version must be the current version |
| POST | /api/v1/govern/handoffs/{handoff_id}/contact-attempt | On a claimed hand-off |
| POST | /api/v1/govern/handoffs/{handoff_id}/resolve | On a claimed hand-off |
| POST | /api/v1/govern/handoffs/{handoff_id}/resume | Releases the hold on a resolved hand-off |
Care hand-offs and the messaging policy
Every route here requires a signed-in staff member in addition to the key scope.
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/care-handoffs | Read |
| GET | /api/v1/care-handoffs/{id} | Read |
| POST | /api/v1/care-handoffs/{id}/claim | Write |
| POST | /api/v1/care-handoffs/{id}/contact-attempt | Write |
| POST | /api/v1/care-handoffs/{id}/resolve | Write |
| POST | /api/v1/care-handoffs/{id}/resume | Write |
| GET | /api/v1/patient-messaging-policy | Read |
| GET | /api/v1/patient-messaging-policy/staff | Read |
| PUT | /api/v1/patient-messaging-policy | Admin; organization admin |
Consent and SMS
| Method | Path | Auth |
|---|---|---|
| POST | /api/v1/public/sms-optin | public, captcha, per-IP limit |
| POST | /api/v1/communication_consent/sms/resend | Write |
| GET | /api/v1/anybio/programs/{handle}/disclosure | public |
| GET, POST | /api/v1/notification-provider-configs | Admin |
| GET, PATCH, DELETE | /api/v1/notification-provider-configs/{config_id} | Admin |
| GET, POST | /api/v1/notifications, .../{notification_id}, .../{notification_id}/acknowledge, /dismiss, /channels/{channel_id}/click, /device-tokens | Read for GET, Write for POST |
Billing periods and adherence
Staff session required on the billing-period routes.
| Method | Path | Scope |
|---|---|---|
| GET | /api/v1/billing-periods/current-period | Read |
| GET | /api/v1/billing-periods/patients/{xuser_id} | Read |
| GET | /api/v1/billing-periods/programs/{episode_profile_id}/patients | Read |
| PATCH | /api/v1/billing-periods/enrollments/{enrollment_id}/order-reference | Write |
Export
Read for GET, Write for the rest.
| Method | Path |
|---|---|
| GET, POST | /api/v1/data-exports |
| GET, PATCH, DELETE | /api/v1/data-exports/{id} |
| POST | /api/v1/data-exports/{id}/test |
| GET | /api/v1/episodes/{episode_id}/data-exports |
| POST | /api/v1/episodes/{episode_id}/data-exports/{data_export_id} |
| GET | /api/v1/episode-data-exports/{id} |
| POST | /api/v1/episode-data-exports/{id}/retry |
| GET, POST | /api/v1/fhir-medplum-configs |
| GET, PATCH, DELETE | /api/v1/fhir-medplum-configs/{id} |
| GET, POST | /api/v1/hl7-endpoints |
| GET, PATCH, DELETE | /api/v1/hl7-endpoints/{id} |
| GET | /api/v1/integrations/epic/sandbox-demo |
Public FHIR terminology: GET /fhir/CodeSystem/biosignal. Public keys for SMART Backend Services: GET /.well-known/jwks.json.
Synthetics
Read for GET, Write for POST.
| Method | Path |
|---|---|
| GET | /api/v1/synthetics/scenarios |
| GET | /api/v1/synthetics/runs, /api/v1/synthetics/runs/{id}, /api/v1/synthetics/runs/{id}/impact |
| POST | /api/v1/synthetics/runs (scenario_slug, project_id, xuser_id, developer_key_id, episode_profile_id) |
| POST | /api/v1/synthetics/runs/{id}/cancel |
Scenarios drive ECG, PPG, EDA and temperature streams into a program; a cuff reading is posted through the device webhook instead.
Keys, projects, organization, environment
| Method | Path | Scope |
|---|---|---|
| GET, POST | /api/v1/developer/keys | Admin |
| GET, DELETE | /api/v1/developer/keys/{key_id} | Admin |
| POST | /api/v1/developer/keys/{key_id}/revoke | Admin |
| POST | /api/v1/sdk/token | Write; mints a short-lived patient token |
| POST | /api/v1/sdk/session | public; publishable key flow |
| GET, POST | /api/v1/projects | Read / Write |
| GET, PATCH, DELETE | /api/v1/projects/{project_id} | Read / Write |
| GET, POST, DELETE | /api/v1/projects/{project_id}/users | Read / Write |
| GET, PATCH | /api/v1/organizations, /api/v1/organizations/{id} | Read / Write |
| GET | /api/v1/environments, /api/v1/session/environment | Read |
| POST | /api/v1/session/environment | Write; switch a session's environment |
| GET | /api/v1/audit, /api/v1/audit/entities/{entity_type}/{entity_id}, /api/v1/audit/xusers/{xuser_id}, /api/v1/audit/episodes/{episode_id}, /api/v1/audit/correlation/{correlation_id} | Admin |
| GET | /api/v1/admin/usage/summary, /api/v1/admin/usage/xusers/{xuser_id}/summary, /api/v1/admin/usage/events | Admin |
Other areas
Documented in their own sections of this portal: the biosignal catalog (/api/v1/biosignals, /api/v1/public/biosignals, /api/v1/projects/{project_id}/biosignals), device catalog and profiles (/api/v1/devices, /api/v1/device-profiles), wearable connections and sources (/api/v1/xusers/{xuser_id}/connections, /api/v1/sources, /api/v1/oauth/..., /api/v1/oauth_providers), feature series and charts (/api/v1/feature-series/{feature_id}, /api/v1/charts/query), the model registry and routing (/api/v1/models, /api/v1/infer/image, /api/v1/infer/biosignal, /api/v1/model-routing), DSP algorithms (/api/v1/dsp-algorithms), the content library, and the MCP endpoint (/mcp, OAuth bearer). Internal SuperAdmin routes under /api/v1/admin/ are in the generated document but are not part of the customer API.