MD Atlas
BlogPricingSign in
MD Atlas

© 2026 Made In Tracker

Explore

CompaniesDevicesDocumentsPersons

Resources

BlogFAQGlossaryAboutFeatures

Company

PricingPartnersRefer & earnTop referrersContact

Legal

Privacy PolicyLegal Notice

Ecosystem

Made In Tracker (opens in new tab)EasyUDI (opens in new tab)

Our data is continuously updated and sourced from EUDAMED, the European database for medical devices and in vitro diagnostics.

Monthly EUDAMED change digest

Get a monthly digest of the new devices, certificates and manufacturers added to EUDAMED — straight to your inbox.

Check the consent box to subscribe.

Metered · pay-as-you-goLive EUDAMED data · read-onlyPrivate beta · endpoints go live at launch

Build EUDAMED into whatever you're shipping.

One clean HTTP API over the entire EU medical-device register — 49,917 companies, 3,070,430 devices, every CE certificate and Basic UDI. Rich filters, one stable schema per entity, pay only for the calls you make. No portal scraping, no brittle HTML parsing.

By subscribing you accept the Privacy Policy.
See what you can build
  • Free at launch — 100 lookups, no card
  • OpenAPI 3.1 + interactive Scalar docs
  • Bearer key or OAuth 2.1
resolve a manufacturer → pull its devicesREAD-ONLY
# 1 — resolve the manufacturer directly by its EUDAMED SRN
$ curl -s https://api.md-atlas.com/v1/companies/by-srn/DE-MF-000024680 \
     -H "Authorization: Bearer $MDATLAS_KEY"

HTTP/2 200   x-credits-remaining: 4993
{ "data": { "id": "cmp_9Qk2vX7", "srn": "DE-MF-000024680",
         "name": "Beispiel Medizintechnik GmbH", "totalDevices": 312 } }

# 2 — every device it registered, one stable schema, paginated
$ curl -s "https://api.md-atlas.com/v1/devices?manufacturerSrn=DE-MF-000024680&riskClass=IIb,III" \
     -H "Authorization: Bearer $MDATLAS_KEY"

HTTP/2 200   x-credits-remaining: 4988
{ "data": [ … ], "page": 1, "total": 1284, "nextPage": 2 }
What you build

Five systems teams ship on the MD Atlas API.

Each is a real medtech integration. Problem → how the API solves it → the exact endpoints and filters it leans on. Find your project on this page.

QMS / PLM sync · flagship

Keep your QMS & PLM in lock-step with EUDAMED

Problem. Your internal quality/regulatory system drifts from the register the moment a certificate lapses, a device status flips, or a manufacturer changes standing — and nobody notices until an audit.

How. Nightly (or hourly) delta pull across companies, devices, and certificates, keyed by SRN and Basic UDI-DI. One stable schema per entity means your ETL mapping never breaks. Diff against your last snapshot, push only what changed.

Endpoints & filters
GET /v1/companiesGET /v1/devicesGET /v1/certificatesstatusmanufacturerSrnriskClasspage / nextPage

Stable IDs + certificate validity windows let you reconcile deterministically — no fuzzy matching against scraped portal HTML.

Regulatory / competitive intelligence

Competitive-intelligence dashboards

Problem. Leadership wants a rival's portfolio, its risk-class mix, and which notified bodies it works with — refreshed, not a one-off slide.

How. Query a competitor by SRN, facet its devices by risk class and EMDN category, and roll up its notified-body relationships straight into your BI layer.

GET /v1/devicesGET /v1/certificatesriskClassemdnnotifiedBody
BI / data-warehouse pipeline

Bulk-pull into your warehouse

Problem. Your analysts want EUDAMED as a modelled table next to your own data — not a CSV someone re-exports by hand each quarter.

How. Paginate the full company / device / certificate corpus into Snowflake, BigQuery, or Postgres. One schema per entity and a stable { page, nextPage } envelope — the pipeline just resumes on nextPage.

GET /v1/companiesGET /v1/devicespage / nextPagelegislation
Supplier / due-diligence screening

Supplier & M&A due diligence

Problem. Procurement or a deal team needs to verify a manufacturer's real footprint and whether its certificates are actually valid — fast, defensibly.

How. Resolve the entity by SRN, pull its device list, then check certificate status & type per device. Green/amber/red the supplier from a source-traceable answer.

GET /v1/companiesGET /v1/devicesGET /v1/certificatesstatuscertificateType
Embed in your product

Ship a "device lookup" feature

Problem. Your own SaaS users keep asking for EUDAMED lookups — and you don't want to build and maintain an ingestion pipeline to answer them.

How. Call detail endpoints by Basic UDI-DI or device id straight from your backend, cache the JSON, render it in your UI. Metered per call — your feature, our data plumbing.

GET /v1/devices/{id}GET /v1/basic-udi/{code}basicUdiissuingAgency
Which interface is right for me?

MCP is flat-rate. The API is pay-as-you-go.

We built two products on purpose, over the same authoritative EUDAMED database. Pick by how you’re consuming it — and yes, plenty of teams use both.

Flat rate · MD Atlas MCP

Answers, in your AI assistant

Want plain-language answers inside Claude, ChatGPT, or Cursor?

  • →You ask a regulatory question, the assistant returns a sourced answer
  • →No code — regulatory, QA/RA, and consulting teams use it directly
  • →Read-only by design · OAuth 2.1 · source-traceable
  • ✕You don't build against it — you talk to it

Flat-rate, unlimited — bundled in the MD Atlas IA subscription, no per-call metering. Explore the MCP →

Pay-as-you-go · MD Atlas API

Data, in your own system

Building your own product, pipeline, or dashboard?

  • →You call HTTP endpoints, you get structured JSON to store and model
  • →For engineers — QMS sync, BI pipelines, embedded lookups, dashboards
  • →Bearer key or OAuth 2.1 · OpenAPI 3.1 · one stable schema per entity
  • →Credits never expire — no subscription, no monthly reset

Metered pay-as-you-go — non-expiring credit packs, you pay only for what you call. See pricing ↓

Rule of thumb: MCP for a human asking questions · API for software making requests.

The surface

Nine endpoints. One mental model.

Every resource has a list endpoint (filterable, paginated) and a detail endpoint. Filters are comma-separated: values within a facet are OR, facets across each other are AND. Cost is weighted per call and returned in the X-Credits-Remaining header.

EndpointReturnsCost
GET/v1/companiesSearch companies5
GET/v1/companies/:idFull company dossier by MD Atlas id1
GET/v1/companies/by-srn/:srnResolve directly by EUDAMED SRN (+ device rollup)2
GET/v1/devicesSearch devices5
GET/v1/devices/:idFull device record1
GET/v1/certificatesSearch CE certificates5
GET/v1/certificates/:idCertificate of record + issuer1
GET/v1/basic-udi/:codeBasic UDI-DI group + its device variants2
GET/healthLiveness + EUDAMED ingestion freshnessfree

Consistent envelope

Every list returns { data, page, total, nextPage }. Follow nextPage until it comes back null to walk the long tail — one shape per entity, every time.

Multi-value filters

?country=DE,FR means DE OR FR. Add &actorType=manufacturer and both must hold — within-facet OR, across-facet AND. Predictable, indexable.

Aggregates, not N calls

By-SRN and by-code roll-ups (device counts, risk-class mix, certificate health) cost 2× a detail lookup and return one row — never paginate to count.

Capabilities

Rich filters. Multi-value logic. One schema per entity.

The same faceting that powers MD Atlas search — exposed as query parameters. Comma-separate for multi-value: OR within a facet, AND across facets.

Filter surface by entityteal = high-value facet
Companies
actorTypecountrycitystatusdevice facets (cross-axis)
Devices
regulationriskClasslegislationemdn (tree)issuingAgencymanufacturerSrn
Certificates
statuscertificateTypelegislationriskClasslanguages
Basic UDI-DI
basicUdiissuingAgencydevice detail join
Auth & error contract

Boring auth. Honest errors.

Two ways in, one error shape. Every non-2xx is a typed JSON envelope with a machine code, a human message, a docs link, and the action to take — so your retry logic never parses a string.

API key

Create a key in the dashboard, scope it, rotate it. Live and test keys are prefix-namespaced (sk_live_ / sk_test_).

OAuth 2.1 for delegated access

Authorization-code + PKCE for apps acting on a customer's behalf. No key on disk; short-lived tokens, refresh rotation.

Rate limits & live credit balance

Per-key rate limits return 429 with X-RateLimit-* — separate from a 402. Every response carries X-Credits-Remaining, so you never guess.

error envelopeJSON
# 401 — no / bad key
HTTP/2 401
{ "error": {
    "code":    "missing_api_key",
    "message": "Provide an Authorization: Bearer header.",
    "docs":    "https://api.md-atlas.com/docs/auth",
    "action":  "create_key_in_dashboard"
} }

# 402 — you're out of credits
HTTP/2 402
{ "error": {
    "code":    "insufficient_credit",
    "message": "Balance is 0 credits.",
    "docs":    "https://api.md-atlas.com/docs/billing",
    "action":  "top_up_or_enable_auto_refill"
} }
Integrate in five minutes

Copy, paste, ship.

The same request in the three stacks you’re most likely to reach for — each echoing the credits header and handling a 402. No SDK required to start.

$ curl -s "https://api.md-atlas.com/v1/devices?riskClass=IIb,III&country=DE" \
     -H "Authorization: Bearer $MDATLAS_KEY" \
     -D -   # dump headers → x-credits-remaining: 4988

# 402 on empty balance → { "error": { "code": "insufficient_credit", … } }
# 200 → {"data": [ … ], "page": 1, "total": 1284, "nextPage": 2 }
const res = await fetch(
  "https://api.md-atlas.com/v1/devices?riskClass=IIb,III&country=DE",
  { headers: { Authorization: `Bearer ${process.env.MDATLAS_KEY}` } },
);

if (res.status === 402) throw new Error("top up credits");
const { data, nextPage } = await res.json();
console.log(res.headers.get("x-credits-remaining")); // "4988"
import os, requests

r = requests.get(
    "https://api.md-atlas.com/v1/devices",
    params={"riskClass": "IIb,III", "country": "DE"},
    headers={"Authorization": f"Bearer {os.environ['MDATLAS_KEY']}"}, timeout=10,
)
if r.status_code == 402: raise RuntimeError("top up credits")
payload = r.json()
print(payload["total"], r.headers["x-credits-remaining"])

Prefer types? Generate a typed client straight from openapi.json — the full contract is published as OpenAPI 3.1 with an interactive Scalar reference you can try in the browser. No SDK to install; same contract either way. Endpoints go live at launch — join the waitlist to get your key first.

Pricing

Buy credits once. They don't expire.

Every pack is a one-time purchase of non-expiring credits — and it is ONE balance: the same credits fund company monitoring, DataMatrix labels and QARA briefs across MD Atlas. Spend them wherever you like. The bigger the pack, the cheaper each lookup — €0.3003 down to €0.1056. Free at launch, no card.

Credit balance1,144 / 1,667

Growth pack · non-expiring · auto-refill on

GET /v1/devices/{id}1×
GET /v1/companies/by-srn/…2×
GET /v1/devices?q=catheter5×

Metering you can watch tick down.

Every call is weighted and drawn from your balance in real time — a detail lookup is the unit, an aggregate costs 2× that, a search 5×. The X-Credits-Remaining header on every response mirrors this ledger, so your code always knows exactly where it stands — no monthly reset, no surprise wall.

Free
≈ 100 lookups
€0
no card required
Enough to test the integration
never expires
Starter
≈ 333 lookups
€100
≈ €0.3003 / lookup
100 credits
Small integrations
never expires
Most popular
Growth
≈ 1,667 lookups
€360
≈ €0.2160 / lookup
500 credits
Dashboards & sync
never expires
Scale
≈ 5,000 lookups
€780
≈ €0.1560 / lookup
1,500 credits
Warehouse pipelines
never expires
Business
≈ 16,667 lookups
€1,760
≈ €0.1056 / lookup
5,000 credits
High-volume / embed
never expires
Per-lookup price declines as you scale:€0.3003 → €0.1056· detail 1× · aggregate 2× · search 5×· /health free

Need more than 500k or a custom SLA? Talk to us. Out of balance? You'll get a 402 insufficient_credit — top up (or turn on auto-refill) and retry.

How credits are spent

One number to remember: what a call costs.

Every endpoint has a fixed credit weight. Heavier queries scan more data, so they cost more — but you always know the price before you send.

1
Detail by ID
Fetch one company, device or certificate you already know.
GET /v1/devices/{id}
2
Aggregate
Rolled-up stats by SRN or code — device counts, risk-class spread.
GET /v1/companies/by-srn/{srn}
5
Search / list
Full-text query across the whole EUDAMED corpus, paginated.
GET /v1/devices?q=…

What does a pack get me?

Worked example — the Growth pack, 500 credits.

1,667 lookups
= 1,667 detail lookups • or 833 aggregates • or 333 searches
Detail lookups1×1,667
Aggregates2×833
Searches5×333

Real workloads mix all three — a typical enrichment run of "search once, then fetch the 20 matches" costs 5 + 20 = 25 lookup-units, i.e. 7.5 credits ≈ €7.50.

Opt-in · off by default

Never hit a wall mid-pipeline.

Turn on auto-refill and we top up your chosen pack automatically when your balance dips below a threshold you set. It's off by default, on your terms, and spend-capped — never a wall mid-pipeline, never a surprise bill, never a forced monthly reset.

  • You pick the pack and the low-balance trigger.
  • Topped-up credits are non-expiring, just like the rest.
  • Set a monthly spend ceiling; we stop before it.
  • Switch it off anytime — your remaining balance stays.
Auto-refill
Keep the pipeline running
When balance drops below333 lookups (100 cr)
Top up withGrowth · 1,667 lookups
Monthly spend cap€400
FAQ

Before you integrate.

How is this different from the MCP server?+−

Same data, different consumer. The MCP server is flat-rate and unlimited inside the MD Atlas IA subscription — built for humans asking questions in Claude, ChatGPT, or Cursor. This HTTP API is the opposite by design: metered, pay-as-you-go REST for developers wiring EUDAMED into their own systems. Building a system? API. Want answers in your assistant? MCP. Many teams run both.

What do credits map to?+−

Credits are MD Atlas's one currency — the same balance funds API calls, company monitoring, DataMatrix labels and QARA briefs, so you are never left holding the wrong kind of credit. On the API, one detail lookup costs 0.3 credits, so a single credit is 3 lookups. Calls are weighted: detail 1×, aggregate 2×, search 5×. Credits never expire, and the per-lookup price drops the larger the pack — from €0.3003 on Starter to €0.1056 on Business.

Do credits expire, or is there a subscription?+−

No and no. Every pack is a one-time purchase of a non-expiring balance — a credit you buy today is spendable next year, with no monthly reset. Optional auto-refill exists for teams who’d rather not think about it, but it’s off by default with a spend cap you set.

Can I keep my QMS or warehouse in sync?+−

Yes — that's the flagship use case. Paginate companies / devices / certificates on a schedule, keyed by SRN and Basic UDI-DI, diff against your last snapshot, and write only the deltas. One stable schema per entity means your ETL mapping doesn't break when the register changes.

How do multi-value filters work?+−

Comma-separate values within a facet for OR (riskClass=IIb,III), and combine different facets for AND (riskClass=III&country=DE). Company queries can also filter on device facets (cross-axis), so "manufacturers in Germany with class III devices" is a single request.

Can I try it before paying?+−

At launch — 100 free lookups, no card. Spend them as 50 aggregates or 20 searches instead if you prefer: enough to test the integration end-to-end and see the exact JSON your code will handle before you buy a pack.

What happens if a search returns no results?+−

An empty search still costs its weight — the query ran and scanned the corpus, so a zero-result search is billed like any other search. In practice this barely moves the needle: detail lookups are the 1× unit and aggregates 2×, and they are the bulk of most workloads — a 5× search is the exception, not the pattern. You always see the weight before you send.

Is the data authoritative and fresh?+−

It’s the live MD Atlas database — the EU EUDAMED read surface under MDR/IVDR, continuously ingested into an indexed, denormalized store. /health reports ingestion freshness, so you can always see how current the corpus is. Read-only by design; every record is source-traceable back to EUDAMED.

Get your API key at launch.

Free at launch — 100 lookups, no card. Be first in line to wire 49,917 companies and 3,070,430 devices — the whole EU medical-device register — into your product, pipeline, or dashboard.

By subscribing you accept the Privacy Policy.

Prefer answers in your AI assistant instead? Explore the MD Atlas MCP →