China NMPA UDI Daily Updates API avatar

China NMPA UDI Daily Updates API

Pricing

from $2.50 / 1,000 udi records

Go to Apify Store
China NMPA UDI Daily Updates API

China NMPA UDI Daily Updates API

Get medical-device records from China NMPA UDI daily and weekly release files. Preview 100 records or import a complete release, with package integrity checks and structured fields for your ERP or device database.

Pricing

from $2.50 / 1,000 udi records

Rating

0.0

(0)

Developer

Vadim Bezrukov

Vadim Bezrukov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Keep your medical-device records up to date with China NMPA UDI daily and weekly releases. Download a release as structured rows with device identifiers, product names and registration details, or preview 100 records before a full import.

This Actor is an independent tool that consumes NMPA's public release packages. It is not affiliated with NMPA and is not the official NMPA shared API.

The first published version is described in the changelog.

Preview 100 records

{
"releaseType": "daily",
"latestOnly": true,
"maxPackages": 1,
"outputMode": "preview",
"previewRecords": 100
}

The Actor downloads and MD5-verifies the full official package, then emits only the first 100 records with output_scope=PREVIEW. Use the preview to check field names and values before importing a complete release.

Use from AI agents with MCP

Direct tool URL (authenticated OAuth or API token required to run): https://mcp.apify.com?tools=automa-flow/nmpa-udi-daily-updates

Select this Actor when an agent must refresh an ERP/WMS/device-master cache from the official NMPA UDI daily or weekly release feed, with MD5 integrity and explicit NO_RELEASE vs SOURCE_FAILED statuses.

Do not select it for current-state NMPA search, product submission, FDA/EUDAMED joins, or the multi-million-row full baseline dump.

Ask your agent something like: Run automa-flow/nmpa-udi-daily-updates with releaseType daily, latestOnly true, outputMode preview, previewRecords 100, maxTotalChargeUsd 0.5; then report RUN_SUMMARY status, recordsEmitted, recordsBilled and nextAction before reading the Dataset.

Anonymous discovery (no token) only supports Store search tools: https://mcp.apify.com?tools=search-actors,fetch-actor-details. Direct Actor execution always needs the caller's own Apify account.

Estimate the charge before running:

SizeInputActor PPE (platform usage included)
Small / first runpreview 100 records≈ $0.26
Complete daily releasecomplete latest daily (~3k-10k rows)≈ $7.51-$25.01
Large weekly releasecomplete weekly (~40k-55k, 2 GB) or raise maxTotalChargeUsd≈ $100.02-$137.52

At maxTotalChargeUsd, already charged batches stay in the Dataset; further packages stop with BUDGET_EXCEEDED in RUN_SUMMARY. Read RUN_SUMMARY.nextAction first.

What you get

Each Dataset row is one UDI release record with:

  • stable source_record_key (deviceRecordKey)
  • normalized upload_type (add / modify from official versionStauts 新增/更新)
  • UDI-DI, product/trade names, model, registrant, registration/filing number, coding system
  • release provenance (filename, dates, MD5, published count)
  • source_fields: original Chinese values plus nested packingList / storageList / clinicalList (their children are always arrays, even with one entry); contactList only when includeContactList=true
  • fingerprint (this release event) and content_fingerprint (device state only, equal across the daily package and the overlapping weekly package, so you can deduplicate)
  • output_scope: PREVIEW or COMPLETE_RELEASE

RUN_SUMMARY in the Key-Value Store includes status, package counts, recordsEmitted, recordsBilled, coverage, warnings and nextAction for agents.

Who it is for

Medtech ERP/WMS integrators, distributors, hospital device-master teams, regulatory-data pipelines and China-market intelligence systems that need a recurring NMPA UDI update feed.

Production sync

{
"releaseType": "daily",
"latestOnly": true,
"maxPackages": 1,
"outputMode": "completeRelease"
}

Or a bounded window (daily max 31 calendar days; weekly packages clamped at 8). Use dates inside the current feed:

{
"releaseType": "daily",
"latestOnly": false,
"fromDate": "2026-09-13",
"toDate": "2026-09-17",
"maxPackages": 5,
"outputMode": "completeRelease"
}

Packages are processed in chronological order (oldest first).

What a window can cover

NMPA keeps only the latest few packages in its RSS and download page (observed on 2026-09-17: 5 daily, 4 weekly). There is no deep backfill from this source. The Actor never guesses:

  • a window that starts before the oldest available package gets a warning, coverage.windowStartsBeforeOldestAvailable=true and, if nothing matches, NO_RELEASE;
  • a window that matches more packages than maxPackages processes the oldest ones and sets coverage.truncatedByMaxPackages=true with a warning naming the remainder.

RUN_SUMMARY.coverage always lists oldestAvailable, newestAvailable, matchedPackages, processedPackages and complete. Read coverageComplete before treating a SUCCESS run as a full sync.

add vs modify

These values come from NMPA release field versionStauts (source spelling):

Source valueNormalized upload_type
新增add
更新modify

They describe the source data-submission/update operation. They do not mean "newly marketed product" or "regulatory risk event".

Scheduling

Schedule a daily run with latestOnly=true and outputMode=completeRelease, or a weekly run with releaseType=weekly. Attach an Apify webhook to push Dataset items into your ERP/WMS/ETL job.

Pricing (PPE)

EventPrice
Actor start$0.01 per GB of run memory (default 1 GB = $0.01; the platform charges one start event per GB)
udi-record$0.0025 / successfully emitted record ($2.50 per 1,000)

Examples:

  • Preview 100 records ≈ $0.26
  • Complete daily ~5,000 records ≈ $12.51
  • Complete weekly ~50,000 records (2 GB run) ≈ $125.02

Platform usage (compute, storage, transfer) is covered by these event prices; nothing is billed on top.

Never charged: RSS/manifest fetches, retries, failed packages, MD5/parse failures, KVS summaries.

Predict a bill before the run: the NMPA download manifest publishes each package's record count, so a complete release costs records × $0.0025 + $0.01 per GB of run memory. Set maxTotalChargeUsd to that figure (Tasks ship with $0.50 for previews and $30 for a complete daily package); at the limit the run stops with BUDGET_EXCEEDED and every charged row stays in the Dataset.

Source & integrity

  1. Read official RSS (files=daily / files=weekly)
  2. Join MD5 / counts from https://udi.nmpa.gov.cn/download.html
  3. Download ZIP from the RSS-provided udid.nmpa.gov.cn URL
  4. Verify MD5 before parsing
  5. Stream-parse XML to a temp spool, then emit/charge Dataset rows in batches. Weekly packages are ZIPs of nested UDID_DAY_UPDATE_*.zip members; each nested daily ZIP is expanded one level and its XML is parsed in chronological member order.

Failure semantics

StateMeaning
SUCCESSEvery selected package was MD5-verified and emitted. A verified package whose header declares 0 records is a normal EMPTY package (run SUCCEEDED, zero rows, nextAction says so), not a failure
NO_RELEASERSS/manifest OK; no package matches the requested window → run SUCCEEDED, zero data rows
SOURCE_FAILEDTransport, HTML challenge, missing/mismatched MD5, unsafe ZIP, malformed XML, or a package where every record lacks deviceRecordKey
PARTIALSome selected data was not delivered: a package failed after others were emitted, or individual records without deviceRecordKey were skipped (recordsSkippedNoKey). Terminal Apify status is still SUCCEEDED; inspect failedPackages / nextAction
BUDGET_EXCEEDEDSpend limit hit mid-emit; charged batches remain valid, unprocessed packages are listed as SKIPPED_BUDGET. Terminal status is SUCCEEDED when any rows were billed; FAILED only when zero useful rows were emitted

NO_RELEASE is never collapsed into SOURCE_FAILED. An empty but parseable RSS channel is treated as NO_RELEASE (not an outage signal). An RSS item with an unrecognized filename (for example a future monthly package) is skipped with a warning; the run fails only if no item is a usable package. A versionStauts value outside 新增/更新 leaves upload_type=null, is counted once per value in RELEASE_SUMMARY.unknownUploadTypeCounts and is called out in nextAction.

Limitations

  • Not a current-state NMPA search/lookup API
  • Not NMPA submission/upload
  • Not the multi-million-row full baseline dump
  • Not real-time (release-based)
  • Chinese source values are preserved; translation and LLM enrichment are not included
  • No deep backfill: only the packages NMPA currently lists (about 5 daily, 4 weekly) are reachable
  • source_fields.contactList (registrant contact person phone / e-mail / fax as published by NMPA) is dropped by default; set includeContactList=true only if your workflow needs it. This Actor does not enrich or scrape private contacts

Connection details

The Actor uses HTTP without a browser or proxy by default. Downloads are limited to udi.nmpa.gov.cn and udid.nmpa.gov.cn.