Trade Intelligence

UFLPA Entity List Screening

UFLPA Entity List and denied-party screening in one call, from two live federal sources.

The problem

Under the Uyghur Forced Labor Prevention Act (UFLPA), goods produced by an entity on the UFLPA Entity List are presumed to be made with forced labor and barred from U.S. entry unless the importer rebuts that presumption. Separately, the federal Consolidated Screening List covers denied parties across Commerce, State and Treasury. The two official lists are published separately — one by DHS, one by trade.gov — and either can change after your last check, so every new supplier needs both, and every existing one needs re-checking.

Who it's for

Import-compliance and sourcing teams, customs brokers, and logistics or trade software builders who need to check a supplier or manufacturer against the UFLPA Entity List and denied-party lists before goods move.

Use cases

  • Pre-shipment screening of a new supplier or manufacturer before placing a purchase order
  • Batch screening a supplier list during onboarding or a periodic compliance review
  • Embedding automated risk screening into a customs brokerage or logistics platform

What it does

Send a supplier or manufacturer name and get back a UFLPA Entity List match and a Consolidated Screening List (denied-party) match, plus a deterministic overall exposure rating (none / low / elevated / high). A batch endpoint screens up to 50 suppliers or parties in one call, returning each party's matches and coverage counts (the overall rating is computed for /screen/shipment), and a standalone endpoint offers a direct UFLPA name search. It screens organizations: records the sources classify as individuals are withheld, and the coverage field on a shipment screen says so. An HTS number and country of origin are optional and echoed back for your own reference; this API never derives an HTS number of its own and does not use one to screen anything.

Why Aervik's implementation is different

Exposure scoring is a fixed, deterministic calculation over each source's status — never an AI judgment call — so the same inputs always produce the same risk rating. Every response tells "checked and clear" apart from "not checked": a source that could not be read this time answers status error, and exposure_summary.incomplete_coverage is true whenever any part of the screen is missing, including a result page the source cut short. Both sources are live: there is no placeholder section, and nothing here is labeled "coming soon". And every tariff-line-shaped string that leaves the service is reduced to the 6-digit international HS subheading — this API will fail a request rather than hand back a tariff line it derived, because classification is a licensed customs broker's job, not ours.

Example

Request

POST /screen/shipment
{
  "hts": "7317.00",
  "country_of_origin": "China",
  "supplier_name": "Example Textile Manufacturing Co., Ltd."
}

Response

Captured live 2026-09-15 from the request above, abridged: each source also carries a name, url and note, and the narrative and disclaimer are omitted. Values verbatim.

{
  "input": {
    "hts": "7317.00",
    "country_of_origin": "China",
    "supplier_name": "Example Textile Manufacturing Co., Ltd."
  },
  "coverage": "Entity records only. Records the source classifies as individuals, and records whose name or list suggests an individual, are excluded from this service. Screen individuals at the source directly.",
  "uflpa": {
    "status": "no_match",
    "matches": [],
    "source": {
      "basis": "live",
      "as_of": "2026-07-31"
    }
  },
  "csl": {
    "status": "no_match",
    "matches": [],
    "source": {
      "basis": "live",
      "as_of": null
    },
    "result_page_truncated": false,
    "total_upstream_results": 0,
    "records_below_match_threshold": 0
  },
  "exposure_summary": {
    "overall_risk": "none",
    "reasons": [
      "No UFLPA or Consolidated Screening List hits found for the supplied party names."
    ],
    "incomplete_coverage": false
  }
}

More requests

Screen several parties at once

POST /screen/parties
{ "parties": [ { "name": "Example Supplier Co., Ltd.", "role": "supplier" }, { "name": "Example Manufacturer Ltd.", "role": "manufacturer" } ] }

Search the UFLPA Entity List by name

GET /uflpa/entities?q=Xinjiang

Calling it directly — real, working requests you can paste and run:

cURL

curl -X POST "https://us-import-risk-screening-api-uflpa-ad-cvd.p.rapidapi.com/screen/shipment" \
  -H "content-type: application/json" \
  -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: us-import-risk-screening-api-uflpa-ad-cvd.p.rapidapi.com" \
  -d '{"hts": "7317.00", "country_of_origin": "China", "supplier_name": "Example Supplier Co., Ltd."}'

Python

import os
import requests

RAPIDAPI_HOST = "us-import-risk-screening-api-uflpa-ad-cvd.p.rapidapi.com"

resp = requests.post(
    f"https://{RAPIDAPI_HOST}/screen/shipment",
    json={
        "hts": "7317.00",
        "country_of_origin": "China",
        "supplier_name": "Example Supplier Co., Ltd.",
    },
    headers={
        "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"],
        "X-RapidAPI-Host": RAPIDAPI_HOST,
    },
)
print(resp.json())

Node.js

const RAPIDAPI_HOST = 'us-import-risk-screening-api-uflpa-ad-cvd.p.rapidapi.com';

const res = await fetch(`https://${RAPIDAPI_HOST}/screen/shipment`, {
  method: 'POST',
  headers: {
    'content-type': 'application/json',
    'X-RapidAPI-Key': process.env.RAPIDAPI_KEY,
    'X-RapidAPI-Host': RAPIDAPI_HOST,
  },
  body: JSON.stringify({
    hts: '7317.00',
    country_of_origin: 'China',
    supplier_name: 'Example Supplier Co., Ltd.',
  }),
});
console.log(await res.json());

Where this API's data comes from, how we read it, and each source's own update schedule: Data Sources & Freshness.

Machine-readable: the OpenAPI 3.1 document for this API, generated from its code — import it into Postman or a client generator. More on the developer page.

A ready-made Postman collection is also available: import it and the shared environment in Postman (Import, then select the file), then set RAPIDAPI_KEY to your RapidAPI key.

Key features

  • One call covers both UFLPA Entity List and Consolidated Screening List (denied-party) exposure
  • Deterministic overall exposure rating — none, low, elevated, or high
  • Standalone UFLPA Entity List name-search endpoint
  • Batch endpoint for supplier/party screening, up to 50 per call
  • A source manifest in each screening section: the source, how it was read, and its own date where it publishes one (null where it does not)
  • No classification, by design: any HTS number you send is echoed, never derived, and every tariff reference returned is capped at 6 digits

Pricing

A free tier with 30 API requests a month to build against, then monthly plans from $29 with a set number of requests included. The $29 and $99 plans are hard-capped — calls stop at the limit rather than billing you; only the top plan (10,000 requests) runs on a soft limit, with overage at $0.15 per additional request. Batching is cheap: one call screening up to 50 parties counts as a single request.

See exact current pricing tiers on RapidAPI →

Frequently asked questions

Does this API classify my goods or work out the HTS code for me?

No, and that is deliberate. This API screens supplier and manufacturer names. If you send an HTS number it is echoed back as your own input and is not used to screen anything. Determining the tariff line for a shipment is a licensed customs broker's work, and any tariff-line-shaped string in a response is reduced to the 6-digit international HS subheading before it leaves the service.

What does this API check in one call?

POST /screen/shipment checks the supplier and manufacturer names you supply against the UFLPA Entity List and the Consolidated Screening List (denied-party), returning a single deterministic overall exposure rating.

How is the overall exposure rating calculated?

By a fixed, deterministic formula over each source's status — never an AI judgment call — so the same inputs always produce the same rating: none, low, elevated, or high.

What does the source.basis field on the response mean?

How that section's source is wired: live means a real government data call, and both sources in this API are live. It does not tell you whether this particular check succeeded. For that, read the section's status (error when the source could not be read) and exposure_summary.incomplete_coverage, which is true whenever any part of the screen is missing.

Does this API report antidumping or countervailing duty (AD/CVD) scope?

No. It did report AD/CVD until September 2026, when we removed it. The federal AD/CVD Orders API it depended on is no longer offered to developers — it is not listed in the International Trade Administration's API catalog and cannot be subscribed to — so there was no path to keeping that data current. We would rather remove a dimension than leave it labeled "coming soon" indefinitely. For AD/CVD scope, use the ITA's own search at access.trade.gov/adcvd.

Can I check a supplier or party without a specific shipment?

Yes. POST /screen/parties batch-screens up to 50 suppliers or parties against UFLPA and the Consolidated Screening List in a single call. A full batch of 50 took 23.6 seconds in each of two runs on 2026-09-15. trade.gov's search is rate-limited, and the API waits out the limit rather than skipping a party, so set your client timeout to at least 60 seconds for a full batch.

How are matches scored?

Each name you send is compared with the listed names. A score of 0.92 or more is a match, with match_type exact when the score is 1 and fuzzy otherwise; a score from 0.72 up to 0.92 is a possible match, which needs a person to look at it; anything lower is not returned. On the UFLPA Entity List the name and every alias are scored and the best one counts. On the Consolidated Screening List the listed name and every alias are scored and the best one counts, and each record trade.gov returned that scored below 0.72 is counted in records_below_match_threshold, because a short trading name can score low against a long registered legal name.

Is a 'no match' result a guarantee my shipment is clear?

No. This API is advisory only, not legal or customs advice, and not a customs-business determination or HTS classification ruling. Consult a licensed customs broker or attorney for your actual import compliance obligations.

Can I search the UFLPA Entity List directly by name?

Yes. GET /uflpa/entities?q= runs a standalone fuzzy name search against the DHS UFLPA Entity List.

What must I do if a party matches the Consolidated Screening List?

The International Trade Administration, which publishes the list, asks every service built on it to tell users: If a party to a user’s transaction matches the name of a party on the consolidated list, the user must check the official publication of restricted parties in the Federal Register or the official lists of restricted parties maintained on the websites of the Departments of Commerce, State and the Treasury to ensure full compliance with all of the terms and conditions of the restrictions placed on the parties on this list.

This API screens; it does not classify

This service screens names. It never derives an HTS number, and it will not hand you a tariff line: any tariff-line-shaped string that would leave the service is reduced to the 6-digit international HS subheading, and a response that would carry anything deeper fails rather than shipping it. Determining the tariff line applicable to a shipment is a licensed customs broker’s work. The one exception is the hts value you sent, which is echoed back in the response as your own input, at whatever depth you supplied it, and is not used to screen anything.

If you need help arriving at a subheading in the first place, that is a different job — see the Landed Cost Estimator, which is a planning estimate and is also capped at 6 digits.

Coverage today, source by source

  • UFLPA Entity List — live. Fetched from the DHS/FLETF published list. No key required. DHS lists entities under three categories of the Act, and some entities under more than one, so a match is returned once per listing: uflpa.matches[].entity.basis carries the category DHS lists it under, and listed_date that listing’s effective date, which can differ between categories. (This basis is the listing’s category; source.basis below is how the source is wired.)
  • Consolidated Screening List (denied party) — live. Called against trade.gov with a real, provisioned API key. Both sources are live. There is no placeholder section in this API.

AD/CVD scope was removed in September 2026, and it is worth saying plainly why. It ran on a clearly-labeled synthetic dataset while we worked on access to the real one. Checking the International Trade Administration’s developer portal directly settled it: the AD/CVD Orders API is not in their catalog of available APIs and is not part of any product a developer can subscribe to. The endpoint still answers, but an endpoint that answers is not an endpoint that is supported, and we found no path to keeping that data current.

Rather than leave a permanent placeholder labeled “coming soon”, we removed the dimension. For AD/CVD scope, use the ITA’s own search at access.trade.gov/adcvd.

The rest of the disclosure

This API is advisory only. A “no match” result is not a guarantee that a shipment, supplier, or product is free of forced-labor or trade-enforcement exposure, and nothing here is a customs-business determination, HTS classification ruling, or legal advice — consult a licensed customs broker or attorney for your actual compliance obligations. Before relying on a result, check each section’s status (error means that source could not be read for this request) and exposure_summary.incomplete_coverage (true whenever any part of the screen is missing). source.basis says how a source is wired, not whether this call reached it. See the API’s own /terms endpoint for the full disclosure.

Further reading: the guide How to Check a Supplier Against the UFLPA Entity List walks through how the official list is laid out, the rebuttable presumption, and what a real pre-shipment check has to cover, and the blog post What UFLPA screening actually requires digs into the presumption itself and why it shifts the burden of proof to importers.

If you query trade.gov’s Consolidated Screening List yourself, trade.gov’s Consolidated Screening List API: Nine Traps in the Search Endpoint shows, with a runnable script and its output, where a screening loop reports a name as checked when most of the matching records went unread.

The guide What a screening API does not show you sets out the seven questions to ask of any screening response — including this one — and shows the same status in three different situations: a match with further entries disclosed below the floor, a no-match with the same disclosure, and a no-match where nothing close was read.

If you load DHS’s UFLPA Entity List into your own code, The UFLPA Entity List as Data: 205 Rows, 187 Entities covers the entities repeated across category tables, the aliases that appear on only one copy, the dates kept per category, and includes a parser.

Before you screen a list, check its shape. A company name typed without its spaces finds its listed record 4% of the time against 98% for the same name with spaces — measured on 97 real listed entities in A company name without spaces misses the screening list. The free screening name checker flags those names, and the names with nothing comparable at all, in a list you paste. It runs this API’s own normalizer, compiled into the page and checked against its source on every build, entirely in your browser — nothing you paste is sent anywhere.

Try UFLPA Entity List Screening on RapidAPI