Docs / Get started

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_…"

Call GET /v1/drugs with a country code and a query:

GET /v1/drugs
curl -G https://api.medifontis.com/v1/drugs \
  -H "Authorization: Bearer $MEDIFONTIS_API_KEY" \
  --data-urlencode "country=de" \
  --data-urlencode "q=ozempic"

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.

First result
{
  "country": "de",
  "sourceId": "de.ema.article57",
  "id": "de:ema:article57:3f301c505c8d15200fcc",
  "kind": "products",
  "name": "Ozempic",
  "data": {
    "name": "Ozempic",
    "holder": "Novo Nordisk A/S",
    "routes": [
      "Subcutaneous Use"
    ],
    "marketed": null,
    "useDomain": "unknown",
    "databaseDate": "2026-10-09",
    "sourceStatus": null,
    "supplyRegime": null,
    "listingStatus": "listed-as-authorised",
    "targetSpecies": [],
    "sourceRowCount": 1,
    "activeSubstances": [
      "Semaglutide"
    ],
    "documentRevision": "90",
    "documentReference": "EMA/518502/2018",
    "useDomainEvidence": {
      "basis": "unreviewed",
      "field": null,
      "value": null,
      "version": 1,
      "sourceId": "de.ema.article57"
    },
    "patientEligibility": "not-assessed",
    "centrallyAuthorised": true,
    "targetSpeciesStatus": "not-reported",
    "activeSubstancesText": "Semaglutide",
    "administrativeStatus": "unknown",
    "prescriptionCategory": "unknown",
    "prescriptionRequired": null,
    "authorisationTerritory": "European Union",
    "pharmacovigilanceContacts": [
      {
        "email": "SOSPON@novonordisk.com",
        "phone": "+45 4444 8888",
        "masterFileLocation": "Denmark"
      }
    ]
  },
  "region": null,
  "retrievedAt": "2026-10-20T01:00:19.432Z",
  "sourceUrl": "https://www.ema.europa.eu/en/documents/other/article-57-product-data_en.xlsx",
  "licence": {
    "id": "LicenseRef-EMA-Legal-Notice",
    "url": "https://www.ema.europa.eu/en/about-us/legal-notice",
    "scope": "rows of EMA’s public Article 57 product data authorised in Germany or centrally in the European Union",
    "reviewedAt": "2026-09-29",
    "attribution": "Source: European Medicines Agency (EMA), Article 57 product data (EMA/518502/2018), based on data submitted by marketing-authorisation holders.",
    "documentsIncluded": false
  },
  "limitations": [
    "Germany has no free, complete official bulk medicine database with PZNs: BfArM’s AMIce public search is interactive only, its § 31b reference database is supplied to commercial users on request, and the GKV-Spitzenverband and BfArM price lists are PDF-only for reasons of usage rights.",
    "EMA’s Article 57 export names every medicinal product authorised in Germany (national, mutual-recognition and decentralised procedures) and every centrally authorised EU product, as submitted by marketing-authorisation holders; submissions can lag an authorisation change.",
    "A record is one product name, active-substance text, route and marketing-authorisation holder. Strengths, forms, packs, PZNs, authorisation numbers and dates are not published, so rows EMA lists more than once for one such product are kept together with their count.",
    "The export publishes no legal category (verschreibungspflichtig, apothekenpflichtig, freiverkäuflich), so the prescription classification stays unknown; listing is not proof of current authorisation, marketing, availability or reimbursement.",
    "Active-substance names are the English xEVMPD names EMA publishes, not German INN spellings.",
    "EMA’s legal notice permits commercial and non-commercial reproduction with acknowledgement of EMA as the source; its exception for third-party content leaves the status of holder-submitted text unconfirmed."
  ],
  "names": [
    "Ozempic",
    "Semaglutide"
  ],
  "identifiers": []
}

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:

Node.js
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
  }
}

Next steps