# UK Business Trust Check: Verify Any UK Company or Trader (`nerolabs/uk-business-trust-check`) Actor

Verify any UK company or trader before you pay. Returns a verdict (looks\_legitimate, caution, high\_risk, cannot\_verify), 0-100 score and cited reasons from Companies House, The Gazette, UK Sanctions List and FSA. Input: name, website or company number; list, CSV or Sheet. Per business. x402, MCP.

- **URL**: https://apify.com/nerolabs/uk-business-trust-check.md
- **Developed by:** [Adam Pearce](https://apify.com/nerolabs) (community)
- **Categories:** Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $35.00 / 1,000 business checkeds

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

**About to book a tradesperson, sign up a supplier, or pay a UK business you found online?** UK Business Trust Check tells you whether that business is **real and healthy** before any money moves: a **verdict**, a **0 to 100 score**, the **reasons** behind it, and one **plain-English line** you (or your AI agent) can read out. Everything comes from **official UK sources**: Companies House, The Gazette, the FCDO UK Sanctions List and the Food Standards Agency.

Check **one business, or thousands at once** from a CSV, a Google Sheet or another Actor's dataset. Every original column comes back untouched, with the verdict added alongside.

### What does UK Business Trust Check do?

For each business you give it (a name, a website, a company number, or any mix):

1. **Reads the business's own website** (homepage plus the privacy, terms, contact and about pages) for what it says about itself: its **company number**, its **legal name** ("Acme Electrical Ltd"), its **VAT number**, and any **trade body badges** it shows (NICEIC, NAPIT, Gas Safe, TrustMark, Checkatrade, Which? Trusted Trader, FMB, SafeContractor).
2. **Finds the right Companies House record**, or says plainly that none can be matched. It uses the number on the site first, then the legal name on the site, then the name plus the area, and it will not guess: a sole trader in one town is never confused with a dissolved limited company of almost the same name in another.
3. **Checks the company's health** on the register: status, age, overdue accounts or confirmation statement, strike-off in progress, insolvency cases, charges, registered office problems, and (optionally) its directors' track records and disqualification name matches.
4. **Searches The Gazette** for corporate insolvency notices such as winding-up petitions and liquidations.
5. **Screens the UK Sanctions List** (the FCDO list, the only official UK list since 28 January 2026) against the business, the company and its current officers and controllers.
6. **Checks the food hygiene rating** from the FSA when the business looks food-related.
7. Returns a **verdict**: `looks_legitimate`, `caution`, `high_risk` or `cannot_verify`, with every reason citing its source and a link.

### Who uses it

- **Vetting contractors and tradespeople** before a deposit: is "ABC Roofing Ltd" actually a live company, or was it struck off last year?
- **Supplier and vendor onboarding**: screen a whole supplier list against the register and the sanctions list in one run.
- **Marketplaces and directories** checking sellers or listed trades before they go live.
- **Lead lists**: clean a Google Maps or directory scrape before outreach, dropping dissolved and insolvent firms.
- **AI agents that pay businesses**: check a business before an agent books, buys or pays, and read back one sentence to the user.

### How to use it

1. Put your businesses in the **Businesses** list, or point **Dataset** or **File URL** at your list (a Google Sheet link works as it is, shared as "Anyone with the link can view").
2. Columns are detected automatically (`name`, `title`, `website`, `url`, `postcode`, `postalCode`, `city`, `company_number` and similar). If yours are unusual, set **Field mapping**.
3. Click **Start**. Five businesses take about 20 seconds.
4. Read the **Verdicts** tab, or download as JSON, CSV or Excel.

#### Input example

```json
{
  "businesses": [
    { "businessName": "Tesco PLC", "companyNumber": "00445790" },
    { "businessName": "Acme Electrical", "website": "acme-electrical.co.uk", "postcode": "LE11 2HP" }
  ],
  "includeOfficers": true
}
```

### Output

One row per business. Real output for Tesco PLC, shortened:

```json
{
  "businessName": "Tesco PLC",
  "trustVerdict": "looks_legitimate",
  "trustScore": 100,
  "plainEnglishSummary": "TESCO PLC (company 00445790) looks legitimate: an active UK company registered 78 years ago, filings up to date, and no insolvency, strike-off or sanctions flags. Matched by the company number supplied, high confidence. This is a public register check, not a credit check or a guarantee of their work.",
  "matchMethod": "number_given",
  "matchConfidence": "high",
  "matchedCompanyNumber": "00445790",
  "matchedCompanyName": "TESCO PLC",
  "companyStatus": "active",
  "incorporatedOn": "1947-11-27",
  "activeDirectorCount": 10,
  "sanctionsChecked": true,
  "sanctionsListDate": "29-Sep-2026",
  "sanctionsHits": [],
  "badgesClaimed": [],
  "badgesVerified": false,
  "reasons": [
    { "severity": "green", "code": "registered-company", "message": "Registered on Companies House as TESCO PLC (00445790), status active, incorporated 1947-11-27 (78 years ago).", "source": "Companies House", "url": "https://find-and-update.company-information.service.gov.uk/company/00445790" },
    { "severity": "green", "code": "filings-up-to-date", "message": "Accounts and confirmation statement are not overdue (last accounts made up to 2026-02-28).", "source": "Companies House" }
  ]
}
```

A company in liquidation reads like this (Carillion, real output):

> High risk: do not pay CARILLION PLC (company 03782379) without further checks. Company status is "liquidation". Matched by the company number supplied, high confidence.

And a sole trader with no register entry:

> Cannot verify: no Companies House record could be confidently matched, which is normal for sole traders and partnerships but means no official register confirms who they are. Their website claims NAPIT, which was not verified. Ask for their full legal name and trading address, and check any trade scheme on the scheme's own site.

#### Main fields

| Field | What it means |
|---|---|
| `trustVerdict` | `looks_legitimate`, `caution`, `high_risk` or `cannot_verify` |
| `trustScore` | 0 to 100, for sorting a list. The verdict comes from the reasons, not the score |
| `plainEnglishSummary` | One sentence to read back to a person |
| `reasons` | Every finding: `severity` (red, amber, green, info), `code`, `message`, `source`, `url` |
| `matchMethod` | `number_given`, `number_on_site`, `legal_name_on_site`, `exact_registered_name`, `name_and_area` or `none` |
| `matchConfidence` | `high` or `medium` (no match is never guessed) |
| `matchedCompanyNumber`, `matchedCompanyName`, `companyStatus`, `incorporatedOn`, `registeredOffice` | The register entry it matched |
| `siteCompanyNumbers`, `siteLegalNames`, `siteVatNumbers` | What the website claims about itself |
| `badgesClaimed` | Trade body badges shown on the site. `badgesVerified` is always `false` |
| `sanctionsHits` | Any UK Sanctions List match, with the list's reference |
| `gazetteNotices` | Corporate insolvency notices found in The Gazette |
| `foodHygiene` | FSA rating, date and link, for food businesses |
| `candidatesRejected` | Register entries it looked at and did not choose, and why |
| `attribution` | Source and licence lines for every row |

**What the verdicts mean.** `high_risk`: a red flag on a confident match (in liquidation, dissolved, strike-off in progress, overdue accounts, a sanctions match). `caution`: amber points worth checking (very new company, overdue confirmation statement, director with a trail of insolvent companies, VAT number that fails its check digits, a company number on the site that is not on the register). `looks_legitimate`: a confident match and nothing red or amber. `cannot_verify`: no confident register match, which is what most sole traders get.

### How much does it cost?

Pay per event: **$0.05 per business checked** (lower on Bronze, Silver and Gold plans), plus a tiny start fee. A business counts as checked when it was resolved and checked, including a confident "no Companies House match" result. Rows with no name, website or number, and rows that failed, are **not charged**.

- Vetting 20 contractors: about **$1.00**
- Screening a 500-row supplier list: about **$25**
- Cleaning a 2,000-row lead list before outreach: about **$100**

### Speed

About 15 to 20 seconds for five businesses. Large lists are paced by the Companies House limit of 600 calls per five minutes (roughly 8 calls per business with director checks on), so expect around 14 businesses a minute on a long list, and allow about 75 minutes for 1,000 (the default run timeout is six hours). Turn off **Check directors** for a faster, lighter pass.

### Sources and licence

- **Companies House** public data API: company profile, officers, persons with significant control, filing history, charges, insolvency, disqualified officers search.
- **The Gazette** notice feed: corporate insolvency notices only (codes 2400 to 2499). Personal insolvency is never fetched.
- **FCDO UK Sanctions List**, downloaded fresh on every run.
- **Food Standards Agency** food hygiene rating API.

Every row carries these attribution lines: Contains public sector information from Companies House, The Gazette and the FCDO UK Sanctions List, and food hygiene ratings from the Food Standards Agency, all licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

### Limits, stated honestly

- **Sole traders and partnerships cannot be fully verified.** They are not on Companies House, so the answer is `cannot_verify`, which is a statement about the records, not an accusation.
- **Badges are claims, not verification.** The Actor reports which trade body logos a site shows; it does not check the schemes' own registers. Check membership on the scheme's website before relying on it.
- **VAT numbers get a check-digit test only.** A number that fails is flagged; one that passes has not been checked with HMRC.
- **Sites behind a bot check fall back to the name.** The Actor never works around a CAPTCHA or bot check, and honours robots.txt. It then matches by name and area only, and says so.
- **Director checks are name-based.** A disqualification or sanctions "possible match" on a common name is shown as something to check, never as a finding.
- **A register check is not a credit check.** It cannot tell you whether a business does good work or pays its bills; it tells you whether it is what it says it is, and whether the official records show trouble.
- It does not guess at "virtual offices", and it does not use review sites, domain WHOIS or any source whose terms forbid this use.

### For AI agents

Call it through Apify's MCP server or API and read `plainEnglishSummary` back to the user; `trustVerdict` and `reasons` carry the detail. Pay-per-event pricing works with x402 agent payments. One business per call works well: pass `businessName`, `website` or `companyNumber`.

### FAQ

**Is this legal?** It reads official public registers published under the Open Government Licence, plus the business's own public website, politely. Officer names appear only as part of company data, and only when something about them is flagged.

**Why "cannot verify" and not "fake"?** Because most UK tradespeople are sole traders with no Companies House entry. The Actor will not call a business fake on the absence of a record.

**It matched the wrong company.** Please open an issue with the business and the company number you expected; `candidatesRejected` shows what else it considered.

If this check saved you from a bad payment or a wasted afternoon, a **review on the Actor page** helps a lot. Questions and requests go in the **Issues** tab.

# Actor input Schema

## `businesses` (type: `array`):

A JSON list of businesses, each with any of businessName, website, companyNumber, postcode, town, phone. Any other keys are kept and returned untouched. Example: \[{"businessName": "Acme Electrical Ltd", "website": "acme-electrical.co.uk", "postcode": "LE11 2HP"}].

## `datasetId` (type: `string`):

Check every row of an existing Apify dataset, for example a Google Maps or directory scrape. Every original column comes back with the trust verdict added. Use this OR 'File URL' OR 'Businesses'.

## `fileUrl` (type: `string`):

A public link to a CSV, Excel .xlsx, JSON or JSON Lines file, or a Google Sheet shared as 'Anyone with the link can view'. Every original column is kept.

## `fileFormat` (type: `string`):

Only needed if automatic detection gets the file format wrong.

## `fieldMapping` (type: `object`):

Only needed when your columns have unusual names. Map businessName, website, companyNumber, postcode, town and phone to your column names, e.g. {"businessName": "title", "website": "url"}. Left empty, common names are detected automatically (title, name, company, website, url, domain, postcode, postalCode, city, company\_number). A postcode inside an 'address' column is picked up too.

## `businessName` (type: `string`):

Trading or registered name, for a single check.

## `website` (type: `string`):

The business's website, for a single check. The site is read for its company number, legal name, VAT number and trade badges.

## `companyNumber` (type: `string`):

Companies House number, if you have it (e.g. 00445790 or SC759398).

## `postcode` (type: `string`):

Where the business trades. Helps pick the right company when names are similar.

## `includeOfficers` (type: `boolean`):

Cross-check up to four active directors: other appointments at insolvent companies, name matches on the disqualified directors register, and the UK Sanctions List. Company register data only. Turn off for a faster, lighter check.

## `includeGazette` (type: `boolean`):

Search The Gazette for corporate insolvency notices (winding-up petitions, liquidations). The Gazette rate-limits heavy use; if it refuses, rows say so rather than claiming there are none.

## `checkFoodHygiene` (type: `boolean`):

Food businesses (by name, website title or SIC code) are checked against the Food Standards Agency ratings automatically. Turn this on to check every business.

## `maxPagesPerSite` (type: `integer`):

The homepage plus the privacy, terms, contact and about pages, where UK firms publish their company number and legal name.

## `respectRobotsTxt` (type: `boolean`):

ON by default. A site that asks automated readers to stay away is not read; the check carries on from the name.

## `concurrency` (type: `integer`):

How many businesses are checked in parallel. The Companies House rate limit (600 calls per five minutes) is the real ceiling, so more than 3 rarely helps.

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

Check at most this many rows from the input. Leave empty for all (up to 10,000 per run).

## Actor input object example

```json
{
  "businesses": [
    {
      "businessName": "Tesco PLC",
      "website": "tesco.com"
    },
    {
      "businessName": "Greggs",
      "website": "greggs.co.uk"
    },
    {
      "businessName": "Screwfix",
      "website": "screwfix.com"
    },
    {
      "companyNumber": "03782379",
      "businessName": "Carillion"
    }
  ],
  "fileFormat": "auto",
  "includeOfficers": true,
  "includeGazette": true,
  "checkFoodHygiene": false,
  "maxPagesPerSite": 4,
  "respectRobotsTxt": true,
  "concurrency": 3
}
```

# Actor output Schema

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

Every business with its verdict, score, reasons and register match, plus your original columns.

## `summary` (type: `string`):

Verdict counts, columns used, Companies House calls and any warnings.

# 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 = {
    "businesses": [
        {
            "businessName": "Tesco PLC",
            "website": "tesco.com"
        },
        {
            "businessName": "Greggs",
            "website": "greggs.co.uk"
        },
        {
            "businessName": "Screwfix",
            "website": "screwfix.com"
        },
        {
            "companyNumber": "03782379",
            "businessName": "Carillion"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nerolabs/uk-business-trust-check").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 = { "businesses": [
        {
            "businessName": "Tesco PLC",
            "website": "tesco.com",
        },
        {
            "businessName": "Greggs",
            "website": "greggs.co.uk",
        },
        {
            "businessName": "Screwfix",
            "website": "screwfix.com",
        },
        {
            "companyNumber": "03782379",
            "businessName": "Carillion",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("nerolabs/uk-business-trust-check").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 '{
  "businesses": [
    {
      "businessName": "Tesco PLC",
      "website": "tesco.com"
    },
    {
      "businessName": "Greggs",
      "website": "greggs.co.uk"
    },
    {
      "businessName": "Screwfix",
      "website": "screwfix.com"
    },
    {
      "companyNumber": "03782379",
      "businessName": "Carillion"
    }
  ]
}' |
apify call nerolabs/uk-business-trust-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nerolabs/uk-business-trust-check"
        }
    }
}
```

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/Xxvx1jGihwfeVioED/builds/a5L7P9j7P85zhUYrm/openapi.json
