# KYB Company Verification API - Registry, Officers, Shareholders (`nabeelbaghoor/kyb-company-verification-api`) Actor

KYB and company registry data with the Kyckr API: search 300 official registers in 100 countries by name or number, read Lite and Enhanced company profiles with directors, shareholders and UBOs, list registry filings and look up orders. Bring your own key.

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

## Pricing

from $5.00 / 1,000 company search result returneds

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

## KYB Company Verification API - Registry, Officers, Shareholders

Verify companies against official government registers in 100 countries through the Kyckr API with your own key, and get company details, directors, shareholders and beneficial owners as clean dataset rows.

Works with the Kyckr Companies V2 REST API (api.kyckr.com/v2, documented in Kyckr's public OpenAPI reference at developer.kyckr.com): GET /companies to search a register by company name or registration number, GET /companies/{kyckrId}/lite for a Lite Profile, GET /companies/{kyckrId}/enhanced for an Enhanced Profile with officers and shareholders, GET /companies/{kyckrId}/documents for the registry filings available, and GET /orders, GET /orders/{orderId} and its JSON download for orders on your account. Each company, profile, document or order becomes one row with the Kyckr ID, jurisdiction, company name, registration number, status, legal form, registered address, dates, registration authority, activities, identifiers, officers with roles, shareholders with percentages, beneficial owners and share capital, plus the full Kyckr record. Download as JSON, CSV or Excel, schedule it, or feed it into a KYB, KYC, AML onboarding or supplier due diligence workflow or an AI agent. Bring your own API key.

BYOK, not live-tested: every route, parameter and response field comes from Kyckr's published OpenAPI definition and developer guides, and every route was confirmed to exist on api.kyckr.com and test-api.kyckr.com, but the actor has not been run against a live Kyckr account.

### What it does

- **Company search**: search the live register of one jurisdiction (ISO code such as GB, DE, AU, or US-NY, CA-ON) by company name or registration number, or run a global name search across Kyckr's stored index when the country is unknown. One row per company, with the Kyckr ID the other modes take.
- **Lite profile**: verified basic details read live from the register: name, number, registered address, foundation and registration dates, status, legal form, activity codes, identifiers, previous names and registration authority.
- **Enhanced profile (KYB)**: everything in the Lite Profile plus officers and directors with roles and active flags, shareholders with share percentages, ultimate beneficial owners where the register files them, share capital and contact details. Optional other directorships for GB directors. Slow registries are followed up automatically: the run polls the pending order and collects the finished profile.
- **Registry documents**: every filing Kyckr can supply for a company (annual accounts, articles, officer filings and more) with product id, category, date, formats, delivery time and credit cost, across all pages.
- **Order history and Order lookup**: orders already on your Kyckr account, and the structured JSON profile of any finished profile order.
- **Registration numbers in, profiles out**: give registration numbers with a jurisdiction to the profile and document modes and each is resolved to its Kyckr ID first.
- **Nothing is bought by this actor**: no document order is placed and no POST route is called.
- **Pay only for results**: a search with no match, a pending or refused profile, or a refused request gives one free row that says why.

### Important: profiles use your Kyckr credits

Kyckr bills Lite and Enhanced Profiles in credits on your own account (the cost columns show what Kyckr reported). The run sends only as many companies as `maxResults` can still return, so no credit is spent on rows that would be cut. Use the Test environment with a sandbox key to try the flow without charges.

### How to get a key

Kyckr API keys are issued by Kyckr to customers: book a demo or contact sales at kyckr.com. Kyckr also provides sandbox credentials for its test environment (test-api.kyckr.com), which mirrors production with sample data at no cost. Paste the key into the API key field, or set the DATA_API_KEY secret, and pick the matching environment. The key goes only to Kyckr in the Authorization header and is never logged. A missing or rejected key ends the run cleanly with a status message.

### Input

| Field | Modes | Description |
| --- | --- | --- |
| `mode` | all | `search`, `lite`, `enhanced`, `documents`, `orders` or `order` |
| `environment` | all | `production` (live registers) or `test` (Kyckr sandbox) |
| `isoCode` | search, lite, enhanced, documents, orders | Jurisdiction: ISO alpha-2 such as GB, or US-XX and CA-XX codes. Empty in search means a global name search |
| `companyNames` | search | Company names, one per line |
| `companyNumbers` | search, lite, enhanced, documents | Registration numbers, one per line (needs a jurisdiction) |
| `kyckrIds` | lite, enhanced, documents | Kyckr IDs from a search, such as GB|MTE2NTUyOTA |
| `showDirectorships` | enhanced | Add other directorships (GB only) |
| `waitForPendingMinutes` | enhanced | Minutes to wait for slow registries (default 5, up to 30) |
| `customerReference` | lite, enhanced, documents | Your own reference, stored by Kyckr |
| `startDate`, `endDate` | orders | Order date range |
| `orderIds` | order | Kyckr order ids |
| `downloadProfiles` | order | Download the JSON profile of finished orders (default on) |
| `maxResults` | all | Row ceiling for the run (default 100) |
| `requestsPerMinute` | all | Pacing, default 60 |
| `apiKey` | all | Your Kyckr API key |

An input set for a mode that does not take it is left off with a warning, never sent.

Example: a KYB check of two UK companies by registration number.

```json
{
    "mode": "enhanced",
    "isoCode": "GB",
    "companyNumbers": ["11655290", "00445790"],
    "showDirectorships": true,
    "maxResults": 10
}
```

### Example output

An illustrative Enhanced Profile row, shaped like the documented EnhancedProfile schema (values are an example). The full profile is kept under `record`.

```json
{
    "mode": "enhanced",
    "modeLabel": "Enhanced profile (KYB)",
    "recordType": "enhanced",
    "input": "11655290",
    "found": true,
    "kyckrId": "GB|MTE2NTUyOTA",
    "jurisdiction": "GB",
    "companyName": "KYCKR UK LIMITED",
    "companyNumber": "11655290",
    "status": "active",
    "statusNormalized": "Active",
    "legalForm": "ltd",
    "address": "Kemp House, 160 City Road, London, United Kingdom, EC1V 2NX",
    "foundationDate": "2018-11-01",
    "registrationAuthority": "Companies House, United Kingdom",
    "activities": "63120 Web portals",
    "officers": "Jane Example (Director); John Example (Secretary, inactive)",
    "officerCount": 2,
    "activeOfficerCount": 1,
    "shareholders": "Kyckr Limited (100%)",
    "shareholderCount": 1,
    "beneficialOwners": null,
    "beneficialOwnerCount": 0,
    "costType": "credit",
    "costValue": 3,
    "note": null,
    "record": { "companyName": "KYCKR UK LIMITED", "identifiers": { "primaryRegistrationNumber": "11655290" } }
}
```

### FAQ

#### What is the Kyckr API?

Kyckr is a company registry data provider for KYB (know your business) and AML compliance. Its Companies V2 API connects to 300 official company registers in 100 countries and returns company data in real time or near real time from the primary government source, as normalised JSON, plus original registry documents.

#### What is the difference between a Lite Profile and an Enhanced Profile?

A Lite Profile verifies basic registration details: name, number, registered address, dates, status, legal form and activity. An Enhanced Profile adds the people and owners behind the company: officers and directors, shareholders with percentages, beneficial owners where filed in structured form, and share capital.

#### Do I need my own Kyckr API key?

Yes. This is a bring-your-own-key actor: it calls Kyckr with your key, under your Kyckr contract and its terms. A missing or rejected key ends the run cleanly with a status message, and nothing is charged.

#### Does this actor order registry documents?

No. Registry documents mode lists the filings available and their Kyckr credit cost, so you can decide what to order in Kyckr. Ordering is left out because each order is a purchase. Order lookup reads orders you already placed.

#### Why is an Enhanced Profile row marked pending?

Some registries take longer than Kyckr holds the connection, so Kyckr answers with an order id. The run polls that order for the minutes you set and collects the finished profile. If it is still pending, the row gives the order id for the Order lookup mode.

#### Can I search without knowing the country?

Yes. Leave the jurisdiction empty in Company search for a global name search. Kyckr warns that it reads a stored index rather than the live register, so confirm the company with a jurisdiction search before relying on its status.

#### What do I pay?

Pay per result: 0.005 USD per search result, registry document or order, 0.01 USD per Lite Profile and 0.02 USD per Enhanced Profile. Empty searches, pending, failed and refused requests are never charged. Kyckr bills its own credits separately on your account.

### Pricing

| Event | Price | Charged for |
| --- | --- | --- |
| `company-search-result` | 0.005 USD | Each company a register search returns |
| `lite-profile` | 0.01 USD | Each Lite Profile |
| `enhanced-profile` | 0.02 USD | Each Enhanced Profile, including one collected from a finished order |
| `registry-document` | 0.005 USD | Each available registry document listed |
| `order-record` | 0.005 USD | Each order in the history or lookup |

### Keyword map

KYB API, know your business API, company registry API, company verification API, business verification API, company search API, official company register data, directors and officers data, shareholder data API, UBO data, beneficial ownership API, Companies House API alternative, company filings API, registry documents, AML onboarding, supplier due diligence, Kyckr API, company data for AI agents.

### Terms and data use

Kyckr data is licensed under your agreement with Kyckr. The Standard Terms and Conditions for Services (kyckr.com/legal/terms-and-conditions) grant a non-sublicensable right to use the Services for internal business use only (cl. 2.1) and forbid reselling, redistributing or providing the Information to a third party (cl. 3.2(b)). The Enterprise Terms and Conditions (kyckr.com/legal/enterprise-terms-and-conditions) let the customer's third-party service providers use the Services solely to fulfil the customer's own use (cl. 3.2), forbid reselling the Information extracted (cl. 4.2(b)), and require API credentials to stay within the customer (cl. 3.3.2). Neither sets a limit on how long you keep the data. Run this actor with your own key, verify your own customers, suppliers and counterparties, keep the results for your own compliance records, and do not share or resell them. This actor is not affiliated with or endorsed by Kyckr.

# Actor input Schema

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

Company search finds companies on an official register by name or registration number and returns their Kyckr IDs. Lite profile verifies basic registration details live from the register. Enhanced profile (KYB) adds officers and directors, shareholders, beneficial owners and share capital. Registry documents lists the filings available for a company. Order history and Order lookup read orders already on your Kyckr account. Lite and Enhanced profiles use Kyckr credits.

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

Production reads live registers and is billed by Kyckr. Test calls the Kyckr sandbox (test-api.kyckr.com) with a sandbox key: sample data, no Kyckr charges, and name search returns every sample company for the country.

## `isoCode` (type: `string`):

Company search, the profile and document modes, and Order history. Two-letter ISO country code of the register, such as GB, DE or AU, or a US state or Canadian province code such as US-NY, US-DE or CA-ON. Leave empty in Company search for a global name search of Kyckr's stored index. Required to search by registration number.

## `companyNames` (type: `array`):

Company search only. One company name per line, up to 500 searches a run together with the numbers.

## `companyNumbers` (type: `array`):

Company search, and the profile and document modes. One registration number per line, searched in the jurisdiction above. In the profile and document modes each number is first resolved to its Kyckr ID with a search.

## `kyckrIds` (type: `array`):

Lite profile, Enhanced profile and Registry documents. One Kyckr ID per line, as returned in the kyckrId column of a Company search, such as GB|MTE2NTUyOTA. Up to 500 companies a run.

## `showDirectorships` (type: `boolean`):

Enhanced profile only. Adds each director's positions at other companies, where Kyckr supports it (currently GB only).

## `waitForPendingMinutes` (type: `integer`):

Enhanced profile only. Some registries answer slowly, and Kyckr then returns an order id instead of the profile. The run polls those orders for up to this many minutes and collects the finished profiles. Anything still pending is listed with its order id for the Order lookup mode.

## `customerReference` (type: `string`):

Lite profile, Enhanced profile and Registry documents. Optional reference of your own, such as a case number, that Kyckr stores with the request and shows in your order list.

## `startDate` (type: `string`):

Order history only. Earliest order date, YYYY-MM-DD or ISO-8601 date-time.

## `endDate` (type: `string`):

Order history only. Latest order date, YYYY-MM-DD or ISO-8601 date-time.

## `orderIds` (type: `array`):

Order lookup only. One Kyckr order id per line, such as the order id of a pending Enhanced profile row.

## `downloadProfiles` (type: `boolean`):

Order lookup only. When an order succeeded and has structured data, download its JSON profile and return it as an Enhanced profile row.

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

The most rows this run returns and charges for. Only this many companies are sent for profiles, so no Kyckr credit is spent on rows that would be cut.

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

Pacing. A rate limit answer is waited out and retried; an empty credit balance ends the run.

## `apiKey` (type: `string`):

Your own Kyckr V2 API key, issued by Kyckr (production keys for Production, sandbox keys for Test). Sent only to Kyckr in the Authorization header, never logged. Stored as a secret. You can instead set the DATA_API_KEY environment secret.

## Actor input object example

```json
{
  "mode": "search",
  "environment": "production",
  "isoCode": "GB",
  "companyNames": [
    "Kyckr"
  ],
  "showDirectorships": false,
  "waitForPendingMinutes": 5,
  "downloadProfiles": true,
  "maxResults": 100,
  "requestsPerMinute": 60
}
```

# Actor output Schema

## `records` (type: `string`):

One row per search result, profile, document or order returned for the chosen mode.

# 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 = {
    "isoCode": "GB",
    "companyNames": [
        "Kyckr"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/kyb-company-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 = {
    "isoCode": "GB",
    "companyNames": ["Kyckr"],
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/kyb-company-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 '{
  "isoCode": "GB",
  "companyNames": [
    "Kyckr"
  ]
}' |
apify call nabeelbaghoor/kyb-company-verification-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/kyb-company-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/omVVczXLNZXV0hTzX/builds/DLeJPZT963cFmbw9W/openapi.json
