{"openapi":"3.1.0","info":{"title":"Resolve402","version":"0.4.0","description":"Not found = not charged. French B2B decision makers, people search, counterparty checks (KYB before invoicing or paying), company contacts published on the company's own site, hiring signals, email pre-checks and document tools (doc to Markdown, Markdown to PDF) for AI agents, paid per call with x402 (USDC on Base or Solana). GDPR: nothing is stored; opt-out via POST /api/opt-out.","x-guidance":"Use GET /api/decision-makers?siren=<9-digit SIREN> (or ?company=<name>) to get the legal officers of a French company from the official registry (RNE), the company web domain, its mail provider and a probable business email per officer, built from the pattern observed on the company's own public pages when available (pattern_source observed_on_site, confidence medium or high) or the common French pattern (default_fr, low); not SMTP-verified, verified:false. Use GET /api/people-search?role=ceo&sector=<NAF section or code>&department=<code>&min_employees=<n>&min_revenue=<EUR> to list decision makers of French companies matching a role, sector, place, size and revenue or profit range (official registry, up to 25 per call), then /api/decision-makers on the ones you keep for their email. Use GET /api/counterparty-check?siren=<SIREN> (or ?vat=<EU VAT> / ?siret= / ?company=, optional &iban=) before invoicing or paying a company: entity active, VAT valid (VIES), insolvency proceedings (BODACC), sanctions screening of the company and its officers (DG Trésor, EU consolidated list, OFAC SDN), IBAN checksum and country, with a verdict ok / review / block. Use GET /api/company-contacts?domain=<domain> (or ?url=) for the contact details a company publishes on its own website: shared emails only (personal addresses never returned, only counted), E.164 phones with type, head-office address, legal identifiers checked (SIREN Luhn, VAT checksum, RCS, Impressum register) and matched to the French registry (siren_match), company social pages, contact form; every field has its source page. Use GET /api/hiring-signals?domain=<domain> (or ?siren= / ?company=) to know whether a company is hiring and in which functions, from its public ATS job board; chain it with /api/decision-makers to reach who decides. Use GET /api/verify-email?email=<address> for a cheap pre-check with a 0-100 deliverability score and its reasons (syntax, MX, null MX, provider, SPF, DMARC, disposable, webmail, role account, random-looking address); the mailbox is not tested (smtp_check:false, accept_all:null). Use GET /api/doc-to-markdown?url=<public document URL> (or POST the file) to turn a PDF, DOCX, HTML, TXT or an image into clean Markdown with tables, with OCR (French, English) for scanned PDFs and images. Use POST /api/markdown-to-pdf {markdown,title?,paper?} to get a PDF back. Use GET /api/company-search?country=FR|NO|FI&nace=<NACE Rev. 2 or 2.1 code>&region=<code or municipality>&size_min=<n> to list companies whose main activity matches the code in the official register of that country, with both NACE codes, the local code, status, size band, registry ID, address, licence and attribution; sole traders are excluded. All paid routes answer 402 first; pay with x402 and retry."},"servers":[{"url":"https://resolve402.dev"}],"paths":{"/api/decision-makers":{"get":{"operationId":"decisionMakers","summary":"French company directors with their probable business email (RNE registry, one call)","description":"Company directors in France (CEO, président, gérant) with their probable business email, in one call. From a SIREN or company name: legal officers (official RNE registry), web domain, mail provider, latest revenue and net income, and a probable work email per officer from the pattern seen on the company's own pages (observed_on_site) or the common French one (default_fr). Not SMTP-verified (verified:false). Charged only if officers are found. Nothing stored (GDPR). Service page: https://resolve402.dev/services/decision-makers. MCP tool: find_decision_makers (npx -y resolve402-mcp).","tags":["Leads","France"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"siren","in":"query","required":false,"description":"9-digit French SIREN","schema":{"type":"string","pattern":"^[0-9]{9}$"},"example":"552032534"},{"name":"company","in":"query","required":false,"description":"Company name (if no SIREN)","schema":{"type":"string"}},{"name":"domain","in":"query","required":false,"description":"Optional company domain hint","schema":{"type":"string"}}],"responses":{"200":{"description":"Officers found","content":{"application/json":{"schema":{"type":"object","properties":{"company":{"type":"object"},"domain":{"type":"object","properties":{"domain":{"type":"string"},"confidence":{"type":"string"},"evidence":{"type":"string"}}},"mail_provider":{"type":"string"},"email_pattern":{"type":"object","description":"Company email pattern and where it comes from (pattern, source, confidence, pages, observed_addresses, pages_checked)."},"officers":{"type":"array","items":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"role":{"type":"string"},"email":{"type":"object","properties":{"address":{"type":"string"},"pattern":{"type":"string","description":"prenom.nom, p.nom, nom.prenom, prenom_nom, prenom-nom, prenom, prenomnom, pnom, nom..."},"pattern_source":{"type":"string","enum":["observed_on_site","default_fr"],"description":"observed_on_site: pattern read from named addresses published on the company's own public pages (contact, legal notice, press, team); default_fr: most common French pattern, nothing observed."},"evidence":{"type":"object","description":"Only when pattern_source is observed_on_site. Third-party addresses are counted, never returned.","properties":{"pages":{"type":"array","items":{"type":"string"},"description":"Public pages where concordant addresses were published"},"observed_addresses":{"type":"integer","description":"Named addresses that follow the pattern"},"personal_addresses_seen":{"type":"integer"},"pages_checked":{"type":"integer"}}},"verified":{"type":"boolean","description":"Always false unless a mailbox test said deliverable. A pattern match is not a verification."},"confidence":{"type":"string","enum":["low","medium","high"],"description":"low: default pattern; medium: 1 observed address; high: >= 2 concordant observed addresses"}}},"email_alternatives":{"type":"array","items":{"type":"string"}}}}},"notes":{"type":"object"}},"required":["company","officers"]}}}},"402":{"description":"Payment Required"},"404":{"description":"Company or officers not found (not charged)"}}}},"/api/people-search":{"get":{"operationId":"peopleSearch","summary":"Decision makers of French companies by role, sector, place and size (official registry)","description":"Find decision makers of French companies by role (CEO, président, DG, gérant), sector (NAF), place, headcount and revenue or net income range, from the official registry (Sirene + RNE). Up to 25 people per call, one per company, with SIREN, NAF, city, size and latest revenue. Chain with /api/decision-makers for their probable business email. Charged only if someone matches. Service page: https://resolve402.dev/services/people-search. MCP tool: people_search (npx -y resolve402-mcp).","tags":["Leads","France"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.050000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"role","in":"query","required":false,"description":"ceo (default), president, dg, gerant or any_executive","schema":{"type":"string","enum":["ceo","president","dg","gerant","any_executive"]},"example":"ceo"},{"name":"sector","in":"query","required":false,"description":"NAF section letter (A-U, e.g. J = information & communication) or NAF code (62.01Z)","schema":{"type":"string"},"example":"J"},{"name":"department","in":"query","required":false,"description":"French department code, e.g. 75, 69, 2A","schema":{"type":"string"},"example":"69"},{"name":"region","in":"query","required":false,"description":"INSEE region code, e.g. 11 (Île-de-France)","schema":{"type":"string"}},{"name":"postal_code","in":"query","required":false,"description":"5-digit postal code","schema":{"type":"string"}},{"name":"min_employees","in":"query","required":false,"description":"Minimum headcount (Sirene brackets)","schema":{"type":"integer","minimum":0},"example":50},{"name":"min_revenue","in":"query","required":false,"description":"Minimum revenue in EUR, latest published accounts (5000000, 5M, 500k)","schema":{"type":"string"}},{"name":"max_revenue","in":"query","required":false,"description":"Maximum revenue in EUR","schema":{"type":"string"}},{"name":"min_net_income","in":"query","required":false,"description":"Minimum net income in EUR (0 = profitable only)","schema":{"type":"string"}},{"name":"max_net_income","in":"query","required":false,"description":"Maximum net income in EUR (-1 = loss-making only)","schema":{"type":"string"}},{"name":"keywords","in":"query","required":false,"description":"Free text on the company name or activity","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1-25, default 10","schema":{"type":"integer","minimum":1,"maximum":25}},{"name":"page","in":"query","required":false,"description":"Page of companies, default 1","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"People found","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"total_companies_matching":{"type":["integer","null"]},"people":{"type":"array","items":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"role":{"type":"string"},"company":{"type":"object","properties":{"siren":{"type":"string"},"name":{"type":"string"},"naf":{"type":["string","null"]},"city":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"headcount":{"type":["string","null"]}}},"next":{"type":"string","description":"/api/decision-makers call for this company (emails)"}}}},"next_page":{"type":"string"}}}}}},"400":{"description":"Invalid or missing filters (not charged)"},"402":{"description":"Payment Required"},"404":{"description":"No match (not charged)"}}}},"/api/counterparty-check":{"get":{"operationId":"counterpartyCheck","summary":"Check a company before invoicing or paying it: status, VAT, insolvency, sanctions (FR, EU, OFAC) on the company and its officers, IBAN, verdict","description":"KYB company verification before paying or invoicing: sanctions screening (OFAC, EU, France), EU VAT number validation (VIES), French insolvency proceedings. Input a SIREN, SIRET, EU VAT number or French company name (optional IBAN). Output for a French company: registry status, insolvency proceedings (BODACC), latest revenue and net income with risk signals, sanctions screening of the company and its officers (DG Trésor, EU consolidated, OFAC SDN), IBAN checksum and country, verdict ok / review / block with reasons. Other EU VAT numbers: VIES validity and sanctions screening of the VAT number and, when VIES discloses it, the registered name. Exact-match pre-check, not an AML service. Charged only if found. Service page: https://resolve402.dev/services/counterparty-check. MCP tool: counterparty_check (npx -y resolve402-mcp).","tags":["Compliance","France","Europe"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"siren","in":"query","required":false,"description":"9-digit French SIREN","schema":{"type":"string","pattern":"^[0-9]{9}$"},"example":"552032534"},{"name":"siret","in":"query","required":false,"description":"14-digit French SIRET (alternative)","schema":{"type":"string"}},{"name":"vat","in":"query","required":false,"description":"EU VAT number, e.g. FR27552032534 or DE123456789 (alternative)","schema":{"type":"string"}},{"name":"company","in":"query","required":false,"description":"French company name (alternative)","schema":{"type":"string"}},{"name":"iban","in":"query","required":false,"description":"Optional IBAN to check (checksum, country, SEPA)","schema":{"type":"string"}}],"responses":{"200":{"description":"Counterparty found","content":{"application/json":{"schema":{"type":"object","properties":{"company":{"type":["object","null"]},"vat":{"type":["object","null"],"properties":{"number":{"type":"string"},"valid":{"type":["boolean","null"],"description":"VIES answer; null when VIES did not answer (status unavailable)"},"name":{"type":["string","null"]},"status":{"type":"string","enum":["checked","unavailable"]},"error":{"type":"string","description":"VIES error code when status is unavailable, e.g. MS_MAX_CONCURRENT_REQ"},"checksum":{"type":"string","enum":["valid","invalid"],"description":"French numbers only: FR key recomputed locally from the SIREN. A format check, not a VIES validation"}}},"proceedings":{"type":["object","null"],"properties":{"status":{"type":["string","null"],"enum":["none","liquidation","redressement","sauvegarde","plan","closed","other",null]},"latest":{"type":["object","null"]},"count":{"type":"integer"},"source_status":{"type":"string"}}},"sanctions":{"type":"object","properties":{"listed":{"type":["boolean","null"],"description":"Company itself matched on any list (identifier or exact normalized name)"},"matches":{"type":"array","items":{"type":"object","properties":{"registry_id":{"type":"integer"},"listed_name":{"type":"string"},"match":{"type":"string","enum":["identifier","exact_name"]},"list":{"type":"string","enum":["fr_gels","eu_consolidated","ofac_sdn"]},"ref":{"type":"string"}}}},"list_date":{"type":["string","null"],"description":"DG Trésor register date"},"status":{"type":"string","enum":["checked","partial","unavailable"]},"source":{"type":"string","enum":["live","snapshot"],"description":"DG Trésor register source"},"lists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["fr_gels","eu_consolidated","ofac_sdn"]},"status":{"type":"string","enum":["checked","unavailable"]},"source":{"type":["string","null"],"enum":["live","snapshot",null]},"list_date":{"type":["string","null"]}}}},"officers_screened":{"type":"integer","description":"Number of individual officers (RNE) screened; their data is never returned"},"officer_matches":{"type":"array","description":"Listed persons matching an officer by exact last + first name (and birth year when both sides have it); gives verdict review","items":{"type":"object","properties":{"list":{"type":"string"},"listed_name":{"type":"string"},"ref":{"type":"string"},"match":{"type":"string","enum":["exact_name_birth_year","exact_name"]}}}}}},"iban":{"type":["object","null"],"properties":{"valid":{"type":"boolean"},"country":{"type":["string","null"]},"sepa":{"type":["boolean","null"]},"reason":{"type":"string"},"masked":{"type":"string"}}},"verdict":{"type":"object","properties":{"level":{"type":"string","enum":["ok","review","block"]},"reasons":{"type":"array","items":{"type":"string"}},"incomplete":{"type":"array","items":{"type":"string"}}}},"checked_at":{"type":"string"}}}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment Required"},"404":{"description":"Counterparty not found (not charged)"}}}},"/api/company-contacts":{"get":{"operationId":"companyContacts","summary":"Contact details a company publishes on its own website: shared emails, phones, address, verified legal identifiers, social pages, with sources","description":"Company contact details as published by the company on its own website: shared emails only (contact@, press@, dpo@; personal addresses never returned), phones in E.164, head-office address, social pages, contact form, and legal identifiers checked (SIREN Luhn, VAT checksum, RCS, Impressum register) and matched to the French registry. Every field sourced. From a domain or URL. Nothing found = not charged. Service page: https://resolve402.dev/services/company-contacts. MCP tool: company_contacts (npx -y resolve402-mcp).","tags":["Leads","Compliance","France","Europe"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"domain","in":"query","required":false,"description":"Company web domain, e.g. acme.fr","schema":{"type":"string"},"example":"danone.com"},{"name":"url","in":"query","required":false,"description":"Any URL of the company site; the domain is extracted","schema":{"type":"string"}}],"responses":{"200":{"description":"Public contacts found","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"company_name":{"type":["string","null"],"description":"Legal name (legal notice, schema.org legalName) or site name"},"emails":{"type":"array","description":"Shared mailboxes only (contact@, press@, dpo@...)","items":{"type":"object","properties":{"address":{"type":"string"},"source":{"type":"string"}}}},"personal_emails_omitted":{"type":"integer","description":"Personal addresses seen on the site; never returned (GDPR)"},"phones":{"type":"array","description":"Voice lines only, read from visible text, tel: links and schema.org; third parties' numbers (host, agency, carrier, mediator...) excluded","items":{"type":"object","properties":{"number":{"type":"string","description":"E.164"},"type":{"type":["string","null"],"enum":["standard","customer_service","sales",null]},"source":{"type":"string"}}}},"fax":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","description":"E.164"},"source":{"type":"string"}}}},"address":{"type":["object","null"],"properties":{"street":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"city":{"type":["string","null"]},"country":{"type":["string","null"]},"source":{"type":"string"}}},"legal":{"type":["object","null"],"properties":{"siren":{"type":["string","null"],"description":"Passes the Luhn check; only the publisher's (never a host's, agency's or group company's; several unrelated ones give null)"},"siren_source":{"type":"string","enum":["published","vat"],"description":"published on the site, or derived from the French VAT number printed (key checked)"},"siret":{"type":["string","null"]},"rcs":{"type":["string","null"]},"vat":{"type":["object","null"],"properties":{"number":{"type":"string"},"country":{"type":"string"},"checksum":{"type":"string","enum":["valid","not_checked"]}}},"register":{"type":["string","null"],"description":"Non-French register: Amtsgericht ... HRB, FN, KvK, BCE, UID"},"legal_form":{"type":["string","null"]},"share_capital":{"type":["object","null"],"properties":{"amount":{"type":"number"},"currency":{"type":"string"},"variable":{"type":"boolean"}}},"official_name":{"type":["string","null"],"description":"Name in the French registry for that SIREN"},"siren_match":{"type":["boolean","null"],"description":"Registry name matches the company the site presents"},"active":{"type":["boolean","null"]},"registry_status":{"type":"string","enum":["checked","not_found","unavailable","not_applicable"]},"rejected_identifiers":{"type":"array","items":{"type":"string"},"description":"Identifiers printed on the site that failed their checksum"}}},"social":{"type":"object","properties":{"linkedin":{"type":"string"},"x":{"type":"string"},"facebook":{"type":"string"},"instagram":{"type":"string"},"youtube":{"type":"string"},"github":{"type":"string"}}},"contact_form_url":{"type":["string","null"]},"sources":{"type":"object","additionalProperties":{"type":"string"},"description":"Page each field was read on"},"pages_checked":{"type":"array","items":{"type":"string"}},"robots_respected":{"type":"boolean"},"checked_at":{"type":"string"}}}}}},"400":{"description":"Missing or invalid domain (not charged)"},"402":{"description":"Payment Required"},"404":{"description":"no_public_contact: no shared email, phone or legal identifier found, or robots.txt forbids reading the site (not charged)"}}}},"/api/hiring-signals":{"get":{"operationId":"hiringSignals","summary":"Is this company hiring, and for what? Open jobs from its public ATS board, summarized as buying signals","description":"Hiring signals of a company: open jobs read from its public ATS board (Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Personio, Workable, Teamtailor, Workday), summarized as buying signals (volume, last 30 days, functions hiring, seniority mix, leadership roles); each job carries its function and seniority (intern to c-level). From a domain, a French SIREN or a company name. Chain with /api/decision-makers to get who to contact. Charged only if open jobs are found. Service page: https://resolve402.dev/services/hiring-signals. MCP tool: hiring_signals (npx -y resolve402-mcp).","tags":["Leads","Intent"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"domain","in":"query","required":false,"description":"Company web domain, e.g. acme.com","schema":{"type":"string"},"example":"doctolib.fr"},{"name":"siren","in":"query","required":false,"description":"9-digit French SIREN (alternative to domain)","schema":{"type":"string","pattern":"^[0-9]{9}$"}},{"name":"company","in":"query","required":false,"description":"French company name (alternative to domain)","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max jobs returned (1-200, default 50)","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Open jobs found","content":{"application/json":{"schema":{"type":"object","properties":{"company":{"type":["object","null"]},"domain":{"type":"object","properties":{"domain":{"type":"string"},"confidence":{"type":"string"},"evidence":{"type":"string"}}},"ats":{"type":"object","properties":{"provider":{"type":"string"},"board":{"type":"string"},"confidence":{"type":"string"},"evidence":{"type":"string"}}},"signals":{"type":"object","properties":{"open_jobs":{"type":"integer"},"posted_last_30d":{"type":"integer"},"newest_posted_at":{"type":["string","null"]},"hiring_intent":{"type":"string","enum":["low","medium","high"]},"by_function":{"type":"object","additionalProperties":{"type":"integer"}},"top_departments":{"type":"array","items":{"type":"object"}},"top_locations":{"type":"array","items":{"type":"object"}},"leadership_roles":{"type":"array","items":{"type":"object"}}}},"jobs":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"department":{"type":["string","null"]},"location":{"type":["string","null"]},"remote":{"type":["boolean","null"]},"employment_type":{"type":["string","null"]},"posted_at":{"type":["string","null"]},"url":{"type":["string","null"]}}}},"jobs_truncated":{"type":"boolean"},"next":{"type":"string"}},"required":["ats","signals","jobs"]}}}},"402":{"description":"Payment Required"},"404":{"description":"No public ATS board or no open jobs (not charged)"}}}},"/api/verify-email":{"get":{"operationId":"verifyEmail","summary":"Email pre-check with a 0-100 deliverability score and reasons (DNS only, mailbox not tested)","description":"Verify and validate an email address before sending: syntax, MX records, disposable domain, free webmail, role account. Email verification from DNS only: input an email, output a 0-100 deliverability score with its reasons, mail provider (Google, Microsoft 365, OVH...), SPF, DMARC, null MX and random-looking local part. Mailbox not tested (no SMTP: smtp_check:false, accept_all:null), so the score is capped at 90. Service page: https://resolve402.dev/services/verify-email. MCP tool: verify_email (npx -y resolve402-mcp).","tags":["Email"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.003000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"email","in":"query","required":true,"description":"Email address to check","schema":{"type":"string","format":"email"},"example":"jane@acme.fr"}],"responses":{"200":{"description":"Pre-check result (no mailbox test)","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"syntax_valid":{"type":"boolean"},"domain":{"type":"string"},"free_webmail":{"type":"boolean"},"disposable":{"type":"boolean"},"role_account":{"type":"boolean"},"has_mx":{"type":"boolean"},"mx":{"type":"array","items":{"type":"string"}},"mail_provider":{"type":"string"},"deliverable":{"type":"string","enum":["likely","unlikely"],"description":"Legacy flag: syntax ok, MX present, not disposable"},"mailbox_checked":{"type":"boolean","description":"Always false"},"score":{"type":"integer","minimum":0,"maximum":100,"description":"Deliverability score without SMTP; capped at 90 because the mailbox is not tested"},"score_band":{"type":"string","enum":["good","risky","bad"],"description":"good >= 70, risky 40-69, bad < 40 or disposable"},"reasons":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"points":{"type":"integer"},"detail":{"type":"string"}}},"description":"Signals that add up to the score: syntax_valid, mx_present, null_mx, no_mx_a_only, enterprise_provider, spf_present, dmarc_present, disposable_domain, free_webmail, role_account, gibberish_local_part, person_like_local_part, no_smtp_check"},"null_mx":{"type":"boolean"},"spf":{"type":"boolean"},"dmarc":{"type":"boolean"},"dmarc_policy":{"type":["string","null"]},"accept_all":{"type":"null","description":"Not tested (no SMTP): unknown"},"smtp_check":{"type":"boolean","description":"Always false: no SMTP connection is made"}},"required":["email","syntax_valid"]}}}},"400":{"description":"Missing email (not charged)"},"402":{"description":"Payment Required"}}}},"/api/doc-to-markdown":{"get":{"operationId":"docToMarkdown","summary":"Document (PDF, DOCX, HTML, TXT) or image at a public URL to clean Markdown with tables","description":"Convert a document (PDF, DOCX, HTML, TXT) or an image into clean Markdown for an LLM, with tables extracted as rows and OCR (French, English) for scanned PDFs and images. Give a public URL (?url=) or POST the file (multipart or raw binary, max 10 MB). Returns markdown, tables, pages, chars and source type. Charged only if text is found. Nothing stored. Service page: https://resolve402.dev/services/doc-to-markdown. MCP tool: doc_to_markdown (npx -y resolve402-mcp).","tags":["Documents"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":true,"description":"Public http(s) URL of the document (max 10 MB, fetch timeout 10 s)","schema":{"type":"string","format":"uri"},"example":"https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"}],"responses":{"200":{"description":"Converted document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocToMarkdown"}}}},"400":{"description":"Unsupported, corrupt or encrypted document, or bad URL (not charged)"},"402":{"description":"Payment Required"},"413":{"description":"Document exceeds 10 MB"},"422":{"description":"no_text: nothing readable (not charged)"}}},"post":{"operationId":"docToMarkdownUpload","summary":"Upload a document (multipart file or raw binary) and get clean Markdown with tables","description":"Convert a document (PDF, DOCX, HTML, TXT) or an image into clean Markdown for an LLM, with tables extracted as rows and OCR (French, English) for scanned PDFs and images. Give a public URL (?url=) or POST the file (multipart or raw binary, max 10 MB). Returns markdown, tables, pages, chars and source type. Charged only if text is found. Nothing stored. Service page: https://resolve402.dev/services/doc-to-markdown. MCP tool: doc_to_markdown (npx -y resolve402-mcp).","tags":["Documents"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.005000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}},"application/pdf":{"schema":{"type":"string","format":"binary"}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}},"text/html":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Converted document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocToMarkdown"}}}},"400":{"description":"Unsupported, corrupt or encrypted document (not charged)"},"402":{"description":"Payment Required"},"413":{"description":"Body exceeds the limit (4.5 MB on POST)"},"422":{"description":"no_text: nothing readable (not charged)"}}}},"/api/markdown-to-pdf":{"post":{"operationId":"markdownToPdf","summary":"Markdown to a clean PDF (headings, lists, code, tables, page numbers)","description":"Render Markdown into a clean 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, €). POST JSON { markdown, title?, paper?: \"A4\" | \"Letter\" } (max 200k characters), get application/pdf back. For hosted agents that must deliver a report, a memo or an invoice as a file. Nothing stored. Service page: https://resolve402.dev/services/markdown-to-pdf. MCP tool: markdown_to_pdf (npx -y resolve402-mcp).","tags":["Documents"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string","description":"CommonMark + GFM tables, max 200,000 characters"},"title":{"type":"string","description":"Printed on top and set in PDF metadata"},"paper":{"type":"string","enum":["A4","Letter"],"default":"A4"}},"required":["markdown"]},"example":{"markdown":"# Weekly report\n\nRevenue grew **12%**.","title":"Weekly report","paper":"A4"}},"text/markdown":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"The PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Empty or invalid markdown (not charged)"},"402":{"description":"Payment Required"},"413":{"description":"Markdown exceeds 200,000 characters"}}}},"/api/company-search":{"get":{"operationId":"companySearch","summary":"Companies by industry (NACE Rev. 2 or 2.1), country, region and size from official registers (France, Norway, Finland)","description":"Search companies by industry (NACE code), country, region and size in official European business registers: France (Sirene), Norway (Brønnøysund), Finland (PRH/YTJ). Give one NACE code, Rev. 2 or Rev. 2.1: it is translated into each registry's own classification with the official correspondence tables (Eurostat, INSEE NAF, Statistics Finland TOL, SSB SN2025), and only companies whose main activity matches come back, up to 25, with registry ID, status, both NACE codes, local code, size band, address, licence and attribution. No sole traders. Charged only if a company is found. Service page: https://resolve402.dev/services/company-search. MCP tool: company_search (npx -y resolve402-mcp).","tags":["Companies","Europe"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"country","in":"query","required":true,"description":"Country register: FR (Sirene), NO (Brønnøysund), FI (PRH/YTJ). UK coming soon.","schema":{"type":"string","enum":["FR","NO","FI"]},"example":"NO"},{"name":"nace","in":"query","required":true,"description":"NACE code, Rev. 2 or Rev. 2.1: class (62.01 or 6201), group (62.0) or division (62)","schema":{"type":"string"},"example":"62.10"},{"name":"nace_rev","in":"query","required":false,"description":"Force the NACE version when the code exists in both (default: detected; Rev. 2 when ambiguous)","schema":{"type":"string","enum":["2","2.1"]}},{"name":"region","in":"query","required":false,"description":"FR: département of the head office (75, 69, 2A); NO: kommunenummer (0301) or fylke (03); FI: municipality name (Helsinki)","schema":{"type":"string"}},{"name":"size_min","in":"query","required":false,"description":"Minimum employees (FR: Sirene brackets lying entirely in the range; NO: exact headcount; not available in FI)","schema":{"type":"integer","minimum":0}},{"name":"size_max","in":"query","required":false,"description":"Maximum employees (same rules as size_min)","schema":{"type":"integer","minimum":0}},{"name":"status","in":"query","required":false,"description":"active (default) or all (adds ceased, bankrupt, in liquidation)","schema":{"type":"string","enum":["active","all"]}},{"name":"limit","in":"query","required":false,"description":"1-25, default 10","schema":{"type":"integer","minimum":1,"maximum":25},"example":3}],"responses":{"200":{"description":"Companies found","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"registry_id":{"type":"string","description":"SIREN (FR), organisasjonsnummer (NO), Y-tunnus (FI)"},"country":{"type":"string","enum":["FR","NO","FI"]},"status":{"type":"string","enum":["active","ceased","in_liquidation","bankrupt","restructuring","other_inactive"]},"legal_form":{"type":["string","null"]},"nace_rev2":{"type":["string","null"]},"nace_rev21":{"type":["string","null"]},"nace_source":{"type":"object","properties":{"rev2":{"type":"string","enum":["registry","correspondence","ambiguous","none"]},"rev21":{"type":"string","enum":["registry","correspondence","ambiguous","none"]}}},"nace_candidates":{"type":"object","properties":{"rev2":{"type":"array","items":{"type":"string"}},"rev21":{"type":"array","items":{"type":"string"}}}},"nace_match":{"type":"string","enum":["exact","partial"]},"local_code":{"type":["string","null"]},"local_classification":{"type":"string"},"size_band":{"type":["string","null"],"description":"0, 1-2, 3-5, 6-9, 10-19, 20-49, 50-99, 100-199, 200-249, 250-499, 500-999, 1000-1999, 2000-4999, 5000-9999, 10000+"},"employees":{"type":["integer","null"],"description":"Exact registered headcount (NO only)"},"address":{"type":["string","null"]},"created_at":{"type":["string","null"]},"source_url":{"type":"string"}},"required":["name","registry_id","country","status","nace_source","nace_match","local_classification","source_url"]}},"meta":{"type":"object","properties":{"registry":{"type":"string"},"licence":{"type":"string"},"attribution":{"type":"string"},"classification_sources":{"type":"array","items":{"type":"string"}},"nace_query":{"type":"object"},"filters":{"type":"object"},"total":{"type":"integer"},"registry_total":{"type":["integer","null"],"description":"Registry hits before the main-activity, status and sole-trader checks"},"excluded":{"type":"object"},"notes":{"type":"array","items":{"type":"string"}}}}},"required":["results","meta"]}}}},"400":{"description":"Invalid filters, country not available (UK) or size filter where the register has no headcount (not charged)"},"402":{"description":"Payment Required"},"404":{"description":"No company found (not charged)"},"502":{"description":"Registry unavailable (not charged)"}}}}},"components":{"schemas":{"DocToMarkdown":{"type":"object","properties":{"markdown":{"type":"string"},"tables":{"type":"array","items":{"type":"object","properties":{"page":{"type":"integer"},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}}}}}},"pages":{"type":"integer","description":"PDF only"},"chars":{"type":"integer"},"source_type":{"type":"string","enum":["pdf","docx","html","txt","markdown","image"]},"truncated":{"type":"boolean","description":"true when the Markdown was cut at 400,000 characters"},"ocr":{"type":"object","description":"When OCR ran: engine, languages, pages_ocr, pages_skipped, mean_confidence"},"notes":{"type":"object"}},"required":["markdown","tables","chars","source_type","truncated"]}}}}