Skip to main content
The Hi Doctor Partner API carries its version in the path, /v1/partner/, and there is no version header. Within v1 changes are additive, so a well-built integration keeps working when fields, events or codes are added. Every change is listed below by date and split into Breaking, Added and Changed, newest first. Last reviewed: 2026-11-04

How is the Partner API versioned?

  • The version is in the path: /v1/partner/.... There is no version header.
  • Within v1, changes are additive: new endpoints, new optional request fields, new response fields, new event types, new error codes and new enum values.
  • A change that would break a working integration, such as removing or renaming a field or changing its meaning, ships under a new path version, with notice.
  • The only exceptions are the changes listed under Breaking below. They were made in v1 in the first weeks of the Partner API, and each one names exactly what to update.

How do I build for additive change?

  • Ignore response fields you do not know.
  • Ignore webhook event types you do not know (see Webhooks).
  • Treat unknown enum values, such as a new fulfilment.route, as “other” rather than failing.
  • Branch on error code, never on message (see Errors).
Questionnaire content changes independently of the API version. It is versioned by schema_version and schema_hash; see Questionnaires and schema.

Changelog

Standard Webhooks, answer values removed from information requests

Breaking

  • Webhooks follow the Standard Webhooks specification, so any Standard Webhooks library verifies them. The old headers, all prefixed with Hi-Doctor and a hyphen, are replaced: The signed message is now {webhook-id}.{webhook-timestamp}.{body}, the HMAC key is the base64-decoded part of the secret after whsec_, and the signature is base64 rather than hex. The tolerance stays 300 seconds. Update your verifier with the code in Verify the signature.
  • Information requests no longer return answer values. answer_entries and answer_document_ids are removed from the information-request response, in the API and in the Business portal; each request now carries answered_question_keys, answer_count and answer_document_count. If you read the removed fields, keep your own record of what the patient answered. See Read the request.

Added

  • Consent withdrawal is recorded with POST /v1/partner/patients/{id}/consent-withdrawal/.
  • Published the full Partner API reference, generated from the Partner API itself: products, questionnaires, files, consultations, patients, information requests, prescriptions, webhooks and test mode.
  • Questionnaires take an optional locale (en, es or zh, falling back to English); schema_hash is per locale and any supported locale’s hash is accepted on submission. See Questionnaires and schema.
  • Submissions accept an optional patient.national_identifier, validated per product country and never echoed. See National identifier.
  • Submissions accept an optional patient.identity_document (type, number, issuing_state) and never echoed. A doctor who needs it asks with the information request reason identity_document_required, answered with identity_document. See Identity document.
  • Business portal: cancel a consultation before a doctor opens it, and see the team roster. See Business portal.
  • Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.
  • The Business portal shows the network each API key was last used from and exports the usage ledger as CSV.

Changed

  • Webhook secrets are whsec_ followed by standard base64 of 32 random bytes. Existing secrets were converted in place and keep their key bytes, so you do not need to rotate. If you stored an older secret (whsec_ followed by URL-safe base64 without padding), convert it yourself: in the part after whsec_, replace - with + and _ with /, then append = until the length is a multiple of 4. For example, in Python: "whsec_" + base64.b64encode(base64.urlsafe_b64decode(old[6:] + "=" * (-len(old[6:]) % 4))).decode(). Rotating the secret also gives you a new one in the current format.
  • Consent: the reference lists true as the only accepted value of each consent flag, and consent.ip must be an IPv4 or IPv6 address or null; any other value fails with 422 invalid_request. See Consent.
  • A skipped answer entry carries only its locator, skip and, optionally, the step’s own step_id; any other member fails with 422 invalid_answers.
  • An information-request answer entry is located by question_key, or by its alias key when question_key is left out, empty or null; when question_key is set, key is ignored.
  • An answer to a step that the other answers hide now fails with 422 unexpected_question_key.
  • Information-request answers: an answer to a request withdrawn by a consent withdrawal fails with 409 info_request_not_open; the body must carry an answer, an upload or the identity document (an empty body fails with 422 invalid_request first); uploads takes at most 10 unique ids, and a duplicate fails with 422 upload_unusable. See Answer the request.
  • Every information-request answer entry needs a question_key, or its alias key; the alias applies only to information-request answers, and a consultation submission entry without question_key fails with 422 invalid_answers. Identity document errors keep their nested field for structural problems, such as patient.identity_document.type.
  • Test advance validates the shape of reason_code and question_keys on every request, before the transition. See Test mode.
  • prescription.active does not check expiry; compare expires_at yourself. See Prescriptions.
  • The reference now states the backend’s request constraints: required strings must contain a non-blank character, limit is 1 to 100 (default 50, outside it 400 invalid_request), a skipped answer entry carries no value, values or option_inputs (422 invalid_answers), and an information-request identity_document has only type, number and issuing_state.
  • patient.address.line2 is stored with line1; together they are limited to 200 characters.
  • Expired uploads no longer count towards the storage quota and are deleted by a periodic cleanup.
  • Error messages no longer repeat submitted answer values or identifiers. An unexpected answer key is still named in errors[].question_key.
  • cancellable now applies exactly the cancel rule, and version advances on every change to the public consultation resource except a change to a product’s display name.
Partner guides published

Added

  • Published the partner guides: authentication, test mode, questionnaires and schema, submission, photos and files, consultation lifecycle, prescriptions, webhooks, information requests, errors, rate limits, idempotency, pagination, the Business portal, security and compliance, and the go-live checklist.

Next steps

Partner API overview

What the Partner API does and how to get access.

Developer FAQ

Short answers to common integration questions.
Commercial questions: read the partnership FAQ or write to hello@hi-doctor.ai.