For developers · Code lookup

GTIN, Pharmacode or NDC → the exact medicine.

Resolve the number on a medicine pack — a scanned GTIN, a Swiss Pharmacode, a US NDC, a German PZN — to the product and the exact pack it identifies, in one indexed read. An unknown code is an explicit not-found, never a guess.

GET /v1/drugs/lookup

Scan · GTIN

7680626130126

Switzerland

BAG Specialty List

Atorvastax
Pack
30 Stk
Listed price
30.55 CHF
ATC
C10AA05
A real Swiss pack: the barcode is drawn from its GTIN (EAN-13), and the record is what the lookup returns for it.

Code systems

15 code systems, one lookup.

Scan or paste the number printed on the pack: the lookup resolves it to the exact product, pack size and listed price — or says plainly that it has no match.

  • GTIN, NDC, CIP13 and the national pack numbers of each register, through one endpoint
  • The pack that matched, not just the product family
  • An unknown code returns an explicit not-found, never a guess
  • NDC (US)468,130
  • GTIN190,796
  • APB (BE)26,461
  • CIP13 (FR)21,191
  • RVG (NL)19,870
  • Varunummer (SE)19,208
  • Varenummer (DK)16,472
  • Código nacional (ES)15,523
  • Varenummer (NO)11,281
  • AIC (IT)10,979
  • PA number (IE)10,480
  • Merkevare id (NO)9,297
  • Kód SÚKL (CZ)8,848
  • Myyntilupa (FI)5,515
  • Vnr (IS)3,050
837,101 pack codes on file across the 15 code systems the lookup accepts that hold rows today, counted live.

How it works

From barcode to record

  1. Read the code

    The linear barcode on a medicine pack is a GTIN (EAN-13). Pharmacodes, NDCs and national numbers are printed on the pack or held in your system.

  2. Look it up

    GET /drugs/lookup?system=gtin&code=… — the system names the code family; the read is one indexed lookup on (system, code).

  3. Get product and pack

    The product record plus the matched pack: pack size, listed price and currency where the register publishes one.

In detail

What a pack-code lookup returns

Every pack code we hold maps to one product record. The lookup returns that record — ATC code, manufacturer, dispensing category, reimbursement flag, country and sync date — together with the pack that matched: its pack size and, where the register lists one, its public price and currency.

Some codes legitimately appear on more than one pack row (re-registrations, multi-packs). The lookup returns the pack flagged primary, or the first by a stable order, and tells you how many rows matched in match_count — so an ambiguous code is visible rather than hidden.

01 · Barcode

Scan → product

Pass system=gtin with the barcode digits. EAN codes resolve the same way with system=ean.

02 · One endpoint

Every code family

GTIN, EAN, NDC, Pharmacode, PZN, CIP13, Swissmedic number, dm+d AMPP-ID and the national numbers of IT, BE, NL, ES, CZ, DK, FI, IE, NO and SE.

03 · Pack-level

The exact pack matched

matched_alias carries the pack size, public price and currency of the code you sent — not just the parent product.

04 · Clean misses

Explicit not-found

An unknown code returns 404 identifier_not_found; an unsupported system returns a validation error listing the systems that are.

Try it

A real call, end to end.

One indexed read on (system, code) — the hot path of every dispensing and scanning flow.

Supported code systems

  • International and national: gtin, ean, ndc11, pharmacode, pzn, cip13, swissmedic_no, dmd_amppid.
  • National registers: aic (IT), be_apb (BE), cbg_meb_id (NL), cima_codigo (ES), cz_kod_sukl (CZ), dk_varenummer (DK), fi_myyntilupa (FI), ie_pa_number (IE), no_varenummer and no_merkevare_id (NO), se_varunummer (SE).
  • Live counts of pack codes per system are shown on this page, read from the database.
  • Each record carries last_synced_at, the date its register was last ingested.
  • Lookups need the drugs:read scope.
  • After resolving, GET /v1/drugs/{id} lists every pack code on the record for cross-walking between systems.
GET /v1/drugs/lookup?system=gtin&code=…
# Barcode scan → GTIN
curl 'https://drug-database.com/v1/drugs/lookup\
?system=gtin&code=7680…' \
  -H 'Authorization: Bearer dd_live_…'

# US National Drug Code (11 digits)
curl 'https://drug-database.com/v1/drugs/lookup\
?system=ndc11&code=…' \
  -H 'Authorization: Bearer dd_live_…'
response
{
  "drug": {
    "id": "3f8a1c2d-…",
    "product_name": "Aspirin Cardio 100 mg",
    "atc_code": "B01AC06",
    "dispensing_cat": "B",
    "is_reimbursed": true,
    "country_code": "CH",
    "last_synced_at": "2026-…"
  },
  "matched_alias": {
    "system": "gtin",
    "code": "7680…",
    "pack_size": "…",
    "public_price": …,
    "currency": "CHF",
    "is_primary": true
  },
  "match_count": 1
}

FAQ

Questions about pack-code lookup

My scanner reads the barcode on a medicine pack — which system is it?
The linear barcode on a medicine pack encodes a GTIN (EAN-13). Pass system=gtin and the digits as code. The lookup returns the product and the exact pack.
Can I look up a Swiss Pharmacode?
Yes. Pass system=pharmacode with the Pharmacode. Swiss packs also resolve by GTIN and by Swissmedic number (system=swissmedic_no).
Can I look up a US NDC?
Yes. Pass system=ndc11 with the 11-digit National Drug Code. It is the same endpoint and response shape as every other code system.
Which code systems are supported?
gtin, ean, ndc11, pharmacode, pzn, cip13, swissmedic_no and dmd_amppid, plus the national numbers aic, be_apb, cbg_meb_id, cima_codigo, cz_kod_sukl, dk_varenummer, fi_myyntilupa, ie_pa_number, no_varenummer, no_merkevare_id and se_varunummer.
What happens with an unknown code?
The endpoint returns 404 identifier_not_found rather than a fuzzy best guess, so your flow can branch deterministically. An unsupported system returns a validation error that lists the supported ones.

Ready when you are

Try barcode & code lookup on real data.

Create a key in minutes. The free plan is enough to see real responses and judge the data; the paid plans are where you build.

Free to try · 10 lookups in total · No card required