Documentation
Base URL https://attestry.cashflowedx.com. The machine-readable description is at /v1/openapi.json (OpenAPI 3.1).
Quick start
Create an account, confirm your e-mail address, and create an API key in the console. The key is shown once. Send it as a Bearer token.
curl -s https://attestry.cashflowedx.com/v1/companies/search \
-H "Authorization: Bearer $ATTESTRY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Siemens", "country": "DE", "limit": 5}'
How responses are shaped
Success is always {"data": …, "meta": {…}}. Failure is always {"error": {"code", "message", "details", "request_id"}} with a matching HTTP status. Every response carries an X-Request-Id header; quote it when you contact support.
Each field of a record is an object:
"legal_name": {
"value": "…",
"status": "verified", // verified | unverified | inferred | unavailable
"source": "gleif",
"source_record_id": "…",
"collected_at": "2026-11-12T09:30:00+00:00",
"verified_at": "2026-10-02T07:11:42Z",
"confidence": 0.95,
"permitted_purposes": ["any_lawful_purpose"],
"retention_days": 365,
"restrictions": ["do_not_imply_gleif_endorsement"]
}
Send "view": "flat" to get only value and status per field. A field no source could supply is returned as {"value": null, "status": "unavailable"}; it is never filled with a guess.
Credits, limits and errors
- Credits are charged per record returned. Nothing found, a failed request, or a record withheld for privacy reasons costs nothing.
meta.credits_chargedandmeta.credits_remainingare in every response. - Rate limits are per API key per minute. See
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. Over the limit you get429 rate_limitedwithRetry-After. 402 quota_exceeded: the month's credits are used up.422 filter_not_supported: no source supports that filter.503 source_not_enabled: a source that could answer exists but is not switched on.502 source_unavailable: the sources did not respond.- Send an
Idempotency-Keyheader on enrich and batch requests. Repeating the same request with the same key within 24 hours returns the first response and is not charged again.
Connect an AI agent (MCP)
The MCP endpoint is https://attestry.cashflowedx.com/mcp (Streamable HTTP). Authenticate with the same API key as a Bearer token.
# Claude Code
claude mcp add --transport http attestry https://attestry.cashflowedx.com/mcp \
--header "Authorization: Bearer $ATTESTRY_API_KEY"
# Cursor, and other clients that read an mcp.json file
{
"mcpServers": {
"attestry": {
"url": "https://attestry.cashflowedx.com/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}
Tools: search_companies, enrich_company, get_company_information, search_people, enrich_contact, verify_business_email, batch_enrich_companies, get_account_usage, list_data_sources.
Apps that sign in through the browser, such as custom connectors in the Claude and ChatGPT web apps, need only the address https://attestry.cashflowedx.com/mcp. They register themselves, send you to an Attestry page to approve access (OAuth 2.1 with PKCE), and can be disconnected in the console under Connect an agent.
Webhooks
Add an https endpoint in the console or with POST /v1/webhooks. Attestry sends batch.completed events. Each delivery has an Attestry-Signature: t=<unix time>,v1=<hex> header: the HMAC-SHA256 of <t>.<raw body> with your endpoint secret. Reject deliveries whose signature does not match or whose timestamp is more than five minutes old.
Endpoint reference
Companies
POST/v1/companies/search
Search companies
Search by name, domain, country, region, industry or headcount. Which filters work depends on
the enabled data sources (see GET /v1/sources); an unsupported filter is rejected, not ignored.
| Field | Type | Notes |
|---|---|---|
name | string | optional |
domain | string | optional |
country | string | optional. ISO 3166-1 alpha-2, e.g. US, GB, DE |
region | string | optional |
industry | string | optional |
employee_min | integer | optional |
employee_max | integer | optional |
revenue_min_usd | integer | optional |
revenue_max_usd | integer | optional |
limit | integer | optional |
offset | integer | optional |
view | full | flat | optional |
POST/v1/companies/enrich
Enrich one company
Look one company up by LEI, registration number + country, domain, or exact legal name, and
merge what every enabled source knows. Each field carries its own source and status.
| Field | Type | Notes |
|---|---|---|
lei | string | optional |
registration_number | string | optional |
country | string | optional |
domain | string | optional |
name | string | optional |
view | full | flat | optional |
People
POST/v1/people/search
Search professionals
Professionals by company, title, seniority or department, in one named country.
Available on paid plans and only for countries enabled on this deployment.
| Field | Type | Notes |
|---|---|---|
company_name | string | optional |
company_domain | string | optional |
job_title | string | optional |
seniority | string | optional |
department | string | optional |
country | string | optional |
region | string | optional |
limit | integer | optional |
offset | integer | optional |
view | full | flat | optional |
POST/v1/people/enrich
Enrich one professional record
| Field | Type | Notes |
|---|---|---|
full_name | string | optional |
company_domain | string | optional |
company_name | string | optional |
work_email | string | optional |
profile_url | string | optional |
country | string | optional |
view | full | flat | optional |
POST/v1/emails/verify
Check a business e-mail address
Syntax, the domain's live mail-server records, disposable and role-address detection.
The mailbox itself is not probed and is reported as unverified.
| Field | Type | Notes |
|---|---|---|
email | string | required |
POST/v1/emails/lookup
Find a work e-mail from a licensed source
Returns an address only when a licensed source holds one. Addresses are never guessed.
| Field | Type | Notes |
|---|---|---|
full_name | string | required |
company_domain | string | optional |
company_name | string | optional |
country | string | optional |
Batches
POST/v1/batches
Start a batch
Queue up to your plan's batch size of enrich or verify items. Poll GET /v1/batches/{id} or
receive a `batch.completed` webhook.
| Field | Type | Notes |
|---|---|---|
operation | companies.enrich | people.enrich | emails.verify | required |
items | array | required |
GET/v1/batches/{batch_id}
Get a batch and its results
Account
GET/v1/account
Account, plan and capabilities
GET/v1/usage
Usage for a period
GET/v1/billing
Plan, subscription status and credit prices
Transparency
GET/v1/sources no key needed
Every data source, its licence and its limits
Public. Lists each source Attestry can draw on, whether it is enabled here, what its licence
permits and how long Attestry stores its data.
GET/v1/plans no key needed
Plans and limits
POST/v1/privacy-requests no key needed
File a data-subject request
Public. Anyone can ask for access, erasure, correction, or to object / opt out. The request
takes effect once the address is confirmed through the e-mailed link.
| Field | Type | Notes |
|---|---|---|
request_type | access | erasure | objection | correction | opt_out_of_sale | required |
email | string | required |
full_name | string | optional |
jurisdiction | string | optional |
details | string | optional |
Webhooks
GET/v1/webhooks
List webhook endpoints
POST/v1/webhooks
Add a webhook endpoint
The signing secret is returned once. Verify `Attestry-Signature: t=<unix>,v1=<hex>` as
HMAC-SHA256 of `<t>.<raw body>`.
| Field | Type | Notes |
|---|---|---|
url | string | required |
DELETE/v1/webhooks/{endpoint_id}
Remove a webhook endpoint