# EUDAMED Device Registration Change Monitor (`xtech/eudamed-device-change-monitor`) Actor

𝗠𝗼𝗻𝗶𝘁𝗼𝗿 𝗘𝗨𝗗𝗔𝗠𝗘𝗗 device registrations by UDI-DI, Basic UDI-DI, or exact trade name. Build a baseline, detect new or changed public records, and export manufacturer, status, changed fields, timestamps, and official source links.

- **URL**: https://apify.com/xtech/eudamed-device-change-monitor.md
- **Developed by:** [Xtech](https://apify.com/xtech) (community)
- **Categories:** Business, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 monitored device records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

EUDAMED Device Registration Change Monitor tracks matched records in the public UDI/Devices module by UDI-DI, Basic UDI-DI, or exact trade name. Create a baseline once, then schedule recurring checks to receive a focused feed of records that are new or have changed.

Independent tool. Not affiliated with, endorsed by, or sponsored by the European Commission or EUDAMED.

### What EUDAMED device records can you monitor?

Monitor up to 30 exact device identifiers and 20 exact public trade names in one watchlist. Identifier searches provide the most precise match. The first tracked run saves a baseline; later runs compare the latest public record with that baseline and return changes by default. Turn on unchanged records when you need a full current snapshot instead.

This Actor covers only publicly available records from EUDAMED’s UDI/Devices module. It does not monitor actor registration, notified bodies and certificates, vigilance, clinical investigations, market surveillance, or any other EUDAMED module.

### Public UDI/Devices data

Each matched row can include:

- Primary UDI-DI and Basic UDI-DI
- Trade name, device name, model, and reference
- Manufacturer name and SRN when published
- Authorised representative details when published
- Public risk-class, device-status, and manufacturer-status codes
- Match reason, change type, and changed fields
- Observation time and direct official-source link

### How to monitor EUDAMED device registrations

1. Add exact UDI-DI or Basic UDI-DI values, exact public trade names, or both.
2. Give the watchlist a recognizable monitor name.
3. Keep change tracking enabled and reuse the same snapshot-store name.
4. Run once to establish the baseline, then schedule recurring checks.

#### Example input

```json
{
  "deviceIdentifiers": ["D924360030EU1"],
  "tradeNames": ["Exact Public Trade Name"],
  "monitorName": "cardiology-watchlist",
  "trackChanges": true,
  "includeUnchanged": false
}
````

### Medical device monitoring use cases

- Follow known devices or device families during supplier review
- Watch published competitor device identifiers
- Maintain a change feed for regulatory and quality teams
- Review public manufacturer or device-status changes
- Build recurring market-intelligence datasets around named devices

### Pricing

You pay only for public device rows written to the dataset. Empty searches, source errors, and unchanged records omitted by change-only mode do not create a paid output row. Use the record limit and an Apify run spending limit for cost control.

### Frequently asked questions

#### Does this monitor cover all of EUDAMED?

No. It covers only public UDI/Devices records and does not search or monitor other EUDAMED modules.

#### Can I search by a partial trade name?

Use the exact public trade name for dependable matching. Prefer a UDI identifier whenever one is available.

#### How are changes detected?

The monitor compares matched public fields with the stored baseline for the same watchlist and labels new, changed, unchanged, or current records.

### Limitations

Public-register coverage and fields are controlled by EUDAMED and can change or be corrected at the source. Codes are returned as published and should be verified using the official link. The output is a monitoring and research aid, not a regulatory determination, conformity assessment, clinical recommendation, or safety alert.

# Actor input Schema

## `deviceIdentifiers` (type: `array`):

Exact UDI-DI or Basic UDI-DI values to monitor. The monitor automatically checks the appropriate public identifier field.

## `tradeNames` (type: `array`):

Optional exact device trade names as shown in EUDAMED. Use a device identifier whenever you have one for the most precise monitoring.

## `monitorName` (type: `string`):

A label included in your results. Keep it the same on recurring runs to compare the same watchlist.

## `trackChanges` (type: `boolean`):

Save a private baseline and label new or changed public records on later runs.

## `includeUnchanged` (type: `boolean`):

Turn this on for a full current snapshot. Leave it off for a smaller change-only feed after the first run.

## `snapshotStoreName` (type: `string`):

Use the same store for recurring runs of one monitoring programme. Use another name to keep programmes separate.

## `maxRecordsPerSearch` (type: `integer`):

Limit each exact search to control the size of a broad trade-name result. Device-identifier searches normally return only the matching record or family.

## Actor input object example

```json
{
  "deviceIdentifiers": [
    "D924360030EU1"
  ],
  "monitorName": "eudamed-device-monitor",
  "trackChanges": true,
  "includeUnchanged": false,
  "snapshotStoreName": "eudamed-device-monitor-snapshots",
  "maxRecordsPerSearch": 100
}
```

# Actor output Schema

## `deviceChanges` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "deviceIdentifiers": [
        "D924360030EU1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtech/eudamed-device-change-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "deviceIdentifiers": ["D924360030EU1"] }

# Run the Actor and wait for it to finish
run = client.actor("xtech/eudamed-device-change-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "deviceIdentifiers": [
    "D924360030EU1"
  ]
}' |
apify call xtech/eudamed-device-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=xtech/eudamed-device-change-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EUDAMED Device Registration Change Monitor",
        "description": "𝗠𝗼𝗻𝗶𝘁𝗼𝗿 𝗘𝗨𝗗𝗔𝗠𝗘𝗗 device registrations by UDI-DI, Basic UDI-DI, or exact trade name. Build a baseline, detect new or changed public records, and export manufacturer, status, changed fields, timestamps, and official source links.",
        "version": "0.1",
        "x-build-id": "5H7hj6YKaQ4OTwOQq"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/xtech~eudamed-device-change-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-xtech-eudamed-device-change-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/xtech~eudamed-device-change-monitor/runs": {
            "post": {
                "operationId": "runs-sync-xtech-eudamed-device-change-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/xtech~eudamed-device-change-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-xtech-eudamed-device-change-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "deviceIdentifiers": {
                        "title": "Device identifiers",
                        "maxItems": 30,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Exact UDI-DI or Basic UDI-DI values to monitor. The monitor automatically checks the appropriate public identifier field.",
                        "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 200
                        }
                    },
                    "tradeNames": {
                        "title": "Exact public trade names",
                        "maxItems": 20,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional exact device trade names as shown in EUDAMED. Use a device identifier whenever you have one for the most precise monitoring.",
                        "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 500
                        }
                    },
                    "monitorName": {
                        "title": "Monitor name",
                        "minLength": 1,
                        "maxLength": 100,
                        "type": "string",
                        "description": "A label included in your results. Keep it the same on recurring runs to compare the same watchlist.",
                        "default": "eudamed-device-monitor"
                    },
                    "trackChanges": {
                        "title": "Track changes between runs",
                        "type": "boolean",
                        "description": "Save a private baseline and label new or changed public records on later runs.",
                        "default": true
                    },
                    "includeUnchanged": {
                        "title": "Include unchanged records",
                        "type": "boolean",
                        "description": "Turn this on for a full current snapshot. Leave it off for a smaller change-only feed after the first run.",
                        "default": false
                    },
                    "snapshotStoreName": {
                        "title": "Snapshot store name",
                        "pattern": "^[A-Za-z0-9_-]+$",
                        "minLength": 1,
                        "maxLength": 100,
                        "type": "string",
                        "description": "Use the same store for recurring runs of one monitoring programme. Use another name to keep programmes separate.",
                        "default": "eudamed-device-monitor-snapshots"
                    },
                    "maxRecordsPerSearch": {
                        "title": "Maximum records per search",
                        "minimum": 1,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Limit each exact search to control the size of a broad trade-name result. Device-identifier searches normally return only the matching record or family.",
                        "default": 100
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
