# Identity Verification API - Global KYC, AML and Age Checks (`nabeelbaghoor/global-identity-verification-api`) Actor

Verify a person against government registries, credit bureaus, telco and electoral data in over 100 countries, and screen them against global sanctions, PEP and adverse media watchlists. One row per service result, with match scores, safe harbour outcome and the elements that matched.

- **URL**: https://apify.com/nabeelbaghoor/global-identity-verification-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$15.00 / 1,000 verification 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/actors/running/actors-in-store.md#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

## Identity Verification API - Global KYC, AML and Age Checks

Verify a person against government registries, credit bureaus, telco records and electoral rolls in more than 100 countries, and screen them against global sanctions, PEP and adverse media watchlists, from one input list.

### What this actor does

- **Electronic identity verification (eIDV)** against official government and commercial data sources, country by country.
- **AML watchlist screening** against sanctions lists, politically exposed persons, their relatives and close associates, special interest persons and entities, and adverse media, drawn from over 100,000 sources in 40 or more languages.
- **Age verification** derived from the date of birth the sources hold, for onboarding flows with an age gate.
- **Address verification and cleansing**, returning which address elements matched rather than a single yes or no.
- **Composite and sequenced searching**, so several services can answer for one person in a single call.
- **Safe harbour reporting**, with the safe harbour score and outcome carried on every row for audit.
- One row per service result, with the provider's own match scores, the exact identity elements that matched, and the reporting reference their support asks for.

### Input

Fill in the people list, choose a country and name the services to run. Every field is optional except the ones the provider needs to match on: a name or an identifier, plus a country and a service.

```json
{
  "countryCode": "AU",
  "services": ["Australia Residential Lookup"],
  "people": [
    {
      "firstName": "Aloysius",
      "lastName": "Pasco",
      "dateOfBirth": "1946-11-01",
      "addressElement1": "30 Plane Tree Green",
      "addressElement3": "Forrestfield",
      "addressElement4": "WA",
      "addressElement5": "6058",
      "identityVariables": { "phoneNo": "0487787402" }
    }
  ],
  "username": "YOUR_ACCOUNT_USERNAME",
  "password": "YOUR_ACCOUNT_PASSWORD",
  "maxResults": 100
}
```

### Example output

```json
{
  "service": "Australia Residential Lookup",
  "matchStatus": "Full Match 1+1 Verification",
  "searchStatus": "Successful",
  "identityVerified": true,
  "status": 1,
  "sourceStatus": "Successful",
  "nameMatchScore": "A1",
  "addressMatchScore": "0",
  "safeHarbour": false,
  "safeHarbourScore": "N/A",
  "verifiedElements": ["addressElement1", "addressElement3", "addressElement4", "addressElement5", "dateOfBirth", "firstName", "lastName", "mobileNumber"],
  "verifications": { "firstName": true, "lastName": true, "middleName": false, "dateOfBirth": true, "mobileNumber": true, "landlineNumber": false },
  "returnedData": { "source": "DZ1" },
  "watchlistResults": null,
  "countryCode": "Australia",
  "clientReference": "Test_0001",
  "reportingReference": "DZ-7905e55c-0ebf-4857-9958-878642e720bc",
  "found": true
}
```

### Frequently asked questions

#### What is an identity verification API?

An identity verification API checks that a person is who they say they are by matching the details they gave you, such as name, date of birth, address and phone number, against authoritative data sources like government registries, credit bureaus, electoral rolls and telco records. It returns a match result per element rather than a single score, which is what anti-money laundering and know your customer rules require you to record.

#### Which countries does this actor cover?

More than 100. The provider selects data sources by country, so the country code decides which services are available: Australian services include the residential file, credit bureau, driver licence, passport, Medicare card, electoral roll and superannuation, while other regions expose their own equivalents across APAC, EMEA and the Americas. Watchlist screening is global and is called with the country set to All.

#### What is AML watchlist screening?

AML watchlist screening checks a person or entity against sanctions lists, politically exposed persons and their relatives and close associates, special interest persons and entities, and adverse media reporting. This actor returns each hit with its category, scan id and a link to the provider's detailed report, so a compliance analyst can review the match rather than trusting a single flag.

#### What is a safe harbour score?

Safe harbour is a regulatory standard, used in Australia among others, that treats an identity as verified when a defined combination of identity elements has been matched against independent sources. Every row carries the safe harbour outcome and the score behind it, so the evidence for a decision is stored alongside the decision.

#### Does a no match cost anything?

No. This actor charges only for service results that carry a verification outcome. Records refused before they were sent, records the provider would not process, and results that came back with no match at all are stored in the dataset but are not charged for.

#### Do I need my own account?

Yes. This is a bring your own credentials actor: it calls the API with your own account username and password, which are exchanged once per run for a session token. Nothing is shared between runs and the credentials are never written to the dataset. The services you can call are the ones your contract covers.

#### Can I test without spending live credits?

Yes. Set the environment to sandbox, which checks against the provider's test identities rather than live data. Sandbox credentials are a separate account from production, so use the pair issued for that environment.

#### How is personal data handled?

The actor sends only the fields you put in the people list, and stores only what the provider returns. Some data sources require the individual's consent before they may be queried, and it is your responsibility to hold that consent and to use a permissible purpose, as your contract with the provider sets out.

### Which routes this actor calls

Both routes were confirmed live against the provider before release, using deliberately invalid credentials so no real data was touched:

- `POST /api/v2/auth/sign_in` exchanges the username and password for a session token valid for eight hours.
- `POST /api/v2/verify` runs the named services against one person.

Worth knowing: the provider's own environments page writes the sign in route with a hyphen and gives the sandbox host as `idu.test`. Neither works. The live route is spelled with an underscore, and the sandbox host is `idu-test`, exactly as their own curl examples show. This actor uses the spellings that answer.

### Keyword map

identity verification API, KYC API, AML screening API, sanctions screening API, PEP check API, watchlist screening, electronic identity verification, eIDV, age verification API, address verification, know your customer, anti money laundering, safe harbour verification, global identity data, onboarding compliance, fraud prevention API, national ID verification, credit bureau verification, electoral roll check, politically exposed persons.

# Actor input Schema

## `people` (type: `array`):

One object per person, using this provider's own field names. Recognised keys are firstName, middleName, lastName, dateOfBirth (YYYY-MM-DD), gender, and the address lines addressElement1 to addressElement5. Identifiers go in identityVariables, for example {"phoneNo": "0487787402"} or {"nationalIDNo": "..."}, and are also accepted written flat on the person. A person may carry its own countryCode, service list and clientReference to override the run defaults.

## `countryCode` (type: `string`):

The two letter country code the checks run against, for example AU, GB, US, NZ, SG or IN. Use All for the global services such as watchlist screening. This provider selects its data sources by country, so this decides which sources are available. A person can override it with its own countryCode.

## `services` (type: `array`):

The provider's own service names, one per line, for example Australia Residential, Australia Credit Bureau, Australia Driver Licence, Australia Passport or Watchlist AML. Naming more than one is a composite search and is billed for every service it names. Your account has to be contracted for a service before it will answer.

## `username` (type: `string`):

Your own account username for this provider. Bring your own credentials: nothing is shared between runs and the credentials are never written to the dataset.

## `password` (type: `string`):

Your own account password for this provider. It is exchanged once per run for a session token, which is what the verification calls carry.

## `environment` (type: `string`):

Which of the provider's two environments to call. Sandbox checks against test identities rather than live data and is billed differently, and its credentials are a separate account from production.

## `clientReference` (type: `string`):

A string of your own that is sent with every request and returned on every row, so a result can be tied back to the case or batch it came from. A person can override it with its own clientReference.

## `skipNotVerified` (type: `boolean`):

Leave results that came back with no match out of the dataset entirely. Off by default, because a no match is a real answer and is not charged for.

## `baseUrl` (type: `string`):

Overrides the host outright. Leave empty unless your account was issued a dedicated hostname, in which case the environment setting is ignored.

## `maxResults` (type: `integer`):

Stop after this many rows. Rows are charged individually, so this is the ceiling on what a run can cost.

## `requestsPerMinute` (type: `integer`):

How fast to call the provider. Lower this if your contract has a tighter rate ceiling than the default.

## Actor input object example

```json
{
  "people": [
    {
      "firstName": "Aloysius",
      "lastName": "Pasco",
      "dateOfBirth": "1946-11-01",
      "addressElement1": "30 Plane Tree Green",
      "addressElement3": "Forrestfield",
      "addressElement4": "WA",
      "addressElement5": "6058",
      "identityVariables": {
        "phoneNo": "0487787402"
      }
    }
  ],
  "countryCode": "AU",
  "services": [
    "Australia Residential Lookup"
  ],
  "environment": "production",
  "skipNotVerified": false,
  "maxResults": 100,
  "requestsPerMinute": 60
}
```

# Actor output Schema

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

One row per service result, using the provider's own field names, alongside the reporting reference for that transaction.

# 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 = {
    "people": [
        {
            "firstName": "Aloysius",
            "lastName": "Pasco",
            "dateOfBirth": "1946-11-01",
            "addressElement1": "30 Plane Tree Green",
            "addressElement3": "Forrestfield",
            "addressElement4": "WA",
            "addressElement5": "6058",
            "identityVariables": {
                "phoneNo": "0487787402"
            }
        }
    ],
    "services": [
        "Australia Residential Lookup"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/global-identity-verification-api").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 = {
    "people": [{
            "firstName": "Aloysius",
            "lastName": "Pasco",
            "dateOfBirth": "1946-11-01",
            "addressElement1": "30 Plane Tree Green",
            "addressElement3": "Forrestfield",
            "addressElement4": "WA",
            "addressElement5": "6058",
            "identityVariables": { "phoneNo": "0487787402" },
        }],
    "services": ["Australia Residential Lookup"],
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/global-identity-verification-api").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 '{
  "people": [
    {
      "firstName": "Aloysius",
      "lastName": "Pasco",
      "dateOfBirth": "1946-11-01",
      "addressElement1": "30 Plane Tree Green",
      "addressElement3": "Forrestfield",
      "addressElement4": "WA",
      "addressElement5": "6058",
      "identityVariables": {
        "phoneNo": "0487787402"
      }
    }
  ],
  "services": [
    "Australia Residential Lookup"
  ]
}' |
apify call nabeelbaghoor/global-identity-verification-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/global-identity-verification-api"
        }
    }
}

```

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/hC8ONihJiK3PfFMP2/builds/1gtLRLJy2PMD4fdWz/openapi.json
