# APAC Product Recall Monitor (食品藥品醫材回收) — Taiwan FDA (`waisuan/apac-product-recall-monitor`) Actor

Daily-schedulable feed of food, drug and medical device recalls from Taiwan FDA open data: Taiwan drug and device recalls, rejected food imports, plus TFDA's translated recall alerts from Japan, Korea, Hong Kong and more. Stable ids for de-duplication.

- **URL**: https://apify.com/waisuan/apac-product-recall-monitor.md
- **Developed by:** [Waisuan](https://apify.com/waisuan) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## APAC Product Recall Monitor (食品藥品醫材回收) — Taiwan FDA

A schedulable feed of **food, drug and medical device recalls and safety alerts** built entirely on official, commercially reusable open data from the **Taiwan Food and Drug Administration (TFDA)**. In one run you get Taiwan's own drug recalls, medical device recalls and safety notices, imported food rejected at the Taiwan border, plus TFDA's daily-curated, translated recall alerts from **Japan, Korea, Hong Kong, Singapore, China, Australia/New Zealand** and Western regulators. Every record has the same English field names, ISO dates and a **stable `id`**, so you can run it daily and keep only new rows.

### Who is it for

- **Importers, distributors and retailers** selling into Taiwan or sourcing from Japan/Korea: get warned when a product, brand or supplier you handle is recalled or rejected at the border.
- **Regulatory affairs, QA and compliance teams** at food, pharma and med-tech companies tracking recalls by licence number, company or contaminant.
- **Market-intelligence, insurance and risk analysts** building recall databases or dashboards.
- **Automation builders and AI agents** that need a clean daily JSON feed for Slack/e-mail alerts.

### What is covered

| `country` | `category` | `recordType` | TFDA dataset |
|---|---|---|---|
| TW | drug | recall (with class I/II/III, lot numbers, licence number, holder) | 回收藥品資料集 (InfoId 34) |
| TW | medicalDevice | recall / safetyAlert (title, date, link to the TFDA notice) | 醫療器材安全警訊資料集 (InfoId 152, latest 1,000 notices) |
| TW | food | borderRejection (imported food that failed inspection: importer, origin, HS code, test result, disposal) | 不符合食品資訊資料集 (InfoId 52) |
| JP, KR, HK, SG, CN, AUNZ, US, FR, … | food | recall | 消費紅綠燈-國際食品 (InfoId 62): TFDA's translations of foreign recalls, incl. whether the product was imported into Taiwan |
| JP, KR, HK, CN, CH, US, … | drug | recall / safetyAlert | 消費紅綠燈-國際藥品 (InfoId 65) |

`country` is the jurisdiction that **announced** the recall. Foreign alerts are TFDA summaries (Traditional Chinese, often with the original Japanese/English product name and a link to the original notice in `detailUrl`).

### Input example

```json
{
  "countries": ["JP", "KR", "HK", "SG"],
  "categories": ["food"],
  "daysBack": 90,
  "keyword": "李斯特菌",
  "maxItems": 50
}
```

| Field | Meaning |
|---|---|
| `countries` | Announcing jurisdictions (default `["TW","JP"]`). Empty = all. |
| `categories` | `food`, `drug`, `medicalDevice` (default all three). |
| `recordTypes` | `recall`, `safetyAlert`, `borderRejection`. Empty = all. |
| `daysBack` | Only records published in the last N days (default 30; 0 = full history back to 2008). |
| `dateFrom`, `dateTo` | Explicit `YYYY-MM-DD` range (overrides `daysBack`). |
| `keyword` | Matches title, product, brand, company, licence number, reason and description. |
| `maxItems` | Maximum rows, newest first (default 100). |

### Output example

Real output (Japan, food recall alert, from the default run on 2026-10-14; `description` shortened):

```json
{
  "id": "intl-food-00db6cabab6e71eb",
  "country": "JP",
  "announcedBy": "日本消費者廳",
  "category": "food",
  "recordType": "recall",
  "publishedDate": "2026-09-14",
  "announcedDate": "2026-09-07",
  "title": "日本消費者廳發布業者回收HAMANI品牌之蛋糕產品(塩卵スポンジケーキ（大）…)，原因為產品使用未經核准之食品添加物(山梨酸鉀)…，經查回收產品未有申請食品輸入查驗紀錄",
  "productName": "蛋糕產品(塩卵スポンジケーキ（大）（大阪市、三重県、東京都のTHAIDUONGMARTで販売）)",
  "brand": "HAMANI",
  "reason": "產品使用未經核准之食品添加物(山梨酸鉀)(使用の認められていない食品添加物ソルビン酸Kを使用)",
  "importedToTaiwan": false,
  "tfdaSignal": "green",
  "detailUrl": "https://www.recall.caa.go.jp/result/detail.php?rcl=00000035795&screenkbn=01",
  "description": "1. 日本消費者廳於2026/09/07發布業者回收HAMANI品牌之蛋糕產品…",
  "language": "zh-TW",
  "source": "Taiwan Food and Drug Administration (TFDA) open data — International food recall alerts (消費紅綠燈-國際食品資料集), data.gov.tw dataset 9641",
  "sourceUrl": "https://data.fda.gov.tw/data/opendata/export/62/json",
  "license": "Open Government Data License, version 1.0 (Taiwan)"
}
```

Real Taiwan drug recall (fields that are always null for this type omitted here; every real row contains all fields):

```json
{
  "id": "tw-drug-0537cfd155c88825",
  "country": "TW",
  "category": "drug",
  "recordType": "recall",
  "publishedDate": "2026-08-26",
  "productName": "百肯膜衣錠5毫克 Biocor Film Coated Tablets 5 mg",
  "companyName": "瑩碩生技醫藥股份有限公司",
  "licenseNumber": "衛署藥製字第048905號",
  "lotNumbers": "BCLA91，共1批藥品。",
  "recallClass": "II",
  "reason": "廠商主動通報，案內藥品於連續性安定性試驗，有不純物含量達檢驗規格上限之情形，故啟動回收。",
  "documentNo": "115年8月3日FDA藥字第1150715052號（食藥署藥品組）",
  "source": "Taiwan Food and Drug Administration (TFDA) open data — Drug recalls (回收藥品資料集), data.gov.tw dataset 6947",
  "sourceUrl": "https://data.fda.gov.tw/data/opendata/export/34/json",
  "license": "Open Government Data License, version 1.0 (Taiwan)"
}
```

Full field list (same keys on every row): `id, country, announcedBy, category, recordType, publishedDate, announcedDate, title, productName, brand, companyName, companyBusinessId, manufacturer, licenseNumber, lotNumbers, recallClass, reason, reasonDetail, action, originCountry, importedToTaiwan, tfdaSignal, hsCode, quantity, inspectionDate, documentNo, detailUrl, imageUrl, description, language, source, sourceUrl, license`.

### Scheduling and de-duplication

Schedule the Actor daily with `daysBack: 3` (a small overlap protects against late publication) and de-duplicate on `id`. Ids are derived from the official record (TFDA notice id for devices, otherwise a hash of date, title/product and key fields), so the same record keeps the same id across runs. If TFDA later edits a record's text, it may appear once more with a new id.

### Pricing

Suggested pay-per-event price: **US$0.003 per result (US$3 per 1,000 records)**, charged through the default dataset-item event, plus the standard Actor start event.

| Use case | Results | Cost |
|---|---|---|
| Default run (TW + JP, last 30 days, on 2026-10-14) | 65 | ~US$0.20 |
| Daily monitor (`daysBack: 3`), estimate from the last 30 days | ~5–15 | ~US$0.02–0.05 |
| Listeria alerts from JP/KR/HK/SG, last 90 days | 8 | US$0.024 |
| Full history, all sources | ~16,600 | ~US$50 |

### FAQ

**Why not scrape the Japanese Consumer Affairs Agency recall site directly?** Its recall site offers no API, RSS or open-data download, and its terms for automated reuse are unclear, so this Actor does not touch it. Japanese recalls are covered through TFDA's openly licensed translations, which link to the original notice. See `SKIPPED.md` in the source.

**How fast do new recalls appear?** As fast as TFDA updates the open datasets (border rejections almost daily; drug recalls and device notices when published; international alerts in batches, sometimes weeks after the foreign announcement, see `announcedDate`).

**What do `tfdaSignal` colours mean?** It is TFDA's own traffic-light rating (燈號) of a foreign alert for Taiwan. In the data, green is typically used when no import of the product was found, yellow when a related product is sold in Taiwan or the case needs attention, and red when affected products may have reached Taiwan. TFDA's reasoning is in `description`; `importedToTaiwan` is parsed from TFDA's import check (`true`, `false` or `null` when not stated).

**Are the texts in English?** Field names, categories, types and dates are English/ISO; the descriptive text is TFDA's official Traditional Chinese (often with original-language product names).

### Data source and license (資料來源與授權)

- 回收藥品資料集 https://data.gov.tw/dataset/6947
- 醫療器材安全警訊資料集 https://data.gov.tw/dataset/14192
- 不符合食品資訊資料集 https://data.gov.tw/dataset/6133
- 消費紅綠燈-國際食品資料集 https://data.gov.tw/dataset/9641
- 消費紅綠燈-國際藥品 https://data.gov.tw/dataset/9644

All are published by the Taiwan Food and Drug Administration under the **Open Government Data License, version 1.0 (政府資料開放授權條款－第1版)**, which permits commercial use with attribution. Attribution:

> 衛生福利部食品藥物管理署 2026 回收藥品資料集、醫療器材安全警訊資料集、不符合食品資訊資料集、消費紅綠燈-國際食品資料集、消費紅綠燈-國際藥品。此開放資料依政府資料開放授權條款 (Open Government Data License) 進行公眾釋出，使用者於遵守本條款各項規定之前提下，得利用之。政府資料開放授權條款：https://data.gov.tw/license

This Actor is an independent tool by Waisuan and is not affiliated with or endorsed by TFDA or any other authority. It is an information service, not medical or legal advice; always check the official notice.

### 繁體中文簡介

本 Actor 整合衛福部食藥署五個開放資料集：國內藥品回收、醫療器材安全警訊與回收、邊境查驗不合格輸入食品，以及食藥署翻譯整理的國際食品回收與國際藥品警訊（含日本、韓國、香港、新加坡、中國、紐澳及歐美）。所有資料統一為英文欄位、ISO 日期，每筆有穩定 id，適合每日排程監控並去重。日本消費者庁リコール情報サイト沒有 API／RSS 且自動化利用條款不明，因此不直接抓取，日本回收資訊來自食藥署的國際警訊資料。建議價格：每千筆 US$3。資料採政府資料開放授權條款第 1 版，可商用，需標示出處。

# Actor input Schema

## `countries` (type: `array`):

Where the recall or alert was announced. TW = actions by Taiwan FDA (drug recalls, medical device recalls/safety alerts, imported food rejected at the border). Other countries come from TFDA's translated international recall alerts (food and drugs only). Empty = all.

## `categories` (type: `array`):

Product categories. Empty = all.

## `recordTypes` (type: `array`):

recall = product recall; safetyAlert = safety notice without a recall; borderRejection = imported food that failed Taiwan border inspection (returned or destroyed). Empty = all.

## `daysBack` (type: `integer`):

Only records published in the last N days. Ignored when "Published from" is set. 0 = no limit (full history since 2008).

## `dateFrom` (type: `string`):

Earliest publication date (inclusive). Overrides "Days back".

## `dateTo` (type: `string`):

Latest publication date (inclusive). Empty = today.

## `keyword` (type: `string`):

Case-insensitive match on title, product, brand, company, licence number, reason and description. Most text is Traditional Chinese (e.g. 李斯特菌, 沙門氏菌, 農藥); brand names and Japanese product names are often in the original language.

## `maxItems` (type: `integer`):

Maximum number of records to output, newest first (each row is one billable result).

## `requestDelayMs` (type: `integer`):

Pause before each download from the TFDA server. A run makes at most five downloads.

## Actor input object example

```json
{
  "countries": [
    "TW",
    "JP"
  ],
  "categories": [
    "food",
    "drug",
    "medicalDevice"
  ],
  "recordTypes": [],
  "daysBack": 30,
  "dateFrom": "",
  "dateTo": "",
  "keyword": "",
  "maxItems": 100,
  "requestDelayMs": 1500
}
```

# Actor output Schema

## `results` (type: `string`):

All records in the default dataset (JSON, CSV, Excel and more via the API).

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("waisuan/apac-product-recall-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("waisuan/apac-product-recall-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call waisuan/apac-product-recall-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,waisuan/apac-product-recall-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aiQlkvngSechdcVgf/builds/ada3nN568Z8NTN7Lt/openapi.json
