x402 · Base mainnet · USDC

French company data.
One call.

Verify a French company, its VAT number, and its address from one API. Built for AI agents that pay per request — no account, no API key, no subscription.

SIREN / SIRET · INSEEVAT · VIESAddress · BANSettlement · seconds

Paid endpoints

Pay only when the response is 2xx
GET$0.01
/api/v1/company

Search by name, SIREN, or SIRET. The full record includes directors, filed finances, employee range, NAF code, and VAT.

q · siret · limit
GET$0.01
/api/v1/vat

Validate any EU VAT number against the European Commission VIES registry. Returns the registered name and address.

vat
GET$0.005
/api/v1/address

Normalize a French address with the official Base Adresse Nationale. Street, postcode, city, coordinates, and confidence score.

q · limit

How an agent pays

x402 v2 · exact scheme

Request without payment

A normal GET. The server replies with HTTP 402 and a PAYMENT-REQUIRED header containing the price and the payTo address.

Sign a USDC authorization

Your wallet signs an EIP-3009 transfer authorization. No gas, no approval transaction, no account.

Retry with proof

Send the same request with the PAYMENT-SIGNATURE header. The facilitator verifies and settles on Base.

Get the data

The response is JSON. If the registry is down or the input is invalid, you get a 4xx/5xx and you are not charged.

# 1. Unpaid request
curl -i "https://veriffr.vercel.app/api/v1/company?q=TotalEnergies"

# HTTP/1.1 402 Payment Required
# PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6Miw...

# 2. With an x402 client, payment is automatic
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const account = privateKeyToAccount(process.env.PRIVATE_KEY!);
const client = new x402Client().register(
  "eip155:8453",
  new ExactEvmScheme(account)
);
const fetchWithPayment = wrapFetchWithPayment(fetch, client);

const response = await fetchWithPayment(
  "https://veriffr.vercel.app/api/v1/company?q=TotalEnergies"
);
const data = await response.json();

console.log(data.results[0].vat);
// FR22531680445

Why this exists

No inference. No per-call model cost.

The French registries are public, but they are built for humans: French-only documentation, different formats, rate limits, and several APIs for one simple question — “who is this company?”

VerifFR normalizes SIRENE, VIES, and BAN into one stable JSON shape. There is no LLM in the request path, so the marginal cost of a call is effectively zero and the price stays at one cent.

The data is cached by the server. A popular lookup does not hammer the official registries, and an agent gets an answer in milliseconds.

  • One schema for company, VAT, and address lookups.
  • English-first docs and field names.
  • No signup, no API key, no monthly minimum.
  • Machine-readable catalog at /api/v1/discovery.
  • Free sample at /api/v1/demo before you spend anything.

Built for agents

Discovery is the hard part
/llms.txt

A compact, plain-text manual with endpoints, prices, parameters, and response shapes. Point your agent at it.

Open llms.txt →
/openapi.json

OpenAPI 3.1 with the x402 price, network, asset, and payTo address attached to every paid operation.

Open the spec →
/api/v1/discovery

Machine-readable catalog: endpoints, prices, free samples, facilitator, and data sources. No payment required.

Fetch the catalog →

Data sources

Official registries, normalized
INSEE SIRENErecherche-entreprises.api.gouv.frEuropean Commission VIESBase Adresse NationaleLicence Ouverte 2.0