Solution · Pharmacode lookup

Pharmacode Lookup API for Swiss drugs.

Resolve a Swiss Pharmacode to the canonical drug product in one indexed read — with ATC, dispensing, reimbursement, and the GTIN / Swissmedic-No bridge.

GET /api/v1/drugs/lookup?system=pharmacode

What you get

The job, end to end

Turn a Swiss Pharmacode into a full drug product in one call. GET /api/v1/drugs/lookup?system=pharmacode&code=… does a single indexed read and returns the canonical drug row — ATC code, manufacturer, Swissmedic dispensing category, BAG-SL reimbursement flag — plus the matched alias with its pack size and public price.

Because every product carries a Swissmedic-No and a set of aliases, a Pharmacode lookup is also your bridge to GTIN and Swissmedic-No: resolve once, then read the full record to cross-walk to any other identifier system for the same pack.

Hot path

One indexed read

Single lookup on (system, code) — the hot path of every Swiss dispense flow.
Bridge

GTIN / Swissmedic-No bridge

Resolved product carries swissmedic_no and all aliases, so you can cross-walk identifier systems.
Pack-level

Pack-level detail

The matched alias returns pack_size, public_price and currency for the exact Pharmacode.

In code

A representative call

One indexed lookup on system=pharmacode returns the canonical drug plus the exact pack that matched.

GET /api/v1/drugs/lookup?system=pharmacode
curl 'https://drug-database.com/api/v1/drugs/lookup\
?system=pharmacode&code=1234567' \
  -H 'Authorization: Bearer dd_live_…'
response
{
  "drug": {
    "id": "3f8a1c2d-1b4e-4c7a-9d2f-0a1b2c3d4e5f",
    "swissmedic_no": "65187",
    "product_name": "Aspirin Cardio 100 mg",
    "atc_code": "B01AC06",
    "manufacturer": "Bayer (Schweiz) AG",
    "dispensing_cat": "B",
    "is_reimbursed": true,
    "country_code": "CH",
    "last_synced_at": "2026-06-27T02:14:00Z"
  },
  "matched_alias": {
    "drug_id": "3f8a1c2d-…",
    "system": "pharmacode",
    "code": "1234567",
    "pack_size": 30,
    "public_price": 14.35,
    "currency": "CHF",
    "is_primary": true
  },
  "_meta": { "sources": ["bag_sl", "oddb"] }
}

Coverage & sourcing

  • The same endpoint resolves gtin, pharmacode, cip13, pzn, swissmedic_no, ean, ndc11 and dmd_amppid.
  • Pharmacode and pack data are data sourced from oddb and BAG-SL.
  • Each resolved row carries last_synced_at for pack-level freshness.
  • We are not affiliated with or endorsed by Refdata, oddb or BAG.
Good to know
  • · Lookups need the drugs:read scope.
  • · The same endpoint resolves GTIN, NDC, PZN, CIP13, EAN and Swissmedic-No — see the docs.

FAQ

Common questions

Pharmacode is the Swiss pharmaceutical article number maintained in the Refdata register. It identifies a specific pack on the Swiss market. The lookup endpoint maps it to the canonical drug row in one indexed read.
Yes. The resolved drug carries its swissmedic_no, and the full record (GET /api/v1/drugs/{id}) lists every alias — GTIN, Swissmedic-No and others — for the same product, so you can cross-walk between identifier systems.
The same /api/v1/drugs/lookup endpoint resolves gtin, pharmacode, cip13, pzn, swissmedic_no, ean, ndc11 and dmd_amppid — just change the system parameter.

Ready when you are

Ship pharmacode lookup on data that stays fresh.

Free to test — 100 requests/day, no card. Upgrade only when you need the throughput.

Free tier · 100 requests/day · No card required