API documentation
REST/JSON. No account or API key: pay per verification with x402. Machine-readable: OpenAPI 3.1, llms.txt, coverage, pricing.
What it verifies — and what it does not
Whether a business entity is registered in a covered jurisdiction and what the official registry says about it now: legal name, registry number, entity type, domestic/foreign, original and normalized status, standing (only where the registry states it) and dates. It does not assess creditworthiness, legitimacy, ownership, sanctions or fraud, and it is not legal advice.
1. Ask (free)
POST https://businessregistrationproof.online/api/v1/verify
Content-Type: application/json
{
"business_name": "Starbucks Corporation", // registered legal name, any script (optional if entity_number)
"jurisdiction": "US-CO", // FR | NO | US-CO | US-CT | US-NY | US-OR; "CO", "Colorado", "Norge" accepted
"entity_number": "optional", // registry ID → exact lookup, HIGH confidence
"entity_type": "optional tie-breaker", // e.g. "LLC"
"city": "optional tie-breaker",
"country": "optional", // disambiguates two-letter codes
"output_language": "optional BCP 47" // explanations are English today
}The request is validated and the jurisdiction resolved locally. An uncovered jurisdiction returns 422 coverage_not_supported with the covered list; a malformed registry number returns 400 invalid_entity_number. A covered request returns 402 with the x402 requirement (header PAYMENT-REQUIRED), the price (0.018 USDC) and the exact official registry that will be queried. Nothing is stored and no registry is contacted.
2. Pay and verify
Resend the identical body with PAYMENT-SIGNATURE (base64 x402 v2 payload, exact scheme, USDC on Base mainnet) and an Idempotency-Key (16–128 characters of A–Z a–z 0–9 _ -). The authorization is verified, the registry is queried live, and the payment is settled only for a determinate result. The settlement is returned in PAYMENT-RESPONSE.
{
"verification_id": "brv_…",
"result": "ACTIVE",
"confidence": "MEDIUM",
"summary": "The official registry lists this entity as active (registered and current). …",
"entity": {
"legal_name": "STARBUCKS CORPORATION", "entity_number": "19921028206",
"entity_type": "Foreign Profit Corporation", "entity_type_code": "FPC",
"jurisdiction": "Colorado", "jurisdiction_code": "US-CO", "country": "US",
"domestic_or_foreign": "FOREIGN", "jurisdiction_of_formation": "WA", "principal_city": "…"
},
"registration": {
"original_status": "Good Standing", "normalized_status": "ACTIVE",
"status_basis": "SOURCE_STATUS", "formation_date": "1992-…", "end_date": null,
"standing": "GOOD_STANDING", "original_standing": "Good Standing",
"registered_agent": { "published_by_source": true, "returned": false }
},
"match": {
"method": "name", "matched_legal_name": "STARBUCKS CORPORATION",
"matched_entity_number": "19921028206", "name_similarity": "IDENTICAL",
"ambiguity_count": 1, "search_complete": true
},
"candidates": [], "near_matches": [], "non_entity_matches": [],
"source": {
"authority": "Colorado Secretary of State", "url": "https://www.sos.state.co.us/biz/…",
"request_url": "https://data.colorado.gov/resource/4ykn-tg5h.json?…",
"checked_at": "…", "source_type": "OFFICIAL_REGISTRY", "response_sha256": "…"
},
"verification": { "checked_at": "…", "source_updated_at": "…", "cache_used": false, "cache_status": "LIVE" },
"interpretation": { "explanation": "…", "caveats": ["…"] },
"unknowns": [],
"evidence": { "records": [{ "source_fields": { … verbatim, minimised … } }], "evidence_sha256": "…" },
"limitations": ["…"],
"payment": { "charged": true, "status": "settled", "amount": "0.018", "transaction": "0x…" }
}- Retrying with the same key returns the stored result (
cache_statusIDEMPOTENT_REPLAY, originalchecked_at) and never charges again. - The same key with a different body →
409 idempotency_conflict. A payment authorization can be used once →409 payment_replay. - If the result was not charged (SOURCE_UNAVAILABLE, UNABLE_TO_VERIFY) the authorization is released unsettled; retry later with the same key and a new authorization.
3. Retrieve later (free)
GET https://businessregistrationproof.online/api/v1/verifications/{verification_id}
Authorization: Bearer <Idempotency-Key>Returns the stored evidence package with cache_status: STORED and the original checked_at. Evidence is kept 90 days; accounting fields are kept for financial records.
Results
ACTIVE | Registered and current per the official registry. Does NOT imply good standing (see registration.standing). Charged. |
DELINQUENT | Still registered, but the registry marks it delinquent/noncompliant (e.g. overdue report). Charged. |
IN_LIQUIDATION | Registered, but in bankruptcy, liquidation or compulsory winding-up. Charged. |
SUSPENDED | Registration or powers suspended by the authority. Charged. |
INACTIVE | No longer active; the registry states no more specific legal reason (e.g. French "cessée", conversions). Charged. |
DISSOLVED | Dissolved (voluntarily, administratively or judicially). Charged. |
REVOKED | Registration revoked or forfeited by the authority. Charged. |
MERGED | Merged or consolidated into another entity. Charged. |
WITHDRAWN | A (typically foreign) registration withdrawn from the jurisdiction. Charged. |
CANCELLED | Registration cancelled or deleted from the register. Charged. |
NOT_FOUND | The selected registry returned no matching entity under the search used. Never means "does not exist anywhere". Charged. |
AMBIGUOUS | Several registered entities match; candidates are returned with entity numbers. Charged. |
SOURCE_UNAVAILABLE | The registry could not be reached. Says nothing about the business. Not charged. |
UNABLE_TO_VERIFY | The registry answered, but the evidence does not support a determinate result (unreadable response, unmapped status wording, or a name too common to check completely). Not charged. |
Status semantics
registration.original_statusis the registry’s own wording and always prevails.normalized_statusis a documented, per-registry mapping (see Coverage); wording without a safe mapping becomesUNKNOWN→UNABLE_TO_VERIFY(not charged).standingis reported only where the registry states it (GOOD_STANDING,DELINQUENT,NOT_IN_GOOD_STANDING); otherwiseNOT_REPORTED. ACTIVE never implies good standing.status_basis:SOURCE_STATUS(explicit status),ACTIVE_LISTING(the registry publishes only active entities) orSOURCE_FLAGS(derived from the registry’s own flags, e.g. bankruptcy or deletion).- NOT_FOUND = “the selected registry returned no matching entity under the search used”. In active-only registries it means “not listed as active”.
Matching and confidence
- Case, accents, punctuation, spacing and legal-form spelling are normalised (LLC = L.L.C. = Limited Liability Company; Inc = Incorporated). Every distinctive word must match: “ABC Holdings LLC” never matches “ABC Holding Group LLC”. Names are never translated or transliterated.
match.name_similarity:IDENTICAL,EQUIVALENT(legal form spelled differently),FORM_OMITTED,FORM_DIFFERS(e.g. LLC vs Inc — used only when nothing closer exists),NOT_CHECKED(number only).confidence: HIGH = exact registry-number match; MEDIUM = unique name match; LOW = legal form differs or status unmapped. It is rule-based, never a model’s self-assessment.- Several matching entities →
AMBIGUOUSwithcandidates(never an arbitrary pick). One match in a search too broad to be complete → UNABLE_TO_VERIFY (not charged) with the candidate’s number.
Freshness
Every paid verification queries the registry live; no cached result is ever presented as live (verification.cache_used: false). checked_at is when we queried; source_updated_at is when the registry last refreshed its publication, when it reports one.
Errors
Every error is {"error":{"code","message","details?"}}. Codes: invalid_request, invalid_json, unsupported_media_type, payload_too_large, missing_identifier, name_too_broad, invalid_entity_number, unknown_jurisdiction, coverage_not_supported, payment_required, invalid_payment, payment_rejected, payment_expired, payment_wrong_*, idempotency_key_required, idempotency_conflict, payment_replay, in_progress, settlement_failed, rate_limited, not_configured, payment_provider_unavailable, service_unavailable.