China NMPA UDI Daily Updates API
Pricing
from $2.50 / 1,000 udi records
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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:
| Size | Input | Actor PPE (platform usage included) |
|---|---|---|
| Small / first run | preview 100 records | ≈ $0.26 |
| Complete daily release | complete latest daily (~3k-10k rows) | ≈ $7.51-$25.01 |
| Large weekly release | complete 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/modifyfrom officialversionStauts新增/更新) - 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 nestedpackingList/storageList/clinicalList(their children are always arrays, even with one entry);contactListonly whenincludeContactList=truefingerprint(this release event) andcontent_fingerprint(device state only, equal across the daily package and the overlapping weekly package, so you can deduplicate)output_scope:PREVIEWorCOMPLETE_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=trueand, if nothing matches,NO_RELEASE; - a window that matches more packages than
maxPackagesprocesses the oldest ones and setscoverage.truncatedByMaxPackages=truewith 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 value | Normalized 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)
| Event | Price |
|---|---|
| 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
- Read official RSS (
files=daily/files=weekly) - Join MD5 / counts from
https://udi.nmpa.gov.cn/download.html - Download ZIP from the RSS-provided
udid.nmpa.gov.cnURL - Verify MD5 before parsing
- Stream-parse XML to a temp spool, then emit/charge Dataset rows in batches.
Weekly packages are ZIPs of nested
UDID_DAY_UPDATE_*.zipmembers; each nested daily ZIP is expanded one level and its XML is parsed in chronological member order.
Failure semantics
| State | Meaning |
|---|---|
SUCCESS | Every 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_RELEASE | RSS/manifest OK; no package matches the requested window → run SUCCEEDED, zero data rows |
SOURCE_FAILED | Transport, HTML challenge, missing/mismatched MD5, unsafe ZIP, malformed XML, or a package where every record lacks deviceRecordKey |
PARTIAL | Some 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_EXCEEDED | Spend 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; setincludeContactList=trueonly 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.