# UK Bankruptcy Check by Name — Individual Insolvency Register (`malekh/uk-bankruptcy-check-individual-insolvency-register`) Actor

Bulk-check names against the UK Individual Insolvency Register: undischarged bankrupts, IVAs, debt relief orders and bankruptcy restrictions. Uses date of birth to rule namesakes OUT — 'John Smith' returns 149 records — and flags current vs discharged.

- **URL**: https://apify.com/malekh/uk-bankruptcy-check-individual-insolvency-register.md
- **Developed by:** [Malek H](https://apify.com/malekh) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Bankruptcy Check by Name — Individual Insolvency Register

Check a list of people against the **UK Individual Insolvency Register** — the
statutory register kept by the Insolvency Service — and find out whether
someone is an **undischarged bankrupt**, is in an **IVA**, has a **debt relief
order**, or is subject to a **bankruptcy restrictions order or undertaking**.

Feed it a batch of candidates, proposed directors, tenants, borrowers or
counterparties. Get back one result per name, with every matching register
entry carrying the insolvency type, the court and case number, the order date,
the register's own status wording, a computed **current / ended** flag, and a
match confidence that takes the **date of birth** into account.

Background-screening vendors sell this exact lookup one name at a time, on a
multi-day manual turnaround — CVCheck lists a "United Kingdom: Bankruptcy"
check at AU$311.45 per single name with a 5-day estimate, and Veremark and
Checkback International both sell a UK "Bankruptcy and Insolvency Check" as a
named pre-employment screening SKU. This Actor runs the same lookup over a
whole list, in seconds.

***

### What it does that a plain name search does not

#### 1. It uses the date of birth to rule people OUT

This is the difference between a search box and a screening tool.

`John Smith` returns **149 records** on this register. A tool that reports "149
hits" has told you nothing, and a tool that reports "1 hit" by silently taking
the first one has told you something false.

Every match here is graded against the date of birth you supply:

| `dateOfBirthMatch` | Meaning |
|---|---|
| `match` | The register's date of birth equals the one you supplied |
| `conflict` | The register's date of birth **contradicts** yours — almost certainly a different person |
| `not_on_register` | The register has no date of birth for this entry |
| `not_supplied` | You did not send one |

Matches whose date of birth conflicts are **kept and labelled**, never silently
dropped — the register's own dates are occasionally absent or wrong, and you
should be the one deciding. They are excluded from the headline
`hasCurrentInsolvency` flag and counted separately as
`conflictingDateOfBirthMatchCount`.

A last-known postcode is compared the same way, including a partial credit for
a matching outward code.

That produces one `confidence` per match:

| `confidence` | Meaning |
|---|---|
| `strong` | Name matches and the supplied date of birth matches |
| `possible` | Name matches, no date of birth to corroborate it |
| `weak` | Fuzzy or surname-only name match |
| `conflicting` | Name matches but the date of birth contradicts |

#### 2. It gets the discharge question right

The register's status field is free prose, not a tidy code, and the wording is
a trap:

> `Discharge Suspended Indefinitely (from 09/07/2004)`

That person is **still bankrupt**. A naive reader sees the word "Discharge" and
clears them. Every status is classified into one of three buckets:

| `caseStatusClass` | Meaning |
|---|---|
| `current` | The register says the insolvency is in force |
| `ended` | The register says it has been discharged, annulled or completed |
| `unknown` | The wording does not clearly say either |

`unknown` is never quietly folded into `ended`. Wrongly reporting "ended" is a
false clear on somebody who may still be an undischarged bankrupt; wrongly
reporting "current" merely sends a case for review. The register's exact
wording is always returned in `statusRaw` so you can read it yourself.

#### 3. It fails loudly instead of quietly

This register is a web page, not a data file, so the dangerous failure is not a
crash — it is a layout change that returns HTTP 200 with no rows, and a tool
that cheerfully reports "no insolvency found" for everyone on your list.

Three guards, in order:

1. **A control search runs before any of your names.** A name known to return
   thousands of records is searched first, its results table is parsed, and one
   case page is opened and checked for its expected fields. If any of that
   comes back thin, the run **fails** and screens nobody.
2. **Every single response must carry one of two sentinels** — the "Your search
   returned N records" header, or the explicit no-results block. A page with
   neither aborts the run.
3. **A name the Actor could not check is reported as an error, not as clear**,
   and is not charged for.

A false negative here is a compliance failure for you. It has to be impossible
to reach quietly.

#### 4. It tells you when a name was too common to check exhaustively

If the register holds more records for a name than the run read, the result
carries `searchTruncated: true` and says so in its `guidance`. No silent
truncation dressed up as a clean result.

***

### What it covers — and what it does not

The register's own front page states its scope:

> Search for information about bankruptcies and insolvencies in **England and
> Wales**, including: bankruptcy orders, debt relief orders (DROs), individual
> voluntary arrangements (IVAs).

> The Individual Insolvency Register combines the individual insolvency,
> **bankruptcy restrictions** and **debt relief restrictions** registers.

**Not covered — read this before relying on a clean result:**

- **Scotland and Northern Ireland.** Scotland's insolvencies are on the
  Register of Insolvencies kept by the Accountant in Bankruptcy; Northern
  Ireland keeps its own. Neither is searched here.
- **History.** This is a *current* register. The Insolvency Service removes
  entries roughly **3 months after discharge or completion**. A clean result
  means "not on the register now" — **not** "never bankrupt". Every no-match
  result says so in its own `guidance` field rather than leaving you to infer
  it.
- **Disqualified directors.** Company-director disqualifications are a separate
  Companies House register, not this one.
- **Identity.** The register carries no unique identifier. A name plus a
  matching date of birth is strong corroboration, not proof. `identifierGradeMatch`
  is always `false` and every result links to the register's own case page in
  `verifyAt` so you can confirm before acting.

***

### Input

```json
{
  "records": [
    { "referenceId": "CAND-001", "firstName": "Jane", "lastName": "Example",
      "dateOfBirth": "1980-04-17" },
    { "referenceId": "CAND-002", "firstName": "John", "middleName": "Peter",
      "lastName": "Sample", "postcode": "SW1A 1AA" },
    { "referenceId": "DIR-88", "fullName": "Alex Specimen" }
  ]
}
```

| Field | Notes |
|---|---|
| `firstName`, `middleName`, `lastName` | Preferred. Unambiguous. |
| `fullName` | Accepted. Read as `GIVEN NAMES SURNAME`, or as `SURNAME, GIVEN NAMES` if it contains a comma. However it was read is echoed back in `nameInterpretation`. |
| `dateOfBirth` | `YYYY-MM-DD` or `DD/MM/YYYY`. Day-first — a US-order date is rejected rather than silently swapped. |
| `postcode` | Last known postcode, if you have it. |
| `referenceId` | Anything of yours; echoed back. |

Options: `statusFilter`, `includeCaseDetails`, `maxCaseDetailsPerName`,
`maxPagesPerName`, `fuzzyThreshold`. See the input form for what each does.

Names are matched punctuation-insensitively, so `O'Brien` finds `OBrien` and
`Abad-Santos` finds `Abad Santos`. Previous and married names are matched
through the register's "may also be known as" field, and flagged as
`matchedVia: "alias"` rather than passed off as a match on the current surname.

***

### Output

One dataset item per input name:

```json
{
  "referenceId": "CAND-001",
  "status": "ok",
  "nameInterpretation": "lastName/firstName as supplied",
  "searchTerm": "Jane Example",
  "registerRecordsForName": 1,
  "searchTruncated": false,
  "matchCount": 1,
  "currentInsolvencyMatchCount": 1,
  "conflictingDateOfBirthMatchCount": 0,
  "highestConfidence": "strong",
  "hasCurrentInsolvency": true,
  "identifierGradeMatch": false,
  "requiresManualVerification": false,
  "guidance": "POSSIBLE match: the name matches and the date of birth supplied matches the register's...",
  "matches": [
    {
      "registerName": "Jane Example",
      "matchType": "name_exact",
      "matchedVia": "name",
      "confidence": "strong",
      "dateOfBirthMatch": "match",
      "registerDateOfBirth": "1980-04-17",
      "postcodeMatch": "not_supplied",
      "insolvencyType": "Bankruptcy",
      "statusRaw": "Currently Bankrupt : Automatic Discharge will be ...",
      "caseStatusClass": "current",
      "isCurrent": true,
      "case": {
        "surname": "Example", "forenames": "Jane", "occupation": "...",
        "lastKnownAddress": "...", "alsoKnownAs": null,
        "court": "...", "caseNumber": "...", "caseYear": "...",
        "orderDate": "2026-05-12", "caseDescription": "...",
        "otherRegisterFields": {}
      },
      "verifyAt": "https://www.insolvencydirect.bis.gov.uk/eiir/case-details/..."
    }
  ],
  "attribution": "Source: The Insolvency Service, Individual Insolvency Register ..."
}
```

Any register field this Actor has not been taught a name for is passed through
in `case.otherRegisterFields` rather than dropped — the register combines three
separate registers and restrictions cases can carry extra fields.

***

### Pricing

Pay per event, and platform usage costs are included in the price:

| Event | Price | What it is |
|---|---|---|
| Screening run | $0.05 | Charged once per run — the control search and case-page check that prove the register is answering normally before anything is screened |
| Name screened | $0.20 | Charged per name the Actor actually got an answer for. A name it could not check is **not** charged |

For comparison, the manual equivalent is sold at roughly £160–£250 per single
name on a multi-day turnaround.

***

### Legal and attribution

Source: The Insolvency Service, **Individual Insolvency Register**
(<https://www.insolvencydirect.bis.gov.uk/eiir/>). Contains public sector
information licensed under the **Open Government Licence v3.0**. Commercial
reuse is expressly permitted with attribution, and the attribution line is
carried in every output item. This Actor is not endorsed by or affiliated with
the Insolvency Service.

The register is public, requires no account, sets no rate limit and disallows
nothing in `robots.txt`; this Actor still paces its own requests.

The Insolvency Service's own terms note that errors can occur in the register.
Confirm any result against the register itself — every match includes a direct
link — before taking action that affects someone.

# Actor input Schema

## `records` (type: `array`):

One object per person: firstName + lastName (add middleName to sharpen the match), or fullName. Add dateOfBirth (YYYY-MM-DD or DD/MM/YYYY) wherever you have it — the register carries no unique identifier, so the date of birth is what separates the person you mean from a namesake, and it is the only thing that can rule a match OUT. A postcode helps too. Any extra fields, such as your own referenceId, are echoed back with the result so it reconciles with your ATS or case management system.

## `statusFilter` (type: `string`):

Every match is labelled with caseStatusClass (current / ended / unknown) either way; this only controls which ones are listed. 'All' is the default so nothing is hidden from you.

## `includeCaseDetails` (type: `boolean`):

On by default, and you almost certainly want it on. The search results list gives only name, date of birth, trading details and postcode. The insolvency TYPE (bankruptcy / IVA / debt relief order / restrictions), the court, the case number, the order date and the discharge status all live on the case page behind it — so with this off, every match comes back with caseStatusClass 'unknown'.

## `maxCaseDetailsPerName` (type: `integer`):

Upper bound on how many case pages are opened for a single name, so one very common name cannot consume the whole run. Matches beyond it are still returned, just without case detail.

## `maxPagesPerName` (type: `integer`):

The register returns 10 results per page — 'John Smith' alone returns 149 records. This caps how deep each name is read. If the cap is hit, the result is flagged searchTruncated: true and says so in its guidance rather than pretending the list was complete. Supplying full forenames is a better fix than raising this.

## `fuzzyThreshold` (type: `number`):

0 to 1. How close a non-exact name has to be before it is reported as a possible match. Lower catches more spelling variants and produces more to review. 0.85 is a sensible default.

## Actor input object example

```json
{
  "records": [
    {
      "referenceId": "CAND-001",
      "firstName": "Jane",
      "lastName": "Example",
      "dateOfBirth": "1980-04-17"
    },
    {
      "referenceId": "CAND-002",
      "firstName": "John",
      "middleName": "Peter",
      "lastName": "Sample",
      "postcode": "SW1A 1AA"
    },
    {
      "referenceId": "DIR-88",
      "fullName": "Alex Specimen"
    }
  ],
  "statusFilter": "all",
  "includeCaseDetails": true,
  "maxCaseDetailsPerName": 10,
  "maxPagesPerName": 5,
  "fuzzyThreshold": 0.85
}
```

# 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 = {
    "records": [
        {
            "referenceId": "CAND-001",
            "firstName": "Jane",
            "lastName": "Example",
            "dateOfBirth": "1980-04-17"
        },
        {
            "referenceId": "CAND-002",
            "firstName": "John",
            "middleName": "Peter",
            "lastName": "Sample",
            "postcode": "SW1A 1AA"
        },
        {
            "referenceId": "DIR-88",
            "fullName": "Alex Specimen"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/uk-bankruptcy-check-individual-insolvency-register").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 = { "records": [
        {
            "referenceId": "CAND-001",
            "firstName": "Jane",
            "lastName": "Example",
            "dateOfBirth": "1980-04-17",
        },
        {
            "referenceId": "CAND-002",
            "firstName": "John",
            "middleName": "Peter",
            "lastName": "Sample",
            "postcode": "SW1A 1AA",
        },
        {
            "referenceId": "DIR-88",
            "fullName": "Alex Specimen",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/uk-bankruptcy-check-individual-insolvency-register").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "records": [
    {
      "referenceId": "CAND-001",
      "firstName": "Jane",
      "lastName": "Example",
      "dateOfBirth": "1980-04-17"
    },
    {
      "referenceId": "CAND-002",
      "firstName": "John",
      "middleName": "Peter",
      "lastName": "Sample",
      "postcode": "SW1A 1AA"
    },
    {
      "referenceId": "DIR-88",
      "fullName": "Alex Specimen"
    }
  ]
}' |
apify call malekh/uk-bankruptcy-check-individual-insolvency-register --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malekh/uk-bankruptcy-check-individual-insolvency-register",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2XzkKX8bLzJCzH3Aj/builds/NrJWkdfLiNKxXVhiB/openapi.json
