Base URL
Scope of this reference
Only patient-accessible endpoints are documented. Clinician, pharmacy and back-office endpoints exist but are intentionally omitted — they are not available to a patient account and are not part of the supported surface.What needs a token
Most endpoints needAuthorization: Bearer <access token>. Three groups do
not:
Questionnaire categories and schemas are genuinely public — you can fetch the
question set and build your interface before a patient has signed in. Only
answers need a token.
X-Brand-Slug: hi-doctor is required on every unauthenticated auth
endpoint, not only sign-in. Omitting it fails the request with the same 401
as a wrong password.Conventions
- All requests and responses are JSON, except PDF downloads.
- All paths are prefixed with
/v1/. - Timestamps are ISO 8601. Dates are
YYYY-MM-DD. - Money is in euro cents unless a field name says otherwise.
- Most list endpoints are paginated as
{ "count": N, "next": url|null, "previous": url|null, "results": [...] }and acceptlimitandoffset. Follownextrather than incrementingoffsetyourself;page_sizeis not a recognised parameter and is ignored.
Typical flow
1
Sign in
POST /v1/users/token/ → access + refresh tokens.2
Complete your profile
PATCH /v1/users/profile/me/. Checkout refuses with PROFILE_INCOMPLETE
and a missing_fields list if anything required is absent.3
Answer a questionnaire
GET /v1/users/questionnaires/categories/ → pick a slug →
GET /v1/users/questionnaires/{slug}/schema/ → save drafts with
PATCH .../progress/ → finish with POST .../submit/.Driving this by hand means evaluating the clinical branching yourself and
tracking the cumulative answer set. If you are building a chat interface,
use the conversational questionnaire instead — it
asks one question at a time and the server owns the branching.4
Pay
POST /v1/users/checkout/ returns either a Stripe checkout_url or
covered_by_subscription when an active plan already covers it. Poll
GET /v1/users/stripe/session/{session_id}/ for the outcome.5
Follow up
Read
/v1/users/consultations/ and /v1/users/prescriptions/, message via
/v1/users/conversations/, and track progress under /v1/users/journal/.Errors and rate limits
The API uses five different error envelopes depending on which layer refused the request — a client that reads onlydetail loses the message on
most validation failures. Errors documents every
shape, every status code, and whether to retry, re-authenticate or fix the
input.
Numeric rate limits are not published, and are enforced at the edge rather than
by the endpoints themselves, so you cannot infer a budget by testing. Handle a
429 on any call: honour Retry-After if present, otherwise back off
exponentially with jitter, and never retry in a tight loop.