# Resolve402 > French company decision makers with their probable business email, people search by role, sector and place, counterparty checks before invoicing or paying, the public contact details of any company (from its own website), hiring signals of any company, email pre-checks and document tools (document to Markdown, Markdown to PDF), in one x402 call each. Official registry data, USDC on Base or Solana, nothing stored (GDPR). Not found = not charged: a 404 is never billed. Base URL: https://resolve402.dev OpenAPI: https://resolve402.dev/openapi.json x402 discovery: https://resolve402.dev/.well-known/x402 Agent setup skill: https://resolve402.dev/SKILL.md MCP server: npx -y resolve402-mcp ## When to use - You have a French company name or SIREN and need who runs it (CEO, président, gérant, DG) plus a business email to reach them. - You need a list of decision makers (CEO, président, DG, gérant) of French companies in a sector, a place and a size range. - You are about to invoice or pay a company (French or EU VAT-registered) and want to know if it is active, VAT-valid, in insolvency proceedings or under an asset freeze, and if its IBAN is consistent. - You have a company website and need its official contact details (shared email, switchboard, head-office address, legal identifiers, social pages), each with the page it was read on. - You want to know if a company is hiring, how much and in which functions (a buying signal), before contacting its decision makers. - You want to pre-check an email address (syntax, MX, provider, disposable, webmail, role account) before sending. - You have a PDF, Word file, web page or scan and need its text and tables as clean Markdown for an LLM, without running a parser yourself. - Your agent must deliver a report, a memo or an invoice as a PDF file and only has Markdown. - You need a list of companies in an industry, a country, a region and a size range, from the official business register, and the NACE code your agent speaks is not the one the register uses (NAF, SN2025, TOL, Rev. 2 vs Rev. 2.1). - Not for: consumer emails, bulk scraping. Decision makers and people search: French companies only. Hiring signals: any company whose ATS has a public board. ## Endpoints - GET /api/decision-makers?siren=<9 digits> | ?company= [&domain=] — $0.02 per call. Returns company, web domain (with confidence and evidence), mail provider (Google, Microsoft 365, Proofpoint, Mimecast...), and per officer: name, role, probable email {address, pattern, pattern_source, confidence, evidence?, verified:false} and email_alternatives. pattern_source "observed_on_site" = the pattern was read from named addresses published on the company's own public pages (contact, legal notice, press, team; robots.txt honoured; addresses counted, never returned), confidence medium (1 address) or high (2+ concordant); "default_fr" = common French pattern, confidence low. Never SMTP-verified. 404 = not found, not charged. Page: https://resolve402.dev/services/decision-makers - GET /api/people-search?role=ceo|president|dg|gerant|any_executive§or=&department=|region=|postal_code=<5 digits>&min_employees=[&min_revenue=5M&max_revenue=&min_net_income=0&max_net_income=&keywords=&limit=10&page=1] — $0.05 per call. Up to 25 people (one per company) from the official registry, with company SIREN, NAF, city, headcount and latest revenue / net income (year given). Each result has "next" = the /api/decision-makers call for emails. 404 = no match, not charged. Page: https://resolve402.dev/services/people-search - GET /api/counterparty-check?siren=<9 digits> | ?siret= | ?vat= | ?company= [&iban=] — $0.02 per call. Company status, VAT validity (VIES, with vat.checksum: the FR key recomputed locally, not a VIES validation), insolvency proceedings (BODACC), sanctions screening of the company (identifier or exact name) and of its individual officers (exact last + first name, birth year when listed) against the DG Trésor asset-freeze register (incl. EU and UN), the EU consolidated financial sanctions list and the OFAC SDN list (sanctions.lists gives each list's status and date), IBAN checksum, country and SEPA, and verdict {level: ok|review|block, reasons, incomplete}. A listed officer gives review, never block; officers are returned only as a count (officers_screened) unless listed. 404 = not found, not charged. Page: https://resolve402.dev/services/counterparty-check - GET /api/company-contacts?domain= | ?url= — $0.005 per call. Contact details the company publishes itself on its website (legal notice / Impressum, contact page, schema.org): emails [{address, source}] limited to shared mailboxes (contact@, press@, dpo@...; personal addresses are never returned, only counted in personal_emails_omitted), phones [{number (E.164), type: standard|customer_service|sales|null, source}] (voice lines; fax numbers in fax [{number, source}]), head-office address, legal {siren, siren_source (published|vat), siret, rcs, vat {number, country, checksum}, register (HRB, FN, KvK, BCE, UID), legal_form, share_capital, official_name, siren_match, active, registry_status}, social (company pages: LinkedIn, X, Facebook, Instagram, YouTube, GitHub), contact_form_url, sources, pages_checked. SIREN/SIRET pass Luhn, the FR VAT key is recomputed; a valid SIREN is matched against the French registry. At most 8 requests per domain, robots.txt honoured. 404 no_public_contact = nothing found, not charged. Page: https://resolve402.dev/services/company-contacts - GET /api/hiring-signals?domain= | ?siren=<9 digits> | ?company= [&limit=50] — $0.01 per call. Finds the company's public ATS board (Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Personio, Workable, Teamtailor, Workday) and returns open jobs plus signals: open_jobs, posted_last_30d, hiring_intent (low/medium/high), by_function (sales, engineering, data_ai...), by_seniority, leadership_roles. "next" gives the /api/decision-makers call to chain. 404 = no public board or no open jobs, not charged. Page: https://resolve402.dev/services/hiring-signals - GET /api/verify-email?email=
— $0.003 per call. Pre-check with score 0-100 and reasons [{code, points, detail}] from DNS only: syntax, MX, null MX, provider, SPF, DMARC, disposable, free webmail, role account, random-looking local part. Capped at 90: the mailbox is not tested (mailbox_checked:false, smtp_check:false, accept_all:null). Page: https://resolve402.dev/services/verify-email - GET /api/doc-to-markdown?url= | POST /api/doc-to-markdown (multipart file field, or raw binary body) — $0.005 per call. Returns markdown, tables [{page?, rows}] (also inlined as GFM tables in markdown), pages (PDF only), chars, source_type (pdf | docx | html | txt | markdown | image), truncated (Markdown cut at 400,000 characters), and ocr {engine, languages, pages_ocr, pages_skipped, mean_confidence} when OCR ran. 422 no_text = nothing readable, not charged. Page: https://resolve402.dev/services/doc-to-markdown - POST /api/markdown-to-pdf with JSON {markdown, title?, paper?: "A4"|"Letter"} (or a text/markdown body with ?title=&paper=) — $0.01 per call. application/pdf: headings, paragraphs, bold/italic/links, nested lists, code blocks, blockquotes, simple tables, page numbers, PDF bookmarks from H1-H3, internal #anchor links, embedded Unicode font (Latin, Greek, Cyrillic, €). Max 200,000 characters of Markdown. Page: https://resolve402.dev/services/markdown-to-pdf - GET /api/company-search?country=FR|NO|FI&nace=[&nace_rev=2|2.1®ion=&size_min=&size_max=&status=active|all&limit=1-25] — $0.01 per call. results [{name, registry_id (SIREN / org.nr / Y-tunnus), country, status (active, ceased, in_liquidation, bankrupt, restructuring), legal_form, nace_rev2, nace_rev21, nace_source {rev2, rev21: registry | correspondence | ambiguous}, nace_candidates (when the official correspondence splits a class), nace_match (exact | partial), local_code, local_classification (NAF rév. 2, SN2025, TOL 2025, TOL 2008), size_band, employees (NO only), address, created_at, source_url}] and meta {registry, licence, attribution, classification_sources, nace_query, total, registry_total, excluded}. Largest first in FR and NO. 404 = nothing found, not charged. Page: https://resolve402.dev/services/company-search ## How to pay 1. Call the endpoint: you get HTTP 402 with payment requirements (scheme exact, USDC, networks eip155:8453 and solana mainnet). 2. Sign with any x402 v2 client (x402-fetch, AgentCash, Coinbase CDP wallet, Keyban Agent Wallet) and retry with the PAYMENT-SIGNATURE header. ## Example GET https://resolve402.dev/api/decision-makers?siren=552032534 → Danone officers, domain danone.com, probable emails firstname.lastname@danone.com. ## Chain GET /api/hiring-signals?domain=doctolib.fr → is Doctolib hiring sales or data people? → GET /api/decision-makers?company=doctolib → who to write to. ## Honesty notes - Decision makers: France only. Emails are probable, not SMTP-verified (verified:false): use email_alternatives and confidence, and say so to the user. At most 5 officers per company. Nothing stored. GDPR opt-out: POST /api/opt-out. - People search: French companies only, active companies, largest first. Revenue filters exclude companies that file their accounts confidentially (many small companies do). Place filters match companies with at least one establishment there; the headquarters may be elsewhere. No email here: call decision makers on the people you keep. Birth dates are never returned. - Counterparty check: A pre-check, not an AML/KYC compliance service: "review" or "block" means a human should look. Sanctions matching is exact (identifier or normalized name for the company; last + first name, plus birth year when both sides have it, for officers), so namesakes without a first name are never flagged. Each list is read live (cached 6 h) or from a bundled snapshot when the feed is slow: sanctions.lists gives each list's status, source and date. VIES depends on each member state's service; when it does not answer within ~20 s (retries included), vat.valid is null and verdict.incomplete lists "vat". Definite VIES answers are cached 6 h per number. The IBAN is only returned masked; officers are only counted unless listed. Nothing stored. - Company contacts: Only reads the company's own site, without a headless browser: sites behind a bot challenge (Cloudflare, Akamai) or rendered only by JavaScript give 404, not charged. At most 8 requests and 6 s per domain; robots.txt honoured on every URL, including redirect targets. Personal addresses are never returned, only counted. Web host, agency and publication director details are deliberately ignored. Nothing stored. Opt-out of a domain or an address: POST /api/opt-out. - Hiring signals: Only sees public ATS boards: no LinkedIn, Indeed or Welcome to the Jungle. ats.confidence "low" = board name guessed from the domain. Workday boards: the first 100 jobs are analyzed; open_jobs is the board's full count. SIREN and company name inputs resolve French companies only; a domain works for any country. - Email pre-check: No SMTP connection: the mailbox itself is not tested, so accept_all is unknown (null) and the score is capped at 90. Disposable detection uses a short built-in list of common throwaway domains. - Document to Markdown: Max 10 MB by URL; a POST body is limited to 4.5 MB by the hosting platform. OCR on up to 4 scanned pages per call; OCR text comes without tables. PDF tables are rebuilt from text positions: spanning headers or irregular borderless layouts may be mis-split. Nothing stored: the document is processed in memory and discarded. - Markdown to PDF: Max 200,000 characters of Markdown. Simple GFM tables only. Images are not embedded: they appear as an [image: alt] placeholder. Nothing stored: the PDF is built in memory and streamed back. - Company search by NACE code: France, Norway and Finland for now. UK (Companies House) is coming soon. Main activity only: secondary activities do not match. When the official correspondence splits a class (e.g. Rev. 2.1 62.20 = Rev. 2 62.02 + 62.03), a company coded in the other version comes back with nace_match partial and nace_candidates. France, Rev. 2.1 search: companies are pre-selected through their NAF rév. 2 code; one that INSEE recoded individually into an unrelated NAF 2025 class can be missed. Finland publishes no headcount (size filters return 400) and returns companies in no particular order. FR region = head-office département. Sole traders and non-public units are never returned (FR entrepreneurs individuels and non-diffusible units, NO ENK and NUF, FI entries without a legal-person form). Nothing stored.