# Supplier Risk Report: Sanctions, VAT & Insolvency (`offerastudio/supplier-risk-report`) Actor

Upload your supplier list and get one risk row per supplier from official registers: EU VAT (VIES), LEI and parent, sanctions lists, UK insolvency and Companies House, US OSHA/EPA, FDA warning letters and recalls. Risk score 0-100 and what changed since last run.

- **URL**: https://apify.com/offerastudio/supplier-risk-report.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 supplier checkeds

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

### What does Supplier Risk Report do?

**Supplier Risk Report** is built for **procurement, compliance and third-party-risk teams** that must show they know who they buy from. Upload your supplier list once a month (name, country and any VAT number, LEI or company number) and get **one risk row per supplier**, built from **official registers**: the EU VAT service (VIES), the GLEIF LEI register with the ultimate parent, the OFAC, EU, UN and UK sanctions lists, UK insolvency notices and Companies House, US OSHA and EPA enforcement, FDA warning letters and US product recalls. Each row has a **0–100 risk score with reasons**, every check with a status (**ok, warning, alert or unavailable**), a plain-English detail and a **source link**, and **what changed since last month**. Deliver the dataset to **Slack, e-mail, Google Sheets or your GRC tool** with an Apify integration or webhook.

Only the checks that make sense for each supplier run: VAT needs a VAT number, UK checks need a UK company number, OSHA and EPA are for US suppliers, sanctions, LEI, FDA letters and recalls run for everyone.

### Who is it for?

- **Procurement and supplier management**: a monthly health check of the whole supplier base.
- **Compliance and legal**: sanctions screening of suppliers and their ultimate parents, with an audit trail of sources.
- **Finance and risk**: early warning on insolvency notices, overdue accounts and officer changes at UK suppliers.
- **Quality and EHS**: FDA warning letters, recalls and OSHA/EPA cases at US suppliers.

### The checks

| Check | Source | Runs when |
| --- | --- | --- |
| EU VAT number | VIES (European Commission) | the supplier has a VAT number |
| Legal entity, status, ultimate parent | GLEIF LEI register | always (by LEI, else by name and country) |
| Sanctions | OFAC SDN and consolidated, EU, UN, UK lists; also for the legal name and the ultimate parent | always |
| UK insolvency | The Gazette notices of the last 8 days, via the nightly cache | UK supplier with a company number |
| UK company status, overdue filings, officer/owner/address changes | Companies House (**free API key**) | UK supplier with a company number and a key |
| US enforcement | EPA ECHO (no key) and OSHA (**free DOL key**) | US supplier |
| FDA warning letters | fda.gov, last 12 months | always (matched by name) |
| Recalls | openFDA and CPSC, last 12 months | always (matched by name) |

Checks that need a key you did not give show **unavailable** with a note, and cost nothing extra.

### How to use it

1. Click **Try for free**: the prefilled run checks four well-known suppliers in Germany, the UK, the US and the Czech Republic (no secrets needed).
2. Replace **Suppliers** with your list: `[{"name": "Acme GmbH", "country": "DE", "vat": "DE123456789"}, …]` (up to 1,000). A VAT number, LEI or company number makes the match exact.
3. Optional: paste a **Companies House** and a **DOL** key (stored encrypted) to turn on those checks.
4. Give the list a **Monitor name**, save it as a **task** and **schedule** it monthly. Use **Mode** `monitor` to get only suppliers that changed.

### Input example

```json
{
    "suppliers": [
        { "name": "Siemens AG", "country": "DE", "vat": "DE129274202", "lei": "W38RGI023J3WT1HWRP32" },
        { "name": "BP p.l.c.", "country": "GB", "companyNumber": "00102498" },
        { "name": "Pfizer Inc.", "country": "US" }
    ],
    "mode": "all",
    "monitorName": "suppliers-monthly"
}
```

### Output example

Real output from a run on 7 October 2026 (shortened):

```json
{
    "rowType": "supplier",
    "supplier": "Pfizer Inc.",
    "country": "US",
    "identified": true,
    "matchedEntity": { "name": "PFIZER INC.", "lei": "765LHXWGK1KXCLTFYQ30", "source": "gleif", "matchScore": 100 },
    "checks": [
        { "check": "lei", "status": "ok", "detail": "PFIZER INC. (765LHXWGK1KXCLTFYQ30), active, LEI issued.", "sourceUrl": "https://search.gleif.org/#/record/765LHXWGK1KXCLTFYQ30" },
        { "check": "sanctions", "status": "ok", "detail": "No match above 85 in 5 lists." },
        { "check": "us-osha-epa", "status": "ok", "detail": "No OSHA or EPA enforcement case under this name in the last 12 months. OSHA was skipped (add a free DOL API key to include it)." },
        { "check": "us-recalls", "status": "warning", "detail": "1 recall in the last 12 months (latest 2026-09-23: Lack of Assurance of Sterility). Matched by name: check that it is the same company." }
    ],
    "riskScore": 8,
    "riskLevel": "low",
    "riskReasons": ["product recall (warning)"],
    "changesSinceLastRun": null
}
```

On the second run with the same Monitor name, `changesSinceLastRun` lists what moved, for example `"sanctions: ok -> alert"`, `"risk score 8 -> 60"` or `"Companies House: Company status changed from active to liquidation"`.

### How is the score calculated?

Each check adds points when it is a **warning** or an **alert**: sanctions 25 / 60, UK insolvency 15 / 35, Companies House status 8 / 35, VAT 5 / 25, LEI 5 / 15, OSHA/EPA 10 / 20, FDA warning letter 12 / 22, recall 8 / 20. The total is capped at 100; **high** from 60, **medium** from 25. An **unavailable** check adds nothing, so a score is only as complete as its checks: read the check list. A warning means "look at it", not "this supplier is bad".

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Supplier checked | **$0.01** per supplier |
| Suppliers no register could identify, and info rows | **free** |

- A list of 200 suppliers costs **$2.00** per run; run monthly for about $24 a year.
- A supplier counts as *identified* when the LEI register, VIES or Companies House confirms it as a legal entity. Others are returned free with the reason, so you can add an identifier. Sanctions results are still shown on those rows.
- Set **Maximum cost per run** to cap the spend. Apify also charges a tiny standard start fee per run.

### Data sources and terms

All sources are official and free: VIES (European Commission), GLEIF (CC0), OFAC, EU, UN and UK sanctions lists, The Gazette (through our nightly cache; the Actor never queries The Gazette itself), Companies House (your key), EPA ECHO and OSHA (US Department of Labor), fda.gov warning letters, openFDA and CPSC. The Actor follows each source's rate limits. It is **not affiliated with or endorsed by any of them**. This report supports your own due diligence; it is **not legal advice and not a sanctions clearance**.

### Limitations

- **Name matching** (sanctions, OSHA/EPA, FDA letters, recalls) can produce false positives and misses. Rows say "matched by name, check that it is the same company".
- **UK insolvency** looks at the last **8 days** of notices (the cache window); run weekly to cover every notice, or add a Companies House key for the status check, which has no such limit.
- **OSHA** needs your free DOL key; without it only EPA is checked.
- Companies House officer and owner changes need a key and a run before (the first run only records the state).
- VIES covers EU VAT numbers only; its member-state services are sometimes down, then the check says **unavailable**.
- US checks look back 12 months. No credit scores, financials or adverse media are included.

### FAQ

#### What do I need to give for a good match?

A country and, if you have them, the VAT number, the LEI or the UK company number. A name alone works for sanctions and name-based checks, but the LEI match then depends on the spelling.

#### Is a sanctions "alert" a confirmed hit?

No. It is a strong name match (score 95 or more). Review the listed entry and the source link before you act.

#### How do I reset the monthly memory?

Use a new Monitor name or delete the named key-value store `supplier-risk-<name>`.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a source, a filter or a field? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/supplier-risk-report/changelog.md

# Actor input Schema

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

A list of suppliers: \[{"name": "Siemens AG", "country": "DE", "vat": "DE129274202", "lei": "W38RGI023J3WT1HWRP32", "companyNumber": "", "domain": "siemens.com"}]. Only "name" is required; "country" (two letters) decides which checks run; a VAT number, LEI or UK company number sharpens the match. Up to 1,000.

## `checks` (type: `array`):

Which checks to run. Default: all that apply to each supplier.

## `mode` (type: `string`):

All: one row per supplier every run, with the changes since the last run. Monitor: only suppliers whose result changed (and every supplier on the first run).

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

Names this supplier list. Runs with the same name share a memory of the last result per supplier (a named key-value store), which is how "changes since last run" works. Default: derived from the list.

## `companiesHouseApiKey` (type: `string`):

Free key from developer.company-information.service.gov.uk. Turns on the UK company status and officer-change check. Without it that check is skipped with a note. Stored encrypted.

## `dolApiKey` (type: `string`):

Free key from dataportal.dol.gov. Turns on OSHA inspections (EPA works without a key). Stored encrypted.

## Actor input object example

```json
{
  "suppliers": [
    {
      "name": "Siemens AG",
      "country": "DE",
      "vat": "DE129274202",
      "lei": "W38RGI023J3WT1HWRP32"
    },
    {
      "name": "BP p.l.c.",
      "country": "GB",
      "companyNumber": "00102498"
    },
    {
      "name": "Pfizer Inc.",
      "country": "US"
    },
    {
      "name": "Škoda Auto a.s.",
      "country": "CZ",
      "vat": "CZ00177041"
    }
  ],
  "checks": [
    "vat",
    "lei",
    "sanctions",
    "uk-insolvency",
    "uk-company",
    "us-osha-epa",
    "fda-warning-letters",
    "us-recalls"
  ],
  "mode": "all"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `checks` (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 = {
    "suppliers": [
        {
            "name": "Siemens AG",
            "country": "DE",
            "vat": "DE129274202",
            "lei": "W38RGI023J3WT1HWRP32"
        },
        {
            "name": "BP p.l.c.",
            "country": "GB",
            "companyNumber": "00102498"
        },
        {
            "name": "Pfizer Inc.",
            "country": "US"
        },
        {
            "name": "Škoda Auto a.s.",
            "country": "CZ",
            "vat": "CZ00177041"
        }
    ],
    "checks": [
        "vat",
        "lei",
        "sanctions",
        "uk-insolvency",
        "uk-company",
        "us-osha-epa",
        "fda-warning-letters",
        "us-recalls"
    ],
    "mode": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/supplier-risk-report").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": [
        {
            "name": "Siemens AG",
            "country": "DE",
            "vat": "DE129274202",
            "lei": "W38RGI023J3WT1HWRP32",
        },
        {
            "name": "BP p.l.c.",
            "country": "GB",
            "companyNumber": "00102498",
        },
        {
            "name": "Pfizer Inc.",
            "country": "US",
        },
        {
            "name": "Škoda Auto a.s.",
            "country": "CZ",
            "vat": "CZ00177041",
        },
    ],
    "checks": [
        "vat",
        "lei",
        "sanctions",
        "uk-insolvency",
        "uk-company",
        "us-osha-epa",
        "fda-warning-letters",
        "us-recalls",
    ],
    "mode": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/supplier-risk-report").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": [
    {
      "name": "Siemens AG",
      "country": "DE",
      "vat": "DE129274202",
      "lei": "W38RGI023J3WT1HWRP32"
    },
    {
      "name": "BP p.l.c.",
      "country": "GB",
      "companyNumber": "00102498"
    },
    {
      "name": "Pfizer Inc.",
      "country": "US"
    },
    {
      "name": "Škoda Auto a.s.",
      "country": "CZ",
      "vat": "CZ00177041"
    }
  ],
  "checks": [
    "vat",
    "lei",
    "sanctions",
    "uk-insolvency",
    "uk-company",
    "us-osha-epa",
    "fda-warning-letters",
    "us-recalls"
  ],
  "mode": "all"
}' |
apify call offerastudio/supplier-risk-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/supplier-risk-report"
        }
    }
}
```

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/Hm3PUjxt7P8E8Aob8/builds/87FXJ4ySdSrrFmEy3/openapi.json
