Changelog
Track changes to the Doctronic API contract and build clients that stay compatible as it grows.
The Doctronic API is served under /api/v1, and the OpenAPI contract is the source of truth for its
operations, fields, responses, and schemas. Download the current contract from
/openapi/doctronic-v1.json; resources has a
curl command for scripts.
The API reference is generated from the deployed production contract, which is checked daily for changes.
Compatibility
The API grows additively within /api/v1: new fields, response members, SSE event names, and enum
values can appear without a new version path. Build clients that keep working when they do.
- Ignore JSON fields, SSE event names, and enum values you don't recognize.
- Read only documented fields, and never depend on field order.
- Treat operation IDs, error codes, event names, and enum values as case-sensitive wire values.
- Review the OpenAPI diff before you update generated clients or validators, or upgrade an
SDK to pick up the change, and test changed behavior in staging before
production. The SDKs are
0.xreleases, so pin the exact version and read the SDK's changelog before each upgrade; see versioning.
Contract changes
2026-10-25
- Breaking: The
X-Doctronic-User-IDcheck no longer returns403 error.member.forbidden. A user-scoped request without the header returns400 error.member.header_required, and a user ID that doesn't exist, isn't active, or isn't one of your organization's users returns404 error.member.not_found. Production has returned these since 2026-10-21. Where you handlederror.member.forbidden, send the header on every user-scoped request and treaterror.member.not_foundas a stale patient-to-user mapping; see request headers. 403now means onlyerror.auth.insufficient_scope: the token lacks the scope the operation requires, anddata.requiredScopenames it. Every operation's403response carriesdata.requiredScope, andPOST /users/andPOST /pharmacy/search/gained a403response. Tokens Doctronic issues today hold every scope; see scopes.- The
400responses ofGET /chats/,GET /chats/{chatId}/,GET /chats/{chatId}/messages/, andGET /artifacts/{artifactId}/now describeerror.member.header_required. Validation failures on these operations are unchanged: they still returnerror.validation_errorwithdata[].field,data[].message, anddata[].code. - Added
400and404responses toGET /users/. - Added
404response toPATCH /users/,POST /chats/,GET /chats/, andPUT /coverage/. - Added
400response toGET /address/. - When a reply fails partway through a turn,
POST /chats/{chatId}/stream/now sends anerrorevent witherrorCodeerror.internaland then ends the stream. See stream errors. - Added error codes:
error.auth.insufficient_scope,error.member.header_required, anderror.member.not_found. The contract now also listserror.consultation_not_ready, which the stream already sent.
2026-10-19
- Changed: the
CreateUserRequestschema now listsdateOfBirth, withfirstName,lastName, andphoneNumber, among the fields required before appointment booking.
2026-10-17
- Added operations:
PATCH /users/,PUT /coverage/, andGET /appointments/{appointment_id}/result/.PATCH /users/andPUT /coverage/acceptIdempotency-Key. - Added fields:
appointmentDemographicsCompleteandmissingAppointmentFieldson thePOST /users/response. - Added the field validation error shape:
400 error.validation_error, withdatalisting{field, message, code}entries such aserror.validation.missing. - Added stream responses:
409 error.partner.chat_stream_in_progressand503 error.partner.chat_stream_unavailableonPOST /chats/{chatId}/stream/. - Added error codes:
error.validation.phone_number.unavailable(503onPOST /users/andPATCH /users/),error.appointments.result_unavailable, anderror.coverage.missing_patient_demographics. - Changed: the
POST /pharmacy/search/request requireslatitudeandlongitude.searchTermis optional.
2026-08-28
- Added
401and403responses to the appointment operations, and403responses toPUT /address/andPUT /pharmacy/.
2026-08-25
- Added operation:
GET /address/, with404 error.address.not_found. - Added
Idempotency-KeytoPOST /users/,POST /chats/,POST /appointments/scheduled/,POST /appointments/asap/,POST /appointments/{appointment_id}/cancel/,POST /appointments/{appointment_id}/reschedule/,PUT /address/,POST /pharmacy/search/, andPUT /pharmacy/, with409idempotency-conflict and503responses. See idempotent requests. - Changed: the maximum length of
conversationPromptContextonPOST /chats/and ofmessagePromptContextonPOST /chats/{chatId}/stream/rose from 2,000 to 50,000 characters.
2026-08-07
- Added: the first published contract, with 18 operations across users, chats and streaming, appointments, address, pharmacy, and artifacts.