Legal-entity research
Use registration number and country to confirm identity, then inspect status, officers and reported relationships. Keep source details with the fields you store.
Check market and field coverage →
Get API keyCOMPANY DATA API
A company data API gives your software structured business records through search and lookup requests. CompanyProof connects legal identity, officers, reported ownership and financials in one profile, with source context where returned. Validate the fields available for your markets before integration.
REST + JSON / MCP for AI agents

People. Ownership.
Financials. Connected.
THE DATA FOUNDATION
Company data network.
Availability varies by field and market.
Explore coverage ↗
CHOOSE THE RIGHT DATA LAYER
Company search finds candidates. A company profile API retrieves records for the selected entity. Neither step, on its own, approves a supplier or verifies every claim about it.
Use registration number and country to confirm identity, then inspect status, officers and reported relationships. Keep source details with the fields you store.
Check market and field coverage →Resolve the account to a legal entity, store its returned ID, then map only the fields your CRM needs. Preserve missing-data states and review ambiguous matches before writing to your CRM. Your application owns the mapping and update workflow.
Inspect the profile contract →Give your agent the returned records and their source context. For a verdict on a supported company identity claim, use the separate Claim Verification API. Ownership and financial claims need their own assessment.
See supported verification fields →Choose representative companies across your required countries and entity types, including similar names, missing financials and restricted modules. Define acceptance thresholds before evaluating providers.
| Measure | Keep the evidence | Decision |
|---|---|---|
| Entity resolution | Confirmed registration number and jurisdiction; unresolved and ambiguous cases. | Can your workflow select the correct legal entity without a silent name match? |
| Required-field coverage | Usable required fields / requested sample records, split by country and entity type. | Does the returned data support your actual decision? |
| Source and recency | Returned source category, link, retrieval time and filing period, where available. | Can a reviewer distinguish registry facts, enrichment and modelled relationships? |
| Operational behaviour | Your measured response times, request credits and module errors on the pilot sample. | Do latency, fallback handling and accepted-call usage fit your application? |
| Permitted use | Your order and agreement for storage, retention and onward distribution. | Are the rights needed for your product explicitly agreed? |
This is an evaluation method, not a measured CompanyProof benchmark. An unavailable ownership module is not evidence that there are no owners. Reported shareholders are not automatically a calculated ultimate beneficial owner.
FROM REQUIREMENT TO RESPONSE
Evaluate a company information API against the fields your application will use—not a promise that every company has every attribute. Start with the response locations below, then inspect the complete contract.
| Your requirement | Response location & interpretation | Reference & next check |
|---|---|---|
| Legal identity | profile.liteKeep registration number and jurisdiction together. Use the returned company ID for subsequent profile requests. | Company profile API contract → Confirm the legal entity before mapping an account. |
| Directors & officers | profile.officersSeparate current appointments from former roles; preserve source and appointment context. | Officer and company attributes → Limit personal data to your documented purpose and permitted use. |
| Ownership & corporate groups | profile.shareholdersprofile.group_structures_fullReported holdings and returned relationships are not a calculated UBO result. | Ownership API field reference → How to assess beneficial ownership → |
| Company financial data | profile.financialMatch each metric to its reporting period, currency, units and individual or consolidated scope. | Financial API field reference → Finding private-company statements → |
| CRM enrichment | enrichmentCheck section_status.enrichment separately. Commercial attributes are not automatically registry facts. | Enrichment attribute reference → Keep availability and provenance alongside each mapped value. |
Illustrative application policy, not a live lookup or a built-in CompanyProof CRM connector. Assume three existing CRM accounts and a workflow that requires a confirmed legal entity before writing company fields.
Your application defines write, retention and review policies. The profile contract explains arrays, wrappers, nullability and module errors. Use the response-state explorer to compare illustrative available, empty and unavailable states.
Switch states to see why a missing module must not become a negative finding. Fictional response excerpts; no API request is made.
A financial figure belongs to a company, a currency and a reporting period.
profile.financialResponse excerpt +{
"years": ["2024"],
"groups": [{
"name": "Income statement",
"list": [{ "name": "Revenue",
"list": { "2024": "28.6" } }]
}]
}Keep the original context alongside the value in your application.
02 / FOLLOW THE CONNECTIONS
Meet the people behind it. Trace its reported ownership. See where it sits in a wider group.
Select a connection below to see the relationship and its context. Fictional company and records.
03 / LOOK BEYOND THE HEADLINE
Explore reported financials over time, with the period, currency and reporting scope intact. A useful number comes with its context.
| Year | Revenue | Operating profit |
|---|---|---|
| 2022 | 18.4 | 2.1 |
| 2023 | 22.7 | 2.8 |
| 2024 | 28.6 | 3.9 |
These values illustrate reporting context. They are not measured CompanyProof customer results or live filings.
04 / OPEN THE RECORD
Switch between identity, officers, ownership, group, financials and enrichment. Inspect the example, then see the JSON behind it.
THE COMPANY RECORD
The legal entity stays connected to its wider corporate group.
profile.group_structures_fullFields & availability +Explore returned parent and subsidiary relationships. Connect related companies without losing the identity and jurisdiction of the specific business you are reviewing.
id, name, registration_numbercountrychildren[]selected, sourceKeep relationship provenance: modelled links and registry-sourced relationships carry different evidence.
Read the complete field reference ↗Fictional demonstration, not a live lookup. Module and field availability vary by company, market and access.
Evaluate your required fields ↗FROM REQUEST TO RECORD
Resolve the company once. Retrieve its profile using the same company ID.
Search by name or identifier and country. Confirm the match before requesting its profile.
POST /v2/companies/searchRetrieve available modules. Preserve their source details, reporting context and availability.
GET /v2/companies/{id}/profileUse a live key with a paid plan or an active evaluation. Each accepted search or profile request uses one credit.
Plans and credit usage →Connect through MCP →# Run server-side with your live API key.
# 1. Search using the company's registration number.
curl --fail-with-body --request POST \
'https://companyproof.ai/v2/companies/search' \
--header "Authorization: Bearer $COMPANYPROOF_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"identifier_type": "registration_number",
"identifier": "09410808",
"country": "GB"
}'
# 2. Confirm the match, then set the returned ID.
# Replace the placeholder with companies[n].id.
COMPANY_ID='REPLACE_WITH_RETURNED_COMPANY_ID'
curl --fail-with-body \
"https://companyproof.ai/v2/companies/$COMPANY_ID/profile" \
--header "Authorization: Bearer $COMPANYPROOF_API_KEY"
// Node.js / server-side. Keep the live key private.
const base = "https://companyproof.ai/v2";
const headers = {
Authorization: "Bearer " + process.env.COMPANYPROOF_API_KEY,
"Content-Type": "application/json"
};
const search = await fetch(base + "/companies/search", {
method: "POST", headers,
body: JSON.stringify({
identifier_type: "registration_number",
identifier: "09410808", country: "GB"
})
});
if (!search.ok) throw new Error(await search.text());
const { companies } = await search.json();
const match = companies.find(c =>
c.registration_number === "09410808" && c.country === "GB"
);
if (!match) throw new Error("No exact company match");
const response = await fetch(
base + "/companies/" + encodeURIComponent(match.id) + "/profile",
{ headers }
);
if (!response.ok) throw new Error(await response.text());
const result = await response.json();
// Check section_status and errors inside each profile module.
console.log(result.section_status, result.profile);
# Python standard library. Run server-side.
import json
import os
from urllib.request import Request, urlopen
from urllib.parse import quote
base = "https://companyproof.ai/v2"
headers = {
"Authorization": "Bearer " + os.environ["COMPANYPROOF_API_KEY"],
"Content-Type": "application/json"
}
def request(path, data=None):
body = json.dumps(data).encode() if data is not None else None
with urlopen(Request(base + path, data=body, headers=headers),
timeout=60) as response:
return json.load(response)
search = request("/companies/search", {
"identifier_type": "registration_number",
"identifier": "09410808", "country": "GB"
})
match = next((c for c in search["companies"]
if c.get("registration_number") == "09410808"
and c.get("country") == "GB"), None)
if match is None:
raise ValueError("No exact company match")
result = request("/companies/" + quote(match["id"], safe="") + "/profile")
# Check section_status and errors inside each profile module.
print(result["section_status"], result["profile"])
{
"company_id": "company_123",
"profile": {
"lite": {
"basic": {
"name": "ACME HOLDINGS LIMITED",
"status": "Active",
"source": {
"name": "Illustrative company registry",
"retrieved_at": "2026-08-29T10:42:11.000Z"
}
}
},
"shareholders": {
"error": {
"status_code": 403,
"message": "This module is unavailable for the selected record."
}
}
},
"enrichment": null,
"section_status": {
"profile": "available",
"enrichment": "unavailable"
}
}
PLAN THE REQUESTS
Each accepted search or profile request uses one credit. Reusing the confirmed company ID for later profile calls avoids an extra search. Use this calculator to make your request assumptions explicit.
Illustrative inputs, editable by you. Each new company uses one search and one profile call. Each refresh reuses a stored company ID and uses one profile call.
ACCEPTED SEARCH + PROFILE CALLS
2,250 credits / month
1,000 × 2 + 250 × 1 = 2,250 credits. The labelled bars show each operation’s share of the total.
This estimates requests, not price or usable-record coverage. Extra accepted searches, repeated profile calls and retries can add credits. Verification and intelligence have separate rules. An empty search result can still be a successful request.
Compare current plans →Read access and credit rules →Keep live keys on your server. Inspect section_status for profile and enrichment availability, then inspect errors inside each profile module. Follow error handling and rate-limit guidance before retrying.
TWO CAPABILITIES. ONE COMPANYPROOF.
Retrieval and verification answer different questions. Use either capability on its own, or connect them in one workflow.
Returns a company profile with available records and source context.
YOU’RE HERE · COMPANY DATA“Northstar is dissolved.”
Compares a supported claim with evidence and returns a verdict and correction.
Explore claim verificationIllustrative examples. Automatic claim verdicts cover the six documented company identity fields.
FREQUENTLY ASKED QUESTIONS
It gives software programmatic access to structured company information. CompanyProof offers company search and a consolidated profile, plus separate verification and agent interfaces.
Profiles can include legal identity, officers, shareholders, group structure, financials and enrichment. Actual modules and fields depend on source availability and access.
CompanyProof uses company information collected and structured from official registries. Preserve the source context returned for the specific record you use.
No. Registry disclosure, source coverage and module access vary. Validate required fields in your target jurisdictions before integration.
The financial module can return reported financial metrics and filing periods where available. Keep the currency, units and individual or consolidated scope with each value.
Shareholder and group records can support ownership research. The current profile contract does not itself promise a calculated ultimate beneficial owner result.
A profile returns observed information. Claim verification compares a supported assertion with available evidence and returns a verdict and correction where appropriate.
CompanyProof provides an MCP interface and documented adaptive intelligence routes. Select the interface according to whether you need structured records, research or claim verification.
Inspect section_status and any returned access or error details. Keep unavailable information separate from an empty result or a negative finding.
Review the current pricing page and documented credit rules. Test representative profile requests and module combinations before estimating monthly usage.
YOUR MARKETS. YOUR REQUIRED FIELDS.
Bring your target countries, required fields, representative companies and monthly request estimate. We’ll help scope an API evaluation against your acceptance criteria.
Discuss your integration Read the documentation ↗