Quickstart
Get an API key, search a medicine and read the result. It takes about five minutes.
1. Get an API key
Create a key on the signup page. It starts with mf_live_ and works immediately for every country. Get your API key.
Store it in an environment variable on your server:
export MEDIFONTIS_API_KEY="mf_live_…"
2. Search a medicine
Call GET /v1/drugs with a country code and a query:
curl -G https://api.medifontis.com/v1/drugs \
-H "Authorization: Bearer $MEDIFONTIS_API_KEY" \
--data-urlencode "country=fr" \
--data-urlencode "q=doliprane"const params = new URLSearchParams({ country: 'fr', q: 'doliprane' })
const response = await fetch(`https://api.medifontis.com/v1/drugs?${params}`, {
headers: { Authorization: `Bearer ${process.env.MEDIFONTIS_API_KEY}` },
})
if (!response.ok) throw new Error(`Medifontis ${response.status}`)
const { results, nextOffset } = await response.json()import os
import requests
response = requests.get(
"https://api.medifontis.com/v1/drugs",
params={"country": "fr", "q": "doliprane"},
headers={"Authorization": f"Bearer {os.environ['MEDIFONTIS_API_KEY']}"},
timeout=10,
)
response.raise_for_status()
results = response.json()["results"]
3. Read the response
Each result is one record of one source. The fields you will use most are name, identifiers, sourceId and kind, data and licence.
{
"country": "fr",
"sourceId": "fr.ansm.bdpm",
"id": "fr:ansm:registrations:60234100",
"kind": "registrations",
"name": "DOLIPRANE 1000 mg, comprimé",
"data": {
"cis": "60234100",
"form": "comprimé",
"name": "DOLIPRANE 1000 mg, comprimé",
"holder": "OPELLA HEALTHCARE FRANCE",
"routes": [
"orale"
],
"holders": [
"OPELLA HEALTHCARE FRANCE"
],
"marketed": true,
"bdmStatus": null,
"useDomain": "unknown",
"authorisedOn": "2002-07-09",
"compositions": [
{
"name": "PARACÉTAMOL",
"nature": "SA",
"strength": "1000 mg",
"linkageNumber": "1",
"substanceCode": "02202",
"dosageReference": "un comprimé",
"pharmaceuticalElement": "comprimé"
}
],
"sourceStatus": "Autorisation active",
"supplyRegime": null,
"regionalRules": "not-collected",
"targetSpecies": [],
"specialityName": "DOLIPRANE 1000 mg, comprimé",
"marketingStatus": "Commercialisée",
"publicationDates": {
"CIS_bdpm": "2026-09-29",
"CIS_CIP_bdpm": "2026-10-19",
"CIS_CPD_bdpm": "2026-09-29",
"CIS_COMPO_bdpm": "2026-09-29"
},
"specialityListed": true,
"useDomainEvidence": {
"basis": "unreviewed",
"field": null,
"value": null,
"version": 1,
"sourceId": "fr.ansm.bdpm"
},
"patientEligibility": "not-assessed",
"targetSpeciesStatus": "not-reported",
"additionalMonitoring": false,
"administrativeStatus": "authorised",
"prescriptionCategory": "unknown",
"activeIngredientNames": [
"PARACÉTAMOL"
],
"authorisationProcedure": "Procédure nationale",
"prescriptionConditions": [],
"europeanAuthorisationNumber": null
},
"region": null,
"retrievedAt": "2026-10-19T23:00:39.006Z",
"sourceUrl": "https://base-donnees-publique.medicaments.gouv.fr/telechargement",
"licence": {
"id": "etalab-1.0",
"url": "https://base-donnees-publique.medicaments.gouv.fr/docs/telechargement/licence_bdpm.pdf",
"scope": "the four freely downloadable BDPM data tables; no medicine document contents",
"termsUrl": "https://base-donnees-publique.medicaments.gouv.fr/telechargement",
"reviewedAt": "2026-09-30",
"attribution": "Source : Base de données publique des médicaments (BDPM), ANSM, HAS et Assurance Maladie — dates de mise à jour dans publicationDates ; https://base-donnees-publique.medicaments.gouv.fr",
"documentsIncluded": false
},
"limitations": [
"Complete BDPM export, not a history of every French authorisation: the help page describes currently marketed medicines and those discontinued within five years, while the reviewed v4/v5 file specifications still say two years.",
"CIS identifies the specialty, CIP13 and CIP7 its presentation. All specialties remain searchable; prescriptions use named CIP13 presentations, and the four current presentations without a matching specialty are flagged, never matched by name or given invented parent data.",
"CIS_CPD publishes explicit dispensing conditions, not an OTC flag: list I, list II, narcotics and explicit prescribing or dispensing restrictions are prescription-or-restricted; absence of a condition stays unknown. No patient eligibility is assessed.",
"The effective pack administrative status preserves explicit licence suspension, withdrawal or cancellation over an active presentation. An archived or missing parent licence cannot establish authorisation; an explicitly cancelled presentation remains cancelled. Marketing declarations do not establish pharmacy stock.",
"The headerless files have the same strict positional schemas in the reviewed v4/v5 specifications. CIS, COMPO and CPD are Windows-1252, CIP is UTF-8; therapeutic fractions are FT in the export but ST in the specification, and three CPD CR-only blank lines are counted without dropping any condition.",
"The linked October 2011 Licence Ouverte v1.0 permits commercial redistribution and derived information with source and update-date attribution. BDPM’s download terms also require preservation of meaning, freshness checks and no suggestion of ANSM/HAS/Assurance Maladie endorsement.",
"SmPCs and patient leaflets are not in these bulk files: no document contents or guessed document URLs are collected. Safety information, shortages, HAS assessments and generic-group overlays are not collected."
],
"names": [
"DOLIPRANE 1000 mg, comprimé",
"PARACÉTAMOL"
],
"identifiers": [
{
"value": "60234100",
"scheme": "cis"
}
]
}
4. Page through results
nextOffset is the offset of the next page, or null on the last one. Pass it as offset to read the next page:
async function* searchAll(country, q) {
let offset = 0
while (offset !== null) {
const params = new URLSearchParams({ country, q, limit: '50', offset: String(offset) })
const response = await fetch(`https://api.medifontis.com/v1/drugs?${params}`, {
headers: { Authorization: `Bearer ${process.env.MEDIFONTIS_API_KEY}` },
})
if (!response.ok) throw new Error(`Medifontis ${response.status}`)
const page = await response.json()
yield* page.results
offset = page.nextOffset
}
}