# UFLPA Forced Labor Screening: Supplier Entity List Check (`reliable_tools/uflpa-forced-labor-screening`) Actor

Screen suppliers against the DHS UFLPA Entity List and CBP Withhold Release Orders, with Chinese name matching, Xinjiang and UFLPA sector flags and the DOL List of Goods.

- **URL**: https://apify.com/reliable_tools/uflpa-forced-labor-screening.md
- **Developed by:** [Reliable Tools](https://apify.com/reliable_tools) (community)
- **Categories:** E-commerce, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 supplier screeneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## UFLPA Forced Labor Screening: Supplier Entity List Check

Not legal advice; not affiliated with or endorsed by DHS, CBP, DOL or the US Government.

This UFLPA forced labor screening tool checks your supplier list against the DHS UFLPA Entity List and the CBP
Withhold Release Orders and Findings in bulk. Supplier names can be written in English, pinyin or Chinese characters.
For every supplier you get the list entries it matches, a same-company probability, the official section, dates and
Federal Register notice, plus risk factors: a Xinjiang location, UFLPA high-priority sectors (cotton, polysilicon,
tomatoes, aluminum, PVC, seafood and more), country-wide CBP orders and the US Department of Labor List of Goods.

The tool reports list matches and risk factors with their official sources. It never says that a supplier uses forced
labor. A hit means "a qualified person should look at this", not a finding of guilt.

### What does UFLPA Forced Labor Screening do?

1. **Finds your suppliers on the UFLPA Entity List.** All four sub-lists of the Uyghur Forced Labor Prevention Act
   Entity List, with every alias the list gives ("also known as", "formerly known as"). Goods from listed entities are
   presumed to be made with forced labor and are barred from entry into the United States.
2. **Finds your suppliers in CBP Withhold Release Orders and Findings.** Every order since 1953, with merchandise,
   status (Active, Partially Modified, Inactive), effective date, remarks and the CBP press release. Companies that CBP
   removed from an order are reported as removed, not as a match.
3. **Matches names the way they appear in real supplier lists.** Chinese characters (新疆华孚纺织有限公司), pinyin
   and English list names meet each other, place spellings are unified (Hotan and Hetian, Aksu and Akesu, Kashi and
   Kashgar) and legal forms are ignored. Each similar listed name gets an AI match score: same organisation, related
   (parent, subsidiary, same group) or different, with a calibrated probability. Fixed rules decide the final status.
   For this step the supplier name, aliases, country, address and products from your input are sent to an external
   AI service for this fixed comparison only. Turn off **AI match checks** to keep your supplier data out of it; name
   rules and HS code or keyword checks still run.
4. **Flags risk factors that are not on any company list.** A Xinjiang address, products in a UFLPA high-priority
   sector, a country-wide CBP order (for example Turkmenistan cotton or Malawi tobacco) and goods on the DOL List of
   Goods Produced by Child Labor or Forced Labor for the supplier country.
5. **Tells you where the EU stands.** The EU Forced Labour Regulation (EU) 2024/3015 applies from 14 December 2027.
   Its database of forced labour risk areas and products was not available when this version was released, so every
   row carries a short status note instead of a pretend EU check.

### Who uses it?

- Importers and sourcing teams screening suppliers before a purchase order or a CBP detention.
- Customs brokers checking a client's vendor list before entry.
- Marketplaces and retailers vetting sellers and private label factories.
- ESG, audit and supply chain due diligence teams who need a documented, repeatable check with sources.
- AI agents that need a structured forced labor check inside a procurement workflow.

### What data you get

| Field | What it is |
|---|---|
| `screeningStatus` | `listed`, `possible_match`, `related_to_listed`, `no_list_match` or `invalid_input` |
| `riskLevel` | `high`, `elevated`, `moderate` or `low` (rules below) |
| `summary` | One sentence for your review |
| `highestMatchProbability` | Highest same-company probability of any listed name |
| `uflpaMatches` | UFLPA Entity List entries: listed name as published, aliases, sub-list (section), effective dates, Federal Register citation and link, whether the listing covers subsidiaries, match probability and relation |
| `cbpOrderMatches` | CBP Withhold Release Orders and Findings: order type, merchandise, industry, status, effective date, every order against the same party, remarks, press release, match probability |
| `riskFactors` | Xinjiang location, UFLPA high-priority sector, CBP country-wide order, removal from an order, DOL List of Goods; each with level, explanation, source, link and basis (`hs_code`, `ai_product_check`, `keyword`, `address_text`) |
| `dolListGoods` | DOL List of Goods entries for the supplier country that fit the products (child labor, forced labor, forced child labor, downstream goods) |
| `similarNamesRuledOut` | Similar listed names that were checked and ruled out, so you can show the screening was done |
| `euForcedLabourRegulation` | Status note on Regulation (EU) 2024/3015 |
| `note` | Hints such as an unrecognised country or a name too generic to screen |
| `screenedAt`, `input`, `disclaimer` | Time of the check, your input row, and a note that this is not legal advice, not affiliated with or endorsed by DHS, CBP, DOL or the US Government, and what a hit means |

An `AUDIT` record in the key-value store lists every source with its URL, last update, download time, record count
and SHA-256 checksum, plus the settings and status counts of the run.

#### Status and risk level rules

| Status | Meaning |
|---|---|
| `listed` | The supplier is, with high probability, a listed entity or named in a CBP order |
| `possible_match` | Could be the listed entity; a person should look (for example a parent company, a missing place word such as "(Shanshan)", or a listing that covers subsidiaries) |
| `related_to_listed` | Not the listed entity, but shares its distinctive name and may belong to the same group |
| `no_list_match` | No listed name matched. Risk factors can still apply |

| Risk level | When |
|---|---|
| `high` | Listed on the UFLPA Entity List or an active CBP order, a Xinjiang location, or products covered by an active country-wide CBP order |
| `elevated` | Possible or related match, an inactive CBP order, or a UFLPA high-priority sector product from China |
| `moderate` | A UFLPA high-priority sector product from outside China (Xinjiang inputs are covered wherever goods are made), a DOL List of Goods entry, or a company CBP removed from an order |
| `low` | No list match and no listed risk factor found. This is not a clearance |

### How to screen suppliers for UFLPA step by step

1. Open the Actor and add your suppliers under **Suppliers**: name, country, and if you have them address, products
   and HS codes. Or paste names under **Supplier names**, or link a CSV file.
2. Click **Start**. The sample input finishes in under a minute.
3. Filter by `screeningStatus` and `riskLevel`, open the matches and follow the source links.
4. Download the results as JSON, CSV or Excel, or read them through the API.

### Example input

```json
{
  "suppliers": [
    {"reference": "S-1", "name": "Hotan Haolin Hair Accessories", "country": "China", "products": ["wigs"], "hsCodes": ["6704.11"]},
    {"reference": "S-2", "name": "紫金矿业集团股份有限公司", "country": "China", "products": ["copper cathodes"]},
    {"reference": "S-3", "name": "Sunrise Garments Co.", "country": "China", "address": "Aksu, Xinjiang", "products": ["cotton t-shirts"]},
    {"reference": "S-4", "name": "Vinatex", "country": "Vietnam", "products": ["cotton shirts"], "hsCodes": ["6205.20"]}
  ]
}
```

### Example output (shortened)

```json
{
  "reference": "S-1",
  "supplierName": "Hotan Haolin Hair Accessories",
  "country": "CN",
  "screeningStatus": "listed",
  "riskLevel": "high",
  "summary": "Name matches DHS UFLPA Entity List entry \"Hetian Haolin Hair Accessories Co. Ltd\" (probability 0.95). Risk factors: Located in Xinjiang (XUAR).",
  "uflpaMatches": [{
    "status": "match", "sameEntityProbability": 0.95, "relation": {"label": "same"},
    "listedAs": "Hetian Haolin Hair Accessories Co. Ltd. (and two aliases: Hotan Haolin Hair Accessories; and Hollin Hair Accessories)",
    "listedNameMatched": "Hotan Haolin Hair Accessories",
    "effectiveDates": ["2022-06-21"],
    "sections": ["Entities in Xinjiang that mine, produce or manufacture goods wholly or in part with forced labor (Section 2(d)(2)(B)(i))"],
    "sourceUrl": "https://www.dhs.gov/uflpa-entity-list"
  }],
  "cbpOrderMatches": [{
    "status": "match", "orderType": "WRO", "merchandise": "Hair Products", "orderStatus": "Active",
    "effectiveDate": "2020-05-01", "remarks": "Enforcement of WRO superseded by enforcement of UFLPA rebuttable presumption"
  }],
  "riskFactors": [{"type": "xinjiang_location", "level": "high", "label": "Located in Xinjiang (XUAR)"}],
  "euForcedLabourRegulation": "Not yet applicable. ..."
}
```

### Use it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/reliable_tools~uflpa-forced-labor-screening/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"suppliers":[{"name":"Xinjiang Huafu Textile Co., Ltd.","country":"China","products":["cotton yarn"]}]}'
```

The same call works from Python, JavaScript or any HTTP client. Each row is independent, so you can screen one
supplier at the moment a buyer adds it, or a full vendor master file overnight.

### Sources and licences

| Source | Publisher | Licence |
|---|---|---|
| UFLPA Entity List (dhs.gov page; the appendix of the latest Federal Register notice as fallback) | US Department of Homeland Security, Forced Labor Enforcement Task Force | US Government work, public domain |
| Federal Register notices on the UFLPA Entity List (federalregister.gov API) | Office of the Federal Register | US Government work, public domain. The API is not an official legal edition of the Federal Register |
| Withhold Release Orders and Findings (CSV published by CBP) | US Customs and Border Protection | US Government work, public domain |
| List of Goods Produced by Child Labor or Forced Labor (Excel, current edition) | US Department of Labor, Bureau of International Labor Affairs | US Government work, public domain. Credit: US Department of Labor. No endorsement implied |
| UFLPA high-priority sectors | UFLPA Strategy (2022) and its 2024 and 2025 updates | US Government work, public domain |
| EU Forced Labour Regulation status | Regulation (EU) 2024/3015 and the Commission's Forced Labour Single Portal | Status note only, no EU data is copied |

Lists are downloaded from the official sources and cached for 24 hours (the DOL list for 14 days). Turn on
**Download lists again** to force a fresh download. If an official source is down, the last cached copy is used and
the `AUDIT` record says so. If no copy exists, the run stops without charging.

### Pricing

Pay per event, no subscription:

| Event | Price | When |
|---|---|---|
| Supplier screened | $0.004 | Every supplier screened against both lists, with risk factors and sources |
| AI match check | $0.004 | When the AI match score ran for the supplier's similar names or products |
| Actor start | $0.00005 | Once per run |

Rows without a supplier name are free. With AI match checks off, only the screening event is charged. 1,000 suppliers
with AI match checks cost $8.

### FAQ

**Does a match mean the supplier uses forced labor?**
No. It means the name matches an entry on an official list, or that a risk factor applies. Under the UFLPA, goods from
listed entities and from Xinjiang are presumed to be made with forced labor unless the importer rebuts that
presumption. Always read the source and decide with a qualified person.

**Can I screen Chinese names?**
Yes. Chinese company names are converted to pinyin, common industry words are translated (纺织 to textile, 棉业 to
cotton industry) and place spellings are unified. A Chinese name whose English brand is not a transliteration (for
example a brand name chosen for export) may not match by name alone; add the English name under `aliases`.

**Why is a company with the same name only a possible match?**
Because the listed entity can be a subsidiary in another place, for example "(Shanshan)", or the supplier can be the
parent or a sister company. Those cases go to `possible_match` or `related_to_listed` so a person can decide.

**Do I need products or HS codes?**
No, but they enable the product checks: UFLPA high-priority sectors, country-wide CBP orders and the DOL List of
Goods. HS codes are matched exactly; product descriptions get an AI product check.

**Is this tool connected to DHS, CBP or DOL?**
No. It reads the lists these agencies publish. It is not affiliated with or endorsed by DHS, CBP, DOL or the US
Government, and it is not legal advice.

**Is the EU forced labour database included?**
Not yet. Regulation (EU) 2024/3015 applies from 14 December 2027, and its risk database was not available when this
version was released. Each row says so.

**How fresh are the lists?**
Each run uses lists no older than 24 hours. The `AUDIT` record shows the publication date of each list, for example
the UFLPA Entity List "Last Updated" date and the CBP CSV date.

### About Reliable Tools

This Actor is made by [Reliable Tools](https://apify.com/reliable_tools). We build tools that return clean data from
official sources plus an AI label with a confidence score, so you can filter and act on the results straight away.
Our focus is trade compliance, e-commerce, product sourcing and lead research.

If a field is missing or a result looks wrong, open an issue on the Issues tab. We read every one and usually reply
within a day. You can find our other Actors on our [profile page](https://apify.com/reliable_tools).

# Actor input Schema

## `suppliers` (type: `array`):

One object per supplier. Fields: "name" (required, any script, for example Chinese characters), "reference", "aliases" (list or text separated by ;), "country", "address", "products" (list or text) and "hsCodes" (list or text). Products and HS codes enable the UFLPA sector and DOL List of Goods checks. The prefill is sample data.

## `supplierNames` (type: `array`):

Optional: plain supplier names, one per line, screened by name only.

## `csvUrl` (type: `string`):

Optional: a link to a CSV file with a header row. Recognised columns: name (or supplier, company), reference, aliases, country, address, products, hsCodes (or hs, hts).

## `aiChecks` (type: `boolean`):

Every similar listed name gets a same, related or different verdict with a probability, and products are checked against UFLPA sectors and DOL goods. Off: name rules and HS code or keyword checks only, and the AI match event is not charged.

## `includeDolList` (type: `boolean`):

Adds goods from the US Department of Labor List of Goods Produced by Child Labor or Forced Labor for the supplier country.

## `minNameScore` (type: `integer`):

Listed names below this similarity (0 to 100) are not reviewed, unless they share a distinctive word with the supplier name. Lower finds more variants and costs nothing extra.

## `maxCandidatesPerList` (type: `integer`):

How many of the most similar listed names per list are reviewed for each supplier.

## `likelyMatchThreshold` (type: `number`):

Same-entity probability from which a candidate counts as a match (and the supplier as listed).

## `reviewThreshold` (type: `number`):

Same-entity probability from which a candidate is reported as a possible match for human review.

## `maxSuppliers` (type: `integer`):

Stops after this many suppliers.

## `forceRefresh` (type: `boolean`):

Lists are cached for 24 hours (the DOL list for 14 days). Turn on to download every list fresh for this run.

## Actor input object example

```json
{
  "suppliers": [
    {
      "reference": "S-1",
      "name": "Hotan Haolin Hair Accessories",
      "country": "China",
      "products": [
        "wigs"
      ],
      "hsCodes": [
        "6704.11"
      ]
    },
    {
      "reference": "S-2",
      "name": "紫金矿业集团股份有限公司",
      "country": "China",
      "products": [
        "copper cathodes"
      ]
    },
    {
      "reference": "S-3",
      "name": "Sunrise Garments Co.",
      "country": "China",
      "address": "Aksu, Xinjiang",
      "products": [
        "cotton t-shirts"
      ]
    },
    {
      "reference": "S-4",
      "name": "Vinatex",
      "country": "Vietnam",
      "products": [
        "cotton shirts"
      ],
      "hsCodes": [
        "6205.20"
      ]
    }
  ],
  "aiChecks": true,
  "includeDolList": true,
  "minNameScore": 78,
  "maxCandidatesPerList": 5,
  "likelyMatchThreshold": 0.75,
  "reviewThreshold": 0.3,
  "maxSuppliers": 5000,
  "forceRefresh": false
}
```

# Actor output Schema

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

Dataset in the screening view.

## `audit` (type: `string`):

Source versions, record counts, checksums, settings and status counts.

# 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 = {
    "suppliers": [
        {
            "reference": "S-1",
            "name": "Hotan Haolin Hair Accessories",
            "country": "China",
            "products": [
                "wigs"
            ],
            "hsCodes": [
                "6704.11"
            ]
        },
        {
            "reference": "S-2",
            "name": "紫金矿业集团股份有限公司",
            "country": "China",
            "products": [
                "copper cathodes"
            ]
        },
        {
            "reference": "S-3",
            "name": "Sunrise Garments Co.",
            "country": "China",
            "address": "Aksu, Xinjiang",
            "products": [
                "cotton t-shirts"
            ]
        },
        {
            "reference": "S-4",
            "name": "Vinatex",
            "country": "Vietnam",
            "products": [
                "cotton shirts"
            ],
            "hsCodes": [
                "6205.20"
            ]
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("reliable_tools/uflpa-forced-labor-screening").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 = { "suppliers": [
        {
            "reference": "S-1",
            "name": "Hotan Haolin Hair Accessories",
            "country": "China",
            "products": ["wigs"],
            "hsCodes": ["6704.11"],
        },
        {
            "reference": "S-2",
            "name": "紫金矿业集团股份有限公司",
            "country": "China",
            "products": ["copper cathodes"],
        },
        {
            "reference": "S-3",
            "name": "Sunrise Garments Co.",
            "country": "China",
            "address": "Aksu, Xinjiang",
            "products": ["cotton t-shirts"],
        },
        {
            "reference": "S-4",
            "name": "Vinatex",
            "country": "Vietnam",
            "products": ["cotton shirts"],
            "hsCodes": ["6205.20"],
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("reliable_tools/uflpa-forced-labor-screening").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 '{
  "suppliers": [
    {
      "reference": "S-1",
      "name": "Hotan Haolin Hair Accessories",
      "country": "China",
      "products": [
        "wigs"
      ],
      "hsCodes": [
        "6704.11"
      ]
    },
    {
      "reference": "S-2",
      "name": "紫金矿业集团股份有限公司",
      "country": "China",
      "products": [
        "copper cathodes"
      ]
    },
    {
      "reference": "S-3",
      "name": "Sunrise Garments Co.",
      "country": "China",
      "address": "Aksu, Xinjiang",
      "products": [
        "cotton t-shirts"
      ]
    },
    {
      "reference": "S-4",
      "name": "Vinatex",
      "country": "Vietnam",
      "products": [
        "cotton shirts"
      ],
      "hsCodes": [
        "6205.20"
      ]
    }
  ]
}' |
apify call reliable_tools/uflpa-forced-labor-screening --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reliable_tools/uflpa-forced-labor-screening"
        }
    }
}
```

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/OcIcBdWqQka9uVT3M/builds/wnLPCciiPWveW3iEz/openapi.json
