POST /v1/partner/consultations, which creates a consultation for an EU-licensed doctor to review. The request carries everything at once: the product choice, the patient’s identity and consent, and every questionnaire answer, so there is no draft to manage. Send it with the consultations:write scope and an Idempotency-Key header, then track the result by webhook.
Last reviewed: 2026-11-04
Every consultation is reviewed in full by an EU-licensed doctor, who decides on medical grounds only (see Safety). Submitting never approves anything: it hands the doctor a complete case. The Idempotency-Key header is required; see Partner API idempotency.
Request
Top-level fields
The product, country, plan and dosage must be a combination returned by the product list, otherwise the request fails with
422 product_unavailable. This includes a country that has closed to new consultations since you fetched the list: it is no longer in the list, so the request fails with 422 product_unavailable.
A body that is missing a required field, or has a field of the wrong type, fails with 422 invalid_request. Its errors list names each field with a code and message. The body is checked after the request itself: authentication, scope, rate limits and the Idempotency-Key header come first, so a request with no Idempotency-Key fails with 400 idempotency_key_required even when its body is also invalid. Body validation then runs before the product, schema, consent and answer checks.
Patient
National identifier
Some countries require a national patient identifier before a prescription can be issued. Send it aspatient.national_identifier. A submission for such a country fails with 422 patient_identifier_required when the identifier is neither in the request nor already stored for the patient. In live mode an existing patient whose identifier is stored can omit it on later submissions.
patient fields are omitted above.
type is an identifier type of the product country (the request country), not of the patient’s residence. A country without a row in this table has no identifier type, so you send no national_identifier for it.
valueis the identifier as printed. It is validated (format and check digits) and normalised.- An unknown type, a type the product country does not use, or a value that fails validation fails with
422 invalid_request, with an error item whosefieldispatient.national_identifierandcodeisinvalid_identifier. - The value is never echoed: not in errors, not in any response and not in any event.
- In live mode it is stored on the patient’s account the first time. A later submission for the same patient with a different identifier fails with
409 patient_conflictand never overwrites the stored one. - Test mode validates it and stores nothing.
Identity document
Electronic prescribing in some countries needs the patient’s identity document before the doctor can approve. Send it aspatient.identity_document. It is optional on submission; when it is missing and the doctor needs it, they ask for it with an information request with reason_code identity_document_required.
patient fields are omitted above.
- It is validated with the same rules as a patient’s own profile: identity card numbers that carry a check letter have it verified; other numbers must be 5 to 20 letters or digits once spaces, dots and hyphens are removed.
- A document that breaks the rules (an unknown issuing state, a wrong check letter, a bad number format) fails with
422 invalid_request, with an error item whosefieldispatient.identity_documentandcodeisinvalid_identity_document. - A structural error keeps its own nested field instead: a value that is not an object is field
patient.identity_document.non_field_errorswith codeinvalid, an unsupported type is fieldpatient.identity_document.typewith codeinvalid_choice, and a missing, blank or too long member is that member’s field, for examplepatient.identity_document.numberwith coderequired,blankormax_length. - The document is never echoed: not in errors, not in any response and not in any event.
- In live mode it is stored on the patient’s account the first time. A later submission for the same patient with a different document fails with
409 patient_conflictand never overwrites the stored one. - Test mode validates it and stores nothing.
Consent
Hi Doctor needs the patient’s own consent, captured by you before submission. Send all three flags as JSON booleans; all must betrue. A flag that is false fails with 422 consent_required. Some non-boolean values are read as booleans: "true" and 1 count as true, while "false" and 0 count as false and so fail with 422 consent_required. A flag that is missing, or a value that cannot be read as a boolean, fails earlier with 422 invalid_request. The API reference therefore lists true as the only accepted value of each flag.
Security and compliance describes how to capture consent.
Upload answers
Upload each photo first withPOST /v1/partner/files, then answer the upload step with the scalar shape {"question_key": "<key>", "value": "<upload_id>"}. An upload that does not exist, has expired or is already attached fails with 422 upload_unusable. See Photos and files.
Which country codes does country accept?
Hi Doctor operates across the whole European Union: residents of all 27 EU member states can use the service, and every consultation is reviewed by an EU-licensed doctor.
country takes the ISO 3166-1 alpha-2 code of an EU member state from the table below. Which codes your platform can use for each product is set in your partner agreement and returned by GET /v1/partner/products; some treatments are limited to specific countries by local rules.
See Countries for languages and how the service works in each country.
Country binding
The requestcountry is the country you submit the product for, and the questionnaire must agree with it:
- If the schema has an explicit country or pickup step, answer it, and the answer must be the same country.
- An answer that names another country, or two answers that disagree, fail with
422 country_conflict. Hi Doctor never overwrites the answer. - If the schema has no country step, the country derived from the answers must still be the requested
country. - A requested country that is closed to new consultations fails earlier, with
422 product_unavailable(see Top-level fields).422 country_closedcomes from a later check on the consultation’s clinical country, during submission.
Response
201 Created returns the consultation resource:
billing also carries price (amount_cents, currency), the price agreed in your partner agreement for this product. Consultation lifecycle explains every field as the consultation moves on.
Errors
A rejected submission returns the standard error envelope with a stablecode, and nothing is created. The submission codes, what each means and which ones to retry are listed once, in Partner API errors. Answer problems name the question_key when the API can tie them to a step, so you can send the patient back to the right question.
Repeat consultations
Submitting again with the sameexternal_patient_id creates a new consultation for the same patient. When the patient has an earlier approved consultation, the doctor sees it. Subscription renewals and reorders are not offered in API v1.
Frequently asked questions
Can I save a draft and submit it later?
No. A consultation is created in one request that carries the product, the patient, their consent and every answer. Keep any draft state on your side until the patient has finished the questionnaire.What happens if I send the same request twice?
Reuse the same Idempotency-Key header and the same body: a retry within 24 hours returns the stored result instead of creating a second consultation. See Partner API idempotency.Which countries can I submit a consultation for?
Any EU member state code that your partner catalogue offers the product in. The catalogue comes from the product list endpoint and follows your partner agreement.Does the patient need a Hi Doctor account first?
No. Hi Doctor links the consultation to a patient through your own patient identifier, external_patient_id. In live mode, if your brand already has a Hi Doctor account with the same email, the first submission fails with a patient conflict error; see Partner API errors.Is a national identifier always required?
No. Only countries that need one for prescribing ask for it, and an identifier already stored for the patient is reused.Who decides whether the patient receives treatment?
Every consultation is reviewed in full by an EU-licensed doctor, who decides on medical grounds only. Submitting a consultation never approves it.Can I submit a renewal or a reorder?
Not in API v1. A submission whose answers need such a context fails with a context error; see Partner API errors.Next steps
Consultation lifecycle
Statuses, the consultation resource and cancelling.
Webhooks
Learn when the doctor opens, asks about or decides on the consultation.
Partner API errors
Every submission error code and how to handle it.
Partnership FAQ
Commercial questions about partnering with Hi Doctor.