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=au" \
  --data-urlencode "q=paracetamol"

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": "au",
  "sourceId": "au.pbs.items",
  "id": "au:pbs:items:10598T_12218_485_2863_43597",
  "kind": "packages",
  "name": "APOHEALTH Osteo Relief Paracetamol 665 mg — paracetamol 665 mg modified release tablet, 96",
  "data": {
    "form": "Tablet 665 mg (modified release)",
    "name": "APOHEALTH Osteo Relief Paracetamol 665 mg — paracetamol 665 mg modified release tablet, 96",
    "brand": "APOHEALTH Osteo Relief Paracetamol 665 mg",
    "route": "Oral",
    "pbsCode": "10598T",
    "liItemId": "10598T_12218_485_2863_43597",
    "marketed": null,
    "packSize": 96,
    "supplier": "Apotex Pty Ltd",
    "useDomain": "unknown",
    "supplyOnly": false,
    "genericName": "Paracetamol",
    "programCode": "R1",
    "presentation": "paracetamol 665 mg modified release tablet, 96",
    "scheduleCode": "4751",
    "sourceStatus": null,
    "supplyRegime": null,
    "firstListedOn": "2025-08-01",
    "legalDrugName": "Paracetamol",
    "listingStatus": "PBS-listed",
    "targetSpecies": [],
    "nonEffectiveOn": null,
    "organisationId": "72",
    "supplyOnlyFrom": null,
    "benefitTypeCode": "R",
    "supplyOnlyUntil": null,
    "copyrightNotices": [
      "Copyright (c) 2024 Department of Health, Commonwealth of Australia",
      "Permission is granted to use and redistribute this content, as long as all copyright statements are retained. Permission is not granted to modify this content.",
      "For further copyright information of this content, please refer to: https://www.health.gov.au/using-our-websites/copyright"
    ],
    "manufacturerCode": "TX",
    "scheduleRevision": 3,
    "useDomainEvidence": {
      "basis": "unreviewed",
      "field": null,
      "value": null,
      "version": 1,
      "sourceId": "au.pbs.items"
    },
    "patientEligibility": "not-assessed",
    "scheduleEffectiveOn": "2026-10-01",
    "targetSpeciesStatus": "not-reported",
    "administrativeStatus": "unknown",
    "prescriptionCategory": "unknown",
    "extemporaneousIngredient": false
  },
  "region": null,
  "retrievedAt": "2026-10-20T17:02:19.073Z",
  "sourceUrl": "https://data-api.health.gov.au/pbs/api/v3/schedules?limit=100000&page=1",
  "licence": {
    "id": "LicenseRef-PBS-Public-API",
    "url": "https://data-api-portal.health.gov.au/apis",
    "scope": "PBS API schedule, item and organisation metadata; all publisher copyright statements retained on each record.",
    "termsUrl": "https://www.health.gov.au/using-our-websites/copyright",
    "reviewedAt": "2026-09-30",
    "attribution": "Source: Pharmaceutical Benefits Scheme (PBS), Department of Health, Commonwealth of Australia. Copyright (c) 2024 Department of Health, Commonwealth of Australia.",
    "documentsIncluded": false
  },
  "limitations": [
    "Complete current PBS schedule, not a universal list of Australian medicines: private/non-subsidised and unlisted ARTG medicines are absent; PBS benefits may also include non-medicine supplies.",
    "PBS item codes identify prescribing rules and can be shared by brands or packs; li_item_id is the publisher’s unique listing (item and PharmCIS product/pack IDs), retained verbatim.",
    "The API has no ARTG registration, Poisons Standard schedule, legal Rx/OTC field or authorisation state: classification and administrative status remain unknown. Benefit codes U/R/A/S are reimbursement restrictions, not legal supply regimes.",
    "Supply-only packs remain searchable but PBS expressly says they may be dispensed and not newly prescribed. Extemporaneous ingredient rows are distinct from ready-prepared packs. Neither kind enters Doctofam’s prescription search.",
    "No PBS patient, prescriber or reimbursement eligibility is assessed. Restriction text, ATC/AMT mappings and document contents are not collected; publisher price fields remain in raw and are not used for prescribing.",
    "The API permits use and redistribution with copyright statements retained but prohibits modification. The referenced Health website notice also restricts commercial use and reformatting. Rights for Medifontis’s derived schema/commercial redistribution require an owner decision or written permission; this is not an open licence.",
    "Direct official HTTPS only; no proxy. The public subscription key is publisher-issued, shared by unregistered users and rate-limited to one request every twenty seconds. Rotation fails closed."
  ],
  "names": [
    "APOHEALTH Osteo Relief Paracetamol 665 mg — paracetamol 665 mg modified release tablet, 96",
    "APOHEALTH Osteo Relief Paracetamol 665 mg",
    "Paracetamol",
    "paracetamol 665 mg modified release tablet, 96"
  ],
  "identifiers": [
    {
      "value": "10598T",
      "scheme": "pbs-item"
    },
    {
      "value": "10598T_12218_485_2863_43597",
      "scheme": "pbs-li-item"
    }
  ]
}

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