POST /api/ema/medicines/search
Price: 20 credits
Search the EU register of centrally authorised medicines. Narrows by trade name, active substance, INN, human or veterinary register, regulatory status, ATC code prefix, MeSH therapeutic area, pharmacotherapeutic group, marketing authorisation holder, target species, the text of the therapeutic indication, the nine regulatory flags, and the authorisation and last-update dates. Returns the full register record for every match, newest publication first.
The register covers only EU centrally authorised medicines, so a product authorised nationally in one member state is absent however it is spelled. Text filters match a substring anywhere in the field and are case-insensitive; `atc_code` is the one prefix filter, so `L01` keeps a whole ATC class. Withdrawn, refused and lapsed products stay on the register, and `status` is what separates them from the live ones — search without it and roughly a third of the answer is historical. `atcvet_code`, `pharmacotherapeutic_group_veterinary` and `species` are veterinary-only and the human records leave them empty, but the register fills them unevenly — the group on about seven in eight veterinary records and the ATCvet code and species on about one in six — so filtering on `species` returns a fraction of the veterinary register rather than all of it, and `category` is what selects the whole of it. Feed `url` to ema/medicines for the assessment overview and the published PDFs.
access-token string requiredtimeout integer — Max scrapping execution timeout (in seconds) (default: 300; min: 20; max: 1500)name string nullable — Substring of the medicine's trade name (examples: "keytruda", "insulin"; minLength: 1)active_substance string nullable — Substring of the active substance (examples: "pembrolizumab"; minLength: 1)inn string nullable — Substring of the international non-proprietary or common name (examples: "adalimumab"; minLength: 1)category string nullable — Human or veterinary register. Unset returns both (one of: "Human", "Veterinary")status string nullable — Regulatory status of the medicine on the register (one of: "Authorised", "Withdrawn", "Application withdrawn", "Refused", "Lapsed", "Opinion", "Expired", "Revoked", "Suspended", "Opinion under re-examination", "Withdrawn from rolling review")atc_code string nullable — ATC code, matched as a prefix, so L01 keeps every antineoplastic agent (examples: "L01FF02", "L01"; minLength: 1)therapeutic_area string nullable — Substring of a MeSH therapeutic area (examples: "Melanoma"; minLength: 1)pharmacotherapeutic_group string nullable — Substring of the pharmacotherapeutic group (examples: "Antineoplastic agents"; minLength: 1)marketing_authorisation_holder string nullable — Substring of the authorisation holder's name (examples: "Novartis"; minLength: 1)indication string nullable — Substring of the therapeutic indication text (examples: "melanoma"; minLength: 1)species string nullable — Target species of a veterinary medicine (examples: "Dogs"; minLength: 1)accelerated_assessment boolean nullable — Assessed under the accelerated timetableadditional_monitoring boolean nullable — Subject to additional safety monitoringadvanced_therapy boolean nullable — Advanced therapy medicinal productbiosimilar boolean nullable — Authorised as a biosimilarconditional_approval boolean nullable — Holds a conditional marketing authorisationexceptional_circumstances boolean nullable — Authorised under exceptional circumstancesgeneric boolean nullable — Authorised as a genericorphan_medicine boolean nullable — Carries an orphan designationprime_priority_medicine boolean nullable — Supported under the PRIME schemeauthorised_from string nullable — Keep medicines authorised on or after this date, YYYY-MM-DD (examples: "2020-01-01")authorised_to string nullable — Keep medicines authorised on or before this date, YYYY-MM-DD (examples: "2024-12-31")updated_from string nullable — Keep records the register updated on or after this date, YYYY-MM-DD (examples: "2026-09-01")count integer required — Max number of medicines to return (min: 1; max: 3000)@type string (default: "EmaMedicine")id string requiredname string (default: "")category string (default: "")status string (default: "")url string (default: "")active_substance string nullableinn_or_common_name array (default: [])therapeutic_areas array (default: [])atc_code string nullableatcvet_code string nullablepharmacotherapeutic_group string nullablepharmacotherapeutic_group_veterinary string nullablespecies array (default: [])marketing_authorisation_holder string nullabletherapeutic_indication string nullablerevision_number string nullableopinion_status string nullablelatest_procedure_affecting_product_information string nullableis_accelerated_assessment boolean nullableis_under_additional_monitoring boolean nullableis_advanced_therapy boolean nullableis_biosimilar boolean nullableis_conditional_approval boolean nullableis_exceptional_circumstances boolean nullableis_generic boolean nullableis_orphan_medicine boolean nullableis_prime_priority_medicine boolean nullableis_patient_safety_flagged boolean nullablepublished_date string nullableupdated_date string nullablemarketing_authorisation_date string nullableeuropean_commission_decision_date string nullableopinion_adopted_date string nullablestart_of_evaluation_date string nullablestart_of_rolling_review_date string nullablewithdrawal_of_application_date string nullablewithdrawal_expiry_revocation_lapse_date string nullablerefusal_of_marketing_authorisation_date string nullablesuspension_of_marketing_authorisation_date string nullable422 — A date field was not YYYY-MM-DD. Check the fields against this schema. A URN with the wrong prefix is the most common cause.408 — The request ran past its time limit Raise `timeout` in the request body, up to the maximum this endpoint documents. Lowering `count` or turning off the `with_*` flags also helps, because less work finishes sooner.412 — Nothing on the register matched those filters. Retrying will not help: either the entity does not exist, or the input points at a different one.429 — Too many requests: a rate limit or a usage window is exhausted When the response carries an X-Retry-After header, wait that many seconds and retry: the same number is in the body as `detail.retry_after`, and the limit clears once that window passes. The message in the body names the limit that was hit.500 — Something broke on our side Retrying will not help. If it keeps happening, send us the X-Request-ID from the response headers.529 — Rate limit reached, or the endpoint is overloaded Wait at least 30 seconds, then retry.X-Error — Error message text (present only on error)X-Request-ID — Unique request identifierX-Execution-Time — Execution time in secondsX-Result-Count — How many records the body carries. 0 means an empty result, which is a normal answer and not by itself an error. A non-zero count can come back together with X-Error when the failure happened partway through — read this header and X-Error independently.X-Total-Available-Results — How many records exist for this query, when the endpoint can say. On a `dry_run` request this is the answer and the body is empty. It saturates: the endpoint's documented maximum means 'at least that many', any smaller number is exact.X-Warning — Present when the request body carried keys this endpoint does not document. They were ignored, so any filter you meant to apply through them did not apply. Check the spelling against this schema and retry.X-Retry-After — Seconds to wait before retrying. Present only on 429.