# FDA Import Refusal & Supplier Risk Signals (`afkdigital/fda-import-refusal-supplier-risk-signals`) Actor

Official FDA import refusal CSV records, with declared manufacturer role and all charges preserved. Filter by date, country, firm, product, and industry; JSON/CSV exports.

- **URL**: https://apify.com/afkdigital/fda-import-refusal-supplier-risk-signals.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Business, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 unique fda import refusal line delivereds

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

## FDA Import Refusal & Supplier Risk Signals

Turn the FDA's official OASIS Import Refusal Report CSV archives into structured historical shipment-line signals for supplier review, due diligence, Clay and n8n. The Actor retrieves FDA ZIP archives directly over HTTPS and exports one unique refusal line per Dataset row in JSON or CSV.

### Source and coverage

- Official report: https://www.accessdata.fda.gov/scripts/importrefusals/index.cfm
- Official CSV ZIP: https://www.accessdata.fda.gov/scripts/importrefusals/downloads/Import_Refusal_2024-present.zip
- Official field dictionary: use "Structure of the Import Refusal Data Files" on the report page. The CSV contains MFG_FIRM_FEI_NUM, LGL_NAME, address, ISO_CNTRY_CODE, PRODUCT_CODE, REFUSAL_DATE, DISTRICT, ENTRY_NUM, RFRNC_DOC_ID, LINE_NUM, LINE_SFX_ID, sample flags, REFUSAL_CHARGES and PRDCT_CODE_DESC_TEXT. ACT_SECTION_CHARGES.csv maps ASC_ID to charge code, statement and section.
- FDA posts archive sets for 2002–2006, 2007–2010, 2011–2013, 2014–2018, 2019–2023 and 2024–present. An archive is downloaded only when its years intersect the requested interval. The current 2024–present ZIP inspected on 2026-11-03 contains REFUSAL_ENTRY_2024-Sep2026.csv, with refusal dates through 2026-09-24. Publication is monthly and can lag the current calendar date. No live status is inferred.
- FDA says the report concerns products whose admission was refused in whole or part. LGL_NAME is **the declared manufacturer**, the establishment declared responsible for the product; it does not prove the actual manufacturer, shipper, importer or supplier relationship. The Actor sets firm_role=declared_manufacturer. Every row is a particular entry line, not a blanket ban, current sanction or Import Alert.

### Inputs

| Field | Behavior |
| --- | --- |
| refusalDateFrom / refusalDateTo | Inclusive YYYY-MM-DD; default last 365 days through UTC today; max ten-year interval; earliest CSV archive 2002. |
| country | Exact two-letter ISO manufacturer country code (e.g. CN), not a free-form country name. |
| firmName | Literal case-insensitive substring in LGL_NAME. |
| productKeyword | Literal case-insensitive substring in FDA product description. |
| industryCode | Exact first two digits of PRODUCT_CODE, e.g. 16. |
| maxResults | At most 10,000 unique entry lines; default 10. |
| maxCostUsd | Additional local event budget; default $0.08, max $80; Apify's per-run limit also applies. |

All filters combine with AND. No unsupported openFDA import-refusal endpoint is used. A zero-match run produces an empty Dataset and zero result events. The default reads the latest archive and stops after ten matching rows, normally in under five minutes.

### Dataset

Each row includes refusal_id, firm_name, firm_role, firm_address, country, product_description, product_code, industry_code, refusal_date, refusal_charges, source_url and fetched_at. The entry, reference document, line and suffix remain separate, and source_record retains the original FDA CSV fields. refusal_id joins ENTRY_NUM, RFRNC_DOC_ID, LINE_NUM, LINE_SFX_ID and REFUSAL_DATE; it never merges different shipment lines based on company name. The source_url is the downloadable archive URL, since FDA does not provide a stable per-CSV-row URL.

refusal_charges is an array of objects with asc_id, code, statement and section, looked up by ASC_ID. Repeated, comma-separated reasons remain in one row. If a newly published charge ID is absent from its dictionary, its identifier is retained with null translation fields. No additional result events are generated for reasons. The source may change historical records or corrected descriptions; use source_url, fetched_at and refusal_date to interpret freshness.

### Pricing and limits

Pay per event: **$0.008 per successfully delivered unique refusal line ($8 per 1,000)**. Event name: `unique-refusal`. There is no start, reason, retry, download or duplicate charge. The SDK pushes and charges one row in one operation. Existing Dataset IDs are checked after a run restart to avoid repeat events. A new run with the same filters may charge again; deduplication is per run. The Actor stops at the smaller of maxResults, maxCostUsd and Apify's run charge limit. Standard-run compute is included in the event price; platform post-run Dataset access/storage may have separate standard fees.

Downloads are bounded to 25 MiB compressed and 100 MiB per CSV member, use HTTPS, at most three attempts on transient errors, a 35-second request timeout and 210-second overall fetch/scan deadline. Archive ranges act as year-based partitions; filters are applied locally while streaming the CSV, so high-volume broad history queries may require narrower dates. An upstream schema change or failure terminates the run rather than silently returning incomplete successful data. SUMMARY records source archives, counts, limits and completion status. Results already delivered before a failure remain accessible and billable.

### Example and integration

```json
{"country":"CN","refusalDateFrom":"2026-09-01","refusalDateTo":"2026-09-30","maxResults":5,"maxCostUsd":0.04}
```

Call the Actor with JSON and read Output's default Dataset as JSON or CSV. Use refusal_id as a Clay/n8n upsert key. JSON preserves nested charge arrays; CSV serializes nested cells and may need parsing downstream.

### Use and attribution

FDA's website policies permit reuse of its public-domain website material unless otherwise noted and recommend linking back and recording the copy date: https://www.fda.gov/about-fda/about-website/website-policies . The Actor provides source links and fetch timestamps, charges for processing, and does not claim FDA endorsement. Verify original FDA records and current regulatory status independently before making business or legal decisions.

# Actor input Schema

## `country` (type: `string`):

Declared manufacturer's country code, e.g. CN. Exact match.

## `firmName` (type: `string`):

Case-insensitive substring in FDA LGL_NAME.

## `productKeyword` (type: `string`):

Case-insensitive substring in PRDCT_CODE_DESC_TEXT.

## `industryCode` (type: `string`):

First two digits of FDA product code, e.g. 16.

## `refusalDateFrom` (type: `string`):

Inclusive YYYY-MM-DD. Omit for UTC today minus 365 days.

## `refusalDateTo` (type: `string`):

Inclusive YYYY-MM-DD. Omit for UTC today. Up to ten years per run.

## `maxResults` (type: `integer`):

Maximum unique entry lines returned; one billed event per delivered line.

## `maxCostUsd` (type: `number`):

Additional event budget in USD at $0.008 per result; Apify platform limit also applies.

## Actor input object example

```json
{
  "maxResults": 10,
  "maxCostUsd": 0.08
}
```

# Actor output Schema

## `json` (type: `string`):

No description

## `csv` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/fda-import-refusal-supplier-risk-signals").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("afkdigital/fda-import-refusal-supplier-risk-signals").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 afkdigital/fda-import-refusal-supplier-risk-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/fda-import-refusal-supplier-risk-signals"
        }
    }
}
```

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/XuPO22kkM8bz9wGxL/builds/Uj9pMlvNCGzUKVFkU/openapi.json
