{"x402Version":2,"items":[{"resource":{"url":"https://api.invoket.com/iban/resolve","description":"Before your agent pays a new bank account: validate the IBAN (all countries), resolve its bank and BIC from national bank registries, and check SEPA reachability per scheme (SCT, SCT Inst, SDD Core/B2B) against the EPC register","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"iban":"DE89370400440532013000"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"iban":{"type":"string","description":"IBAN to verify, any SEPA or non-SEPA country; spaces are tolerated"}},"required":["iban"]}},"output":{"type":"json","example":{"data":{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","reachable":true,"sepa_reachability":{"match":"exact","schemes":["SCT","SCT_INST","SDD_B2B","SDD_CORE"],"sct":true,"sct_inst":true,"sdd_b2b":true,"sdd_core":true},"valid":true},"provenance":{"fetched_at":"2026-06-12T09:30:00Z","freshness":{"as_of":"2026-06-11T00:00:00Z","kind":"snapshot"},"source":"national-bank-registries+epc-sepa-registers"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"],"description":"ISO 9362 Business Identifier Code (BIC/SWIFT) of the account's bank"},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"reachable":{"type":["boolean","null"],"description":"Whether the bank is reachable for at least one SEPA scheme (see sepa_reachability)"},"sepa_reachability":{"type":["object","null"],"properties":{"match":{"type":"string"},"schemes":{"type":"array","items":{"type":"string"}},"sct":{"type":"boolean","description":"Reachable for SEPA Credit Transfer (SCT); null when the BIC is unknown to the EPC registry"},"sct_inst":{"type":"boolean","description":"Reachable for SEPA Instant Credit Transfer (SCT Inst); null when unknown"},"sdd_b2b":{"type":"boolean","description":"Reachable for SEPA Direct Debit B2B (SDD B2B); null when unknown"},"sdd_core":{"type":"boolean","description":"Reachable for SEPA Direct Debit Core (SDD Core); null when unknown"}},"required":["match","schemes","sct","sct_inst","sdd_b2b","sdd_core"]},"valid":{"type":"boolean","description":"Whether the IBAN passed structural and checksum (ISO 7064 mod-97) validation"},"branch_code":{"type":["string","null"]},"issue":{"type":["string","null"],"description":"Diagnostic code when 'valid' is false — BAD_CHARACTERS, BAD_LENGTH, BAD_FORMAT, BAD_CHECKSUM, UNKNOWN_COUNTRY or INVALID_BBAN; null when the IBAN is valid"}},"required":["bank","bank_code","country","coverage","iban","reachable","sepa_reachability","valid"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string","description":"Names the reference data actually served: 'national-bank-registries' alone, or 'national-bank-registries+epc-sepa-registers' when the response carries a non-null sepa_reachability block. In the composite case provenance.freshness.as_of is the OLDEST of the two snapshot dates: a composite is never fresher than its oldest input."}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"iban":{"type":"string","description":"IBAN to verify, any SEPA or non-SEPA country; spaces are tolerated"}},"required":["iban"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/iban-resolve","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Verify an IBAN and resolve its bank","tags":["iban"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/iban/resolve/batch","description":"Before a payment run: validate up to 500 IBANs in one call, resolve bank and BIC from national bank registries, and check SEPA reachability per scheme (SCT, SCT Inst, SDD Core/B2B) against the EPC register","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"ibans":["DE89370400440532013000","FR1420041010050500013M02606"]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"ibans":{"type":"array","items":{"type":"string"}}},"required":["ibans"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","reachable":true,"sepa_reachability":{"match":"exact","schemes":["SCT","SCT_INST","SDD_B2B","SDD_CORE"],"sct":true,"sct_inst":true,"sdd_b2b":true,"sdd_core":true},"valid":true},{"bank":{"bic":"PSSTFRPP","name":"LA BANQUE POSTALE"},"bank_code":"20041","country":"FR","coverage":"partial","iban":"FR1420041010050500013M02606","reachable":true,"valid":true}]},"provenance":{"fetched_at":"2026-06-12T09:30:00Z","freshness":{"as_of":"2026-06-11T00:00:00Z","kind":"snapshot"},"source":"national-bank-registries"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"]},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"reachable":{"type":["boolean","null"]},"sepa_reachability":{"type":["object","null"],"properties":{"match":{"type":"string"},"schemes":{"type":"array","items":{"type":"string"}},"sct":{"type":"boolean"},"sct_inst":{"type":"boolean"},"sdd_b2b":{"type":"boolean"},"sdd_core":{"type":"boolean"}},"required":["match","schemes","sct","sct_inst","sdd_b2b","sdd_core"]},"valid":{"type":"boolean"},"branch_code":{"type":["string","null"]},"issue":{"type":["string","null"],"description":"Diagnostic code when 'valid' is false — BAD_CHARACTERS, BAD_LENGTH, BAD_FORMAT, BAD_CHECKSUM, UNKNOWN_COUNTRY or INVALID_BBAN; null when the IBAN is valid"}},"required":["bank","bank_code","country","coverage","iban","reachable","sepa_reachability","valid"]}}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string","description":"Names the reference data actually served: 'national-bank-registries' alone, or 'national-bank-registries+epc-sepa-registers' as soon as ONE item of the batch carries a non-null sepa_reachability block (one provenance for the whole batch). In the composite case provenance.freshness.as_of is the OLDEST of the two snapshot dates: a composite is never fresher than its oldest input."}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"ibans":{"type":"array","items":{"type":"string"}}},"required":["ibans"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/iban-resolve-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Verify a list of IBANs","tags":["iban"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":500,"unitField":"ibans"}}},{"resource":{"url":"https://api.invoket.com/iban/screen","description":"Before your agent onboards or pays a counterparty: screen the bank account for sanctions — flags sanctioned banks (BIC) and high-risk jurisdictions against the official OFAC, EU, UN and FATF lists, for KYB/AML compliance","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"iban":"DE89370400440532013000"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"iban":{"type":"string"}},"required":["iban"]}},"output":{"type":"json","example":{"data":{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","screening":{"bank_sanctioned":false,"hits":[],"jurisdiction":{"level":"clear","lists":[]},"risk":"clear"},"valid":true},"provenance":{"fetched_at":"2026-06-20T09:30:00Z","freshness":{"as_of":"2026-06-20T00:00:00Z","kind":"snapshot"},"source":"ofac-eu-un-sanctions"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"]},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"screening":{"type":["object","null"],"properties":{"bank_sanctioned":{"type":"boolean"},"hits":{"type":"array"},"jurisdiction":{"type":"object","properties":{"level":{"type":"string"},"lists":{"type":"array"}},"required":["level","lists"]},"risk":{"type":"string","description":"Aggregated risk band: 'prohibited' (sanctioned bank or embargoed jurisdiction), 'high', 'elevated', 'clear' (no signal AND registry coverage sufficient to say so), or 'unknown' (bank not resolved in the registry — absence of a hit is not evidence of clearance). Never treat 'unknown' as 'clear'."}},"required":["bank_sanctioned","hits","jurisdiction","risk"]},"valid":{"type":"boolean"},"issue":{"type":["string","null"],"description":"Diagnostic code when 'valid' is false — BAD_CHARACTERS, BAD_LENGTH, BAD_FORMAT, BAD_CHECKSUM, UNKNOWN_COUNTRY or INVALID_BBAN; null when the IBAN is valid"}},"required":["bank","bank_code","country","coverage","iban","screening","valid"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"iban":{"type":"string"}},"required":["iban"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/iban-screen","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen an IBAN for sanctions","tags":["iban","sanctions"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/iban/screen/batch","description":"Before onboarding or a payment run: screen up to 500 IBANs in one call for sanctioned banks (BIC) and high-risk jurisdictions against the official OFAC, EU, UN and FATF lists, for KYB/AML compliance","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"ibans":["DE89370400440532013000","FR1420041010050500013M02606"]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"ibans":{"type":"array","items":{"type":"string"}}},"required":["ibans"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","screening":{"bank_sanctioned":false,"hits":[],"jurisdiction":{"level":"clear","lists":[]},"risk":"clear"},"valid":true},{"bank_code":"033","country":"AE","coverage":"structure_only","iban":"AE070331234567890123456","screening":{"bank_sanctioned":false,"hits":[{"detail":"EU-AML","source":"EU","type":"jurisdiction"}],"jurisdiction":{"level":"high_risk","lists":["EU-AML"]},"risk":"high"},"valid":true}]},"provenance":{"fetched_at":"2026-06-20T09:30:00Z","freshness":{"as_of":"2026-06-20T00:00:00Z","kind":"snapshot"},"source":"ofac-eu-un-sanctions"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"]},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"screening":{"type":["object","null"],"properties":{"bank_sanctioned":{"type":"boolean"},"hits":{"type":"array"},"jurisdiction":{"type":"object","properties":{"level":{"type":"string"},"lists":{"type":"array"}},"required":["level","lists"]},"risk":{"type":"string","description":"Aggregated risk band: 'prohibited' (sanctioned bank or embargoed jurisdiction), 'high', 'elevated', 'clear' (no signal AND registry coverage sufficient to say so), or 'unknown' (bank not resolved in the registry — absence of a hit is not evidence of clearance). Never treat 'unknown' as 'clear'."}},"required":["bank_sanctioned","hits","jurisdiction","risk"]},"valid":{"type":"boolean"},"issue":{"type":["string","null"],"description":"Diagnostic code when 'valid' is false — BAD_CHARACTERS, BAD_LENGTH, BAD_FORMAT, BAD_CHECKSUM, UNKNOWN_COUNTRY or INVALID_BBAN; null when the IBAN is valid"}},"required":["bank","bank_code","country","coverage","iban","screening","valid"]}}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"ibans":{"type":"array","items":{"type":"string"}}},"required":["ibans"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/iban-screen-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a list of IBANs for sanctions","tags":["iban","sanctions"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":500,"unitField":"ibans"}}},{"resource":{"url":"https://api.invoket.com/iban/repair","description":"Before your agent pays an IBAN taken from OCR or invoice ingestion: fix a broken or garbled IBAN — recompute check digits, recover unreadable characters (?) and rank candidates by known bank from national bank registries","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"iban":"DE89370400440532013?00"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"iban":{"type":"string"}},"required":["iban"]}},"output":{"type":"json","example":{"data":{"already_valid":false,"ambiguous":false,"candidates":[{"bank_known":true,"iban":"DE89370400440532013000","resolution":{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","reachable":true,"valid":true}}],"input":"DE89370400440532013?00","repaired":true},"provenance":{"fetched_at":"2026-06-21T09:30:00Z","freshness":{"as_of":"2026-06-11T00:00:00Z","kind":"snapshot"},"source":"national-bank-registries"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"already_valid":{"type":"boolean"},"ambiguous":{"type":"boolean"},"candidates":{"type":"array","items":{"type":"object","properties":{"bank_known":{"type":"boolean"},"iban":{"type":"string"},"resolution":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"]},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"reachable":{"type":["boolean","null"]},"valid":{"type":"boolean"},"branch_code":{"type":["string","null"]},"issue":{"type":["string","null"]},"sepa_reachability":{"type":["object","null"]}},"required":["bank","bank_code","country","coverage","iban","reachable","valid"]}},"required":["bank_known","iban","resolution"]}},"input":{"type":"string"},"repaired":{"type":"boolean"},"issue":{"type":["string","null"],"description":"Why no candidate was returned, when 'candidates' is empty: 'TOO_AMBIGUOUS' (too many unreadable characters to decide) or 'UNREPAIRABLE' (no valid IBAN can be reconstructed). Null when at least one candidate is returned. An empty result is a SUCCESSFUL answer (HTTP 200), never an error."}},"required":["already_valid","ambiguous","candidates","input","repaired"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string","description":"Names the reference data actually served: 'national-bank-registries' alone, or 'national-bank-registries+epc-sepa-registers' when the response carries a non-null sepa_reachability block. In the composite case provenance.freshness.as_of is the OLDEST of the two snapshot dates: a composite is never fresher than its oldest input."}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"iban":{"type":"string"}},"required":["iban"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/iban-repair","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Fix a broken or garbled IBAN","tags":["iban"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/iban/repair/batch","description":"Before a payment run over OCR or invoice data: fix up to 500 broken or garbled IBANs in one call, within a total repair-effort budget — recompute check digits, recover unreadable characters and rank candidates by known bank from national bank registries. A batch whose combined '?' search space is too large is rejected with 400 BATCH_BUDGET_EXCEEDED and never charged: send fewer IBANs per call, or fewer '?' per IBAN","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"ibans":["DE89370400440532013?00","FR1420041010050500013M02606"]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"ibans":{"type":"array","items":{"type":"string"}}},"required":["ibans"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"already_valid":false,"ambiguous":false,"candidates":[{"bank_known":true,"iban":"DE89370400440532013000","resolution":{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","reachable":true,"valid":true}}],"input":"DE89370400440532013?00","repaired":true},{"already_valid":true,"ambiguous":false,"candidates":[{"bank_known":true,"iban":"FR1420041010050500013M02606","resolution":{"bank":{"bic":"PSSTFRPP","name":"LA BANQUE POSTALE"},"bank_code":"20041","country":"FR","coverage":"partial","iban":"FR1420041010050500013M02606","reachable":true,"valid":true}}],"input":"FR1420041010050500013M02606","repaired":false}]},"provenance":{"fetched_at":"2026-06-21T09:30:00Z","freshness":{"as_of":"2026-06-11T00:00:00Z","kind":"snapshot"},"source":"national-bank-registries"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"already_valid":{"type":"boolean"},"ambiguous":{"type":"boolean"},"candidates":{"type":"array","items":{"type":"object","properties":{"bank_known":{"type":"boolean"},"iban":{"type":"string"},"resolution":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"]},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"reachable":{"type":["boolean","null"]},"valid":{"type":"boolean"},"branch_code":{"type":["string","null"]},"issue":{"type":["string","null"]},"sepa_reachability":{"type":["object","null"]}},"required":["bank","bank_code","country","coverage","iban","reachable","valid"]}},"required":["bank_known","iban","resolution"]}},"input":{"type":"string"},"repaired":{"type":"boolean"},"issue":{"type":["string","null"],"description":"Why no candidate was returned for this IBAN, when its 'candidates' is empty: 'TOO_AMBIGUOUS' or 'UNREPAIRABLE'. Null when at least one candidate is returned."}},"required":["already_valid","ambiguous","candidates","input","repaired"]}}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string","description":"Names the reference data actually served: 'national-bank-registries' alone, or 'national-bank-registries+epc-sepa-registers' as soon as ONE item of the batch carries a non-null sepa_reachability block (one provenance for the whole batch). In the composite case provenance.freshness.as_of is the OLDEST of the two snapshot dates: a composite is never fresher than its oldest input."}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"ibans":{"type":"array","items":{"type":"string"}}},"required":["ibans"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/iban-repair-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Fix a list of broken IBANs","tags":["iban"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":500,"unitField":"ibans"}}},{"resource":{"url":"https://api.invoket.com/screen/entity","description":"Before your agent onboards a counterparty, signs a contract or releases a payment: screen a company or person name against the official designation lists in full - OFAC SDN and Consolidated, the EU financial sanctions list, the UN Security Council list - 26,666 entities with their aliases, programmes and designation dates. Deterministic name matching, every hit sourced to the list that published it. PEP screening, adverse media and transaction analysis are not covered.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"country":"DE","include_weak":"false","kind":"entity","name":"Europäisch-Iranische Handelsbank"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 filter on the country published by the list (nationality or place of registration)"},"include_weak":{"type":"string","description":"Optional. Whether weak matches (an alias the source itself flags as weak, or a partial token overlap) count towards the verdict; default false. It changes ONLY the verdict: weak matches are always returned in hits[], so you can judge what was set aside for you"},"kind":{"type":"string","description":"Optional filter, one of 'person', 'entity', 'vessel', 'aircraft' - the four kinds the lists publish. Vessels (1516) and aircraft (344) are screened by DEFAULT alongside persons and entities, and their names are often common words (HERMES, VICTORIA, NEPTUNE), so a hit here may be a designated ship rather than a company: read 'kind' on each match. A filter only ever REMOVES candidates, and only on data the list published in a comparable form: an entity that publishes nothing, or publishes its country in plain words, stays a candidate - a false negative costs more than one candidate too many"},"name":{"type":"string","description":"Company or person name to screen, 2 to 200 characters once whitespace is collapsed. Matched against every name each list publishes - primary names and aliases, strong and weak. No edit distance and no phonetics: matching is deterministic and its type is named in the answer"},"birth_year":{"type":"string","description":"Optional filter for persons, 1800 to 2100, matched with a one-year tolerance either side. Persons whose birth date the list does not publish are never removed by it"}},"required":["name"]}},"output":{"type":"json","example":{"data":{"hits":[{"birth_dates":[],"id":"OFAC-SDN:25684","identifications":[{"number":"HRB 14604","type":"Registration Number"},{"number":"EIHBDEHH","type":"SWIFT/BIC"}],"kind":"entity","list_source":"OFAC-SDN","listed_on":"2018-11-05","match_type":"exact","matched_name":"EUROPAISCH-IRANISCHE HANDELSBANK AG","nationalities":[],"programs":["IFSR","IRAN","NPWMD"],"remarks":"All Offices Worldwide; (Linked To: BANK OF INDUSTRY AND MINE)"},{"birth_dates":[],"id":"EU:EU.13742.32","identifications":[],"kind":"entity","list_source":"EU-FSF","listed_on":"2025-09-29","match_type":"exact_alias","matched_name":"Europäisch-Iranische Handelsbank","nationalities":[],"programs":["IRN"]}],"limits":"Screening covers the designation lists and snapshot date reported above. No cross-list reconciliation is performed: an entity designated by several authorities is returned once per list. Politically exposed persons (PEP) and adverse media are not covered.","lists_screened":[{"entities":6017,"list":"EU-FSF"},{"entities":481,"list":"OFAC-CONS"},{"entities":19157,"list":"OFAC-SDN"},{"entities":1011,"list":"UN"}],"query":{"name":"Europäisch-Iranische Handelsbank","normalized":"europaisch iranische handelsbank"},"total_matches":2,"truncated":false,"verdict":"hit","verdict_basis":["exact","exact_alias"]},"provenance":{"fetched_at":"2026-07-30T06:08:29Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"birth_dates":{"type":"array"},"id":{"type":"string"},"identifications":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string"},"type":{"type":"string"}},"required":["number","type"]},"description":"Identifiers the list publishes for the entity, verbatim - registration numbers, SWIFT/BIC codes, passports, tax numbers. The 'type' is the source's own label"},"kind":{"type":"string"},"list_source":{"type":"string","description":"The list that published this designation, as it publishes it: 'OFAC-SDN', 'OFAC-CONS', 'EU-FSF' or 'UN'. No cross-list reconciliation: an entity designated by two authorities returns TWO hits, each with its own programmes and date - reconciling them is a judgement, not data"},"listed_on":{"type":["string","null"],"description":"Date the entity was listed by that authority, as published (for OFAC, the earliest designation event of the profile - a later re-designation never overwrites it). Null when the list publishes no date"},"match_type":{"type":"string","description":"Closed enumeration, in severity order: 'exact' (primary name), 'exact_alias' (strong alias), 'exact_weak_alias' (an alias the source itself publishes as weak - OFAC does), 'all_tokens' (every query token present, order irrelevant), 'partial_tokens' (at least two shared tokens covering 60% or more of the query). Nothing else: no opaque score"},"matched_name":{"type":"string"},"nationalities":{"type":"array"},"programs":{"type":"array","items":{"type":"string"}},"remarks":{"type":["string","null"]}},"required":["birth_dates","id","identifications","kind","list_source","listed_on","match_type","matched_name","nationalities","programs","remarks"]}},"limits":{"type":"string","description":"Fixed sentence served inside every response: scope of the lists and snapshot date, no cross-list reconciliation, and no PEP or adverse-media coverage"},"lists_screened":{"type":"array","items":{"type":"object","properties":{"entities":{"type":"integer"},"list":{"type":"string"}},"required":["entities","list"]},"description":"The lists actually screened and how many entities each contributed, returned on every verdict including no_hit: a paid answer must state what it was rendered against"},"query":{"type":"object","properties":{"name":{"type":"string"},"normalized":{"type":"string","description":"The normalized form of the submitted name (accents folded, case flattened, titles and legal forms dropped). It is what actually decided the matching, so it is returned: you can reproduce our comparison"}},"required":["name","normalized"]},"total_matches":{"type":"integer","description":"Number of matches found, BEFORE the 50-per-answer cap; 'truncated' says whether the cap applied. The verdict always covers ALL matches, never just the ones returned - truncating an answer never softens its verdict"},"truncated":{"type":"boolean"},"verdict":{"type":"string","description":"Closed enumeration. 'hit': at least one full match (exact primary name, exact strong alias, or all query tokens present). 'weak_hit': only weak matches (an alias the source flags as weak, or a partial token overlap) while include_weak is false. 'no_hit': nothing matched, for the lists and snapshot date reported in the same answer. A no_hit is not a clearance certificate - it is a dated statement about these lists"},"verdict_basis":{"type":"array","items":{"type":"string"},"description":"Which match types actually counted towards the verdict, most severe first - the verdict is reconstructible, never taken on trust"}},"required":["hits","limits","lists_screened","query","total_matches","truncated","verdict","verdict_basis"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 filter on the country published by the list (nationality or place of registration)"},"include_weak":{"type":"string","description":"Optional. Whether weak matches (an alias the source itself flags as weak, or a partial token overlap) count towards the verdict; default false. It changes ONLY the verdict: weak matches are always returned in hits[], so you can judge what was set aside for you"},"kind":{"type":"string","description":"Optional filter, one of 'person', 'entity', 'vessel', 'aircraft' - the four kinds the lists publish. Vessels (1516) and aircraft (344) are screened by DEFAULT alongside persons and entities, and their names are often common words (HERMES, VICTORIA, NEPTUNE), so a hit here may be a designated ship rather than a company: read 'kind' on each match. A filter only ever REMOVES candidates, and only on data the list published in a comparable form: an entity that publishes nothing, or publishes its country in plain words, stays a candidate - a false negative costs more than one candidate too many"},"name":{"type":"string","description":"Company or person name to screen, 2 to 200 characters once whitespace is collapsed. Matched against every name each list publishes - primary names and aliases, strong and weak. No edit distance and no phonetics: matching is deterministic and its type is named in the answer"},"birth_year":{"type":"string","description":"Optional filter for persons, 1800 to 2100, matched with a one-year tolerance either side. Persons whose birth date the list does not publish are never removed by it"}},"required":["name"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/screen-entity","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a name against sanctions lists","tags":["sanctions"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/screen/entity/batch","description":"Before onboarding a supplier book or running a payout list: screen up to 200 company or person names in one call against the official designation lists in full - OFAC SDN and Consolidated, the EU financial sanctions list, the UN Security Council list - one sourced verdict per name, with aliases, programmes and designation dates. A malformed item is flagged at its position instead of failing the batch. PEP screening, adverse media and transaction analysis are not covered.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"include_weak":false,"items":[{"name":"Europäisch-Iranische Handelsbank"},{"name":"Compagnie de Saint-Gobain"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"include_weak":{"type":"boolean","description":"Optional. Whether weak matches count towards the verdict, for the WHOLE batch; default false. It is a caller policy (what you count as a signal), not a property of one name. Weak matches are returned in hits[] either way"},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"description":"Array of names screened in one settlement. Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch is a 400, never charged. Each item takes a 'name' (2 to 200 characters) plus the same optional filters as the single endpoint - 'kind' ('person', 'entity', 'vessel' or 'aircraft'), 'country', 'birth_year'. A malformed item yields {error, code} at its position without failing the batch"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"count":2,"limits":"Screening covers the designation lists and snapshot date reported above. No cross-list reconciliation is performed: an entity designated by several authorities is returned once per list. Politically exposed persons (PEP) and adverse media are not covered.","lists_screened":[{"entities":6017,"list":"EU-FSF"},{"entities":481,"list":"OFAC-CONS"},{"entities":19157,"list":"OFAC-SDN"},{"entities":1011,"list":"UN"}],"results":[{"hits":[{"birth_dates":[],"id":"OFAC-SDN:25684","identifications":[{"number":"EIHBDEHH","type":"SWIFT/BIC"}],"kind":"entity","list_source":"OFAC-SDN","listed_on":"2018-11-05","match_type":"exact","matched_name":"EUROPAISCH-IRANISCHE HANDELSBANK AG","nationalities":[],"programs":["IFSR","IRAN","NPWMD"],"remarks":"All Offices Worldwide; (Linked To: BANK OF INDUSTRY AND MINE)"},{"birth_dates":[],"id":"EU:EU.13742.32","identifications":[],"kind":"entity","list_source":"EU-FSF","listed_on":"2025-09-29","match_type":"exact_alias","matched_name":"Europäisch-Iranische Handelsbank","nationalities":[],"programs":["IRN"]}],"index":0,"query":{"name":"Europäisch-Iranische Handelsbank","normalized":"europaisch iranische handelsbank"},"total_matches":2,"truncated":false,"verdict":"hit","verdict_basis":["exact","exact_alias"]},{"hits":[],"index":1,"query":{"name":"Compagnie de Saint-Gobain","normalized":"compagnie de saint gobain"},"total_matches":0,"truncated":false,"verdict":"no_hit","verdict_basis":[]}],"summary":{"error":0,"hit":1,"no_hit":1,"weak_hit":0}},"provenance":{"fetched_at":"2026-07-30T06:08:38Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"limits":{"type":"string","description":"Fixed sentence served once for the batch: scope of the lists and snapshot date, no cross-list reconciliation, and no PEP or adverse-media coverage"},"lists_screened":{"type":"array","items":{"type":"object","properties":{"entities":{"type":"integer"},"list":{"type":"string"}},"required":["entities","list"]},"description":"The lists actually screened and how many entities each contributed, returned ONCE for the batch: they do not depend on the name screened"},"results":{"type":"array","items":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"birth_dates":{"type":"array"},"id":{"type":"string"},"identifications":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string"},"type":{"type":"string"}},"required":["number","type"]}},"kind":{"type":"string"},"list_source":{"type":"string","description":"The list that published this designation: 'OFAC-SDN', 'OFAC-CONS', 'EU-FSF' or 'UN'. No cross-list reconciliation: an entity designated by two authorities returns TWO hits"},"listed_on":{"type":["string","null"]},"match_type":{"type":"string","description":"Closed enumeration, in severity order: 'exact', 'exact_alias', 'exact_weak_alias' (an alias the source itself publishes as weak), 'all_tokens', 'partial_tokens' (at least two shared tokens covering 60% or more of the query). Nothing else: no opaque score"},"matched_name":{"type":"string"},"nationalities":{"type":"array"},"programs":{"type":"array","items":{"type":"string"}},"remarks":{"type":["string","null"]}},"required":["birth_dates","id","identifications","kind","list_source","listed_on","match_type","matched_name","nationalities","programs","remarks"]}},"index":{"type":"integer","description":"Zero-based position of this item in the submitted array, returned explicitly so you can correct an item without recounting"},"query":{"type":"object","properties":{"name":{"type":"string"},"normalized":{"type":"string"}},"required":["name","normalized"]},"total_matches":{"type":"integer","description":"Number of matches found for this name, BEFORE the per-item cap of 10 (the single endpoint returns up to 50); 'truncated' says whether the cap applied. The verdict always covers ALL matches"},"truncated":{"type":"boolean"},"verdict":{"type":"string","description":"Closed enumeration, per name: 'hit' (a full match), 'weak_hit' (only weak matches while include_weak is false), 'no_hit' (nothing matched, for the lists and snapshot date reported at batch level)"},"verdict_basis":{"type":"array","items":{"type":"string"}},"code":{"type":"string"},"error":{"type":"string"}},"required":["index"]},"description":"One verdict per submitted name, at its position, each carrying its explicit 'index' - same shape and same codes as GET /screen/entity, minus the lists and the limits sentence, returned once at batch level. A malformed item appears as {error, code} at its position"},"summary":{"type":"object","properties":{"error":{"type":"integer"},"hit":{"type":"integer"},"no_hit":{"type":"integer"},"weak_hit":{"type":"integer"}},"required":["error","hit","no_hit","weak_hit"],"description":"How many items came back hit, weak_hit, no_hit and error - enough to decide whether to read the detail"}},"required":["count","limits","lists_screened","results","summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"include_weak":{"type":"boolean","description":"Optional. Whether weak matches count towards the verdict, for the WHOLE batch; default false. It is a caller policy (what you count as a signal), not a property of one name. Weak matches are returned in hits[] either way"},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"description":"Array of names screened in one settlement. Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch is a 400, never charged. Each item takes a 'name' (2 to 200 characters) plus the same optional filters as the single endpoint - 'kind' ('person', 'entity', 'vessel' or 'aircraft'), 'country', 'birth_year'. A malformed item yields {error, code} at its position without failing the batch"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/screen-entity-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a list of names against sanctions lists","tags":["sanctions"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":200,"unitField":"items"}}},{"resource":{"url":"https://api.invoket.com/screen/address","description":"Before your agent sends funds to a crypto address: check it against the sanctioned addresses published by OFAC (SDN and Consolidated) AND by the EU financial sanctions list - multi-list, where free feeds are OFAC-only - returning the designated entity, its programmes and its designation date behind every hit. Bitcoin, EVM, Tron, Solana and Monero. No transaction analysis, no clustering, no derived addresses, no risk score.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"address":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","chain":"bitcoin"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"address":{"type":"string","description":"Cryptocurrency address to screen, up to 128 characters (internal whitespace is collapsed - an address copied out of a PDF carries some). Compared on a normalized form whose rule the chain family dictates: EVM lowercased with 0x enforced, base58 case PRESERVED (it is significant), bech32 lowercased"},"chain":{"type":"string","description":"Optional family: 'bitcoin', 'evm', 'tron', 'solana' or 'monero'. Given, it is LAW - an address that does not have that family's shape is refused (400, unbilled), never reinterpreted as another family. Omitted, the family is inferred from the shape, and the answer says so in chain_family_source. 'other' is never inferred: outside the five named families, a value is an address only if a list publishes it verbatim, otherwise 400 UNRECOGNIZED_ADDRESS_FORMAT - unbilled, because a password or a misplaced IBAN must not be billed as a verdict"}},"required":["address"]}},"output":{"type":"json","example":{"data":{"hits":[{"address_published":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","chain":"BTC","entity_id":"EU:EU.12747.39","entity_name":"Garantex","list_source":"EU-FSF","listed_on":"2025-02-24","programs":["UKR"]}],"limits":"Screening covers the designation lists and snapshot date reported above, and only addresses those lists publish themselves. Absence from an official list is not a safety signal. No transaction analysis, no address clustering, no derived or associated addresses, and no risk scoring are performed. EVM addresses are matched case-insensitively; the EIP-55 checksum is not verified and never causes a rejection.","lists_screened":[{"addresses":7,"list":"EU-FSF"},{"addresses":0,"list":"OFAC-CONS"},{"addresses":961,"list":"OFAC-SDN"},{"addresses":0,"list":"UN"}],"query":{"address":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","address_normalized":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","chain_family":"bitcoin","chain_family_source":"inferred"},"verdict":"sanctioned"},"provenance":{"fetched_at":"2026-07-30T06:08:59Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"address_published":{"type":"string","description":"The address exactly as the list publishes it, before normalization - what you quote back to a counterparty"},"chain":{"type":["string","null"],"description":"The chain token as the list publishes it (BTC, ETH, XBT...), verbatim. It does NOT decide the family: when the token contradicts the shape, the shape wins and the token is still reported as published. Null when the list publishes no token"},"entity_id":{"type":"string"},"entity_name":{"type":"string"},"list_source":{"type":"string","description":"The list that published this designation: 'OFAC-SDN', 'OFAC-CONS', 'EU-FSF' or 'UN'. The EU entries are the multi-list edge: free feeds carry OFAC only"},"listed_on":{"type":["string","null"],"description":"Date the entity was listed by that authority, as published. Null when the list publishes no date"},"programs":{"type":"array","items":{"type":"string"}}},"required":["address_published","chain","entity_id","entity_name","list_source","listed_on","programs"]},"description":"One entry per (address, designated entity) pair, never merged: an address published by two authorities, or under two chain tokens, returns several hits. Not capped"},"limits":{"type":"string","description":"Fixed sentence served inside every response: absence from a list is not a safety signal; no transaction analysis, no clustering, no derived addresses; the EIP-55 checksum is not verified and never causes a rejection"},"lists_screened":{"type":"array","items":{"type":"object","properties":{"addresses":{"type":"integer"},"list":{"type":"string"}},"required":["addresses","list"]},"description":"The four lists screened and how many addresses each contributed, INCLUDING the ones at zero (the UN publishes no crypto address to date): an absence of data is not an absence of checking. Each count is of entries published by that list, not of distinct addresses: an address designated by several lists counts once PER LIST (no cross-list merging), so the total exceeds the number of distinct addresses in the store"},"query":{"type":"object","properties":{"address":{"type":"string"},"address_normalized":{"type":"string","description":"The form the lookup actually used. Returned so you can reproduce it: a mismatch between your normalization and ours is how a designated address goes unnoticed"},"chain_family":{"type":"string"},"chain_family_source":{"type":"string","description":"'declared' when you passed 'chain', 'inferred' when the family was read off the address shape, 'listed' when the value is outside the five named families and a list publishes it verbatim (this is how Litecoin bech32 and Bitcoin Cash cashaddr addresses stay visible)"}},"required":["address","address_normalized","chain_family","chain_family_source"]},"verdict":{"type":"string","description":"Closed enumeration, binary: 'sanctioned' (at least one designation covers this address) or 'not_listed' (no designation covers it, for the lists and snapshot date reported here). Nothing in between - graded risk, proximity or a score would be a judgement, not official data"}},"required":["hits","limits","lists_screened","query","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"address":{"type":"string","description":"Cryptocurrency address to screen, up to 128 characters (internal whitespace is collapsed - an address copied out of a PDF carries some). Compared on a normalized form whose rule the chain family dictates: EVM lowercased with 0x enforced, base58 case PRESERVED (it is significant), bech32 lowercased"},"chain":{"type":"string","description":"Optional family: 'bitcoin', 'evm', 'tron', 'solana' or 'monero'. Given, it is LAW - an address that does not have that family's shape is refused (400, unbilled), never reinterpreted as another family. Omitted, the family is inferred from the shape, and the answer says so in chain_family_source. 'other' is never inferred: outside the five named families, a value is an address only if a list publishes it verbatim, otherwise 400 UNRECOGNIZED_ADDRESS_FORMAT - unbilled, because a password or a misplaced IBAN must not be billed as a verdict"}},"required":["address"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/screen-address","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a crypto address against sanctions lists","tags":["sanctions","crypto"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/screen/address/batch","description":"Before a payout run or a sweep: check up to 500 crypto addresses in one call against the sanctioned addresses published by OFAC (SDN and Consolidated) AND by the EU financial sanctions list - multi-list, where free feeds are OFAC-only - each hit carrying the designated entity, its programmes and its designation date. A malformed address is flagged at its position instead of failing the batch. No transaction analysis, no clustering, no risk score.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"items":[{"address":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A"},{"address":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","chain":"bitcoin"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"}},"required":["address"]},"description":"Array of addresses screened in one settlement. Its length is priced per unit (base + N x unit), capped at 500; an empty or oversized batch is a 400, never charged. Each item takes an 'address' and an optional 'chain' that is law for THAT item. A malformed or unrecognizable address yields {error, code} at its position without failing the batch - the codes are the single endpoint's, MISSING_PARAMETER, INVALID_INPUT and UNRECOGNIZED_ADDRESS_FORMAT"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"count":2,"limits":"Screening covers the designation lists and snapshot date reported above, and only addresses those lists publish themselves. Absence from an official list is not a safety signal. No transaction analysis, no address clustering, no derived or associated addresses, and no risk scoring are performed. EVM addresses are matched case-insensitively; the EIP-55 checksum is not verified and never causes a rejection.","lists_screened":[{"addresses":7,"list":"EU-FSF"},{"addresses":0,"list":"OFAC-CONS"},{"addresses":961,"list":"OFAC-SDN"},{"addresses":0,"list":"UN"}],"results":[{"hits":[{"address_published":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A","chain":"ETH","entity_id":"OFAC-SDN:57056","entity_name":"AMNOKGANG TECHNOLOGY DEVELOPMENT COMPANY","list_source":"OFAC-SDN","listed_on":"2026-03-12","programs":["DPRK4"]}],"index":0,"query":{"address":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A","address_normalized":"0x0330070fd38ec3bb94f58fa55d40368271e9e54a","chain_family":"evm","chain_family_source":"inferred"},"verdict":"sanctioned"},{"hits":[{"address_published":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","chain":"BTC","entity_id":"EU:EU.12747.39","entity_name":"Garantex","list_source":"EU-FSF","listed_on":"2025-02-24","programs":["UKR"]}],"index":1,"query":{"address":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","address_normalized":"3My1ffQr5qQzmq4aBFgRqwRYqfB5zPAt8t","chain_family":"bitcoin","chain_family_source":"declared"},"verdict":"sanctioned"}],"summary":{"error":0,"not_listed":0,"sanctioned":2}},"provenance":{"fetched_at":"2026-07-30T06:09:06Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"limits":{"type":"string","description":"Fixed sentence served once for the batch: absence from a list is not a safety signal; no transaction analysis, no clustering, no derived addresses; the EIP-55 checksum is not verified"},"lists_screened":{"type":"array","items":{"type":"object","properties":{"addresses":{"type":"integer"},"list":{"type":"string"}},"required":["addresses","list"]},"description":"The four lists screened and how many addresses each contributed, INCLUDING the ones at zero (the UN publishes no crypto address to date), returned ONCE for the batch. Each count is of entries published by that list, not of distinct addresses: an address designated by several lists counts once PER LIST (no cross-list merging)"},"results":{"type":"array","items":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"address_published":{"type":"string"},"chain":{"type":["string","null"],"description":"The chain token as the list publishes it, verbatim. It does NOT decide the family: when the token contradicts the shape, the shape wins. Null when the list publishes no token"},"entity_id":{"type":"string"},"entity_name":{"type":"string"},"list_source":{"type":"string","description":"The list that published this designation: 'OFAC-SDN', 'OFAC-CONS', 'EU-FSF' or 'UN'. The EU entries are the multi-list edge: free feeds carry OFAC only"},"listed_on":{"type":["string","null"]},"programs":{"type":"array","items":{"type":"string"}}},"required":["address_published","chain","entity_id","entity_name","list_source","listed_on","programs"]},"description":"One entry per (address, designated entity) pair, never merged, not capped per item"},"index":{"type":"integer","description":"Zero-based position of this item in the submitted array, returned explicitly so you can correct an item without recounting"},"query":{"type":"object","properties":{"address":{"type":"string"},"address_normalized":{"type":"string"},"chain_family":{"type":"string"},"chain_family_source":{"type":"string"}},"required":["address","address_normalized","chain_family","chain_family_source"]},"verdict":{"type":"string","description":"Closed enumeration, binary, per address: 'sanctioned' or 'not_listed'. Nothing in between - graded risk or a score would be a judgement, not official data"},"code":{"type":"string"},"error":{"type":"string"}},"required":["index"]},"description":"One verdict per submitted address, at its position, each carrying its explicit 'index' - same shape and same codes as GET /screen/address, minus the lists and the limits sentence, returned once at batch level"},"summary":{"type":"object","properties":{"error":{"type":"integer"},"not_listed":{"type":"integer"},"sanctioned":{"type":"integer"}},"required":["error","not_listed","sanctioned"],"description":"How many items came back sanctioned, not_listed and error - enough to decide whether to read the detail"}},"required":["count","limits","lists_screened","results","summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"}},"required":["address"]},"description":"Array of addresses screened in one settlement. Its length is priced per unit (base + N x unit), capped at 500; an empty or oversized batch is a 400, never charged. Each item takes an 'address' and an optional 'chain' that is law for THAT item. A malformed or unrecognizable address yields {error, code} at its position without failing the batch - the codes are the single endpoint's, MISSING_PARAMETER, INVALID_INPUT and UNRECOGNIZED_ADDRESS_FORMAT"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/screen-address-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a list of crypto addresses","tags":["sanctions","crypto"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":500,"unitField":"items"}}},{"resource":{"url":"https://api.invoket.com/preflight/payment","description":"Run every check on a bank transfer before your agent executes it, in one call: IBAN validity, bank and BIC from national registries, SEPA scheme reachability from the EPC register, sanctions screening of the bank and of its jurisdiction (OFAC, EU, UN, FATF), and screening of the beneficiary name against the OFAC, EU and UN designation lists. Returns a verdict - stop, review, insufficient_coverage, ok - with every reason attached to its block and its dated source.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"250000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"250000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"beneficiary_name":"Europäisch-Iranische Handelsbank","iban":"DE89370400440532013000","include_weak":"false"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"beneficiary_name":{"type":"string","description":"Optional - Name of the beneficiary, 2 to 200 characters, screened against the designation lists exactly as GET /screen/entity does, except that only person and entity matches can drive the verdict: a designated vessel or aircraft sharing the name is reported, never a 'stop'. But WITHOUT it the verdict can never be 'ok': the beneficiary was not looked at, and an 'ok' would read as a green light on them"},"iban":{"type":"string","description":"The beneficiary IBAN, up to 64 characters (separators tolerated). A structurally invalid IBAN is a USEFUL answer: HTTP 200 with a motivated 'stop', not an error"},"include_weak":{"type":"string","description":"Optional. Whether weak name matches count towards the verdict; default false. Same semantics as /screen/entity: it changes only the verdict, weak matches are returned either way"},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 filter on the beneficiary's DECLARED country, applied to the name screening only. It is your declaration, never an assertion of ours, and it can only remove candidates whose country the list published in a comparable form"}},"required":["iban"]}},"output":{"type":"json","example":{"data":{"bank_screening":{"coverage":"screened","screening":{"bank_sanctioned":false,"hits":[],"jurisdiction":{"level":"clear","lists":[]},"risk":"clear"}},"iban":{"bank":{"bic":"COBADEFFXXX","name":"Commerzbank"},"bank_code":"37040044","country":"DE","coverage":"full","iban":"DE89370400440532013000","reachable":true,"sepa_reachability":{"match":"exact","schemes":["SCT","SCT_INST","SDD_B2B","SDD_CORE"],"sct":true,"sct_inst":true,"sdd_b2b":true,"sdd_core":true},"valid":true},"limits":"This is a control outcome, not a payment instruction: 'stop' and 'review' report what the checks found, and the decision to pay remains the caller's. The beneficiary name is screened against designation lists only — the account holder's name is never verified with the beneficiary bank (Verification of Payee under the EU Instant Payments Regulation is out of scope). Company identity, VAT status and e-invoicing capability are not covered.","name_screening":{"coverage":"screened","lists_screened":[{"entities":6017,"list":"EU-FSF"},{"entities":481,"list":"OFAC-CONS"},{"entities":19157,"list":"OFAC-SDN"},{"entities":1011,"list":"UN"}],"screening":{"hits":[{"birth_dates":[],"id":"OFAC-SDN:25684","identifications":[{"number":"EIHBDEHH","type":"SWIFT/BIC"}],"kind":"entity","list_source":"OFAC-SDN","listed_on":"2018-11-05","match_type":"exact","matched_name":"EUROPAISCH-IRANISCHE HANDELSBANK AG","nationalities":[],"programs":["IFSR","IRAN","NPWMD"],"remarks":"All Offices Worldwide; (Linked To: BANK OF INDUSTRY AND MINE)"},{"birth_dates":[],"id":"EU:EU.13742.32","identifications":[],"kind":"entity","list_source":"EU-FSF","listed_on":"2025-09-29","match_type":"exact_alias","matched_name":"Europäisch-Iranische Handelsbank","nationalities":[],"programs":["IRN"]}],"query":{"name":"Europäisch-Iranische Handelsbank","normalized":"europaisch iranische handelsbank"},"total_matches":2,"truncated":false,"verdict":"hit","verdict_basis":["exact","exact_alias"]}},"query":{"beneficiary_name":"Europäisch-Iranische Handelsbank","iban":"DE89370400440532013000","include_weak":false},"sources":[{"as_of":"2026-07-25","source":"national-bank-registries"},{"as_of":"2026-06-11","source":"epc-sepa-registers"},{"as_of":"2026-07-27","source":"ofac-eu-un-sanctions"},{"as_of":"2026-07-28","source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}],"verdict":"stop","verdict_reasons":[{"block":"name_screening","code":"NAME_HIT","detail":"the beneficiary name matches a designated entity","severity":"stop"}]},"provenance":{"fetched_at":"2026-07-30T06:13:17Z","freshness":{"as_of":"2026-06-11T00:00:00Z","kind":"snapshot"},"source":"national-bank-registries+epc-sepa-registers+ofac-eu-un-sanctions+ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"bank_screening":{"type":"object","properties":{"coverage":{"type":"string","description":"What could actually be screened on the bank side: 'screened', 'jurisdiction_only' (an embargoed country outside the IBAN registry - the jurisdiction check still ran) or 'not_applicable' (nothing to screen: the IBAN is invalid)"},"screening":{"type":["object","null"],"properties":{"bank_sanctioned":{"type":"boolean"},"hits":{"type":"array"},"jurisdiction":{"type":"object","properties":{"level":{"type":"string"},"lists":{"type":"array"}},"required":["level","lists"]},"risk":{"type":"string","description":"Aggregated risk band: 'prohibited' (sanctioned bank or embargoed jurisdiction), 'high', 'elevated', 'clear' (no signal AND registry coverage sufficient to say so), or 'unknown' (bank not resolved in the registry — absence of a hit is not evidence of clearance). Never treat 'unknown' as 'clear'."}},"required":["bank_sanctioned","hits","jurisdiction","risk"],"description":"The /iban/screen verdict, without its echo fields (IBAN, country, bank, coverage) - they already live identically in the 'iban' block. The risk band is NOT re-decided here: this endpoint only reads the one risk table of the service"}},"required":["coverage","screening"]},"iban":{"type":"object","properties":{"bank":{"type":["object","null"],"properties":{"bic":{"type":["string","null"]},"name":{"type":"string"}},"required":["bic","name"]},"bank_code":{"type":["string","null"]},"country":{"type":["string","null"]},"coverage":{"type":["string","null"],"description":"Registry coverage for the IBAN's country: 'full' (complete national registry — an unknown bank means the account is likely unreachable), 'partial' (curated registry of major FR/GB/PT banks — an unknown bank is unknowable, so reachable stays null rather than a false negative), or 'structure_only' (country not in any registry — only IBAN structure is checked)"},"iban":{"type":"string"},"reachable":{"type":["boolean","null"]},"sepa_reachability":{"type":["object","null"],"properties":{"match":{"type":"string"},"schemes":{"type":"array","items":{"type":"string"}},"sct":{"type":"boolean"},"sct_inst":{"type":"boolean"},"sdd_b2b":{"type":"boolean"},"sdd_core":{"type":"boolean"}},"required":["match","schemes","sct","sct_inst","sdd_b2b","sdd_core"],"description":"Which EPC schemes the bank is reachable under (SCT, SCT Inst, SDD Core, SDD B2B), and whether the reading is an exact BIC8 match or an institution-level fallback. EPC reference BICs state PSP reachability, NOT a routing guarantee. Null when no BIC was resolved"},"valid":{"type":"boolean"},"branch_code":{"type":["string","null"]},"issue":{"type":["string","null"],"description":"Diagnostic code when 'valid' is false — BAD_CHARACTERS, BAD_LENGTH, BAD_FORMAT, BAD_CHECKSUM, UNKNOWN_COUNTRY or INVALID_BBAN; null when the IBAN is valid"}},"required":["bank","bank_code","country","coverage","iban","reachable","sepa_reachability","valid"],"description":"The full /iban/resolve answer (T-905): structural validity, country, bank code, bank name and BIC from national registries, and fine-grained SEPA scheme reachability from the EPC register. On an invalid IBAN everything here is null and 'issue' carries the diagnostic code"},"limits":{"type":"string","description":"Fixed sentence served inside every response: a control outcome, not a payment instruction; the beneficiary name is screened against designation lists only, and the account holder's name is NEVER verified with the beneficiary bank (Verification of Payee under the EU Instant Payments Regulation is out of scope)"},"name_screening":{"type":"object","properties":{"coverage":{"type":"string","description":"'screened' when a beneficiary name was submitted and screened, 'not_requested' when none was. 'not_requested' is not a pass: it forbids 'ok' and produces the NAME_NOT_SCREENED reason"},"lists_screened":{"type":"array","items":{"type":"object","properties":{"entities":{"type":"integer"},"list":{"type":"string"}},"required":["entities","list"]},"description":"The designation lists actually screened for the name and how many entities each contributed. EMPTY when no name was submitted: we do not claim to have consulted what we did not read"},"screening":{"type":["object","null"],"properties":{"hits":{"type":"array","items":{"type":"object","properties":{"birth_dates":{"type":"array"},"id":{"type":"string"},"identifications":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string"},"type":{"type":"string"}},"required":["number","type"]}},"kind":{"type":"string"},"list_source":{"type":"string"},"listed_on":{"type":["string","null"]},"match_type":{"type":"string"},"matched_name":{"type":"string"},"nationalities":{"type":"array"},"programs":{"type":"array","items":{"type":"string"}},"remarks":{"type":["string","null"]}},"required":["birth_dates","id","identifications","kind","list_source","listed_on","match_type","matched_name","nationalities","programs","remarks"]}},"query":{"type":"object","properties":{"name":{"type":"string"},"normalized":{"type":"string"}},"required":["name","normalized"]},"total_matches":{"type":"integer"},"truncated":{"type":"boolean"},"verdict":{"type":"string"},"verdict_basis":{"type":"array","items":{"type":"string"}}},"required":["hits","query","total_matches","truncated","verdict","verdict_basis"],"description":"The GET /screen/entity verdict for the beneficiary name, capped at 10 matches with an honest total_matches and truncated - the verdict still covers ALL matches. Null when no name was submitted"}},"required":["coverage","lists_screened","screening"]},"query":{"type":"object","properties":{"beneficiary_name":{"type":["string","null"]},"iban":{"type":"string"},"include_weak":{"type":"boolean"},"country":{"type":["string","null"]}},"required":["beneficiary_name","iban","include_weak"]},"sources":{"type":"array","items":{"type":"object","properties":{"as_of":{"type":"string"},"source":{"type":"string"}},"required":["as_of","source"]},"description":"One dated entry per source actually consulted - bank registries and the EPC register are quarterly, the sanctions artefacts and the entity store weekly. The entity store appears only if a name was screened. The single 'provenance' block above carries the composite source and the OLDEST of these dates"},"verdict":{"type":"string","description":"Closed enumeration, exactly the maximum severity among the reasons. 'stop': invalid IBAN, sanctioned bank or BIC, embargoed jurisdiction, or a name hit on the beneficiary. 'review': bank unknown in a COMPLETE national registry, high-risk or monitored jurisdiction (FATF, EU-AML), a weak name match, or a full name match on a designated VESSEL or AIRCRAFT (NAME_HIT_NON_COUNTERPARTY - a ship cannot be the counterparty of a transfer, so it never stops a payment; the match is still returned in full). 'insufficient_coverage': no signal, but a check did not happen - in particular no beneficiary name submitted, or a bank that could not be screened. 'ok': every check ran and none raised a signal"},"verdict_reasons":{"type":"array","items":{"type":"object","properties":{"block":{"type":"string"},"code":{"type":"string"},"detail":{"type":"string"},"severity":{"type":"string"}},"required":["block","code","detail","severity"]},"description":"Every reason behind the verdict, most severe first, each carrying its block, a stable code from a closed set of eleven (IBAN_INVALID, BANK_UNKNOWN_IN_FULL_REGISTRY, BANK_SANCTIONED, JURISDICTION_SANCTIONED, JURISDICTION_HIGH_RISK, JURISDICTION_MONITORED, BANK_SCREENING_INCOMPLETE, NAME_HIT, NAME_WEAK_HIT, NAME_HIT_NON_COUNTERPARTY, NAME_NOT_SCREENED) and its own severity. Empty on 'ok', and on 'ok' only. You RECOMPUTE the verdict from them instead of taking it on trust"}},"required":["bank_screening","iban","limits","name_screening","query","sources","verdict","verdict_reasons"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"beneficiary_name":{"type":"string","description":"Optional - Name of the beneficiary, 2 to 200 characters, screened against the designation lists exactly as GET /screen/entity does, except that only person and entity matches can drive the verdict: a designated vessel or aircraft sharing the name is reported, never a 'stop'. But WITHOUT it the verdict can never be 'ok': the beneficiary was not looked at, and an 'ok' would read as a green light on them"},"iban":{"type":"string","description":"The beneficiary IBAN, up to 64 characters (separators tolerated). A structurally invalid IBAN is a USEFUL answer: HTTP 200 with a motivated 'stop', not an error"},"include_weak":{"type":"string","description":"Optional. Whether weak name matches count towards the verdict; default false. Same semantics as /screen/entity: it changes only the verdict, weak matches are returned either way"},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 filter on the beneficiary's DECLARED country, applied to the name screening only. It is your declaration, never an assertion of ours, and it can only remove candidates whose country the list published in a comparable form"}},"required":["iban"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/preflight-payment","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Pre-flight a bank transfer before you send it","tags":["iban","sanctions"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.25"}},{"resource":{"url":"https://api.invoket.com/preflight/x402-seller","description":"Before your agent signs an x402 payment to a counterparty it does not know: submit the 402 challenge you received and get one verdict - ok, review, stop, insufficient_coverage - over the pay-to address screened against the OFAC, EU and UN designation lists, the amount claimed compared with what that resource publishes in the public CDP Bazaar census, and whether the resource is listed at all. Every reason names its block and its source.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"250000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"250000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","maxAmountRequired":"25000","network":"eip155:8453","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","resource":"https://api.invoket.com/company/report"},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"asset":{"type":"string","description":"Optional - Contract or mint address of the token, up to 128 characters. Atomic units only compare at equal asset (6 decimals here, 18 there): when several candidate rails carry different assets and the request does not settle which, the answer is RAILS_AMBIGUOUS rather than a 'lowest amount' that would mix magnitudes"},"maxAmountRequired":{"type":"string","description":"Optional - The amount claimed by the challenge, in ATOMIC units, as a decimal integer (string or JSON number); 'amount' is accepted too. Without it nothing is compared and the price block reports AMOUNT_NOT_SUBMITTED. It is compared with the LOWEST matching rail the resource published at the census date"},"network":{"type":"string","description":"Optional - CAIP-2 network of the rail you would pay on ('maxAmountRequired' is the same field as 'amount'), up to 128 characters. It selects which published rails the amount is compared against. Two token generations are reconciled by a closed, sourced table: Base IS eip155:8453. A token outside that table is never reinterpreted - it simply matches no rail, and the answer says RAIL_NOT_PUBLISHED"},"payTo":{"type":"string","description":"The address the payment would credit, taken verbatim from the challenge ('pay_to' is accepted too). This is the only field that can produce a 'stop': it is screened against the OFAC SDN and consolidated lists, the EU FSF and the UN Security Council list. An address whose form matches none of the five screenable families (EVM, Bitcoin, Solana, Tron, Monero) is not refused - it comes back as coverage 'unscreenable_address_form', because refusing it would leave those sellers with no check at all and inventing a 'not_listed' would be a lie"},"resource":{"type":"string","description":"The resource URL exactly as the 402 challenge named it, http(s), up to 2048 characters. It is the census key: we normalize it and echo the canonical form back so you can replay the lookup. A resource absent from the census is a COVERAGE GAP, never a signal against the seller - the census lists a resource only after its first settlement"}},"required":["payTo","resource"]}},"output":{"type":"json","example":{"data":{"limits":"This is a control outcome, not a payment instruction: 'ok' is not a recommendation to pay, and the decision remains the caller's. The input is declarative - the x402 challenge is never replayed and the seller's origin is never contacted. The pay-to address is screened against the designation lists and snapshot date reported in the screening block. Price coherence and liveness hold as of the census date reported in their blocks and never as of this call: the census lists a resource only after its first settlement, so an absent resource is a coverage gap and never a signal against the seller. This check does not attest that the seller will deliver, that the resource is safe, that the price is fair, or that the origin is reachable. No score, no rating, no reputation.","presence":{"coverage":"listed","freshness":{"as_of":"2026-08-17","source":"cdp-x402-bazaar"},"host":"api.invoket.com","host_resources":42,"last_updated":"2026-07-26T06:29:44.051Z","pay_to":"published","usage":{"last_called_at":"2026-07-31T18:35:31.62Z","total_calls_30d":6,"unique_payers_30d":3}},"price_coherence":{"comparison":"above_published","coverage":"compared","declared_amount":"25000","difference":"24000","freshness":{"as_of":"2026-08-17","source":"cdp-x402-bazaar"},"published_amount":"1000","rails_matched":2,"rails_published":[{"amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","matches_query":true,"network":"eip155:8453","pay_to":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","scheme":"exact"},{"amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","matches_query":false,"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","pay_to":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","scheme":"exact"},{"amount":"1000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","matches_query":true,"network":"eip155:8453","pay_to":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","scheme":"exact"}]},"query":{"amount":"25000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","pay_to":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","resource":"https://api.invoket.com/company/report","resource_canonical":"https://api.invoket.com/company/report"},"screening":{"coverage":"screened","freshness":{"as_of":"2026-07-27","source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"},"lists_screened":[{"addresses":7,"list":"EU-FSF"},{"addresses":0,"list":"OFAC-CONS"},{"addresses":975,"list":"OFAC-SDN"},{"addresses":0,"list":"UN"}],"screening":{"hits":[],"query":{"address":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","address_normalized":"0x4465825b0ac713aa2fa07ea29023020804a128ee","chain_family":"evm","chain_family_source":"inferred"},"verdict":"not_listed"}},"verdict":"review","verdict_reasons":[{"block":"price_coherence","code":"AMOUNT_ABOVE_PUBLISHED","detail":"the challenge asks for 25000 atomic units where this resource published 1000 at the census date: 24000 more","severity":"review"}]},"provenance":{"fetched_at":"2026-08-17T20:07:12.418902531Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc+cdp-x402-bazaar"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"limits":{"type":"string","description":"Fixed sentence served inside every response. It names what this check does NOT attest - that the seller will deliver, that the resource is safe, that the price is fair, that the origin is reachable - and it dates the two halves separately: the screening as of the sanctions snapshot, price and liveness as of the census. Beyond 7 days the census is not even consulted"},"presence":{"type":"object","properties":{"coverage":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"source":{"type":"string"}},"required":["as_of","source"]},"host":{"type":"string"},"host_resources":{"type":"integer","description":"How many resources of this host the census lists. This is what separates a KNOWN seller whose particular resource is new from a wholly unknown host - and it is why an absent resource is reported as a coverage gap rather than held against the seller"},"last_updated":{"type":["string","null"]},"pay_to":{"type":"string","description":"'published' when the address you would credit is among those this resource publishes, 'not_published' when the resource is listed and publishes other addresses (a 'review'), 'unknown' when the resource is absent or the snapshot is stale - the question was not asked"},"usage":{"type":["object","null"],"properties":{"last_called_at":{"type":"string"},"total_calls_30d":{"type":"integer"},"unique_payers_30d":{"type":"integer"}},"required":["last_called_at","total_calls_30d","unique_payers_30d"]}},"required":["coverage","freshness","host","host_resources","last_updated","pay_to","usage"],"description":"What the census knows about this resource and its host: whether the resource itself is listed, how many resources the host serves, when the entry was last updated, and the usage counters published ON the resource - total calls and unique payers over 30 days, and the last call. Those are published aggregates, never a buyer identity, an address or a transaction"},"price_coherence":{"type":"object","properties":{"comparison":{"type":["string","null"]},"coverage":{"type":"string","description":"Why the comparison did or did not happen: 'compared', 'resource_not_in_snapshot', 'amount_not_submitted', 'rail_not_published' (no rail for the declared network and asset), 'rails_ambiguous' (candidate rails on different assets and nothing to settle which), 'amount_not_comparable' (the source published a decimal, not atomic units) or 'snapshot_stale'"},"declared_amount":{"type":["string","null"]},"difference":{"type":["string","null"]},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"source":{"type":"string"}},"required":["as_of","source"]},"published_amount":{"type":["string","null"]},"rails_matched":{"type":"integer"},"rails_published":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"string"},"asset":{"type":"string"},"matches_query":{"type":"boolean"},"network":{"type":"string"},"pay_to":{"type":"string"},"scheme":{"type":"string"}},"required":["amount","asset","matches_query","network","pay_to","scheme"]}}},"required":["comparison","coverage","declared_amount","difference","freshness","published_amount","rails_matched","rails_published"],"description":"What the challenge claims against what the resource published at the census date, in atomic units, plus every rail the resource published - not only the ones matched, so you can see what you did not ask for. An amount ABOVE the published one is a 'review' with the gap quantified; an amount BELOW is stated and motivates nothing, because a price cut between two daily snapshots is the nominal case"},"query":{"type":"object","properties":{"amount":{"type":["string","null"]},"asset":{"type":["string","null"]},"network":{"type":["string","null"]},"pay_to":{"type":"string"},"resource":{"type":"string"},"resource_canonical":{"type":"string"}},"required":["amount","asset","network","pay_to","resource","resource_canonical"],"description":"What the verdict was rendered on, echoed back - including 'resource_canonical', the key we actually looked up. The check is declarative by construction: the challenge is never replayed and the origin is never contacted, so what you submitted is what was judged"},"screening":{"type":"object","properties":{"coverage":{"type":"string","description":"'screened' when the address form is one we can look up, 'unscreenable_address_form' when it is not (XRPL, Stellar, Algorand and others that no list publishes). Under 'unscreenable_address_form' the screening block is null and 'lists_screened' is empty, and the verdict can never be 'ok'"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"source":{"type":"string"}},"required":["as_of","source"]},"lists_screened":{"type":"array","items":{"type":"object","properties":{"addresses":{"type":"integer"},"list":{"type":"string"}},"required":["addresses","list"]}},"screening":{"type":["object","null"],"properties":{"hits":{"type":"array"},"query":{"type":"object","properties":{"address":{"type":"string"},"address_normalized":{"type":"string"},"chain_family":{"type":"string"},"chain_family_source":{"type":"string"}},"required":["address","address_normalized","chain_family","chain_family_source"]},"verdict":{"type":"string"}},"required":["hits","query","verdict"]}},"required":["coverage","freshness","lists_screened","screening"],"description":"The pay-to address screened against the designation lists, served as GET /screen/address renders it, with the lists actually consulted and how many addresses each contributed - that count is what makes a 'not_listed' opposable rather than an assertion. Its freshness is the sanctions store's, not the census's"},"verdict":{"type":"string","description":"Closed enumeration, exactly the maximum severity among the reasons - recompute it instead of taking our word. 'stop': the pay-to address is designated, and that is the ONLY thing that stops. 'review': the challenge asks more than the resource published, or the pay-to address is not among those it publishes. 'insufficient_coverage': a check could not be rendered - address form not screenable, resource absent from the census, amount not submitted or not comparable, census snapshot older than 7 days. 'ok': every check ran and none raised a signal"},"verdict_reasons":{"type":"array","items":{"type":"object","properties":{"block":{"type":"string"},"code":{"type":"string"},"detail":{"type":["string","null"]},"severity":{"type":"string"}},"required":["block","code","detail","severity"]},"description":"Every reason attached to the block it belongs to, with its stable code and its own severity, most severe first. A same fact is motivated ONCE, in the block that owns it: an absent resource and a stale snapshot are motivated by 'presence', and 'price_coherence' only reports in its coverage that it could not compare"}},"required":["limits","presence","price_coherence","query","screening","verdict","verdict_reasons"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"asset":{"type":"string","description":"Optional - Contract or mint address of the token, up to 128 characters. Atomic units only compare at equal asset (6 decimals here, 18 there): when several candidate rails carry different assets and the request does not settle which, the answer is RAILS_AMBIGUOUS rather than a 'lowest amount' that would mix magnitudes"},"maxAmountRequired":{"type":"string","description":"Optional - The amount claimed by the challenge, in ATOMIC units, as a decimal integer (string or JSON number); 'amount' is accepted too. Without it nothing is compared and the price block reports AMOUNT_NOT_SUBMITTED. It is compared with the LOWEST matching rail the resource published at the census date"},"network":{"type":"string","description":"Optional - CAIP-2 network of the rail you would pay on ('maxAmountRequired' is the same field as 'amount'), up to 128 characters. It selects which published rails the amount is compared against. Two token generations are reconciled by a closed, sourced table: Base IS eip155:8453. A token outside that table is never reinterpreted - it simply matches no rail, and the answer says RAIL_NOT_PUBLISHED"},"payTo":{"type":"string","description":"The address the payment would credit, taken verbatim from the challenge ('pay_to' is accepted too). This is the only field that can produce a 'stop': it is screened against the OFAC SDN and consolidated lists, the EU FSF and the UN Security Council list. An address whose form matches none of the five screenable families (EVM, Bitcoin, Solana, Tron, Monero) is not refused - it comes back as coverage 'unscreenable_address_form', because refusing it would leave those sellers with no check at all and inventing a 'not_listed' would be a lie"},"resource":{"type":"string","description":"The resource URL exactly as the 402 challenge named it, http(s), up to 2048 characters. It is the census key: we normalize it and echo the canonical form back so you can replay the lookup. A resource absent from the census is a COVERAGE GAP, never a signal against the seller - the census lists a resource only after its first settlement"}},"required":["payTo","resource"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/preflight-x402-seller","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check an x402 seller before you pay it","tags":["x402","screening"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.25"}},{"resource":{"url":"https://api.invoket.com/phone/validate","description":"Before your agent stores or messages a phone number: validate and normalize it offline — E.164 formatting, region, national format and line type from Google's libphonenumber metadata, no network call","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"country":"FR","number":"+33612345678 ext. 123"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"country":{"type":"string"},"number":{"type":"string"}},"required":["number"]}},"output":{"type":"json","example":{"data":{"country":"FR","country_code":33,"e164":"+33612345678","extension":"123","input":"+33612345678 ext. 123","national_format":"06 12 34 56 78 ext. 123","number_type":"mobile","valid":true},"provenance":{"fetched_at":"2026-06-12T09:30:00Z","freshness":{"as_of":"2025-06-01T00:00:00Z","kind":"snapshot"},"source":"libphonenumber"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"country":{"type":["string","null"],"description":"Region as an ISO 3166-1 alpha-2 code — never a numeric calling code. It is null even on a VALID number from an ITU non-geographic range (+800 UIFN, +870 Inmarsat, +882 and +883 international networks, +979 premium), which belongs to no country: read 'country_code' for the dialing code there, and expect null when mapping this field onto an ISO table."},"country_code":{"type":["integer","null"],"description":"E.164 country calling code as an integer (33 for France, 800 for UIFN…), set on every valid number — including those whose 'country' is null (non-geographic ranges)."},"e164":{"type":["string","null"]},"extension":{"type":["string","null"],"description":"Extension (phone extension / poste) parsed from the input, null when the number carries none. It is never folded into 'e164': E.164 does not carry extensions and no ';ext=' form is invented — store 'extension' alongside 'e164' to keep it. 'national_format' shows it in the local reading form."},"input":{"type":"string"},"national_format":{"type":["string","null"]},"number_type":{"type":["string","null"]},"valid":{"type":"boolean","description":"Structural verdict. false is a SUCCESSFUL answer (HTTP 200), never an error: the number was read and rejected. On a false verdict every derived field ('e164', 'country', 'country_code', 'national_format', 'extension', 'number_type') is null and 'issue' carries a stable diagnostic code: BAD_FORMAT, TOO_SHORT, TOO_LONG, NOT_A_NUMBER, UNKNOWN_REGION or INVALID_FOR_REGION. 'issue' is null when 'valid' is true."},"issue":{"type":["string","null"]}},"required":["country","country_code","e164","extension","input","national_format","number_type","valid"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"country":{"type":"string"},"number":{"type":"string"}},"required":["number"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/phone-validate","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Validate a phone number offline","tags":["phone"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/legal/article","description":"Before your agent cites, advises on or drafts against a French law: check the article is in force at a given date — consolidated text, status (in force / repealed / deferred) and validity dates, from the official Légifrance LEGI dataset. Covers 12 major French codes and statutes (civil, labor, commercial, tax/CGI and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"article":"1240","code":"code-civil","date":"2024-01-01"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string","description":"Slug of the French code or statute, resolved against the official Légifrance LEGI consolidated dataset (e.g. code-civil). Covered corpus: Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17)"},"date":{"type":"string","description":"Optional. Date at which the law is read, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-07-05, not 2026-7-5); defaults to today"}},"required":["article","code"]}},"output":{"type":"json","example":{"data":{"article":"1240","code":"code-civil","coverage":{"complete":true},"coverage_window":{"from":"1804-03-21"},"date":"2024-01-01","etat":"vigueur","in_force_at_date":true,"label":"Code civil, art. 1240","text":"Tout fait quelconque de l'homme, qui cause à autrui un dommage, oblige celui par la faute duquel il est arrivé à le réparer.","version":{"date_debut":"2016-10-01","version_id":"LEGIARTI000032041571"}},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"DILA — base LEGI (législation et réglementation consolidées)"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why the coverage is incomplete, when 'complete' is false (e.g. a dump anomaly) — absent otherwise. Nothing is invented to fill the gap"}},"required":["complete"]},"coverage_window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":["string","null"]}},"required":["from"],"description":"Period over which this text is actually queryable: from (inclusive) and to (exclusive, null when open). Derived from the versions actually ingested, so it never promises more than is served. A date outside it returns 404 OUT_OF_COVERAGE_WINDOW (not billed) naming the window — a coverage limit on our side, not a statement that the law did not exist"},"date":{"type":"string"},"etat":{"type":"string"},"in_force_at_date":{"type":"boolean"},"label":{"type":"string"},"text":{"type":"string"},"version":{"type":"object","properties":{"date_debut":{"type":"string"},"version_id":{"type":"string"},"date_fin":{"type":"string"}},"required":["date_debut","version_id"]}},"required":["article","code","coverage","date","etat","in_force_at_date","label","text","version"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string","description":"Slug of the French code or statute, resolved against the official Légifrance LEGI consolidated dataset (e.g. code-civil). Covered corpus: Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17)"},"date":{"type":"string","description":"Optional. Date at which the law is read, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-07-05, not 2026-7-5); defaults to today"}},"required":["article","code"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/legal-article","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check if a French law is in force","tags":["legal"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/legal/eu-act","description":"Before your agent advises on EU compliance or cites EU law: check an act or article is in force at a given date, by CELEX or ELI identifier — consolidated text, status, validity dates and the staggered date it becomes APPLICABLE (in force is not the same thing: the AI Act is in force since 2024-08-01, but its Article 50 only applies from 2026-08-02), from the official EUR-Lex dataset. Covers key EU digital and financial acts (GDPR, DSA, AI Act, MiCA and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"article":"17","celex":"32016R0679","date":"2024-01-01"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string","description":"Optional on its own - CELEX identifier of the EU act (an ELI is accepted via eli= as a fallback (e.g. eli=reg/2016/679/oj, or the full URI http://data.europa.eu/eli/reg/2016/679/oj — the scheme, the data.europa.eu host, the /eli/ prefix and the trailing /oj are all optional)), resolved against the official EUR-Lex consolidated dataset. Covered acts: GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2. Historical depth VARIES per act and is reported per response in coverage_window: some acts are only covered from their first published consolidation (the e-Commerce Directive, in force since 2000, is only queryable from 2024-02-17)"},"date":{"type":"string","description":"Optional. Date at which the law is read, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-07-05, not 2026-7-5); defaults to today"}},"required":[]}},"output":{"type":"json","example":{"data":{"applicability_scope":"act","applicability_source":"Regulation (EU) 2016/679, Article 99(2): \"It shall apply from 25 May 2018.\"","applicable_at_date":true,"applicable_from":"2018-05-25","article":"17","celex":"32016R0679","coverage":{"complete":true},"coverage_window":{"from":"2016-05-04"},"date":"2024-01-01","etat":"vigueur","in_force_at_date":true,"label":"Règlement (UE) 2016/679 (RGPD), art. 17 — Droit à l'effacement","text":"La personne concernée a le droit d'obtenir du responsable du traitement l'effacement, dans les meilleurs délais, de données à caractère personnel la concernant et le responsable du traitement a l'obligation d'effacer ces données dans les meilleurs délais, lorsque l'un des motifs énumérés à l'article 17 s'applique.","version":{"date_debut":"2016-05-24","version_id":"32016R0679-art-17"}},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-05T00:00:00Z","kind":"snapshot"},"source":"EUR-Lex / Cellar — droit de l'Union consolidé"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"applicability_scope":{"type":["string","null"]},"applicability_source":{"type":["string","null"]},"applicable_at_date":{"type":["boolean","null"]},"applicable_from":{"type":["string","null"],"description":"Date from which the act (or that specific article) becomes APPLICABLE, which is not the same as being in force: it is curated from the act's final provisions and cited in applicability_source. null when no determined date exists at EU level (directives take effect through national transposition) or when the act is not covered — never a guessed date; the reason is then given in coverage.reason"},"article":{"type":"string"},"celex":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why the coverage is incomplete, when 'complete' is false — including the act having no application date on record, in which case applicable_from and applicable_at_date are null and 'etat' reports entry into force only, which is not the same as being applicable"}},"required":["complete"]},"coverage_window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":["string","null"]}},"required":["from"],"description":"Period over which this act is actually queryable: from (inclusive) and to (exclusive, null when open). Derived from the versions actually ingested, so it never promises more than is served. A date outside it returns 404 OUT_OF_COVERAGE_WINDOW (not billed) naming the window — a coverage limit on our side, not a statement that the law did not exist"},"date":{"type":"string"},"etat":{"type":"string"},"in_force_at_date":{"type":"boolean"},"label":{"type":"string"},"text":{"type":"string"},"version":{"type":"object","properties":{"date_debut":{"type":"string"},"version_id":{"type":"string"},"date_fin":{"type":"string"}},"required":["date_debut","version_id"]},"articles":{"type":"array","description":"Article numbers available at that date — ACT level only (a request without 'article'). The text of each one stays on ?article=; acts never concatenate their articles"},"eli":{"type":"string"}},"required":["applicability_scope","applicability_source","applicable_at_date","applicable_from","coverage","date","etat","in_force_at_date","label","version"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string","description":"Optional on its own - CELEX identifier of the EU act (an ELI is accepted via eli= as a fallback (e.g. eli=reg/2016/679/oj, or the full URI http://data.europa.eu/eli/reg/2016/679/oj — the scheme, the data.europa.eu host, the /eli/ prefix and the trailing /oj are all optional)), resolved against the official EUR-Lex consolidated dataset. Covered acts: GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2. Historical depth VARIES per act and is reported per response in coverage_window: some acts are only covered from their first published consolidation (the e-Commerce Directive, in force since 2000, is only queryable from 2024-02-17)"},"date":{"type":"string","description":"Optional. Date at which the law is read, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-07-05, not 2026-7-5); defaults to today"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/legal-eu-act","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check if an EU law is in force","tags":["legal"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/legal/article/batch","description":"Before your agent signs off a contract review or a due-diligence memo: check that up to 50 legal citations are still in force at a given date in one call — consolidated text, status and validity dates per reference, from the official LEGI (French law) and EUR-Lex (EU law) datasets. Covers 12 major French codes and statutes and key EU acts (GDPR, DSA, AI Act, MiCA and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"refs":[{"article":"1240","code":"code-civil","date":"2024-01-01"},{"article":"17","celex":"32016R0679"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"date":{"type":"string"}},"required":[]},"description":"Array of article references, French ({ code, article, date? }) and EU ({ celex or eli, article?, date? }, e.g. eli=reg/2016/679/oj or the full URI http://data.europa.eu/eli/reg/2016/679/oj) mixed freely. Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":["refs"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"article":"1240","code":"code-civil","coverage":{"complete":true},"date":"2024-01-01","etat":"vigueur","in_force_at_date":true,"label":"Code civil, art. 1240","text":"Tout fait quelconque de l'homme, qui cause à autrui un dommage, oblige celui par la faute duquel il est arrivé à le réparer.","version":{"date_debut":"2016-10-01","version_id":"LEGIARTI000032041571"}},{"applicability_scope":"act","applicability_source":"Regulation (EU) 2016/679, Article 99(2)","applicable_at_date":true,"applicable_from":"2018-05-25","article":"17","celex":"32016R0679","coverage":{"complete":true},"date":"2026-06-20","etat":"vigueur","in_force_at_date":true,"label":"Règlement (UE) 2016/679 (RGPD), art. 17 — Droit à l'effacement","text":"La personne concernée a le droit d'obtenir du responsable du traitement l'effacement, dans les meilleurs délais, de données à caractère personnel la concernant.","version":{"date_debut":"2018-05-25","version_id":"32016R0679-art-17-v1"}}]},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"DILA — base LEGI ; EUR-Lex / Cellar — droit consolidé"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why this reference could not be answered, when 'complete' is false (unknown reference, no version at the requested date): the item stays a successful 200 carrying only its echo, 'date' and this reason — never an invented text or status"}},"required":["complete"]},"date":{"type":"string"},"etat":{"type":"string"},"in_force_at_date":{"type":"boolean"},"label":{"type":"string"},"text":{"type":"string"},"version":{"type":"object","properties":{"date_debut":{"type":"string"},"version_id":{"type":"string"},"date_fin":{"type":"string"}},"required":["date_debut","version_id"]},"applicability_scope":{"type":["string","null"]},"applicability_source":{"type":["string","null"]},"applicable_at_date":{"type":["boolean","null"]},"applicable_from":{"type":["string","null"]},"celex":{"type":"string"},"coverage_window":{"type":"object","description":"Period over which this text or act is actually queryable: from (inclusive) and to (exclusive, null when open)"},"eli":{"type":"string"}},"required":["coverage","date"]}}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"date":{"type":"string"}},"required":[]},"description":"Array of article references, French ({ code, article, date? }) and EU ({ celex or eli, article?, date? }, e.g. eli=reg/2016/679/oj or the full URI http://data.europa.eu/eli/reg/2016/679/oj) mixed freely. Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":["refs"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/legal-article-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check if a list of laws is in force","tags":["legal"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":50,"unitField":"refs"}}},{"resource":{"url":"https://api.invoket.com/legal/history","description":"Before your agent relies on a stored legal citation or watches a provision for change: the full version timeline of a French or EU article — each version's status (in force, repealed, superseded, deferred) and validity dates, from the official LEGI and EUR-Lex datasets — to detect exactly when it changed. Covers 12 major French codes and statutes and key EU acts (GDPR, DSA, AI Act, MiCA and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"article":"1240","code":"code-civil"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string","description":"Optional on its own - Slug of the French code or statute (e.g. code-civil); an EU reference passes celex= or eli= instead (e.g. eli=reg/2016/679/oj, or the full URI http://data.europa.eu/eli/reg/2016/679/oj — the scheme, the data.europa.eu host, the /eli/ prefix and the trailing /oj are all optional). Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":[]}},"output":{"type":"json","example":{"data":{"article":"1240","code":"code-civil","count":2,"coverage_window":{"from":"1804-03-21"},"label":"Code civil, art. 1240","versions":[{"continuity":"same_article","date_debut":"1804-03-21","date_fin":"2016-10-01","etat":"modifie","version_id":"LEGIARTI000006437044"},{"continuity":"renumbered","date_debut":"2016-10-01","etat":"vigueur","version_id":"LEGIARTI000032041571"}]},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"DILA — base LEGI (législation et réglementation consolidées)"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"count":{"type":"integer"},"coverage_window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":["string","null"]}},"required":["from"],"description":"Period over which this text or act is actually queryable: from (inclusive) and to (exclusive, null when open). Tells a monitoring agent how far back it can go without paying for a call that will fail — historical depth varies per text (the e-Commerce Directive, in force since 2000, is only covered from 2024-02-17)"},"label":{"type":"string"},"versions":{"type":"array","items":{"type":"object","properties":{"continuity":{"type":"string","description":"Whether this version continues the previous one under the same article number: 'same_article', 'renumbered' (a reform made the number stop designating one text and start designating another — French Civil Code art. 1240 carried 'payment made in good faith' until 2016, then the former art. 1382 on tort liability), or 'unknown'. French law only: EU consolidations keep their numbering, so the field is absent there. Nothing is rewritten or hidden — the marker sits next to the version, which is still served as recorded. A renumbered version also carries renumbered_from (the number the text came from) when the LEGI filiation records it — never guessed"},"date_debut":{"type":"string"},"date_fin":{"type":"string","description":"End of this version's validity (exclusive); omitted when the version is still open (currently in force)"},"etat":{"type":"string","description":"LEGI status of this version, carried verbatim: 'vigueur' (in force), 'abroge' (repealed), 'modifie' (superseded by a later version), 'abroge_diff'/'vigueur_diff' (deferred)"},"version_id":{"type":"string"},"renumbered_from":{"type":"string","description":"Article number this text came from, present only when the LEGI filiation records it — never guessed, and absent for EU law"},"renumbered_to":{"type":"string","description":"Article number this text moved to, present only when the LEGI filiation records it — never guessed, and absent for EU law"}},"required":["date_debut","etat","version_id"]}},"celex":{"type":"string"},"eli":{"type":"string"}},"required":["count","label","versions"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string","description":"Optional on its own - Slug of the French code or statute (e.g. code-civil); an EU reference passes celex= or eli= instead (e.g. eli=reg/2016/679/oj, or the full URI http://data.europa.eu/eli/reg/2016/679/oj — the scheme, the data.europa.eu host, the /eli/ prefix and the trailing /oj are all optional). Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/legal-history","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"List the version history of a law","tags":["legal"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/legal/diff","description":"Before your agent updates a contract clause or a compliance rule that depends on a law: see exactly what changed in a French or EU article between two dates — resolves the version in force at each date, from the official LEGI and EUR-Lex datasets, and returns a word-level diff plus a git-style unified patch with both versions' metadata. Covers 12 major French codes and statutes and key EU acts (GDPR, DSA, AI Act, MiCA and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"article":"1240","code":"code-civil","from":"2000-01-01","to":"2026-06-20"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string","description":"Optional on its own - Slug of the French code or statute (e.g. code-civil); an EU reference passes celex= or eli= instead (e.g. eli=reg/2016/679/oj, or the full URI http://data.europa.eu/eli/reg/2016/679/oj — the scheme, the data.europa.eu host, the /eli/ prefix and the trailing /oj are all optional). Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"},"from":{"type":"string","description":"Start date of the comparison, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-07-05, not 2026-7-5). Must not be after 'to', otherwise the call is rejected with 400 INVALID_RANGE rather than billed for a diff read backwards"},"to":{"type":"string","description":"Optional. End date of the comparison, strict ISO calendar format YYYY-MM-DD; defaults to today"}},"required":["from"]}},"output":{"type":"json","example":{"data":{"article":"1240","changed":true,"code":"code-civil","diff":{"added":18,"changed":true,"removed":22,"segments":[{"op":"delete","text":"Le paiement"},{"op":"insert","text":"Tout"},{"op":"equal","text":" fait "}],"unified":"@@ -1 +1 @@\n-Le paiement fait de bonne foi à celui qui est en possession de la créance est valable, encore que le possesseur en soit par la suite évincé.\n\\ No newline at end of file\n+Tout fait quelconque de l'homme, qui cause à autrui un dommage, oblige celui par la faute duquel il est arrivé à le réparer.\n\\ No newline at end of file\n"},"differs":true,"from":"2000-01-01","from_in_force":true,"from_version":{"continuity":"same_article","date_debut":"1804-03-21","date_fin":"2016-10-01","etat":"modifie","version_id":"LEGIARTI000006437044"},"in_force_changed":false,"label":"Code civil, art. 1240","renumbering_suspected":true,"status_changed":true,"to":"2026-06-20","to_in_force":true,"to_version":{"continuity":"renumbered","date_debut":"2016-10-01","etat":"vigueur","version_id":"LEGIARTI000032041571"}},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"DILA — base LEGI (législation et réglementation consolidées)"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"article":{"type":"string"},"changed":{"type":"boolean","description":"Whether the consolidated text differs between the two dates (false when the same version is in force at both). When false the diff is returned empty — no segments, empty unified patch, zero counters: the article's text itself is sold by /legal/article?date="},"code":{"type":"string"},"diff":{"type":"object","properties":{"added":{"type":"integer"},"changed":{"type":"boolean"},"removed":{"type":"integer"},"segments":{"type":"array","items":{"type":"object","properties":{"op":{"type":"string","description":"Word-level diff operation for this segment: 'equal', 'insert' (present only at 'to') or 'delete' (present only at 'from')"},"text":{"type":"string"}},"required":["op","text"]}},"unified":{"type":"string"}},"required":["added","changed","removed","segments","unified"]},"differs":{"type":"boolean","description":"changed OR status_changed OR in_force_changed — the single field to filter on to monitor a citation: it catches a rewritten text, a repeal that left the wording untouched, and a repeal that left the status untouched too"},"from":{"type":"string"},"from_in_force":{"type":"boolean"},"from_version":{"type":["object","null"],"properties":{"continuity":{"type":"string"},"date_debut":{"type":"string"},"date_fin":{"type":"string"},"etat":{"type":"string"},"version_id":{"type":"string"}},"required":["date_debut","etat","version_id"],"description":"Version in force at the 'from' date, or null if none (e.g. before the first version) — the diff then shows a full insertion. 'date_fin' closes the version (absent while it is still open) and 'continuity' tells whether the article number kept designating the same text across the change ('same_article') or was renumbered ('renumbered') - French law only"},"in_force_changed":{"type":"boolean","description":"Whether the text stopped (or started) being the applicable law between the two dates — the only flag that fires on a French-style repeal, where both dates resolve to the same version and both 'changed' and 'status_changed' stay false"},"label":{"type":"string"},"renumbering_suspected":{"type":"boolean","description":"Whether a renumbering break falls between the two dates: the article number stopped designating one text and started designating another, so the diff describes a change that never happened. French Civil Code art. 1240 from 2000-01-01 returns a perfectly credible diff between 'payment made in good faith' (the old art. 1240) and tort liability (the old art. 1382, renumbered 1240 in 2016). The diff itself is unchanged and this flag stays out of 'differs' — it is a warning about how to read the diff, not one more change event. Always false for EU law, whose consolidations keep their numbering"},"status_changed":{"type":"boolean","description":"Whether the legal status (etat) differs between the two dates — true on a repeal that keeps the last known wording, where 'changed' stays false, and whenever only one of the two dates has a version at all"},"to":{"type":"string"},"to_in_force":{"type":"boolean"},"to_version":{"type":["object","null"],"properties":{"continuity":{"type":"string"},"date_debut":{"type":"string"},"etat":{"type":"string"},"version_id":{"type":"string"},"date_fin":{"type":"string"}},"required":["date_debut","etat","version_id"],"description":"Version retained at the 'to' date, or null if none (e.g. before the first version) — the diff then shows a full deletion. 'date_fin' closes the version (absent while it is still open) and 'continuity' tells whether the article number kept designating the same text across the change ('same_article') or was renumbered ('renumbered') - French law only"},"celex":{"type":"string"},"coverage_window":{"type":"object","description":"Period over which this text or act is actually queryable: from (inclusive) and to (exclusive, null when open) — how far back a monitoring agent can diff without paying for a call that will fail"},"eli":{"type":"string"}},"required":["changed","diff","differs","from","from_in_force","from_version","in_force_changed","label","renumbering_suspected","status_changed","to","to_in_force","to_version"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string","description":"Optional on its own - Slug of the French code or statute (e.g. code-civil); an EU reference passes celex= or eli= instead (e.g. eli=reg/2016/679/oj, or the full URI http://data.europa.eu/eli/reg/2016/679/oj — the scheme, the data.europa.eu host, the /eli/ prefix and the trailing /oj are all optional). Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"},"from":{"type":"string","description":"Start date of the comparison, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-07-05, not 2026-7-5). Must not be after 'to', otherwise the call is rejected with 400 INVALID_RANGE rather than billed for a diff read backwards"},"to":{"type":"string","description":"Optional. End date of the comparison, strict ISO calendar format YYYY-MM-DD; defaults to today"}},"required":["from"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/legal-diff","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"See what changed in a law between dates","tags":["legal"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/legal/history/batch","description":"Before your agent re-certifies a legal knowledge base or monitors a portfolio of citations: the version timeline (status and validity dates) of up to 100 French or EU article references in one call, from the official LEGI and EUR-Lex datasets, to detect which references changed and when. Covers 12 major French codes and statutes and key EU acts (GDPR, DSA, AI Act, MiCA and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"refs":[{"article":"1240","code":"code-civil"},{"article":"17","celex":"32016R0679"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"}},"required":[]},"description":"Array of article references, French ({ code, article }) and EU ({ celex or eli, article? }, e.g. eli=reg/2016/679/oj or the full URI http://data.europa.eu/eli/reg/2016/679/oj) mixed freely. Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":["refs"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"article":"1240","code":"code-civil","count":2,"coverage":{"complete":true},"label":"Code civil, art. 1240","versions":[{"continuity":"same_article","date_debut":"1804-03-21","date_fin":"2016-10-01","etat":"modifie","version_id":"LEGIARTI000006437044"},{"continuity":"renumbered","date_debut":"2016-10-01","etat":"vigueur","version_id":"LEGIARTI000032041571"}]},{"article":"17","celex":"32016R0679","count":1,"coverage":{"complete":true},"label":"Règlement (UE) 2016/679 (RGPD), art. 17 — Droit à l'effacement","versions":[{"date_debut":"2018-05-25","etat":"vigueur","version_id":"32016R0679-art-17-v1"}]}]},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"DILA — base LEGI ; EUR-Lex / Cellar — droit consolidé"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"count":{"type":"integer"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why this reference could not be answered, when 'complete' is false (unknown reference, no version recorded): the item stays a successful 200 carrying only its echo and this reason — no timeline is invented"}},"required":["complete"]},"label":{"type":"string"},"versions":{"type":"array","items":{"type":"object","properties":{"continuity":{"type":"string","description":"Whether this version continues the previous one under the same article number: 'same_article', 'renumbered' (a reform made the number stop designating one text and start designating another — French Civil Code art. 1240 carried 'payment made in good faith' until 2016, then the former art. 1382 on tort liability), or 'unknown'. French law only: EU consolidations keep their numbering, so the field is absent there"},"date_debut":{"type":"string"},"date_fin":{"type":"string"},"etat":{"type":"string","description":"LEGI status of this version, carried verbatim: 'vigueur' (in force), 'abroge' (repealed), 'modifie' (superseded by a later version), 'abroge_diff'/'vigueur_diff' (deferred)"},"version_id":{"type":"string"},"renumbered_from":{"type":"string"},"renumbered_to":{"type":"string"}},"required":["date_debut","etat","version_id"]}},"celex":{"type":"string"},"coverage_window":{"type":"object","description":"Period over which this text or act is actually queryable: from (inclusive) and to (exclusive, null when open)"},"eli":{"type":"string"}},"required":["coverage"]}}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"}},"required":[]},"description":"Array of article references, French ({ code, article }) and EU ({ celex or eli, article? }, e.g. eli=reg/2016/679/oj or the full URI http://data.europa.eu/eli/reg/2016/679/oj) mixed freely. Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":["refs"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/legal-history-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"List version history for a list of laws","tags":["legal"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":100,"unitField":"refs"}}},{"resource":{"url":"https://api.invoket.com/legal/diff/batch","description":"Before your agent re-runs a contract review or due diligence after time has passed: a structured diff of the consolidated text — word-level segments plus a git-style unified patch — for up to 50 French or EU article references, each between its own two dates, in one call, from the official LEGI and EUR-Lex datasets. Covers 12 major French codes and statutes and key EU acts (GDPR, DSA, AI Act, MiCA and more).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"refs":[{"article":"1240","code":"code-civil","from":"2000-01-01","to":"2026-06-20"},{"article":"17","celex":"32016R0679","from":"2018-05-25","to":"2026-06-20"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"}},"required":["from"]},"description":"Array of article references, French ({ code, article, from, to? }) and EU ({ celex or eli, article?, from, to? }, e.g. eli=reg/2016/679/oj or the full URI http://data.europa.eu/eli/reg/2016/679/oj) mixed freely, each diffed between its own two dates. Dates use the strict ISO calendar format YYYY-MM-DD (zero-padded), and an item whose 'from' is after its 'to' is rejected with 400 INVALID_RANGE quoting its index rather than billed. Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":["refs"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"article":"1240","changed":true,"code":"code-civil","coverage":{"complete":true},"diff":{"added":0,"changed":true,"removed":3,"segments":[{"op":"equal","text":"Tout fait quelconque de l'homme, qui cause à autrui un dommage, oblige celui par la faute duquel il est arrivé à le réparer."},{"op":"delete","text":" (ancien article 1382)"}],"unified":"@@ -1 +1 @@\n-Tout fait quelconque de l'homme, qui cause à autrui un dommage, oblige celui par la faute duquel il est arrivé à le réparer. (ancien article 1382)\n\\ No newline at end of file\n+Tout fait quelconque de l'homme, qui cause à autrui un dommage, oblige celui par la faute duquel il est arrivé à le réparer.\n\\ No newline at end of file\n"},"differs":true,"from":"2000-01-01","from_in_force":true,"from_version":{"date_debut":"1804-03-21","date_fin":"2016-10-01","etat":"modifie","version_id":"LEGIARTI000006419278"},"in_force_changed":false,"label":"Code civil, art. 1240","status_changed":true,"to":"2026-06-20","to_in_force":true,"to_version":{"date_debut":"2016-10-01","etat":"vigueur","version_id":"LEGIARTI000032041571"}},{"article":"17","celex":"32016R0679","changed":false,"coverage":{"complete":true},"diff":{"added":0,"changed":false,"removed":0,"segments":[],"unified":""},"differs":false,"from":"2018-05-25","from_in_force":true,"from_version":{"date_debut":"2018-05-25","etat":"vigueur","version_id":"32016R0679-art-17-v1"},"in_force_changed":false,"label":"Règlement (UE) 2016/679 (RGPD), art. 17 — Droit à l'effacement","status_changed":false,"to":"2026-06-20","to_in_force":true,"to_version":{"date_debut":"2018-05-25","etat":"vigueur","version_id":"32016R0679-art-17-v1"}}]},"provenance":{"fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"DILA — base LEGI ; EUR-Lex / Cellar — droit consolidé"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"changed":{"type":"boolean","description":"Whether the consolidated text differs between this reference's two dates (false when the same version is in force at both). When false the item's diff is returned empty — no segments, empty unified patch, zero counters: the article's text itself is sold by /legal/article?date="},"code":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why this reference could not be diffed, when 'complete' is false (unknown reference, no version at either date): the item stays a successful 200 carrying only its echo and its two dates — no diff is invented"}},"required":["complete"]},"diff":{"type":"object","properties":{"added":{"type":"integer"},"changed":{"type":"boolean"},"removed":{"type":"integer"},"segments":{"type":"array","items":{"type":"object","properties":{"op":{"type":"string","description":"Word-level diff operation for this segment: 'equal', 'insert' (present only at 'to') or 'delete' (present only at 'from')"},"text":{"type":"string"}},"required":["op","text"]}},"unified":{"type":"string"}},"required":["added","changed","removed","segments","unified"]},"differs":{"type":"boolean","description":"changed OR status_changed OR in_force_changed — the single field to filter on to monitor a portfolio of citations: it catches a rewritten text, a repeal that left the wording untouched, and a repeal that left the status untouched too"},"from":{"type":"string"},"from_in_force":{"type":"boolean"},"from_version":{"type":["object","null"],"properties":{"date_debut":{"type":"string"},"date_fin":{"type":"string"},"etat":{"type":"string"},"version_id":{"type":"string"},"continuity":{"type":"string"}},"required":["date_debut","etat","version_id"],"description":"Version in force at this reference's 'from' date, or null if none — the diff then shows a full insertion. 'date_fin' closes the version (absent while it is still open) and 'continuity' tells whether the article number kept designating the same text across the change ('same_article') or was renumbered ('renumbered') - French law only"},"in_force_changed":{"type":"boolean","description":"Whether the text stopped (or started) being the applicable law between this reference's two dates — the only flag that fires on a French-style repeal, where both dates resolve to the same version and both 'changed' and 'status_changed' stay false"},"label":{"type":"string"},"status_changed":{"type":"boolean","description":"Whether the legal status (etat) differs between this reference's two dates — true on a repeal that keeps the last known wording, where 'changed' stays false, and whenever only one of the two dates has a version at all"},"to":{"type":"string"},"to_in_force":{"type":"boolean"},"to_version":{"type":["object","null"],"properties":{"date_debut":{"type":"string"},"etat":{"type":"string"},"version_id":{"type":"string"},"continuity":{"type":"string"},"date_fin":{"type":"string"}},"required":["date_debut","etat","version_id"],"description":"Version retained at this reference's 'to' date, or null if none — the diff then shows a full deletion. 'date_fin' closes the version (absent while it is still open) and 'continuity' tells whether the article number kept designating the same text across the change ('same_article') or was renumbered ('renumbered') - French law only"},"celex":{"type":"string"},"coverage_window":{"type":"object","description":"Period over which this text or act is actually queryable: from (inclusive) and to (exclusive, null when open)"},"eli":{"type":"string"},"renumbering_suspected":{"type":"boolean","description":"Whether a renumbering break falls between this reference's two dates: the article number stopped designating one text and started designating another, so the diff describes a change that never happened. The diff itself is unchanged and this flag stays out of 'differs' — it is a warning about how to read the diff. Always false for EU law"}},"required":["coverage","from","to"]}}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"refs":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"}},"required":["from"]},"description":"Array of article references, French ({ code, article, from, to? }) and EU ({ celex or eli, article?, from, to? }, e.g. eli=reg/2016/679/oj or the full URI http://data.europa.eu/eli/reg/2016/679/oj) mixed freely, each diffed between its own two dates. Dates use the strict ISO calendar format YYYY-MM-DD (zero-padded), and an item whose 'from' is after its 'to' is rejected with 400 INVALID_RANGE quoting its index rather than billed. Covered corpus — French law (Légifrance LEGI): Code civil, Code du travail, Code de commerce, Code pénal, Code de la consommation, Code général des impôts (CGI), Code de la sécurité sociale, Code monétaire et financier, Code de l'environnement, Code de la propriété intellectuelle, Code des assurances, plus the Data Protection Act (loi 78-17); EU law (EUR-Lex): GDPR, eIDAS, the e-Commerce Directive, the DSM copyright Directive, DSA, DMA, AI Act, MiCA and NIS2"}},"required":["refs"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/legal-diff-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Diff a list of laws between two dates","tags":["legal"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":50,"unitField":"refs"}}},{"resource":{"url":"https://api.invoket.com/legal/deadline","description":"Before your agent commits to a filing date, a notice period or a contractual term: the exact due date of a time limit under an explicitly chosen computation regime — calendar days, calendar days with rollover, business days (Mon-Sat), working days (Mon-Fri), clear days (jours francs), months or years — with every weekend and public holiday it skipped, each one named, the end-of-month and next-working-day rules it applied, and the step-by-step reasoning. Holiday calendars for 10 countries: France from the official State dataset, the nine others from a community reference dataset, and every answer says which authority it used. The regime is required and never inferred from the legal matter.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"country":"FR","duration":"5","regime":"working_days","start":"2026-05-06"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"country":{"type":"string","description":"Optional only for the 'calendar_days' regime: ISO 3166-1 alpha-2 code of the holiday calendar to use, required by every regime except 'calendar_days'. Covered: FR (official calendar published by the French State), plus BE, DE, ES, IE, IT, LU, NL, PL and PT (community reference dataset). Any other code is refused with 400 COUNTRY_NOT_COVERED listing the covered ones — a deadline is never computed on a guessed calendar. An optional 'subdivision' selects a regional calendar: FR-ALSACE-MOSELLE, FR-BL, FR-GF, FR-GP, FR-MF, FR-MQ, FR-NC, FR-PF, FR-PM, FR-RE, FR-WF, FR-YT"},"duration":{"type":"string","description":"Length of the term, a positive integer. Its unit follows from the regime (days, months or years) and is bounded: 3650 days, 120 months, 10 years"},"regime":{"type":"string","description":"Computation regime, REQUIRED and never inferred from the legal matter — one of seven closed values. 'calendar_days': every day counts, no rollover (2026-05-06 + 5 = 2026-05-11). 'calendar_days_with_rollover': same count, due date pushed to the next working day when it falls on a weekend or public holiday. 'business_days': Monday to Saturday, public holidays excluded. 'working_days': Monday to Friday, public holidays excluded (2026-05-06 + 5 = 2026-05-15). 'clear_days' (jours francs): neither the day of the act nor the due day counts, then rollover. 'months': same day-of-month, end-of-month rule then rollover (2026-01-31 + 1 month = 2026-02-28, a Saturday, rolled over to 2026-03-02). 'years': the same rules in years. Every regime except 'calendar_days' consults a holiday calendar and therefore requires 'country'"},"start":{"type":"string","description":"Date of the act that starts the term, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-05-06, not 2026-5-6)"}},"required":["duration","regime","start"]}},"output":{"type":"json","example":{"data":{"calendar":{"as_of":"2026-07-28","authority":"official","country":"FR","window":{"from":"2015-01-01","to":"2029-12-31"}},"calendar_consulted":true,"days_counted":5,"due_date":"2026-05-15","duration":5,"legal_basis":[{"article":"641","available_in_corpus":false,"code":"code-de-procedure-civile","jurisdiction":"FR","rule":"the day of the act is not counted; a term expressed in months or years expires on the day bearing the same day-of-month"},{"article":"642","available_in_corpus":false,"code":"code-de-procedure-civile","jurisdiction":"FR","rule":"a term expiring on a Saturday, a Sunday, a public holiday or a non-working day is extended to the next working day"}],"legal_basis_note":"text `code-de-procedure-civile` is not part of the ingested corpus today: the citation is exact, but `/legal/article` cannot serve its text yet","limits":["The computation regime is chosen by the caller and never inferred from the legal matter: this endpoint dates a term, it does not advise which term or which regime applies.","Computation is in civil days, without time of day: hourly time limits, court closing hours, judicial vacations and non-working days set by contract or collective agreement are out of scope.","Holiday calendars carry their own authority: `official` is the calendar published by the State, `community_dataset` is an open dataset used as a reference and has no official standing."],"regime":"working_days","rollover_applied":false,"skipped_days":[{"date":"2026-05-08","kind":"public_holiday","name":"Victory in Europe Day","name_local":"8 mai"},{"date":"2026-05-09","kind":"weekend","name":"Sat"},{"date":"2026-05-10","kind":"weekend","name":"Sun"},{"date":"2026-05-14","kind":"public_holiday","name":"Ascension Day","name_local":"Ascension"}],"start_date":"2026-05-06","start_date_effective":"2026-05-07","steps":["day of the act 2026-05-06 is not counted (art. 641 CPC): counting starts on the next day","5 working days (Monday to Friday, public holidays excluded) counted: 2026-05-07 to 2026-05-15, 4 day(s) skipped","regime `working_days` applies no rollover: due date stands at 2026-05-15"],"unit":"days"},"provenance":{"fetched_at":"2026-07-28T09:30:00Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"official-holiday-calendars"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"calendar":{"type":"object","properties":{"as_of":{"type":"string"},"authority":{"type":"string","description":"Authority of the holiday calendar actually used: 'official' — published by the State, today France only (api.gouv.fr / Etalab) — or 'community_dataset' — an open reference dataset (Nager.Date) with no official standing. Carried on every answer: a community dataset never silently becomes published law"},"country":{"type":"string"},"window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"],"description":"Period the loaded calendar actually covers, both bounds INCLUSIVE and derived from the calendar years actually loaded, never declared: whole years, from 1 January of the first covered year to 31 December of the last one, so an ordinary late-December day with no holiday in it is covered like any other. A year with no holiday loaded is not covered and stops the window there. A start or due date outside the window returns 404 OUT_OF_COVERAGE_WINDOW (not billed): days whose holiday status is unknown are never counted"},"subdivision":{"type":"string"}},"required":["authority","country","window"]},"calendar_consulted":{"type":"boolean"},"days_counted":{"type":"integer","description":"Number of days that actually counted toward the term. Absent for the months and years regimes, where nothing is counted in days"},"due_date":{"type":"string"},"duration":{"type":"integer"},"legal_basis":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"available_in_corpus":{"type":"boolean","description":"Whether /legal/article can serve the text of this cited article today. The citation is exact either way; false only says the ingested corpus does not carry that code yet, and 'legal_basis_note' says so"},"code":{"type":"string"},"jurisdiction":{"type":"string"},"rule":{"type":"string"}},"required":["article","available_in_corpus","code","jurisdiction","rule"]}},"legal_basis_note":{"type":"string"},"limits":{"type":"array","items":{"type":"string"}},"regime":{"type":"string"},"rollover_applied":{"type":"boolean","description":"Whether the due date was postponed to the next working day (article 642 of the French Code de procédure civile), with 'rollover_reason' naming the day that caused it. Applies to the rollover, clear-days, months and years regimes — never to plain 'calendar_days'"},"skipped_days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"kind":{"type":"string","description":"Why this day was skipped: 'weekend' or 'public_holiday'. Public holidays carry their published label in 'name' (English) and 'name_local'"},"name":{"type":"string"},"name_local":{"type":"string"}},"required":["date","kind","name"]}},"start_date":{"type":"string"},"start_date_effective":{"type":"string","description":"First day actually counted, after the start-day rule (article 641 of the French Code de procédure civile: the day of the act is not counted). Equal to 'start' for the months and years regimes, whose day-of-month is the anchor of the computation"},"steps":{"type":"array","items":{"type":"string"},"description":"The computation step by step, in order, so the due date can be reproduced by hand. A step cites an article ONLY where the service has computation rules on record — today France alone (articles 641 and 642 of the Code de procédure civile). For any other country, and when no country is given, the same steps are served WITHOUT any citation, exactly as 'legal_basis' is then empty and explained by 'legal_basis_note': the regime you chose was applied to the requested holiday calendar as such. A missing citation says nothing about the dates, which are computed identically either way — it only means the service does not attach that computation to a national rule it carries"},"unit":{"type":"string"},"rollover_reason":{"type":"string","description":"Day that caused the due date to be postponed (weekend or named public holiday), present only when 'rollover_applied' is true"}},"required":["calendar_consulted","due_date","duration","legal_basis","limits","regime","rollover_applied","skipped_days","start_date","start_date_effective","steps","unit"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"country":{"type":"string","description":"Optional only for the 'calendar_days' regime: ISO 3166-1 alpha-2 code of the holiday calendar to use, required by every regime except 'calendar_days'. Covered: FR (official calendar published by the French State), plus BE, DE, ES, IE, IT, LU, NL, PL and PT (community reference dataset). Any other code is refused with 400 COUNTRY_NOT_COVERED listing the covered ones — a deadline is never computed on a guessed calendar. An optional 'subdivision' selects a regional calendar: FR-ALSACE-MOSELLE, FR-BL, FR-GF, FR-GP, FR-MF, FR-MQ, FR-NC, FR-PF, FR-PM, FR-RE, FR-WF, FR-YT"},"duration":{"type":"string","description":"Length of the term, a positive integer. Its unit follows from the regime (days, months or years) and is bounded: 3650 days, 120 months, 10 years"},"regime":{"type":"string","description":"Computation regime, REQUIRED and never inferred from the legal matter — one of seven closed values. 'calendar_days': every day counts, no rollover (2026-05-06 + 5 = 2026-05-11). 'calendar_days_with_rollover': same count, due date pushed to the next working day when it falls on a weekend or public holiday. 'business_days': Monday to Saturday, public holidays excluded. 'working_days': Monday to Friday, public holidays excluded (2026-05-06 + 5 = 2026-05-15). 'clear_days' (jours francs): neither the day of the act nor the due day counts, then rollover. 'months': same day-of-month, end-of-month rule then rollover (2026-01-31 + 1 month = 2026-02-28, a Saturday, rolled over to 2026-03-02). 'years': the same rules in years. Every regime except 'calendar_days' consults a holiday calendar and therefore requires 'country'"},"start":{"type":"string","description":"Date of the act that starts the term, strict ISO calendar format YYYY-MM-DD (zero-padded: 2026-05-06, not 2026-5-6)"}},"required":["duration","regime","start"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/legal-deadline","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Compute a legal deadline date","tags":["legal"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/legal/transposition","description":"Before your agent relies on an EU directive producing effects in a Member State: in force, applicable and transposed are three different things. This returns the national implementing measures a Member State has notified to the European Commission for an EU act — each measure with its national act type, title, national reference, publication and notification dates — plus the published transposition deadline and how many days the first notification came after it (positive means late). Ask for one country, or omit it for a one-line verdict on each of the 30 EEA States. What is served is a register of notifications, never an assessment of conformity.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"celex":"32019L0790","country":"FR"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"celex":{"type":"string","description":"CELEX identifier of the EU act, e.g. 32019L0790 (DSM copyright Directive). Covered acts, the same selective corpus as /legal/eu-act: 32000L0031 (e-Commerce), 32014R0910 (eIDAS), 32016R0679 (GDPR), 32019L0790 (DSM copyright), 32022L2555 (NIS2), 32022R1925 (DMA), 32022R2065 (DSA), 32023R1114 (MiCA), 32024R1689 (AI Act). Any other CELEX returns 404 (not billed) listing these"},"country":{"type":"string","description":"Optional. ISO 3166-1 alpha-2 code of the Member State. Given: its status, the measures it notified and its gap to the deadline. Omitted: a one-line summary (country, status, measure count) for each of the 30 EEA States — the EU-27 plus IS, LI and NO — plus any non-EEA State that actually notified measures for this act (the United Kingdom carries some, from before its withdrawal: silencing them would make the total lie). A non-EEA code the corpus knows but that notified nothing for the requested act is answered 'out_of_scope' (200), not refused; a code no act covers is refused with 400 listing the countries supported for that act"}},"required":["celex"]}},"output":{"type":"json","example":{"data":{"act":{"act_type":"directive","celex":"32019L0790","transposition_deadline":"2021-06-07","transposition_deadlines":["2021-06-07"]},"country":"FR","deadline_gap_days":-587,"first_measure_notified_on":"2019-10-29","limits":["Measures are those notified to the European Commission by the Member State; this is a register of notifications, not an assessment of conformity or completeness.","`no_measures_notified` means nothing is recorded for this act; it does not mean the directive is untransposed in national law, which may transpose it through pre-existing or unnotified provisions.","Direct effect (vertical), consistent interpretation and State liability are out of scope: an untransposed directive is not without legal effect, and this endpoint draws no conclusion on national applicability.","Country coverage follows the addressees of each act: a non-EEA country carrying no measure for the requested act is served as `out_of_scope`. Enlargements and withdrawals (Brexit) are not reconstructed act by act, so a current Member State is never reported out of scope even where it predates its own accession."],"measure_count":8,"measures":[{"celex_ntm":"72019L0790FRA_278035","national_act_type":"Loi","national_ref":"MICX1902858L","notified_on":"2019-10-29","publication_date":"2019-07-26","title":"LOI no 2019-775 du 24 juillet 2019 tendant à créer un droit voisin au profit des agences de presse et des éditeurs de presse (1)"},{"celex_ntm":"72019L0790FRA_202103614","national_act_type":"Ordonnance","national_ref":"MICB2106674R","notified_on":"2021-08-02","publication_date":"2021-05-13","title":"Ordonnance n° 2021-580 du 12 mai 2021 portant transposition du 6 de l'article 2 et des articles 17 à 23 de la directive 2019/790 (NOR : MICB2106674R) JORF n°0111 du 13 mai 2021"}],"status":"measures_notified"},"provenance":{"fetched_at":"2026-07-28T09:30:00Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"eur-lex-ntm"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"act":{"type":"object","properties":{"act_type":{"type":"string"},"celex":{"type":"string"},"transposition_deadline":{"type":["string","null"],"description":"Published transposition deadline, the earliest one when the act carries several — NIS2 publishes two (2024-10-17 and 2024-10-18), both listed in 'transposition_deadlines'. null for an act that publishes none"},"transposition_deadlines":{"type":"array","items":{"type":"string"}},"title":{"type":"string"}},"required":["act_type","celex","transposition_deadline","transposition_deadlines"]},"country":{"type":"string"},"deadline_gap_days":{"type":"integer","description":"Days between the transposition deadline and the earliest notified measure: POSITIVE means notified after the deadline (late), negative means before it. null as soon as either date is missing — never estimated, and a national publication date is never substituted for a notification date"},"first_measure_notified_on":{"type":"string"},"limits":{"type":"array","items":{"type":"string"}},"measure_count":{"type":"integer"},"measures":{"type":"array","items":{"type":"object","properties":{"celex_ntm":{"type":"string"},"national_act_type":{"type":"string"},"national_ref":{"type":"string","description":"National reference as notified (French NOR, national official journal number…), null when the Member State published none"},"notified_on":{"type":"string","description":"Date the Member State notified this measure to the Commission — the date this endpoint reasons on. Distinct from 'publication_date', the national official journal publication, which may be years earlier when a pre-existing act is notified as transposing"},"publication_date":{"type":"string"},"title":{"type":"string"},"link":{"type":"string"}},"required":["celex_ntm","title"]}},"status":{"type":"string","description":"State of the notification register for this act and country, a closed enumeration: 'measures_notified' (at least one national measure recorded), 'no_measures_notified' (an act subject to transposition, nothing recorded for this country), 'not_applicable' (an act carrying no transposition obligation — a regulation or a decision — and nothing notified), 'out_of_scope' (a non-EEA country carrying no measure for this act: it was not an addressee, so the absence is an absence of obligation, not an absence of transposition — GB on NIS2 for instance, while GB on the 2000 e-Commerce Directive stays 'measures_notified'). None of the four concludes on national law. A regulation CAN carry national implementing measures (MiCA carries 95 across 27 States) and is then reported as 'measures_notified' like any other act"},"status_reason":{"type":"string"},"summary":{"type":"array","description":"One line per EEA State — { country, status, measure_count } — returned INSTEAD of status/measures/first_measure_notified_on/deadline_gap_days when the request omits 'country'"}},"required":["act","limits","measure_count"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"celex":{"type":"string","description":"CELEX identifier of the EU act, e.g. 32019L0790 (DSM copyright Directive). Covered acts, the same selective corpus as /legal/eu-act: 32000L0031 (e-Commerce), 32014R0910 (eIDAS), 32016R0679 (GDPR), 32019L0790 (DSM copyright), 32022L2555 (NIS2), 32022R1925 (DMA), 32022R2065 (DSA), 32023R1114 (MiCA), 32024R1689 (AI Act). Any other CELEX returns 404 (not billed) listing these"},"country":{"type":"string","description":"Optional. ISO 3166-1 alpha-2 code of the Member State. Given: its status, the measures it notified and its gap to the deadline. Omitted: a one-line summary (country, status, measure count) for each of the 30 EEA States — the EU-27 plus IS, LI and NO — plus any non-EEA State that actually notified measures for this act (the United Kingdom carries some, from before its withdrawal: silencing them would make the total lie). A non-EEA code the corpus knows but that notified nothing for the requested act is answered 'out_of_scope' (200), not refused; a code no act covers is refused with 400 listing the countries supported for that act"}},"required":["celex"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/legal-transposition","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check how an EU directive was transposed","tags":["legal"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/climate/point","description":"Before your agent verifies a weather-dependent claim, backtests a parametric trigger or checks what conditions a site or shipment faced: daily 2 m temperature, total precipitation and 10 m wind at any GPS point or city for a past date, from the Copernicus ERA5 reanalysis — temperature and precipitation cover a rolling 30-year window, wind a rolling ~5-year window — with the served grid cell and a coverage flag.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"city":"Monaco","date":"2022-07-14"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"city":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"date":{"type":"string","description":"Calendar day (YYYY-MM-DD) within the ingested ERA5 window: rolling 30 years for temperature and precipitation, rolling ~5 years for wind (a deep date returns the covered families and flags the rest via coverage); a date outside the widest window returns 400 with the covered range"}},"required":["date"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"date":"2022-07-14","grid":{"distance_km":6.47,"lat":43.75,"lon":7.5},"lat":43.73718,"location":{"admin1":"00","country":"MC","lat":43.73718,"lon":7.42145,"name":"Monaco","source":"GeoNames"},"lon":7.42145,"precipitation":{"total_mm":0.25},"temperature":{"celsius":25.03},"wind":{"direction_deg":208.3,"speed_ms":0.71}},"provenance":{"dataset":"era5","fetched_at":"2026-07-03T22:06:21Z","freshness":{"as_of":"2022-07-14T00:00:00Z","kind":"snapshot"},"source":"ERA5"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Which requested family could not be served for this point and date, present when 'complete' is false — typically wind on a date deeper than its rolling ~5-year window, where the block is served with null values rather than extrapolated"}},"required":["complete"]},"date":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"location":{"type":"object","properties":{"admin1":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"source":{"type":"string"}},"required":["admin1","country","lat","lon","name","source"],"description":"Echo of the resolved place when city=/location= was used: name, ISO country, admin1 code and the exact GeoNames coordinates the lookup was served at"},"lon":{"type":"number"},"precipitation":{"type":"object","properties":{"total_mm":{"type":["number","null"]}},"required":["total_mm"]},"temperature":{"type":"object","properties":{"celsius":{"type":["number","null"]}},"required":["celsius"]},"wind":{"type":"object","properties":{"direction_deg":{"type":["number","null"],"description":"Meteorological direction of the daily-mean wind vector (resultant direction, degrees, where the wind comes from: 0 = north, 90 = east)"},"speed_ms":{"type":["number","null"],"description":"Daily-mean wind vector: speed of the mean 10 m vector (m/s), computed from ERA5 daily means of the u/v components — lower than the day's mean wind speed whenever direction varies during the day (components cancel); not a mean of instantaneous speeds"}},"required":["direction_deg","speed_ms"]}},"required":["coverage","date","lat","lon"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"city":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"date":{"type":"string","description":"Calendar day (YYYY-MM-DD) within the ingested ERA5 window: rolling 30 years for temperature and precipitation, rolling ~5 years for wind (a deep date returns the covered families and flags the rest via coverage); a date outside the widest window returns 400 with the covered range"}},"required":["date"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/climate-point","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get historical weather for a location","tags":["climate"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/weather/forecast","description":"Before your agent schedules a delivery, plans outdoor work or hedges short-term weather exposure: a point forecast of 2 m temperature, precipitation and 10 m wind — plus opt-in convective, humidity, cloud and snow variables — for any GPS point or city. Deterministic NOAA GFS at 0.25 deg to 16 days (384 h), NOAA GEFS ensemble mean at 0.5 deg to 35 days (840 h) — beyond 16 days the value is an ensemble mean with smoothed extremes: trend, not threshold triggers. The lead selector is optional (omitted, the forecast defaults to the current analysis time) and the response names the model that served it and the exact forecast step.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"city":"Zurich","horizon_h":"24","variables":"temperature,precipitation,wind,convective,humidity,clouds,snow"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"city":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"horizon_h":{"type":"string","description":"Optional. Forecast lead time in hours from the analysis cycle, 0-840 (35 days). Up to 384 h served from the deterministic GFS 0.25 deg run; beyond 384 h from the GEFS ensemble mean at 0.5 deg (an average of 31 members, not a single deterministic scenario: smoothed extremes, so trend rather than threshold triggers). If the target falls beyond the window currently available (its exact end shifts with ingestion cycles), the request is served at the latest available step and the response sets lead.clamped=true with the valid_time actually served. Alternatives (at most one of the three; all omitted defaults to the current analysis time, horizon_h=0): valid_time (RFC 3339 instant — never clamped, out-of-window returns 400) or date (YYYY-MM-DD calendar day, served at 12:00 UTC that day; weekday names like 'Wednesday' are rejected with a 400 that spells out the expected format)."},"variables":{"type":"string","description":"Optional. Comma-separated selector of the variable families to return; defines the exact set served (omit it for the default temperature,precipitation,wind). Base families: temperature, precipitation, wind. Opt-in families from the deterministic GFS (<= 384 h only): convective (surface CAPE/CIN plus a qualitative convective_risk — an instability proxy for thunderstorm/hail risk, NOT a calibrated hail probability), humidity (2 m relative humidity), clouds (total cloud cover), snow (snow depth on the ground and whether precipitation is falling as snow). An opt-in family requested beyond 384 h, or missing at the grid cell, is served as a null block with coverage.complete=false naming it — never extrapolated."}},"required":[]}},"output":{"type":"json","example":{"data":{"clouds":{"total_cover_pct":35.0},"convective":{"cape_jkg":640.0,"cin_jkg":-18.0,"inhibited":false,"risk":"low"},"coverage":{"complete":true},"grid":{"distance_km":12.8,"lat":47.25,"lon":8.5},"horizon_h":24,"humidity":{"relative_pct":58.0},"lat":47.36667,"lead":{"cycle":"2026-07-05T00:00:00+00:00","horizon_h":24,"step_time":"2026-07-06T00:00:00+00:00","valid_time":"2026-07-06T00:00:00+00:00"},"location":{"admin1":"ZH","country":"CH","lat":47.36667,"lon":8.55,"name":"Zürich","source":"GeoNames"},"lon":8.55,"precipitation":{"total_mm":0.0},"snow":{"depth_m":0.0,"is_snow":false},"temperature":{"celsius":22.8},"wind":{"direction_deg":215.0,"speed_ms":2.7}},"provenance":{"dataset":"gfs","fetched_at":"2026-07-05T04:35:00Z","freshness":{"kind":"live"},"source":"GFS"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"clouds":{"type":"object","properties":{"total_cover_pct":{"type":["number","null"],"description":"Total (whole-column) cloud cover in percent; null when unavailable at the grid cell"}},"required":["total_cover_pct"]},"convective":{"type":"object","properties":{"cape_jkg":{"type":["number","null"],"description":"Surface-based Convective Available Potential Energy in J/kg (raw GFS value); null when unavailable at the grid cell or beyond the deterministic window"},"cin_jkg":{"type":["number","null"],"description":"Convective Inhibition in J/kg (raw, negative or zero); a strong cap suppresses convection despite high CAPE. Secondary: null CIN alone does not degrade coverage"},"inhibited":{"type":["boolean","null"],"description":"True when CIN <= -100 J/kg (a strong cap likely to suppress convection despite instability); reported separately, it never changes the risk category. null when CIN is unavailable"},"risk":{"type":["string","null"],"description":"Qualitative instability proxy derived from surface CAPE — an instability/thunderstorm-hail-risk proxy, NOT a calibrated hail probability (hail also needs shear, freezing level…). Scale (NWS/SPC conventions, J/kg): none [<100), low [100,1000), moderate [1000,2500), high [2500,4000), extreme [>=4000). null when CAPE is unavailable"}},"required":["cape_jkg","cin_jkg","inhibited","risk"]},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Which requested family could not be served for this point and step, present when 'complete' is false — the block is then served with null values rather than extrapolated"}},"required":["complete"]},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"horizon_h":{"type":"integer","description":"Echo of the requested lead time in hours, always counted from the deterministic GFS cycle. Beyond 384 h the answer comes from the GEFS 00Z cycle, structurally one cycle behind, so lead.horizon_h counts more hours from that cycle for the same instant: compare lead.valid_time, not the two horizon counts."},"humidity":{"type":"object","properties":{"relative_pct":{"type":["number","null"],"description":"2 m relative humidity in percent; null when unavailable at the grid cell"}},"required":["relative_pct"]},"lat":{"type":"number"},"lead":{"type":"object","properties":{"cycle":{"type":"string"},"horizon_h":{"type":"integer"},"step_time":{"type":"string"},"valid_time":{"type":"string"},"clamped":{"type":"boolean"},"step_offset_secs":{"type":"integer"}},"required":["cycle","horizon_h","valid_time"],"description":"Resolved lead: analysis cycle, requested instant, lead hours, and the exact forecast step served; clamped=true when horizon_h was reduced to the latest available step. horizon_h here is recounted from the cycle that served the data (see data.horizon_h). step_offset_secs (signed seconds, step_time minus valid_time, present only when non-zero) is how far the served step sits from the instant asked for: a step covers the interval that follows it, so an unaligned instant is served by the preceding step — up to 4 h on the 6-hourly GEFS tail. Never interpolated between steps; coverage.reason spells the gap out and coverage.complete stays true."},"location":{"type":"object","properties":{"admin1":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"source":{"type":"string"}},"required":["admin1","country","lat","lon","name","source"],"description":"Echo of the resolved place when city=/location= was used: name, ISO country, admin1 code and the exact GeoNames coordinates the lookup was served at"},"lon":{"type":"number"},"precipitation":{"type":"object","properties":{"total_mm":{"type":["number","null"],"description":"Forecast precipitation for the served step (mm). Beyond 384 h (dataset=gefs) every value served — this one, temperature and wind alike — is a ~30-member ensemble mean: averaging spreads rain across members, so heavy-rain steps and dry steps are largely absent (tail measured 0.4-1.8 mm/day vs 0.0-13.1 on the deterministic segment). Never build a threshold trigger on that range; dataset=gfs is the segment that resolves extremes."}},"required":["total_mm"]},"snow":{"type":"object","properties":{"depth_m":{"type":["number","null"],"description":"Snow depth on the ground in metres (state, SNOD); distinct from is_snow. null when unavailable at the grid cell"},"is_snow":{"type":["boolean","null"],"description":"Whether precipitation at the served step is falling as snow (GFS categorical CSNOW); distinct from depth_m. null when unavailable at the grid cell"}},"required":["depth_m","is_snow"]},"temperature":{"type":"object","properties":{"celsius":{"type":["number","null"]}},"required":["celsius"]},"wind":{"type":"object","properties":{"direction_deg":{"type":["number","null"]},"speed_ms":{"type":["number","null"]}},"required":["direction_deg","speed_ms"]},"date":{"type":"string"},"valid_time":{"type":"string"}},"required":["coverage","grid","lat","lead","lon"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the model that served the response, one of: gfs (deterministic NOAA GFS 0.25 deg, <= 384 h), gefs (NOAA GEFS ensemble mean 0.5 deg, beyond 384 h). Branch on this field rather than parsing provenance.source, which carries the human-readable label (the GEFS label spells out that it is an ensemble mean) whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string","description":"Human-readable label of the model that served the response: 'GFS' (deterministic, 0.25 deg, <= 384 h) or 'NOAA GEFS ensemble mean (35-day, 0.5 deg)' beyond — the label spells out that the long-range answer is an ensemble mean, not a deterministic scenario. Written for humans, its exact wording is not part of the contract: branch on provenance.dataset."}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"city":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"horizon_h":{"type":"string","description":"Optional. Forecast lead time in hours from the analysis cycle, 0-840 (35 days). Up to 384 h served from the deterministic GFS 0.25 deg run; beyond 384 h from the GEFS ensemble mean at 0.5 deg (an average of 31 members, not a single deterministic scenario: smoothed extremes, so trend rather than threshold triggers). If the target falls beyond the window currently available (its exact end shifts with ingestion cycles), the request is served at the latest available step and the response sets lead.clamped=true with the valid_time actually served. Alternatives (at most one of the three; all omitted defaults to the current analysis time, horizon_h=0): valid_time (RFC 3339 instant — never clamped, out-of-window returns 400) or date (YYYY-MM-DD calendar day, served at 12:00 UTC that day; weekday names like 'Wednesday' are rejected with a 400 that spells out the expected format)."},"variables":{"type":"string","description":"Optional. Comma-separated selector of the variable families to return; defines the exact set served (omit it for the default temperature,precipitation,wind). Base families: temperature, precipitation, wind. Opt-in families from the deterministic GFS (<= 384 h only): convective (surface CAPE/CIN plus a qualitative convective_risk — an instability proxy for thunderstorm/hail risk, NOT a calibrated hail probability), humidity (2 m relative humidity), clouds (total cloud cover), snow (snow depth on the ground and whether precipitation is falling as snow). An opt-in family requested beyond 384 h, or missing at the grid cell, is served as a null block with coverage.complete=false naming it — never extrapolated."}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/weather-forecast","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a weather forecast for a location","tags":["weather"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/weather/forecast/daily","description":"Before your agent plans a multi-day operation — logistics, construction, an event, crop work: a day-by-day forecast for any GPS point or city, with daily minimum and maximum 2 m temperature, total precipitation and peak 10 m wind per UTC calendar day, from today to the end of the NOAA GFS window (~16 days), extendable to 35 days on the NOAA GEFS ensemble mean — those extra days are an average of ~30 members, so their extremes are smoothed: trend, not threshold triggers. Each day names the model that served it and carries a coverage flag.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"days":"3","lat":"43.7031","lon":"7.2661"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"days":{"type":"string","description":"Optional. Number of UTC calendar days to return, 1-35, starting today. Defaults to 16 — the deterministic GFS window; ask for more explicitly to reach the GEFS ensemble-mean tail, whose smoothed extremes answer trend questions rather than threshold triggers. Alternative to lat+lon: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) resolved via the embedded GeoNames gazetteer and echoed back as data.location."},"lat":{"type":"string"},"lon":{"type":"string"}},"required":[]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"days":[{"coverage":{"complete":true},"dataset":"gfs","date":"2026-07-04","precipitation_sum_mm":0.4,"source":"GFS","steps_used":8,"temperature_max_c":27.8,"temperature_min_c":21.4,"wind_speed_max_ms":6.2},{"coverage":{"complete":true},"dataset":"gfs","date":"2026-07-05","precipitation_sum_mm":1.4,"source":"GFS","steps_used":8,"temperature_max_c":29.3,"temperature_min_c":22.1,"wind_speed_max_ms":5.1},{"coverage":{"complete":true},"dataset":"gfs","date":"2026-07-06","precipitation_sum_mm":0.0,"source":"GFS","steps_used":8,"temperature_max_c":28.6,"temperature_min_c":22.8,"wind_speed_max_ms":4.7}],"from":"2026-07-04","grid":{"distance_km":5.9,"lat":43.75,"lon":7.25},"lat":43.7031,"lead":{"cycle":"2026-07-04T00:00:00+00:00"},"lon":7.2661,"to":"2026-07-06"},"provenance":{"dataset":"gfs","fetched_at":"2026-07-04T06:05:00Z","freshness":{"kind":"live"},"source":"GFS"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why the series is incomplete, present when 'complete' is false — a partial day or a grid cell without data; per-day detail sits in data.days[].coverage"}},"required":["complete"]},"days":{"type":"array","items":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string"}},"required":["complete"],"description":"Per-day coverage: complete=false for partial days (day 0 from the cycle hour, the truncated last day of the window) or a grid cell with no data, values then null and never invented"},"dataset":{"type":"string","description":"Stable machine identifier of the model that served this day: gfs or gefs. Makes the deterministic/ensemble boundary readable day by day without parsing the label in data.days[].source."},"date":{"type":"string"},"precipitation_sum_mm":{"type":["number","null"],"description":"Daily total precipitation (mm), reconstructed from the model's disjoint accumulation buckets (0-3 h, 0-6 h, 6-9 h ...) — never a naive sum of overlapping buckets. On days served by the GEFS ensemble mean (dataset=gefs, beyond ~16 days) it is an average over ~30 members: averaging spreads rain across them, so heavy-rain days AND fully dry days are largely absent — measured at Paris on 2026-07-25, the 19-day ensemble tail stayed within 0.4-1.8 mm/day while the deterministic days ranged 0.0-13.1 mm/day. Use those days for trend, never for a threshold trigger (a 'more than 30 mm in a day' or 'dry day' rule will essentially never fire); the deterministic GFS days are the ones that resolve extremes."},"source":{"type":"string","description":"Human-readable label of the model that served this day: 'GFS' (deterministic 0.25 deg, <= 384 h); 'NOAA GEFS ensemble mean (35-day, 0.5 deg)' beyond, when that window is served — an ensemble-mean day averages ~30 members, so its extremes are smoothed (see data.days[].precipitation_sum_mm). Its wording is not part of the contract — branch on data.days[].dataset instead."},"steps_used":{"type":"integer"},"temperature_max_c":{"type":["number","null"]},"temperature_min_c":{"type":["number","null"],"description":"Daily minimum 2 m temperature (deg C), derived from the 3-hourly forecast steps (subsampled; native GRIB TMIN/TMAX fields are roadmap). Same for temperature_max_c. On days served by the GEFS ensemble mean (dataset=gefs, beyond ~16 days) both are averages over ~30 members and the daily range collapses towards the climatological average — measured at Paris on 2026-07-25, the max spanned 25.3-27.9 deg C over the 19-day tail against 21.2-40.5 deg C on the deterministic days: trend, not threshold triggers."},"wind_speed_max_ms":{"type":["number","null"],"description":"Peak 10 m wind speed over the day (m/s), max of the 3-hourly forecast steps. On days served by the GEFS ensemble mean (dataset=gefs, beyond ~16 days) it is an average over ~30 members: gusty peaks are smoothed away — trend, not threshold triggers."}},"required":["coverage","dataset","date","source","steps_used"]},"description":"One entry per UTC calendar day, in date order: daily min/max temperature, total precipitation, max wind, the model that served it and how many forecast steps fed it"},"from":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"lead":{"type":"object","properties":{"cycle":{"type":"string"}},"required":["cycle"]},"lon":{"type":"number"},"to":{"type":"string"},"location":{"type":"object","description":"Echo of the resolved place when city=/location= was used — name, ISO country, admin1 code and the exact GeoNames coordinates the series was served at; absent when lat/lon were passed directly"}},"required":["coverage","days","from","lat","lead","lon","to"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the model(s) that served the series: gfs, gefs, or gfs+gefs when the range spans both (the per-day boundary is readable in data.days[].dataset). Branch on this field rather than parsing provenance.source, which joins the human-readable labels."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"days":{"type":"string","description":"Optional. Number of UTC calendar days to return, 1-35, starting today. Defaults to 16 — the deterministic GFS window; ask for more explicitly to reach the GEFS ensemble-mean tail, whose smoothed extremes answer trend questions rather than threshold triggers. Alternative to lat+lon: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) resolved via the embedded GeoNames gazetteer and echoed back as data.location."},"lat":{"type":"string"},"lon":{"type":"string"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/weather-forecast-daily","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a day-by-day forecast for a location","tags":["weather"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/weather/forecast/batch","description":"Before your agent plans across a whole network — fleet routing, multi-site operations, portfolio hedging: 2 m temperature, precipitation and 10 m wind forecasts for up to 500 point + lead-time queries in one call, from the deterministic NOAA GFS run (~16 days). Each query takes lat+lon or a city name plus an optional lead selector (omitted, it defaults to the current analysis time); an uncovered item is flagged via per-item coverage instead of failing the batch.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"queries":[{"city":"Medellin","horizon_h":24},{"horizon_h":72,"lat":25.2854,"lon":51.531},{"lat":19.4326,"lon":-99.1332,"valid_time":"2026-09-01T12:00:00Z"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"queries":{"type":"array","items":{"type":"object","properties":{"city":{"type":"string","description":"Optional. Per item, resolve the point from a place name instead of lat + lon (alias location; optional country as ISO-3166 alpha-2 to disambiguate). Ambiguous names resolve to the most populated match; the resolved place is echoed back per item as output...results[].location. An unknown city degrades that item (coverage.complete=false) without failing the batch. Giving both a city and lat/lon on one item degrades that item as ambiguous."},"horizon_h":{"type":"integer","description":"Optional. Per item, at most one lead selector: horizon_h (hours from the analysis cycle), valid_time (RFC 3339 instant) or date (YYYY-MM-DD, served at 12:00 UTC). All omitted defaults to the current analysis time (horizon_h=0). Two forms on one item is a 400 citing the item index."}},"required":[]},"description":"Array of point/lead-time queries resolved in one settlement. Its length is priced per unit (base + N x unit), capped at 500; a batch over 500 is rejected with 400. Each item takes a point (lat + lon, or a city name) and at most one lead selector (omitted = current analysis time)."}},"required":["queries"]}},"output":{"type":"json","example":{"data":{"count":3,"results":[{"coverage":{"complete":true},"grid":{"distance_km":7.1,"lat":6.25,"lon":-75.5},"horizon_h":24,"lat":6.2518,"lead":{"cycle":"2026-07-04T00:00:00+00:00","horizon_h":24,"step_time":"2026-07-05T00:00:00+00:00","valid_time":"2026-07-05T00:00:00+00:00"},"location":{"admin1":"02","country":"CO","lat":6.2518,"lon":-75.5636,"name":"Medellín","source":"GeoNames"},"lon":-75.5636,"precipitation":{"total_mm":2.1},"temperature":{"celsius":19.4},"wind":{"direction_deg":112.0,"speed_ms":1.8}},{"coverage":{"complete":true},"grid":{"distance_km":4.8,"lat":25.25,"lon":51.5},"horizon_h":72,"lat":25.2854,"lead":{"cycle":"2026-07-04T00:00:00+00:00","horizon_h":72,"step_time":"2026-07-07T00:00:00+00:00","valid_time":"2026-07-07T00:00:00+00:00"},"lon":51.531,"precipitation":{"total_mm":0.0},"temperature":{"celsius":34.7},"wind":{"direction_deg":330.0,"speed_ms":4.3}},{"coverage":{"complete":false,"reason":"requested lead time is outside the available forecast window 2026-07-04T00:00:00+00:00..2026-07-20T00:00:00+00:00"},"lat":19.4326,"lon":-99.1332,"valid_time":"2026-09-01T12:00:00+00:00"}]},"provenance":{"dataset":"gfs","fetched_at":"2026-07-04T06:05:00Z","freshness":{"kind":"live"},"source":"GFS"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","description":"Number of results returned, equal to the number of queries submitted (capped at 500)"},"results":{"type":"array","items":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why this item is degraded, present when its 'complete' is false: outside the forecast window, off-grid, or an unknown/ambiguous city. The item then carries only its echo — no value is invented and the batch does not fail"}},"required":["complete"]},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"horizon_h":{"type":"integer"},"lat":{"type":"number"},"lead":{"type":"object","properties":{"cycle":{"type":"string"},"horizon_h":{"type":"integer"},"step_time":{"type":"string"},"valid_time":{"type":"string"},"clamped":{"type":"boolean"},"step_offset_secs":{"type":"integer"}},"required":["cycle","horizon_h","valid_time"]},"location":{"type":"object","properties":{"admin1":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"source":{"type":"string"}},"required":["admin1","country","lat","lon","name","source"]},"lon":{"type":"number"},"precipitation":{"type":"object","properties":{"total_mm":{"type":["number","null"]}},"required":["total_mm"]},"temperature":{"type":"object","properties":{"celsius":{"type":["number","null"]}},"required":["celsius"]},"wind":{"type":"object","properties":{"direction_deg":{"type":["number","null"]},"speed_ms":{"type":["number","null"]}},"required":["direction_deg","speed_ms"]},"date":{"type":"string"},"valid_time":{"type":"string"}},"required":["coverage"]},"description":"One result per input query, in the same order. An item outside the forecast window, off-grid, or with an unknown/ambiguous city returns coverage.complete=false (partial success) rather than failing the batch; the call fails (400) only when zero items are covered. City items echo the resolved place as location. Per item, lead.step_offset_secs (signed seconds, step_time minus valid_time, present only when non-zero) reports how far the served model step sits from the instant asked for; values are never interpolated between steps."}},"required":["count","results"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the model that served the response, one of: gfs (deterministic NOAA GFS 0.25 deg, <= 384 h), gefs (NOAA GEFS ensemble mean 0.5 deg, beyond 384 h). Branch on this field rather than parsing provenance.source, which carries the human-readable label (the GEFS label spells out that it is an ensemble mean) whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"queries":{"type":"array","items":{"type":"object","properties":{"city":{"type":"string","description":"Optional. Per item, resolve the point from a place name instead of lat + lon (alias location; optional country as ISO-3166 alpha-2 to disambiguate). Ambiguous names resolve to the most populated match; the resolved place is echoed back per item as output...results[].location. An unknown city degrades that item (coverage.complete=false) without failing the batch. Giving both a city and lat/lon on one item degrades that item as ambiguous."},"horizon_h":{"type":"integer","description":"Optional. Per item, at most one lead selector: horizon_h (hours from the analysis cycle), valid_time (RFC 3339 instant) or date (YYYY-MM-DD, served at 12:00 UTC). All omitted defaults to the current analysis time (horizon_h=0). Two forms on one item is a 400 citing the item index."}},"required":[]},"description":"Array of point/lead-time queries resolved in one settlement. Its length is priced per unit (base + N x unit), capped at 500; a batch over 500 is rejected with 400. Each item takes a point (lat + lon, or a city name) and at most one lead selector (omitted = current analysis time)."}},"required":["queries"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/weather-forecast-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get forecasts for many locations","tags":["weather"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":500,"unitField":"queries"}}},{"resource":{"url":"https://api.invoket.com/weather/forecast/exceedance","description":"Before your agent commits to a rain-or-shine decision two to five weeks out — a parametric payout, a shipping window, a harvest or concrete slot: how many NOAA GEFS ensemble members cross your threshold on each day of the ensemble tail. Ask 'at least 30 mm of rain in a day', 'wind at or above 15 m/s' or 'a day at or below 0 deg C' for any GPS point or city, and get one counted fraction per UTC calendar day with the member count behind it. Ask days= (up to 20) for the whole tail. This is what the ensemble MEAN served by GET /weather/forecast cannot answer: averaging the members smooths extremes away, so a mean day essentially never crosses a threshold. What is served here is a raw counted fraction, not a calibrated probability — no bias correction or statistical post-processing is applied, and members_total is served on every day so the number can be audited.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"city":"Manila","comparison":"at_least","days":"3","threshold":"30","variable":"precipitation"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"city":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population. Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"comparison":{"type":"string","description":"Optional. Direction of the test: at_least (default) counts members whose daily value is >= threshold ('more than 30 mm of rain'), at_most counts members whose daily value is <= threshold ('a dry day', 'a day at or below 0 deg C'). Bounds are inclusive on both sides. An unknown value returns 400 INVALID_COMPARISON spelling out what each direction tests."},"days":{"type":"string","description":"Optional. Number of UTC calendar days to count, 1 to MAX_DAYS (20 — the physical span of the ensemble tail, f390 to f840). Omitted, the window served is as much of the tail as fits a read budget (today 11 days, 6 for wind which reads two variables), flagged window_capped=true; ask days= for the rest, up to 20. Optional companion from=YYYY-MM-DD sets the first day (default: the first day of the tail). Days that fall outside the covered ensemble window are simply omitted from the response, never a 400; a window entirely short of the tail returns 400 OUT_OF_RANGE pointing at GET /weather/forecast, which serves those lead times deterministically."},"threshold":{"type":"string","description":"Required. The threshold value, expressed in the unit of the chosen variable (mm, m/s or deg C — never implicit, always echoed as data.threshold_unit). Any finite number; a non-numeric or infinite value returns 400 INVALID_THRESHOLD naming the expected unit."},"variable":{"type":"string","description":"Required. Which quantity the threshold is tested on, one of: precipitation (threshold in mm), wind (m/s), temperature (deg C). It is required because a threshold without a quantity has no unit; the unit actually applied is echoed back as data.threshold_unit. Unknown or missing value returns 400 INVALID_VARIABLE listing the accepted values with their units."}},"required":["threshold","variable"]}},"output":{"type":"json","example":{"data":{"comparison":"at_least","coverage":{"complete":false,"reason":"1 served day(s) have partial coverage"},"days":[{"coverage":{"complete":false,"reason":"day starts before the ensemble window (covered from 2026-08-24T06:00:00+00:00)"},"date":"2026-08-24","members_exceeding":7,"members_total":31,"probability":0.2258,"statistic":"daily_sum","steps_used":4},{"coverage":{"complete":true},"date":"2026-08-25","members_exceeding":9,"members_total":31,"probability":0.2903,"statistic":"daily_sum","steps_used":4},{"coverage":{"complete":true},"date":"2026-08-26","members_exceeding":11,"members_total":31,"probability":0.3548,"statistic":"daily_sum","steps_used":4}],"from":"2026-08-24","grid":{"distance_km":11.74,"lat":14.5,"lon":121.0},"lat":14.6042,"lead":{"cycle":"2026-08-08T00:00:00+00:00","window_end":"2026-09-12T06:00:00+00:00","window_start":"2026-08-24T06:00:00+00:00"},"location":{"admin1":"NCR","country":"PH","lat":14.6042,"lon":120.9822,"name":"Manila","source":"GeoNames"},"lon":120.9822,"method":{"calibrated":false,"kind":"counted_member_fraction","note":"Raw ensemble exceedance fraction: the share of GEFS members whose daily statistic crosses the threshold, counted member by member. This is not a calibrated probability — no bias correction or statistical post-processing is applied; 'members_total' is served on every day so the fraction can be audited."},"threshold":30.0,"threshold_unit":"mm","to":"2026-08-26","variable":"precipitation"},"provenance":{"dataset":"gefs","fetched_at":"2026-08-09T13:21:18Z","freshness":{"age_secs":134478,"kind":"cached"},"source":"NOAA GEFS ensemble members (0.5°, up to 31 members)"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"comparison":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why the series is incomplete, present when 'complete' is false — days with degraded member counts or truncated by the window; per-day detail sits in data.days[].coverage"}},"required":["complete","reason"]},"days":{"type":"array","items":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string"}},"required":["complete","reason"],"description":"Per-day coverage: complete=false when the day is truncated by the ensemble window, when the member count is below MIN_MEMBERS (21), or when members have missing steps — the reason names which. A member with missing steps is still counted rather than dropped, since dropping it would silently shrink the ensemble."},"date":{"type":"string"},"members_exceeding":{"type":"integer","description":"Number of members whose daily statistic crosses the threshold in the requested direction (bounds inclusive)"},"members_total":{"type":"integer","description":"Number of ensemble members actually present in the store for that day — counted, never assumed equal to the nominal 31 of GEFS v12. This is what makes the fraction auditable. Below the two-thirds floor (MIN_MEMBERS = 21) the day is still served but its coverage.complete goes false and the reason cites the count."},"probability":{"type":["number","null"],"description":"Counted fraction between 0 and 1: members_exceeding / members_total for that day. A raw ensemble fraction, NOT a calibrated probability (see data.method) — divide-and-audit it with members_total. null when no member carried a value for that day; no probability is invented on an empty sample."},"statistic":{"type":"string","description":"Which daily statistic each member was reduced to before the comparison: daily_sum for precipitation (rebuilt from the model's disjoint accumulation buckets, per member — never a naive sum of overlapping buckets), daily_max for wind (scalar speed sqrt(u^2+v^2) computed per member, never a vector mean of components, which would understate gusty members) and for temperature with at_least, daily_min for temperature with at_most (a frost threshold tested against the daily maximum would never fire)."},"steps_used":{"type":"integer","description":"Number of distinct forecast steps that fed this day, all members taken together (the ensemble tail is 6-hourly)"}},"required":["coverage","date","members_exceeding","members_total","probability","statistic","steps_used"]},"description":"One entry per UTC calendar day actually covered by the ensemble tail, in date order — days outside the covered window are omitted rather than invented. Each day carries the counted fraction, the member count behind it, the daily statistic tested and its coverage."},"from":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"lead":{"type":"object","properties":{"cycle":{"type":"string"},"window_end":{"type":"string"},"window_start":{"type":"string"}},"required":["window_end","window_start"],"description":"Ensemble reference points: cycle is the analysis cycle of the members actually read (the ensemble layer is structurally one cycle behind, its 35-day extension publishing the following day), window_start/window_end are the real bounds of the ensemble tail this endpoint can count over — so an agent knows where the window starts and ends without a second call. These bounds are those of the MEMBER grids, never those of the ensemble-mean series served by GET /weather/forecast."},"location":{"type":"object","properties":{"admin1":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"source":{"type":"string"}},"required":["admin1","country","lat","lon","name","source"],"description":"Echo of the resolved place when city=/location= was used — name, ISO country, admin1 code and the exact GeoNames coordinates the count was served at; absent when lat/lon were passed directly"},"lon":{"type":"number"},"method":{"type":"object","properties":{"calibrated":{"type":"boolean"},"kind":{"type":"string"},"note":{"type":"string"}},"required":["calibrated","kind","note"],"description":"How the number was obtained, served on every response (not just documented): kind=counted_member_fraction, calibrated=false, and a note stating in plain words that this is not a calibrated probability. Nothing here is bias-corrected or post-processed; a 0.29 means 9 of 31 members crossed the threshold, no more."},"threshold":{"type":"number"},"threshold_unit":{"type":"string","description":"Unit the threshold was interpreted in, fixed by the requested variable: mm (precipitation), m/s (wind) or deg C (temperature). Served next to the threshold so the comparison is never unit-ambiguous."},"to":{"type":"string"},"variable":{"type":"string"},"window_capped":{"type":"boolean","description":"Present and true only when days was omitted and the default window was shortened by the read budget: the served window is from..to, while data.lead.window_end shows where the tail really ends. Ask days= for the rest. Absent otherwise."}},"required":["comparison","coverage","days","from","lat","lon","method","threshold","threshold_unit","to","variable"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the model that served the response: gefs (NOAA GEFS members, 0.5 deg). Branch on this field rather than parsing provenance.source."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"age_secs":{"type":"integer"},"kind":{"type":"string"}},"required":["age_secs","kind"]},"source":{"type":"string","description":"Human-readable label of what was counted: the GEFS ensemble MEMBERS (0.5 deg, up to 31), never the ensemble mean — that mean is exactly what this endpoint does not serve. Its wording is not part of the contract: branch on provenance.dataset."}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"city":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population. Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"comparison":{"type":"string","description":"Optional. Direction of the test: at_least (default) counts members whose daily value is >= threshold ('more than 30 mm of rain'), at_most counts members whose daily value is <= threshold ('a dry day', 'a day at or below 0 deg C'). Bounds are inclusive on both sides. An unknown value returns 400 INVALID_COMPARISON spelling out what each direction tests."},"days":{"type":"string","description":"Optional. Number of UTC calendar days to count, 1 to MAX_DAYS (20 — the physical span of the ensemble tail, f390 to f840). Omitted, the window served is as much of the tail as fits a read budget (today 11 days, 6 for wind which reads two variables), flagged window_capped=true; ask days= for the rest, up to 20. Optional companion from=YYYY-MM-DD sets the first day (default: the first day of the tail). Days that fall outside the covered ensemble window are simply omitted from the response, never a 400; a window entirely short of the tail returns 400 OUT_OF_RANGE pointing at GET /weather/forecast, which serves those lead times deterministically."},"threshold":{"type":"string","description":"Required. The threshold value, expressed in the unit of the chosen variable (mm, m/s or deg C — never implicit, always echoed as data.threshold_unit). Any finite number; a non-numeric or infinite value returns 400 INVALID_THRESHOLD naming the expected unit."},"variable":{"type":"string","description":"Required. Which quantity the threshold is tested on, one of: precipitation (threshold in mm), wind (m/s), temperature (deg C). It is required because a threshold without a quantity has no unit; the unit actually applied is echoed back as data.threshold_unit. Unknown or missing value returns 400 INVALID_VARIABLE listing the accepted values with their units."}},"required":["threshold","variable"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/weather-forecast-exceedance","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get the odds a weather threshold is crossed","tags":["weather"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/climate/point/batch","description":"Before your agent backtests parametric triggers over a site portfolio, verifies claims across parcels or scores weather exposure for an asset fleet: daily 2 m temperature, total precipitation and 10 m wind for up to 500 point/date queries in one call, from the Copernicus ERA5 reanalysis (temperature and precipitation: rolling 30-year window; wind: rolling ~5-year window). Each query takes lat+lon or a city name; an uncovered item is flagged via per-item coverage instead of failing the batch.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"queries":[{"city":"Paris","date":"2024-07-14","variables":"temperature,precipitation,wind"},{"date":"2024-01-20","lat":40.7128,"lon":-74.006}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"queries":{"type":"array","items":{"type":"object","properties":{"city":{"type":"string","description":"Optional. Per item, resolve the point from a place name instead of lat + lon (alias location; optional country as ISO-3166 alpha-2 to disambiguate), against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). The resolved place is echoed back per item as output...results[].location. An unknown city degrades that item (coverage.complete=false) without failing the batch."},"date":{"type":"string"},"variables":{"type":"string","description":"Optional. Per item, a selector of the variable families to return (temperature, precipitation, wind); omitted returns all three. Accepts a comma-separated string (\"temperature,wind\") or an array ([\"temperature\",\"wind\"]). Families not selected are absent from that item; coverage is unaffected, and the per-unit price depends only on the number of queries, never on the filter. An unknown family is a 400 citing the item index."}},"required":["date"]},"description":"Array of point/date queries resolved in one call. Its length is priced per unit (base + N x unit), capped at 500; a batch over 500 is rejected with 400. Each item takes a point (lat + lon, or a city name) and a date (YYYY-MM-DD) within the ingested ERA5 window (rolling 30 years for temperature and precipitation, rolling ~5 years for wind)."}},"required":["queries"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"coverage":{"complete":true},"date":"2024-07-14","grid":{"distance_km":13.2,"lat":48.75,"lon":2.25},"lat":48.8534,"location":{"admin1":"11","country":"FR","lat":48.8534,"lon":2.3488,"name":"Paris","source":"GeoNames"},"lon":2.3488,"precipitation":{"total_mm":0.4},"temperature":{"celsius":24.3},"wind":{"direction_deg":220.0,"speed_ms":3.1}},{"coverage":{"complete":false,"reason":"no data at this grid cell for: temperature, precipitation, wind"},"date":"2024-01-20","lat":40.7128,"lon":-74.006}]},"provenance":{"dataset":"era5","fetched_at":"2026-06-16T09:30:00Z","freshness":{"as_of":"2024-07-14T00:00:00Z","kind":"snapshot"},"source":"era5-copernicus"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"}},"required":["complete"]},"date":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"location":{"type":"object","properties":{"admin1":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"source":{"type":"string"}},"required":["admin1","country","lat","lon","name","source"]},"lon":{"type":"number"},"precipitation":{"type":"object","properties":{"total_mm":{"type":["number","null"]}},"required":["total_mm"]},"temperature":{"type":"object","properties":{"celsius":{"type":["number","null"]}},"required":["celsius"]},"wind":{"type":"object","properties":{"direction_deg":{"type":["number","null"],"description":"Meteorological direction of the daily-mean wind vector (resultant direction, degrees, where the wind comes from: 0 = north, 90 = east)"},"speed_ms":{"type":["number","null"],"description":"Daily-mean wind vector: speed of the mean 10 m vector (m/s), computed from ERA5 daily means of the u/v components — lower than the day's mean wind speed whenever direction varies during the day (components cancel); not a mean of instantaneous speeds"}},"required":["direction_deg","speed_ms"]}},"required":["coverage","date"]},"description":"One result per input query, in the same order. An item with a date outside the ERA5 window, off-grid, or with an unknown city returns coverage.complete=false (partial success) rather than failing the batch; the call fails (400) only when zero items are covered. City items echo the resolved place as location."}},"required":["count","results"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"queries":{"type":"array","items":{"type":"object","properties":{"city":{"type":"string","description":"Optional. Per item, resolve the point from a place name instead of lat + lon (alias location; optional country as ISO-3166 alpha-2 to disambiguate), against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). The resolved place is echoed back per item as output...results[].location. An unknown city degrades that item (coverage.complete=false) without failing the batch."},"date":{"type":"string"},"variables":{"type":"string","description":"Optional. Per item, a selector of the variable families to return (temperature, precipitation, wind); omitted returns all three. Accepts a comma-separated string (\"temperature,wind\") or an array ([\"temperature\",\"wind\"]). Families not selected are absent from that item; coverage is unaffected, and the per-unit price depends only on the number of queries, never on the filter. An unknown family is a 400 citing the item index."}},"required":["date"]},"description":"Array of point/date queries resolved in one call. Its length is priced per unit (base + N x unit), capped at 500; a batch over 500 is rejected with 400. Each item takes a point (lat + lon, or a city name) and a date (YYYY-MM-DD) within the ingested ERA5 window (rolling 30 years for temperature and precipitation, rolling ~5 years for wind)."}},"required":["queries"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/climate-point-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get historical weather for many locations","tags":["climate"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":500,"unitField":"queries"}}},{"resource":{"url":"https://api.invoket.com/climate/degree-days","description":"Before your agent sizes heating or cooling demand, settles an energy contract or models crop growth: heating, cooling and growing degree-days (HDD/CDD/GDD) for any GPS point or city over a date range, computed from Copernicus ERA5 daily mean temperature (rolling 30-year window) with the NWS/EIA/WMO mean-temperature method.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"base":"18","from":"2024-07-01","kind":"cdd","lat":"48.8566","lon":"2.3522","to":"2024-07-31"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"base":{"type":"string"},"from":{"type":"string"},"kind":{"type":"string"},"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"output":{"type":"json","example":{"data":{"base":18.0,"cdd":95.4,"coverage":{"complete":true},"days_counted":31,"from":"2024-07-01","lat":48.8566,"lon":2.3522,"method":"mean_temperature","to":"2024-07-31"},"provenance":{"dataset":"era5","fetched_at":"2026-06-26T09:30:00Z","freshness":{"as_of":"2024-07-31T00:00:00Z","kind":"snapshot"},"source":"era5-copernicus"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"base":{"type":"number"},"cdd":{"type":"number","description":"Cooling degree-days accumulated over covered days (sum of max(daily mean - base, 0)); hdd/gdd appear when requested"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why the accumulation is incomplete, present when 'complete' is false — days missing from the ingested window are not counted and never interpolated; 'days_counted' says how many actually fed the total"}},"required":["complete"]},"days_counted":{"type":"integer"},"from":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"method":{"type":"string","description":"Degree-day method used: 'mean_temperature' (daily mean vs base, per NWS/EIA/WMO), reported honestly and never clipped"},"to":{"type":"string"},"gdd":{"type":"number"},"hdd":{"type":"number"},"location":{"type":"object","description":"Echo of the resolved place when city=/location= was used — name, ISO country, admin1 code and the exact GeoNames coordinates; absent when lat/lon were passed directly"}},"required":["base","coverage","days_counted","from","lat","lon","method","to"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"base":{"type":"string"},"from":{"type":"string"},"kind":{"type":"string"},"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/climate-degree-days","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get degree-days for a location","tags":["climate"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/climate/aggregate","description":"Before your agent writes a seasonal report, audits an ESG claim or reconciles a weather-linked contract: period climate summaries for any GPS point or city over a date range — mean, min and max temperature, total precipitation and mean wind — from the Copernicus ERA5 reanalysis (temperature and precipitation: rolling 30-year window; wind: rolling ~5-year window), with the served grid cell and a coverage flag.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"country":"CH","from":"2022-07-01","location":"Zurich","to":"2022-07-31"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"country":{"type":"string","description":"Optional ISO 3166 alpha-2 country code narrowing the place-name lookup (e.g. country=CH keeps only Swiss matches); only meaningful together with location=/city="},"from":{"type":"string"},"location":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: city. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"to":{"type":"string"}},"required":["from","to"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"days_counted":31,"from":"2022-07-01","grid":{"distance_km":13.51,"lat":47.25,"lon":8.5},"lat":47.36667,"location":{"admin1":"ZH","country":"CH","lat":47.36667,"lon":8.55,"name":"Zürich","source":"GeoNames"},"lon":8.55,"precipitation":{"total_mm":41.25},"temperature":{"max_celsius":26.24,"mean_celsius":21.08,"min_celsius":14.62},"to":"2022-07-31","wind":{"mean_direction_deg":339.3,"mean_speed_ms":0.31}},"provenance":{"dataset":"era5","fetched_at":"2026-07-03T22:06:21Z","freshness":{"as_of":"2022-07-01T00:00:00Z","kind":"snapshot"},"source":"ERA5"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Which requested family produced no aggregate over the window, present when 'complete' is false — the family is then served as null rather than computed on a partial or absent series"}},"required":["complete"]},"days_counted":{"type":"integer"},"from":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"location":{"type":"object","properties":{"admin1":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"source":{"type":"string"}},"required":["admin1","country","lat","lon","name","source"],"description":"Echo of the resolved place when location=/city= was used: name, ISO country, admin1 code and the exact GeoNames coordinates the lookup was served at"},"lon":{"type":"number"},"precipitation":{"type":["object","null"],"properties":{"total_mm":{"type":"number","description":"Total accumulated precipitation over the window (mm), not a daily mean"}},"required":["total_mm"]},"temperature":{"type":["object","null"],"properties":{"max_celsius":{"type":"number"},"mean_celsius":{"type":"number"},"min_celsius":{"type":"number"}},"required":["max_celsius","mean_celsius","min_celsius"]},"to":{"type":"string"},"wind":{"type":["object","null"],"properties":{"mean_direction_deg":{"type":"number","description":"Meteorological direction of the mean wind vector (resultant direction, degrees, where the wind comes from: 0 = north, 90 = east)"},"mean_speed_ms":{"type":"number","description":"Speed of the mean 10 m wind vector over the window (m/s), computed from ERA5 daily means of the u/v components — lower than the true mean wind speed whenever direction varies (components cancel); not a mean of instantaneous speeds"}},"required":["mean_direction_deg","mean_speed_ms"]}},"required":["coverage","days_counted","from","lat","lon","to"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"country":{"type":"string","description":"Optional ISO 3166 alpha-2 country code narrowing the place-name lookup (e.g. country=CH keeps only Swiss matches); only meaningful together with location=/city="},"from":{"type":"string"},"location":{"type":"string","description":"Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: city. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."},"to":{"type":"string"}},"required":["from","to"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/climate-aggregate","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get climate summaries for a location","tags":["climate"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/climate/indices","description":"Before your agent prices or settles a parametric-insurance trigger, or screens weather risk for agriculture and construction: climate-event indices for any GPS point or city over a date range — frost and summer days, tropical nights, dry spells, heavy-rain days, max one-day rainfall, total precipitation and peak gust — ETCCDI/Climdex definitions on true daily Tmin/Tmax from the Copernicus ERA5 reanalysis (precipitation-based indices: rolling 30-year window; Tmin/Tmax- and gust-based indices: rolling ~5-year window).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"from":"2024-07-01","lat":"48.8566","lon":"2.3522","to":"2024-07-31"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"from":{"type":"string"},"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"days_counted":31,"from":"2024-07-01","grid":{"distance_km":13.2,"lat":48.75,"lon":2.25},"indices":{"frost_days":0,"heavy_rain_days":1,"max_dry_spell_days":9,"max_gust_ms":18.7,"prcptot_mm":28.6,"rx1day_mm":22.4,"summer_days":18,"tropical_nights":3},"lat":48.8566,"lon":2.3522,"thresholds":{"dry_mm":1.0,"heavy_mm":10.0,"hot_celsius":25.0},"to":"2024-07-31"},"provenance":{"dataset":"era5","fetched_at":"2026-06-26T09:30:00Z","freshness":{"as_of":"2024-07-31T00:00:00Z","kind":"snapshot"},"source":"era5-copernicus"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Which requested index could not be computed, present when 'complete' is false — its source variable is not ingested at this point, so the index is served as null rather than approximated"}},"required":["complete"]},"days_counted":{"type":"integer"},"from":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"indices":{"type":"object","properties":{"frost_days":{"type":["integer","null"]},"heavy_rain_days":{"type":["integer","null"]},"max_dry_spell_days":{"type":["integer","null"]},"max_gust_ms":{"type":["number","null"],"description":"Peak 10 m wind gust over the period (m/s); null when the gust layer is not ingested for this point"},"prcptot_mm":{"type":["number","null"]},"rx1day_mm":{"type":["number","null"]},"summer_days":{"type":["integer","null"],"description":"Days with daily maximum temperature above the hot threshold (ETCCDI SU); computed from true Tmin/Tmax, never the daily mean"},"tropical_nights":{"type":["integer","null"]}},"required":[]},"lat":{"type":"number"},"lon":{"type":"number"},"thresholds":{"type":"object","properties":{"dry_mm":{"type":"number"},"heavy_mm":{"type":"number"},"hot_celsius":{"type":"number"}},"required":["dry_mm","heavy_mm","hot_celsius"]},"to":{"type":"string"},"location":{"type":"object","description":"Echo of the resolved place when city=/location= was used — name, ISO country, admin1 code and the exact GeoNames coordinates; absent when lat/lon were passed directly"}},"required":["coverage","days_counted","from","indices","lat","lon","thresholds","to"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"from":{"type":"string"},"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/climate-indices","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get climate-event indices for a location","tags":["climate"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/climate/anomaly","description":"Before your agent verifies a 'hotter than normal' claim, reports climate exposure or settles an anomaly-based trigger: how far observed temperature, precipitation and wind departed from the WMO 1991-2020 climatological normal, for any GPS point or city over a date range within the ingested Copernicus ERA5 window (rolling 30 years for temperature and precipitation, rolling ~5 years for wind).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"from":"2024-07-01","lat":"48.8566","lon":"2.3522","to":"2024-07-31"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"from":{"type":"string"},"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"days_counted":31,"from":"2024-07-01","grid":{"distance_km":13.2,"lat":48.75,"lon":2.25},"lat":48.8566,"lon":2.3522,"precipitation":{"anomaly_mm":-23.8,"normal_mm":52.4,"observed_mm":28.6},"reference_period":"1991-2020","temperature":{"anomaly_celsius":3.2,"normal_celsius":21.1,"observed_celsius":24.3},"to":"2024-07-31","wind":{"anomaly_speed_ms":0.2,"normal_speed_ms":3.0,"observed_speed_ms":3.2}},"provenance":{"dataset":"era5","fetched_at":"2026-06-26T09:30:00Z","freshness":{"as_of":"2024-07-31T00:00:00Z","kind":"snapshot"},"source":"era5-copernicus"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Which requested family has no anomaly, present when 'complete' is false — the observed value or the 1991-2020 normal is missing at this point, so the family is served as null rather than compared against a partial baseline"}},"required":["complete"]},"days_counted":{"type":"integer"},"from":{"type":"string"},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"lon":{"type":"number"},"precipitation":{"type":["object","null"],"properties":{"anomaly_mm":{"type":"number"},"normal_mm":{"type":"number"},"observed_mm":{"type":"number"}},"required":["anomaly_mm","normal_mm","observed_mm"]},"reference_period":{"type":"string","description":"WMO climatological baseline the anomaly is measured against (1991-2020)"},"temperature":{"type":["object","null"],"properties":{"anomaly_celsius":{"type":"number","description":"Observed minus 1991-2020 normal (°C); positive means warmer than normal"},"normal_celsius":{"type":"number"},"observed_celsius":{"type":"number"}},"required":["anomaly_celsius","normal_celsius","observed_celsius"]},"to":{"type":"string"},"wind":{"type":["object","null"],"properties":{"anomaly_speed_ms":{"type":"number"},"normal_speed_ms":{"type":"number"},"observed_speed_ms":{"type":"number","description":"Daily-mean wind vector: speed of the mean 10 m vector (m/s), from ERA5 daily means of the u/v components — lower than the true mean wind speed whenever direction varies during the day (components cancel). The normal and the anomaly are computed on the same vector-mean basis, so the comparison is consistent"}},"required":["anomaly_speed_ms","normal_speed_ms","observed_speed_ms"]},"location":{"type":"object","description":"Echo of the resolved place when city=/location= was used — name, ISO country, admin1 code and the exact GeoNames coordinates; absent when lat/lon were passed directly"}},"required":["coverage","days_counted","from","lat","lon","reference_period","to"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"from":{"type":"string"},"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/climate-anomaly","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get climate anomalies for a location","tags":["climate"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/climate/return-period","description":"Before your agent underwrites, reinsures or stress-tests a climate exposure: rank a target year's season against 30 years of a location's climate history (Copernicus ERA5 reanalysis, WMO-standard climatological period) — percentile, empirical return period and sample size, for any GPS point or city. Temperature and precipitation cover a rolling 30-year window; every verdict reports its actual sample size via sample_years and coverage.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"lat":"48.8566","lon":"2.3522","month":"8","year":"2024"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"month":{"type":"string"},"year":{"type":"string"}},"required":["year"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"grid":{"distance_km":14.02,"lat":48.75,"lon":2.25},"lat":48.8566,"lon":2.3522,"method":"empirical","percentile":80.0,"rank":24,"return_period_years":4.43,"sample_years":30,"season":"08-01..08-31","stat":"mean","unit":"celsius","value":20.49,"variable":"temperature","year":2024},"provenance":{"dataset":"era5","fetched_at":"2026-07-16T09:29:59Z","freshness":{"as_of":"1996-08-01T00:00:00Z","kind":"snapshot"},"source":"ERA5"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Why the verdict is degraded, present when 'complete' is false: fewer than 20 fully-covered years in the sample, or a target season not covered at all — value, percentile, rank and return_period_years are then null rather than computed on a partial sample"}},"required":["complete"]},"grid":{"type":"object","properties":{"distance_km":{"type":"number"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["distance_km","lat","lon"]},"lat":{"type":"number"},"lon":{"type":"number"},"method":{"type":"string","description":"Always 'empirical' in v1: rank within the sample, no extreme-value (GEV) fit"},"percentile":{"type":["number","null"],"description":"Empirical percentile of the target year within the historical sample (rank / sample_years)"},"rank":{"type":["integer","null"]},"return_period_years":{"type":["number","null"],"description":"Empirical recurrence interval in years of a season at least this extreme, by Weibull plotting position (finite even for the record)"},"sample_years":{"type":"integer","description":"Number of fully-covered historical years in the sample; always reported (a verdict on fewer than 20 years is flagged coverage.complete=false)"},"season":{"type":"string"},"stat":{"type":"string"},"unit":{"type":"string"},"value":{"type":["number","null"]},"variable":{"type":"string"},"year":{"type":"integer"},"location":{"type":"object","description":"Echo of the resolved place when city=/location= was used — name, ISO country, admin1 code and the exact GeoNames coordinates; absent when lat/lon were passed directly"}},"required":["coverage","lat","lon","method","percentile","rank","return_period_years","sample_years","season","stat","unit","value","variable","year"]},"provenance":{"type":"object","properties":{"dataset":{"type":"string","description":"Stable machine identifier of the dataset that served the response: era5 (Copernicus ERA5 reanalysis). Branch on this field rather than parsing provenance.source, which carries a human-readable label whose wording is not part of the contract."},"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["dataset","fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"lat":{"type":"string","description":"Optional on its own - Latitude in decimal degrees. Alternative: pass city=<name> (alias location=, optional country= ISO 3166 alpha-2) instead of lat+lon — resolved via the embedded GeoNames gazetteer (exact match, most populous wins) and echoed back as data.location"},"lon":{"type":"string"},"month":{"type":"string"},"year":{"type":"string"}},"required":["year"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/climate-return-period","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Rank a season in a location's climate history","tags":["climate"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/vehicle/vin/decode","description":"Before your agent buys, lists or insures a vehicle: decode any 17-character VIN offline — manufacturer, country and region of build, model year, check digit validity and deterministic attributes from the official NHTSA vPIC tables","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"vin":"5YJ3E1EA7KF000316"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"vin":{"type":"string","description":"17-character Vehicle Identification Number (VIN alphabet, excludes I/O/Q). Malformed input is a 400; a well-formed VIN whose manufacturer prefix (WMI) is not in the vPIC tables is a 404 (unbilled)"}},"required":["vin"]}},"output":{"type":"json","example":{"data":{"attributes":{"Body Class":"Sedan/Saloon","Model":"Model 3"},"check_digit_applicable":true,"check_digit_valid":false,"country":"United States","coverage":{"complete":true},"make":"TESLA","make_source":"wmi","manufacturer":"Tesla, Inc.","model_year":2019,"region":"North America","vin":"5YJ3E1EA7KF000316","wmi":"5YJ"},"provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa-vpic"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"attributes":{"type":"object","properties":{"Body Class":{"type":"string"},"Model":{"type":"string"}},"required":["Body Class","Model"]},"check_digit_applicable":{"type":"boolean","description":"Whether the check digit is REGULATORY for this VIN: true in North America only (49 CFR 565 in the United States, aligned Canadian and Mexican rules), false everywhere else, where position 9 is unconstrained and usually carries a serial character. When false, check_digit_valid: false is NOT a rejection reason — most European VINs, valid ones included, fail a checksum no law requires them to satisfy, so filtering on the boolean alone discards them. Always present, derived from the same source as region: a VIN is never served with region 'Europe' and check_digit_applicable true"},"check_digit_valid":{"type":"boolean","description":"Whether the position-9 check digit matches the ISO 3779 checksum; reported for information, never a rejection reason. Read it together with check_digit_applicable: outside North America a false here says nothing about the VIN being genuine"},"country":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string","description":"Names which expected fields could not be resolved, present when complete is false, several joined by '; ' — the fields themselves are omitted rather than guessed. Closed list of causes: the vPIC country of registration contradicting the VIN region (country then omitted), no make for this WMI, no model for this VIN, undecodable model year, no deterministic positional attributes, attributes dropped as ambiguous"}},"required":["complete"],"description":"Honest decode coverage: complete=true only when every expected field is resolved — make, model, model year, at least one unambiguous positional attribute, and a country consistent with the VIN region. Expect complete=false on many European VINs: vPIC is a US register and often describes only the assembly plant. Always a 200 with a named reason, never a guessed value, never a 5xx"},"make":{"type":"string","description":"Brand of the vehicle, omitted rather than guessed when no source resolves it. Same brand as the one /vehicle/recalls searches for this VIN, never a different one, and never a corporate group badge (FCA, PSA, Stellantis)"},"make_source":{"type":"string","description":"Where the make comes from, present exactly when make is. Closed enumeration, by priority: 'wmi' (make column of the vPIC WMI table), 'pattern' (Make element of a positional pattern), 'manufacturer_bridge' (pipeline-built VIN-to-brand bridge: legal entity name, then the decoded model for multi-brand corporate parents such as FCA US LLC). A make already resolved by a higher-priority source is never overwritten"},"manufacturer":{"type":"string"},"model_year":{"type":"integer","description":"Model year decoded from position 10, disambiguated against the snapshot date; omitted when the 30-year cycle cannot be resolved"},"region":{"type":"string"},"vin":{"type":"string"},"wmi":{"type":"string","description":"World Manufacturer Identifier resolved from the VIN prefix (3 characters, or 6 for low-volume manufacturers)"},"model_year_ambiguous":{"type":"boolean","description":"Present and true when the position-10 code maps to more than one year of the 30-year cycle: the model year is then the most plausible one and the ambiguity is stated rather than hidden"}},"required":["check_digit_applicable","check_digit_valid","coverage","manufacturer","vin","wmi"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"vin":{"type":"string","description":"17-character Vehicle Identification Number (VIN alphabet, excludes I/O/Q). Malformed input is a 400; a well-formed VIN whose manufacturer prefix (WMI) is not in the vPIC tables is a 404 (unbilled)"}},"required":["vin"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-vin-decode","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Decode a VIN","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/vehicle/recalls","description":"Before your agent buys, sells or services a vehicle: list manufacturer recall campaigns that may affect it, consolidated from official NHTSA and RappelConso sources, matched by make, model and year or from a VIN. An empty list means no known recall. Results are paged at 200 campaigns, one paid call per page: the busiest brands (~900 campaigns) take 5","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"make":"Toyota","model":"Corolla","year":"2019"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"make":{"type":"string","description":"Optional on its own - Manufacturer make to match (e.g. 'Toyota'). Provide either 'make' (optionally with 'model'/'year') or 'vin', never both. A make absent from every covered source is a 404 (UNKNOWN_MAKE, unbilled)"},"model":{"type":"string","description":"Optional model to narrow the match within the make (e.g. 'Corolla'); omitted matches all models of the make"},"year":{"type":"string","description":"Optional model year (YYYY) to keep only campaigns whose year range covers it; a non-numeric year is a 400"},"cursor":{"type":"string","description":"Optional opaque cursor, as returned by next_cursor on a previous page — never built by hand. It must be replayed with the same make/model/year or vin: a cursor that is malformed, replayed on a different query, or issued against a recall snapshot since re-ingested is a 400 (INVALID_CURSOR, unbilled), never a silently shifted page"}},"required":[]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":false,"reason":"expected source(s) not ingested: Safety Gate","sources":[{"as_of":"2026-07-01","fresh":true,"name":"NHTSA"},{"as_of":"2026-07-01","fresh":true,"name":"RappelConso"},{"missing":true,"name":"Safety Gate","reason":"Safety Gate source is not currently ingested"}]},"make":"Toyota","model":"Corolla","recalls":[{"campaign_id":"20V012000","component":"FUEL SYSTEM, GASOLINE","match":{"make":"TOYOTA","model":"COROLLA","years":{"from":2018,"to":2019}},"published_at":"2020-01-13","remedy":"Dealers will replace the fuel pump assembly free of charge.","source":"NHTSA","summary":"The low-pressure fuel pump may fail and cause the engine to stall while driving.","url":"https://www.nhtsa.gov/recalls?nhtsaId=20V012000"},{"campaign_id":"2019-11-0123","component":"Système de freinage","match":{"make":"TOYOTA","model":"COROLLA","years":{"from":2019,"to":2019}},"published_at":"2019-11-06","remedy":"Dealers will inspect and replace the master cylinder free of charge.","source":"RappelConso","summary":"Possible sealing defect of the master cylinder that may reduce braking efficiency.","url":"https://rappel.conso.gouv.fr/fiche-rappel/0123"}],"year":2019},"provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-07-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa+rappelconso"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string"},"sources":{"type":"array","items":{"type":"object","properties":{"as_of":{"type":"string"},"fresh":{"type":"boolean"},"name":{"type":"string"}},"required":["as_of","fresh","name"]}}},"required":["complete","reason","sources"],"description":"Sources actually consulted with their dated freshness, plus any expected source not yet ingested flagged missing=true with a reason; complete is true only when every expected source is served and fresh. A stale served source keeps its last good state (fresh=false), never a 5xx"},"make":{"type":"string"},"model":{"type":"string"},"recalls":{"type":"array","items":{"type":"object","properties":{"campaign_id":{"type":"string"},"component":{"type":"string"},"match":{"type":"object","properties":{"make":{"type":"string"},"model":{"type":"string"},"years":{"type":"object","properties":{"from":{"type":["integer","null"]},"to":{"type":["integer","null"]}},"required":["from","to"]}},"required":["make"],"description":"Why the campaign was retained (normalized make, optional model, optional year range) — honest matching by make/model/year, never a per-VIN 'confirmed for this exact vehicle'"},"published_at":{"type":"string"},"remedy":{"type":"string"},"source":{"type":"string"},"summary":{"type":"string"},"url":{"type":"string"}},"required":["campaign_id","match","source","summary"]},"description":"Candidate campaigns that may affect the vehicle, most recent first — an empty list is a successful, billed answer meaning no known recall, never a 404"},"year":{"type":"integer"},"next_cursor":{"type":"string","description":"Opaque cursor to the next page, present exactly when truncated is true and absent on the last page (the list is then complete). Replay it as cursor= with the SAME query to reach the campaigns beyond the 200 of this page: one paid call per page, so a brand with ~900 campaigns costs 5 calls"},"total":{"type":"integer","description":"Number of campaigns matched before any truncation, and the same on every page of a cursor walk — never the count left to serve; truncated=true says campaigns remain beyond this page and next_cursor reaches them"},"truncated":{"type":"boolean"},"vin":{"type":"object","description":"Present when the request used vin=: how the VIN was resolved (VIN, WMI, manufacturer, resolved make, model year) before matching campaigns — the matching itself stays by make/model/year"}},"required":["coverage","make","recalls"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"make":{"type":"string","description":"Optional on its own - Manufacturer make to match (e.g. 'Toyota'). Provide either 'make' (optionally with 'model'/'year') or 'vin', never both. A make absent from every covered source is a 404 (UNKNOWN_MAKE, unbilled)"},"model":{"type":"string","description":"Optional model to narrow the match within the make (e.g. 'Corolla'); omitted matches all models of the make"},"year":{"type":"string","description":"Optional model year (YYYY) to keep only campaigns whose year range covers it; a non-numeric year is a 400"},"cursor":{"type":"string","description":"Optional opaque cursor, as returned by next_cursor on a previous page — never built by hand. It must be replayed with the same make/model/year or vin: a cursor that is malformed, replayed on a different query, or issued against a recall snapshot since re-ingested is a 400 (INVALID_CURSOR, unbilled), never a silently shifted page"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-recalls","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Find vehicle recalls","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/vehicle/critair","description":"Before your agent plans a route or advises on a vehicle in France: compute its Crit'Air class and current low-emission-zone (ZFE) restrictions from the official classification tables (arrêté du 21 juin 2016), from declared fuel and Euro norm or first registration date","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"euro_norm":"euro3","first_registration":"2004-05-01","fuel":"diesel","vehicle_class":"m1"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"euro_norm":{"type":"string","description":"Optional on its own - Declared Euro emission norm (pre_euro, euro1, euro2, euro3, euro4, euro5, euro6; euro1 is accepted and normalised to pre_euro, which the Crit'Air schedule does not distinguish). Provide either 'euro_norm' or 'first_registration'; if both are given, 'euro_norm' wins"},"first_registration":{"type":"string","description":"Optional on its own - Date of first registration (YYYY-MM-DD), used to derive the Euro norm when 'euro_norm' is not supplied. It must be a plausible registration date: a future date or one before 1900-01-01 is a 400 (a genuinely old vehicle is answered 200 with critair_class 'non_classe', never an error)"},"fuel":{"type":"string","description":"Declared fuel/powertrain: electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid (common FR/EN synonyms accepted). Required; hybrids are classified by their thermal engine"},"vehicle_class":{"type":"string","description":"Optional. Vehicle category: m1 (passenger car, default) or n1 (light commercial vehicle); other categories are out of scope (400)"}},"required":["fuel"]}},"output":{"type":"json","example":{"data":{"critair_class":"4","derivation":{"euro_norm":"euro3","fuel":"diesel","via":"euro_norm"},"euro_norm":"euro3","first_registration":"2004-05-01","fuel":"diesel","notes":"Restrictions PERMANENTES en vigueur pour les véhicules M1/N1, par classe Crit'Air. Les dérogations locales, horaires et sectorielles (axes, dérogations petits rouleurs, laissez-passer) sont HORS PÉRIMÈTRE et ne sont pas modélisées. Les calendriers de durcissement au-delà des étapes ci-dessous ont été révisés par la loi de 2025 et ne sont retenus que lorsqu'ils sont effectivement entrés en vigueur.","regulation":{"as_of":"2026-07-04","reference":"Arrêté du 21 juin 2016 (nomenclature Crit'Air, art. R. 318-2 du code de la route)"},"vehicle_class":"m1","zfe_restrictions":[{"area":"Lyon, Villeurbanne, Caluire-et-Cuire, Bron et Vénissieux (périmètre intra-boulevard périphérique Laurent-Bonnevay)","since":"2022-01-01","zone_id":"metropole-lyon","zone_name":"ZFE-m de la Métropole de Lyon"},{"area":"Communes de la Métropole du Grand Paris situées à l'intérieur de l'autoroute A86 (Paris et petite couronne, hors A86 elle-même)","since":"2021-06-01","zone_id":"grand-paris","zone_name":"ZFE-m de la Métropole du Grand Paris"}]},"provenance":{"fetched_at":"2026-07-04T09:30:00Z","freshness":{"as_of":"2026-07-01T00:00:00Z","kind":"snapshot"},"source":"critair-regulation+zfe-open-data"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"critair_class":{"type":"string","description":"Computed Crit'Air sticker class: '0', '1'..'5' or 'non_classe' — 'non_classe' is a successful, billed answer (too old to qualify), never an error"},"derivation":{"type":"object","properties":{"euro_norm":{"type":"string"},"fuel":{"type":"string"},"via":{"type":"string"}},"required":["fuel","via"],"description":"How the class was obtained: which input path was used (via), the effective Euro norm and the fuel column retained — makes the computation auditable. On the 'first_registration' path the Euro norm is INFERRED from the date against the norm mandated for new registrations at that time (euro6 from 2015-09-01 for m1, 2016-09-01 for n1): a vehicle may have been type-approved under an earlier norm, and the sticker class is identical across the norms that share it"},"euro_norm":{"type":"string"},"first_registration":{"type":"string"},"fuel":{"type":"string"},"notes":{"type":"string"},"regulation":{"type":"object","properties":{"as_of":{"type":"string"},"reference":{"type":"string"}},"required":["as_of","reference"],"description":"Reference to the regulatory classification table and the date it was last verified"},"vehicle_class":{"type":"string"},"zfe_restrictions":{"type":"array","items":{"type":"object","properties":{"area":{"type":"string"},"since":{"type":"string"},"zone_id":{"type":"string"},"zone_name":{"type":"string"}},"required":["area","since","zone_id","zone_name"]},"description":"Low-emission zones (ZFE) that currently ban this class, each with its enforcement start date; an empty list means no modelled ZFE restricts the class"}},"required":["critair_class","derivation","fuel","notes","regulation","vehicle_class","zfe_restrictions"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"euro_norm":{"type":"string","description":"Optional on its own - Declared Euro emission norm (pre_euro, euro1, euro2, euro3, euro4, euro5, euro6; euro1 is accepted and normalised to pre_euro, which the Crit'Air schedule does not distinguish). Provide either 'euro_norm' or 'first_registration'; if both are given, 'euro_norm' wins"},"first_registration":{"type":"string","description":"Optional on its own - Date of first registration (YYYY-MM-DD), used to derive the Euro norm when 'euro_norm' is not supplied. It must be a plausible registration date: a future date or one before 1900-01-01 is a 400 (a genuinely old vehicle is answered 200 with critair_class 'non_classe', never an error)"},"fuel":{"type":"string","description":"Declared fuel/powertrain: electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid (common FR/EN synonyms accepted). Required; hybrids are classified by their thermal engine"},"vehicle_class":{"type":"string","description":"Optional. Vehicle category: m1 (passenger car, default) or n1 (light commercial vehicle); other categories are out of scope (400)"}},"required":["fuel"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-critair","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a vehicle's Crit'Air class and ZFE restrictions","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/vehicle/report","description":"Before your agent buys or appraises a vehicle: one consolidated report from a VIN — decode, candidate recall campaigns, type-approval CO2, the French registration tax it would cost and, from declared characteristics, Crit'Air / low-emission-zone status — from official NHTSA vPIC, RappelConso, EU 2019/631 and French tax sources, each block with its own provenance and honest coverage","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"100000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"100000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"fuel":"electric","vin":"5YJ3E1EA7KF000316"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"fuel":{"type":"string","description":"Optional declared fuel/powertrain (electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid), rules of /vehicle/critair: a thermal vehicle also needs 'euro_norm' (pre_euro, euro1, euro2, euro3, euro4, euro5, euro6) or 'first_registration' (YYYY-MM-DD), an electric one needs neither. Nothing usable, or an implausible date, leaves the Crit'Air block missing with its reason — it never fails the report"},"vin":{"type":"string","description":"17-character Vehicle Identification Number (VIN alphabet, excludes I/O/Q). Required: it is the report's mandatory base. Malformed is a 400; a well-formed VIN whose manufacturer prefix (WMI) is unknown is a 404 (unbilled) — without the decode base there is no report"}},"required":["vin"]}},"output":{"type":"json","example":{"data":{"co2":{"co2":{"low_sample":false,"sample_size":42680,"unit":"g/km","wltp":{"p10":0,"p50":0,"p90":0}},"match_level":"model_year","provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"eea-co2-monitoring"},"typical_specs":{"engine_power_kw":150,"mass_kg":1931},"vehicle":{"commercial_name":"MODEL 3","make":"TESLA","year":2019}},"coverage":{"complete":true,"missing":[]},"critair":{"critair_class":"0","derivation":{"fuel":"electric","via":"fuel"},"fuel":"electric","provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-07-04T00:00:00Z","kind":"snapshot"},"source":"critair-regulation+zfe-open-data"},"regulation":{"as_of":"2026-07-04","reference":"Arrêté du 21 juin 2016 (nomenclature Crit'Air, art. R. 318-2 du code de la route)"},"vehicle_class":"m1","zfe_restrictions":[]},"recalls":{"coverage":{"complete":false,"reason":"expected source(s) not ingested: Safety Gate","sources":[{"as_of":"2026-07-01","fresh":true,"name":"NHTSA"},{"as_of":"2026-07-01","fresh":true,"name":"RappelConso"},{"missing":true,"name":"Safety Gate","reason":"Safety Gate source is not currently ingested"}]},"make":"TESLA","provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-07-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa+rappelconso"},"recalls":[{"campaign_id":"22V037000","component":"STEERING","match":{"make":"TESLA","years":{"from":2017,"to":2022}},"published_at":"2022-01-27","remedy":"Free over-the-air software update.","source":"NHTSA","summary":"Power steering assist may be reduced over rough terrain.","url":"https://www.nhtsa.gov/recalls?nhtsaId=22V037000"}],"year":2019},"registration_tax":{"coverage":"insufficient_inputs","missing_inputs":["fiscal_power","region"]},"vin_decode":{"attributes":{"Model":"Model 3"},"check_digit_applicable":true,"check_digit_valid":false,"country":"United States","coverage":{"complete":true},"make":"TESLA","make_source":"wmi","manufacturer":"Tesla, Inc.","model_year":2019,"provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa-vpic"},"region":"North America","vin":"5YJ3E1EA7KF000316","wmi":"5YJ"}},"provenance":{"fetched_at":"2026-07-01T09:30:00Z","freshness":{"as_of":"2026-06-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa-vpic"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"co2":{"type":"object","properties":{"co2":{"type":"object","properties":{"low_sample":{"type":"boolean"},"sample_size":{"type":"integer"},"unit":{"type":"string"},"wltp":{"type":"object","properties":{"p10":{"type":"integer"},"p50":{"type":"integer"},"p90":{"type":"integer"}},"required":["p50"]},"nedc":{"type":"integer"}},"required":["low_sample","sample_size","unit"]},"match_level":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"typical_specs":{"type":"object","properties":{"engine_power_kw":{"type":"integer"},"mass_kg":{"type":"integer"},"engine_capacity_cm3":{"type":"integer"},"fuel_mix":{"type":"array"}},"required":["engine_power_kw"],"description":"Typical figures of the CO2 aggregate (engine capacity, power, mass, and fuel_mix when the deployed dataset carries it), each an independent registration-weighted median over the aggregated versions: central values of a group, never the datasheet of one version. Same carrier and same meaning as on /vehicle/co2"},"vehicle":{"type":"object","properties":{"commercial_name":{"type":"string"},"make":{"type":"string"},"year":{"type":"integer"},"make_source":{"type":"string"}},"required":["make"]},"coverage":{"type":"object"},"limits":{"type":"array","description":"Reading limits of the CO2 figures, returned verbatim as on /vehicle/co2 (elided from this example only, to keep the 402 header small)"}},"required":["co2","match_level","provenance","vehicle"],"description":"Best-effort EU CO2 block (core of /vehicle/co2), keyed by the decoded make, model and model year — hence ALWAYS match_level 'model_year' with its p10/p90 dispersion: a European VIN carries no type-approval variant, a limit never worked around with a single figure. Model absent from the registry, year outside the ingested window or dataset not deployed: block out, motivated in coverage.missing, never an error of the report"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"missing":{"type":"array"}},"required":["complete","missing"],"description":"Honest coverage of the secondary blocks: complete=false as soon as one is missing, each named with its reason — never an invented block, never a silent error. The tax costing is not listed here: that block is always present and carries its own coverage"},"critair":{"type":"object","properties":{"critair_class":{"type":"string"},"derivation":{"type":"object","properties":{"fuel":{"type":"string"},"via":{"type":"string"},"euro_norm":{"type":"string"}},"required":["fuel","via"]},"fuel":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"regulation":{"type":"object","properties":{"as_of":{"type":"string"},"reference":{"type":"string"}},"required":["as_of","reference"]},"vehicle_class":{"type":"string"},"zfe_restrictions":{"type":"array"},"euro_norm":{"type":"string"},"first_registration":{"type":"string"},"notes":{"type":"string","description":"Modelling limits of the ZFE reference data, returned verbatim as on /vehicle/critair (elided from this example only, to keep the 402 header small)"}},"required":["critair_class","derivation","fuel","provenance","regulation","vehicle_class","zfe_restrictions"],"description":"Best-effort Crit'Air block (core and rules of /vehicle/critair): present as soon as the declared characteristics allow a class — a battery electric needs neither norm nor date — otherwise in coverage.missing with its reason, never a 5xx"},"recalls":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string"},"sources":{"type":"array","items":{"type":"object","properties":{"as_of":{"type":"string"},"fresh":{"type":"boolean"},"name":{"type":"string"}},"required":["as_of","fresh","name"]}}},"required":["complete","reason","sources"]},"make":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"recalls":{"type":"array","items":{"type":"object","properties":{"campaign_id":{"type":"string"},"component":{"type":"string"},"match":{"type":"object","properties":{"make":{"type":"string"},"years":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"}},"required":["from","to"]}},"required":["make"]},"published_at":{"type":"string"},"remedy":{"type":"string"},"source":{"type":"string"},"summary":{"type":"string"},"url":{"type":"string"}},"required":["campaign_id","match","source","summary"]}},"year":{"type":"integer"},"total":{"type":"integer"},"truncated":{"type":"boolean"},"vin":{"type":"object"}},"required":["coverage","make","provenance","recalls"],"description":"Best-effort recall block: candidate campaigns matched by the decoded make and model year, with its own multi-source provenance; listed in coverage.missing when it cannot be produced, never a 5xx"},"registration_tax":{"type":"object","properties":{"coverage":{"type":"string"},"missing_inputs":{"type":"array","items":{"type":"string"}},"reason":{"type":"string"},"total_eur":{"type":"number","description":"Sum of the tax items, on the computed branch only — and absent there too as soon as one item is undetermined: a partial total would be a wrong figure"}},"required":["coverage"],"description":"French registration tax block (core of /vehicle/tax), ALWAYS present with its own closed coverage, one of exactly three values: 'computed' (items, brackets, exemptions by article, total_eur), 'insufficient_inputs' naming what is missing, or 'date_out_of_range' when the registration date predates the published schedules (France is covered from 2020-01-01 onwards) — nothing is missing in that case, so no extra attribute will ever unlock a costing. Never a partial total. Technical figures come from the CO2 block; add 'region' and 'fiscal_power' to the query for a costing ('registration_date' defaults to 'first_registration', else today; country implicitly FR)"},"vin_decode":{"type":"object","properties":{"attributes":{"type":"object","properties":{"Model":{"type":"string"}},"required":["Model"]},"check_digit_applicable":{"type":"boolean"},"check_digit_valid":{"type":"boolean"},"country":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string"}},"required":["complete"]},"make":{"type":"string"},"make_source":{"type":"string"},"manufacturer":{"type":"string"},"model_year":{"type":"integer"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"region":{"type":"string"},"vin":{"type":"string"},"wmi":{"type":"string"},"model_year_ambiguous":{"type":"boolean"}},"required":["check_digit_applicable","check_digit_valid","coverage","manufacturer","provenance","vin","wmi"],"description":"Mandatory base block: the full VIN decode (/vehicle/vin/decode) with its own vPIC provenance"}},"required":["coverage","registration_tax","vin_decode"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"fuel":{"type":"string","description":"Optional declared fuel/powertrain (electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid), rules of /vehicle/critair: a thermal vehicle also needs 'euro_norm' (pre_euro, euro1, euro2, euro3, euro4, euro5, euro6) or 'first_registration' (YYYY-MM-DD), an electric one needs neither. Nothing usable, or an implausible date, leaves the Crit'Air block missing with its reason — it never fails the report"},"vin":{"type":"string","description":"17-character Vehicle Identification Number (VIN alphabet, excludes I/O/Q). Required: it is the report's mandatory base. Malformed is a 400; a well-formed VIN whose manufacturer prefix (WMI) is unknown is a 404 (unbilled) — without the decode base there is no report"}},"required":["vin"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-report","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a consolidated vehicle report from a VIN","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.10"}},{"resource":{"url":"https://api.invoket.com/vehicle/co2","description":"Before your agent prices, imports or compares a European vehicle: get its type-approval CO2 emissions and technical characteristics — WLTP g/km with its dispersion, fuel, engine capacity, power and mass — from the official EU CO2 monitoring data (Regulation (EU) 2019/631, new registrations 2018-2022), keyed by type-approval number or by make, model and year. Every answer states the precision it was matched at","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"make":"Renault","model":"Clio","year":"2021"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"make":{"type":"string","description":"Optional on its own - Make of the vehicle (e.g. 'Renault'); short forms and member-state spellings are folded ('VW' and 'VOLKSWAGEN VW' both reach VOLKSWAGEN). Use either this approximate key — make, model and year, all three required together — or the precise one: 'type_approval' (the EU type-approval number, optionally narrowed by 'variant' and 'version'). Mixing the two keys is a 400"},"model":{"type":"string","description":"Optional on its own - Commercial name as reported to the EU registry (e.g. 'Clio'); case and accents are folded. Required together with 'make' and 'year'"},"year":{"type":"string","description":"Optional on its own - Registration year (YYYY) within the ingested window; a year outside it is a 404 whose message names the years actually served, never a silent miss"}},"required":[]}},"output":{"type":"json","example":{"data":{"co2":{"low_sample":false,"sample_size":200122,"unit":"g/km","wltp":{"p10":99,"p50":118,"p90":120}},"coverage":{"min_sample":5,"versions_aggregated":427,"years_covered":[2018,2019,2020,2021,2022]},"limits":["type-approval values under the WLTP procedure, not real-world fuel consumption (OBFCM data is out of scope)","statistical aggregate of new registrations reported by member states, not a manufacturer datasheet","no VIN to variant/version link: a European VIN does not carry the variant outside manufacturer databases","regulated pollutants (NOx, particulates) are not covered","in 'typical_specs', each figure is an independent weighted median over the aggregated versions (and 'fuel_mix' their registration shares): together they describe no single existing version, they are not a datasheet"],"match_level":"model_year","typical_specs":{"engine_capacity_cm3":999,"engine_power_kw":67,"mass_kg":1171},"vehicle":{"commercial_name":"CLIO","make":"RENAULT","year":2021}},"provenance":{"fetched_at":"2026-07-29T09:42:21Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"eea-co2-monitoring"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"co2":{"type":"object","properties":{"low_sample":{"type":"boolean"},"sample_size":{"type":"integer"},"unit":{"type":"string"},"wltp":{"type":"object","properties":{"p10":{"type":"integer"},"p50":{"type":"integer"},"p90":{"type":"integer"}},"required":["p50"]},"nedc":{"type":"integer","description":"Correlated NEDC value in g/km, present only where the source publishes it (registrations from before the WLTP switchover) — absent is not zero"}},"required":["low_sample","sample_size","unit"],"description":"Type-approval CO2 under WLTP in g/km: p50 always, plus p10/p90 at match_level 'model_year' where a single figure would be wrong at both ends. A value of 0 is a real value (battery electric), while a vehicle with no WLTP measurement omits the wltp block entirely — never confuse the two. 'nedc' appears only where the source publishes it; 'sample_size' is the number of registrations behind the aggregate, and 'low_sample' flags an aggregate below coverage.min_sample, kept but stated, never presented as a measurement"},"coverage":{"type":"object","properties":{"min_sample":{"type":"integer"},"versions_aggregated":{"type":"integer"},"years_covered":{"type":"array","items":{"type":"integer"}},"years_observed":{"type":"object"}},"required":["min_sample","versions_aggregated","years_covered"],"description":"Ingested window (years_covered — the machine truth of which years are served), registration years actually observed for the matched key (years_observed, type-approval form), number of versions aggregated, and the minimum sample size behind low_sample"},"limits":{"type":"array","items":{"type":"string"},"description":"Reading limits returned with every answer: WLTP type-approval values rather than real-world consumption, a statistical aggregate of member-state registrations rather than a manufacturer datasheet, no VIN-to-variant link, and no regulated pollutants (NOx, particulates). At match_level 'model_year' a fifth line states that the figures under typical_specs are independent medians describing no single existing version"},"match_level":{"type":"string","description":"Closed enumeration stating the precision bought, to be read before the figures: 'type_approval_exact' (one type-approval, unique values), 'type_approval_partial' (versions of one type-approval aggregated by registration-weighted median — variant and version are then omitted on purpose) or 'model_year' (several powertrains under one make/model/year: the only level that carries p10/p90)"},"typical_specs":{"type":"object","properties":{"engine_capacity_cm3":{"type":"integer"},"engine_power_kw":{"type":"integer"},"mass_kg":{"type":"integer"},"fuel_mix":{"type":"array"}},"required":[],"description":"Present at match_level 'model_year' only: typical figures of the aggregate — engine capacity, power and mass are each an independent registration-weighted median, and 'fuel_mix' is the share of registrations per fuel (descending, shares rounded, fuels under 0.05 percent dropped, so they need not sum to exactly 1). Read them as central values of a group, never as the datasheet of one version: nothing guarantees they coexist on a real powertrain. When the deployed dataset carries no fuel breakdown, 'fuel_mix' is absent and the fuel is left unsaid rather than reduced to the most frequent one"},"vehicle":{"type":"object","properties":{"commercial_name":{"type":"string"},"make":{"type":"string"},"year":{"type":"integer"},"engine_capacity_cm3":{"type":"integer"},"engine_power_kw":{"type":"integer"},"fuel":{"type":"string"},"fuel_mode":{"type":"string"},"make_source":{"type":"string"},"manufacturer":{"type":"string"},"manufacturer_eu":{"type":"string"},"mass_kg":{"type":"integer"},"type_approval":{"type":"object","description":"EU type-approval key actually matched, present on the precise form: number plus variant and version when they narrowed the match (they are omitted on purpose at match_level type_approval_partial)"},"wheelbase_mm":{"type":"integer"}},"required":["make"],"description":"The matched vehicle. On the precise forms it is a type-approval and carries its characteristics (fuel, fuel_mode, engine capacity, power, mass, wheelbase). At match_level 'model_year' it carries ONLY the key of the aggregate — make, commercial name, year — because an aggregate identifies no single vehicle; 'make' is the canonical brand (the same spelling the input key resolves to), and 'make_source' keeps the raw member-state label that was aggregated when it differs"}},"required":["co2","coverage","limits","match_level","vehicle"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"make":{"type":"string","description":"Optional on its own - Make of the vehicle (e.g. 'Renault'); short forms and member-state spellings are folded ('VW' and 'VOLKSWAGEN VW' both reach VOLKSWAGEN). Use either this approximate key — make, model and year, all three required together — or the precise one: 'type_approval' (the EU type-approval number, optionally narrowed by 'variant' and 'version'). Mixing the two keys is a 400"},"model":{"type":"string","description":"Optional on its own - Commercial name as reported to the EU registry (e.g. 'Clio'); case and accents are folded. Required together with 'make' and 'year'"},"year":{"type":"string","description":"Optional on its own - Registration year (YYYY) within the ingested window; a year outside it is a 404 whose message names the years actually served, never a silent miss"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-co2","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a European vehicle's type-approval CO2","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/vehicle/tax","description":"Before your agent buys, imports or quotes a vehicle in France: compute what registering it costs — CO2 malus, weight malus and the regional certificate tax — against the official schedule in force on the registration date you supply, not the one a model remembers. Coverage is France only; each item states its bracket, its threshold and the exemption applied with its legal article, and the total disappears rather than being partial","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"co2_wltp":"150","country":"FR","fiscal_power":"7","fuel":"diesel","region":"11","registration_date":"2026-05-01","weight_kg":"1900"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"co2_wltp":{"type":"string","description":"Optional. Declared WLTP CO2 in g/km (0-1000). The technical figures can instead be resolved from the EU CO2 dataset by passing 'type_approval', or 'make'+'model'+'year' (the keys of /vehicle/co2); they are then marked source 'resolved', and a declared value always wins"},"country":{"type":"string","description":"Jurisdiction, required. 'FR' is the only covered value: any other is a 400 COUNTRY_NOT_COVERED (unbilled) — a neighbouring schedule is never approximated"},"fiscal_power":{"type":"string","description":"Optional. Declared fiscal power, CV (1-999): the base of the regional tax. A French administrative figure absent from the EU registry — always declarative, never resolved"},"fuel":{"type":"string","description":"Optional when a resolution key is supplied: Declared fuel/powertrain, in the exact vocabulary of /vehicle/critair (electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid, usual synonyms accepted). Required unless a resolution key is given. It drives the automatic exemptions: above the mass threshold an unknown fuel leaves the weight malus 'undetermined' rather than guessed"},"region":{"type":"string","description":"Optional. French region, by INSEE code ('11') or name (case and accents folded). Administrative figure: always declarative. Unknown region is a 400"},"registration_date":{"type":"string","description":"Optional. Date of registration (YYYY-MM-DD, default today UTC). It selects the schedule to the day — the CO2 schedule changed mid-year on 2025-03-01. Earlier than the first published schedule is a 404 naming it (2020-01-01); a future date is legitimate while an open schedule covers it"},"weight_kg":{"type":"string","description":"Optional. Declared mass in running order, kg (100-20000): the base of the weight malus"}},"required":["country"]}},"output":{"type":"json","example":{"data":{"co2_malus":{"amount_eur":4279,"capped":false,"co2_g_km":150,"status":"due","threshold_g":108},"country":"FR","inputs_used":{"co2_wltp_g_km":{"source":"declared","value":150},"fiscal_power_cv":{"source":"declared","value":7},"fuel":{"source":"declared","value":"diesel"},"region":{"source":"declared","value":{"eur_per_fiscal_hp":68.95,"insee_code":"11","name":"Île-de-France"}},"weight_kg":{"source":"declared","value":1900}},"limits":["exemptions and allowances that depend on the taxpayer's situation (disability card, dependent children, legal person operating a vehicle with at least eight seats) are published in the schedules but never applied automatically"],"regional_tax":{"amount_eur":493.65,"fiscal_power_cv":7,"fixed_fee_eur":11,"proportional_eur":482.65,"region":{"eur_per_fiscal_hp":68.95,"insee_code":"11","name":"Île-de-France"},"status":"due"},"registration_date":"2026-05-01","schedule":{"as_of":"2026-07-28","co2_malus":{"valid_from":"2026-01-01","valid_to":"2026-12-31"},"legal_basis":[{"article":"L. 421-62","code":"code des impositions sur les biens et services","in_force_since":"2025-03-01","legi_id":"LEGIARTI000051214838","subject":"barèmes CO2 WLTP"}],"regional_tax_as_of":"2026-07-28","weight_malus":{"valid_from":"2026-01-01"}},"total_eur":10272.65,"weight_malus":{"amount_eur":5500,"brackets":[{"amount_eur":2000,"eur_per_kg":10,"from_kg":1500,"taxable_kg":200,"to_kg":1699},{"amount_eur":1500,"eur_per_kg":15,"from_kg":1700,"taxable_kg":100,"to_kg":1799},{"amount_eur":2000,"eur_per_kg":20,"from_kg":1800,"taxable_kg":100,"to_kg":1899}],"mass_kg":1900,"status":"due","taxable_mass_kg":1900,"threshold_kg":1500}},"provenance":{"fetched_at":"2026-07-29T09:42:54Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"fr-registration-tax"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"co2_malus":{"type":"object","properties":{"amount_eur":{"type":"integer"},"capped":{"type":"boolean"},"co2_g_km":{"type":"integer"},"status":{"type":"string"},"threshold_g":{"type":"integer"},"exemption":{"type":"object","description":"The article that exempts the vehicle, present when status is exempt — the exemption is named, never silent"},"reason":{"type":"string","description":"Why the item could not be computed, present when status is undetermined: a required figure was neither declared nor resolved. No amount is served rather than a guessed one, and total_eur disappears"}},"required":["status"],"description":"CO2 malus, priced gram by gram against the dated schedule. Its status is the closed enumeration shared by all three items, to be read BEFORE the amount: 'due' (computed, 0 EUR below the threshold included), 'exempt' (an automatic exemption applied and named by its article, e.g. electric and hydrogen under L. 421-67), 'not_applicable' (no schedule existed at that date: an absence of tax, not a data gap) or 'undetermined' (a required figure was neither declared nor resolved: no amount, a reason instead)"},"country":{"type":"string"},"inputs_used":{"type":"object","properties":{"co2_wltp_g_km":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"integer"}},"required":["source","value"]},"fiscal_power_cv":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"integer"}},"required":["source","value"]},"fuel":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"string"}},"required":["source","value"]},"region":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"object","properties":{"eur_per_fiscal_hp":{"type":"number"},"insee_code":{"type":"string"},"name":{"type":"string"}},"required":["eur_per_fiscal_hp","insee_code","name"]}},"required":["source","value"]},"weight_kg":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"integer"}},"required":["source","value"]},"resolution":{"type":"object"}},"required":[],"description":"Every figure used, with its source ('declared' or 'resolved'), so the result is reconstructable; a 'resolution' entry appears when a resolution key served, carrying the match_level of /vehicle/co2"},"limits":{"type":"array","items":{"type":"string"},"description":"The six reading limits returned with every answer: new French registrations only (no imported-used-car reduction), WLTP schedules only, taxpayer-dependent exemptions never applied automatically, no superethanol E85 allowance (the fuel vocabulary shared with /vehicle/critair does not express it), current regional tariffs only, annual and company-vehicle taxes out of scope"},"regional_tax":{"type":"object","properties":{"amount_eur":{"type":"number"},"fiscal_power_cv":{"type":"integer"},"fixed_fee_eur":{"type":"integer"},"proportional_eur":{"type":"number"},"region":{"type":"object","properties":{"eur_per_fiscal_hp":{"type":"number"},"insee_code":{"type":"string"},"name":{"type":"string"}},"required":["eur_per_fiscal_hp","insee_code","name"]},"status":{"type":"string"},"exemption":{"type":"object"},"reason":{"type":"string"}},"required":["fixed_fee_eur","status"],"description":"Regional certificate tax: fiscal power times the tariff voted by the region, plus the flat national fee (L. 421-38), which stays due even when the region exempts the vehicle — an exempt electric car still shows that amount. Same status enumeration"},"registration_date":{"type":"string"},"schedule":{"type":"object","properties":{"as_of":{"type":"string"},"co2_malus":{"type":"object","properties":{"valid_from":{"type":"string"},"valid_to":{"type":["string","null"],"description":"End of the applied schedule's validity, null when the period is still open (the most recent published schedule)"}},"required":["valid_from","valid_to"]},"legal_basis":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"code":{"type":"string"},"in_force_since":{"type":"string"},"legi_id":{"type":"string"},"subject":{"type":"string"}},"required":["article","code","in_force_since","legi_id","subject"]}},"regional_tax_as_of":{"type":"string"},"weight_malus":{"type":"object","properties":{"valid_from":{"type":"string"}},"required":["valid_from"]}},"required":["as_of","co2_malus","legal_basis","regional_tax_as_of"],"description":"Which schedule was applied: the validity window of each item and the code articles behind it with their LEGI identifiers, so the computation is auditable against the law"},"total_eur":{"type":"number","description":"Sum of the items — ABSENT as soon as one is 'undetermined': a partial total would be a wrong figure, so the field disappears instead. The other items stay computed and it remains a billed 200"},"weight_malus":{"type":"object","properties":{"amount_eur":{"type":"integer"},"brackets":{"type":"array","items":{"type":"object","properties":{"amount_eur":{"type":"integer"},"eur_per_kg":{"type":"integer"},"from_kg":{"type":"integer"},"taxable_kg":{"type":"integer"},"to_kg":{"type":"integer"}},"required":["amount_eur","eur_per_kg","from_kg","taxable_kg"]}},"mass_kg":{"type":"integer"},"status":{"type":"string"},"taxable_mass_kg":{"type":"integer"},"threshold_kg":{"type":"integer"},"allowance":{"type":"object"},"combined_cap":{"type":"object","description":"Present ONLY when the cap on the combined malus (article L. 421-74) reduced this item: the CO2 malus plus the weight malus may never exceed the maximum tariff of the applicable CO2 schedule (40000 EUR in 2022, 60000 in 2024, 80000 in 2026), and the reduction is charged to the weight malus. It carries amount_before_cap_eur, combined_cap_eur, max_amount_eur and reduction_eur, so the reduction is reconstructable. Its absence means the combined malus stays under the cap. Note the cap does not follow 'capped': at 191 g/km in 2026 the CO2 schedule is not saturated yet the combined cap already bites. The regional tax is not a malus and stays outside it, so total_eur remains the sum of the three items"},"exemption":{"type":"object"},"reason":{"type":"string"}},"required":["status"],"description":"Weight malus, at the marginal rate bracket by bracket on the mass after any allowance (plug-in hybrid allowance capped at 15% of the mass, L. 421-79-1). Same status enumeration; 'not_applicable' before 2022, when the tax did not exist"}},"required":["co2_malus","country","inputs_used","limits","regional_tax","registration_date","schedule","weight_malus"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"co2_wltp":{"type":"string","description":"Optional. Declared WLTP CO2 in g/km (0-1000). The technical figures can instead be resolved from the EU CO2 dataset by passing 'type_approval', or 'make'+'model'+'year' (the keys of /vehicle/co2); they are then marked source 'resolved', and a declared value always wins"},"country":{"type":"string","description":"Jurisdiction, required. 'FR' is the only covered value: any other is a 400 COUNTRY_NOT_COVERED (unbilled) — a neighbouring schedule is never approximated"},"fiscal_power":{"type":"string","description":"Optional. Declared fiscal power, CV (1-999): the base of the regional tax. A French administrative figure absent from the EU registry — always declarative, never resolved"},"fuel":{"type":"string","description":"Optional when a resolution key is supplied: Declared fuel/powertrain, in the exact vocabulary of /vehicle/critair (electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid, usual synonyms accepted). Required unless a resolution key is given. It drives the automatic exemptions: above the mass threshold an unknown fuel leaves the weight malus 'undetermined' rather than guessed"},"region":{"type":"string","description":"Optional. French region, by INSEE code ('11') or name (case and accents folded). Administrative figure: always declarative. Unknown region is a 400"},"registration_date":{"type":"string","description":"Optional. Date of registration (YYYY-MM-DD, default today UTC). It selects the schedule to the day — the CO2 schedule changed mid-year on 2025-03-01. Earlier than the first published schedule is a 404 naming it (2020-01-01); a future date is legitimate while an open schedule covers it"},"weight_kg":{"type":"string","description":"Optional. Declared mass in running order, kg (100-20000): the base of the weight malus"}},"required":["country"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-tax","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Compute a French vehicle registration tax","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/vehicle/prepurchase","description":"Before your agent buys a used vehicle: one VIN returns a decision - ok, review, stop, insufficient_coverage - over open recall campaigns (NHTSA, RappelConso), type-approval CO2 from the European Environment Agency, Crit'Air low-emission-zone class and what the French registration certificate would cost. Every reason names its block; the answer states what it cannot attest - service history, mileage, liens, accident damage.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"250000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"250000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"fiscal_power":"5","fuel":"electric","region":"ile-de-france","registration_date":"2026-03-15","vin":"5YJ3E1EA0KF000316"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"fiscal_power":{"type":"string","description":"Optional administrative horsepower (puissance fiscale, CV) from the registration certificate, field P.6. Missing, the tax block comes back 'insufficient_inputs' naming it"},"fuel":{"type":"string","description":"Optional declared fuel/powertrain (electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid), rules of /vehicle/critair: a thermal vehicle also needs 'euro_norm' or 'first_registration', a battery electric one needs neither. Nothing usable leaves the Crit'Air block missing with its reason - it never fails the dossier"},"region":{"type":"string","description":"Optional French region for the regional part of the registration tax (name or INSEE code). Missing, the tax block comes back 'insufficient_inputs' naming it: a named gap, never a guessed figure"},"registration_date":{"type":"string","description":"Optional date (YYYY-MM-DD) of the registration being priced - the date that CHOOSES the schedule, and at resale it is no longer the first registration. Falls back to 'first_registration', then to the day of the call. France is covered from 2020-01-01 onwards; an earlier date returns coverage 'date_out_of_range', which no extra attribute will ever unlock"},"vin":{"type":"string","description":"17-character Vehicle Identification Number (VIN alphabet, excludes I/O/Q). Required, and the dossier's only key. Malformed is a 400; an unknown manufacturer prefix (WMI) is a 404; and on THIS route a check digit (position 9) that is wrong WHERE IT IS REGULATORY - North America - is a 400 before any work, because one mistyped character would otherwise bill five blocks describing another vehicle. None of the three is billed. Outside North America position 9 is constrained by no text and is never held against the VIN"}},"required":["vin"]}},"output":{"type":"json","example":{"data":{"co2":{"co2":{"low_sample":false,"nedc":0,"sample_size":42680,"unit":"g/km","wltp":{"p10":0,"p50":0,"p90":0}},"coverage":{"min_sample":5,"versions_aggregated":110,"years_covered":[2018,2019,2020,2021,2022]},"match_level":"model_year","provenance":{"fetched_at":"2026-08-17T18:39:57.882726599Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"eea-co2-monitoring"},"typical_specs":{"engine_power_kw":150,"mass_kg":1931},"vehicle":{"commercial_name":"MODEL 3","make":"TESLA","year":2019}},"coverage":{"complete":true,"missing":[]},"critair":{"critair_class":"0","derivation":{"fuel":"electric","via":"fuel"},"fuel":"electric","provenance":{"fetched_at":"2026-08-17T18:39:57.882726599Z","freshness":{"as_of":"2026-07-04T00:00:00Z","kind":"snapshot"},"source":"critair-regulation+zfe-open-data"},"regulation":{"as_of":"2026-07-04","reference":"Arrêté du 21 juin 2016 (nomenclature Crit'Air, art. R. 318-2 du code de la route)"},"vehicle_class":"m1","zfe_restrictions":[]},"limits":"This dossier is built from public reference data keyed by the VIN alone. It attests neither the service history, the mileage, an outstanding lien or finance, accident or flood damage, the identity of the seller, nor a valid roadworthiness test (contrôle technique). Recall campaigns are candidates matched by make, model and model year: open sources never state whether the remedy was carried out on this VIN. Nothing here is a market value, an inspection or a purchase recommendation.","recalls":{"coverage":{"complete":false,"filters":{"year":{"applied":"partial","reason":"6 of 31 matched campaigns carry no model year range in the source: they match at brand level and the 'year' filter did not discriminate them","unfilterable":6}},"reason":"expected source(s) not ingested: Safety Gate","sources":[{"as_of":"2026-08-16","fresh":true,"name":"NHTSA"},{"as_of":"2026-08-16","fresh":true,"name":"RappelConso"},{"missing":true,"name":"Safety Gate","reason":"Safety Gate source is not currently ingested"}]},"make":"TESLA","provenance":{"fetched_at":"2026-08-17T18:39:57.882726599Z","freshness":{"as_of":"2026-08-16T00:00:00Z","kind":"snapshot"},"source":"nhtsa+rappelconso"},"recalls":[{"campaign_id":"26V507000","component":"EXTERIOR LIGHTING:HEADLIGHTS","match":{"make":"TESLA","model":["MODEL 3"],"years":{"from":2019,"to":2019}},"published_at":"2026-08-04","remedy":"The remedy is currently under development. Owner notification letters are expected to be mailed September 15, 2026.","source":"NHTSA","summary":"Tesla, Inc. (Tesla) is recalling certain 2017-2023 Model 3 and 2020-2023 Model Y vehicles. The headlight low beams may be too bright and exceed the maximum light output.","url":"https://www.nhtsa.gov/recalls?nhtsaId=26V507000"}],"total":31,"truncated":false,"year":2019},"registration_tax":{"co2_malus":{"amount_eur":0,"co2_g_km":0,"exemption":{"article":"L. 421-67","id":"electric_or_hydrogen","label":"vehicle powered exclusively by electricity, hydrogen or both"},"status":"exempt","threshold_g":108},"country":"FR","coverage":"computed","inputs_used":{"co2_wltp_g_km":{"source":"resolved","value":0},"fiscal_power_cv":{"source":"declared","value":5},"fuel":{"source":"declared","value":"electric"},"region":{"source":"declared","value":{"eur_per_fiscal_hp":68.95,"insee_code":"11","name":"Île-de-France"}},"weight_kg":{"source":"resolved","value":1931}},"regional_tax":{"amount_eur":11.0,"exemption":{"article":"L. 421-49","id":"regional_clean_vehicle_exemption","label":"region has voted the exemption of electric and hydrogen vehicles"},"fiscal_power_cv":5,"fixed_fee_eur":11,"proportional_eur":0.0,"region":{"eur_per_fiscal_hp":68.95,"insee_code":"11","name":"Île-de-France"},"status":"exempt"},"registration_date":"2026-03-15","schedule":{"as_of":"2026-07-28","co2_malus":{"valid_from":"2026-01-01","valid_to":"2026-12-31"},"regional_tax_as_of":"2026-07-28","weight_malus":{"valid_from":"2026-01-01"}},"total_eur":11.0,"weight_malus":{"amount_eur":0,"exemption":{"article":"L. 421-79","id":"low_carbon_footprint_electric_or_hydrogen","label":"low-carbon-footprint vehicle, and hydrogen or electric vehicle"},"mass_kg":1931,"status":"exempt","threshold_kg":1500}},"verdict":{"decision":"review","reasons":[{"block":"recalls","code":"open_recall_campaign","decision":"review","message":"31 recall campaign(s) target this make, model and model year; open sources never state whether the remedy was carried out on this VIN, so each one stays to be checked with the manufacturer network"}]},"vin_decode":{"attributes":{"Body Class":"Sedan/Saloon","Electrification Level":"BEV (Battery Electric Vehicle)","Model":"Model 3"},"check_digit_applicable":true,"check_digit_valid":true,"country":"UNITED STATES (USA)","coverage":{"complete":true},"make":"Tesla","make_source":"wmi","manufacturer":"TESLA, INC.","model_year":2019,"model_year_ambiguous":true,"provenance":{"fetched_at":"2026-08-17T18:39:57.882726599Z","freshness":{"as_of":"2026-07-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa-vpic"},"region":"North America","vin":"5YJ3E1EA0KF000316","wmi":"5YJ"}},"provenance":{"fetched_at":"2026-08-17T18:39:57.882726599Z","freshness":{"as_of":"2026-07-01T00:00:00Z","kind":"snapshot"},"source":"nhtsa-vpic"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"co2":{"type":"object","properties":{"co2":{"type":"object","properties":{"low_sample":{"type":"boolean"},"nedc":{"type":"integer"},"sample_size":{"type":"integer"},"unit":{"type":"string"},"wltp":{"type":"object","properties":{"p10":{"type":"integer"},"p50":{"type":"integer"},"p90":{"type":"integer"}},"required":["p50"]}},"required":["low_sample","nedc","sample_size","unit"]},"coverage":{"type":"object","properties":{"min_sample":{"type":"integer"},"versions_aggregated":{"type":"integer"},"years_covered":{"type":"array","items":{"type":"integer"}}},"required":["min_sample","versions_aggregated","years_covered"]},"match_level":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"typical_specs":{"type":"object","properties":{"engine_power_kw":{"type":"integer"},"mass_kg":{"type":"integer"},"engine_capacity_cm3":{"type":"integer"},"fuel_mix":{"type":"array"}},"required":["engine_power_kw"]},"vehicle":{"type":"object","properties":{"commercial_name":{"type":"string"},"make":{"type":"string"},"year":{"type":"integer"},"make_source":{"type":"string"}},"required":["make"]},"limits":{"type":"array"}},"required":["co2","coverage","match_level","provenance","vehicle"],"description":"Best-effort EU CO2 block (core of /vehicle/co2), keyed by the decoded make, model and model year - hence ALWAYS match_level 'model_year' with its p10/p90 dispersion: a European VIN carries no type-approval variant, a limit never worked around with a single figure. Its typical figures are what the tax block resolves its CO2 and mass from"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"missing":{"type":"array"}},"required":["complete","missing"],"description":"Honest coverage of the secondary blocks: complete=false as soon as one is missing, each named with its reason - never an invented block, never a silent error. The tax costing is not listed here: that block is always present and carries its own coverage"},"critair":{"type":"object","properties":{"critair_class":{"type":"string"},"derivation":{"type":"object","properties":{"fuel":{"type":"string"},"via":{"type":"string"},"euro_norm":{"type":"string"}},"required":["fuel","via"]},"fuel":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"regulation":{"type":"object","properties":{"as_of":{"type":"string"},"reference":{"type":"string"}},"required":["as_of","reference"]},"vehicle_class":{"type":"string"},"zfe_restrictions":{"type":"array"},"euro_norm":{"type":"string"},"first_registration":{"type":"string"},"notes":{"type":"string"}},"required":["critair_class","derivation","fuel","provenance","regulation","vehicle_class","zfe_restrictions"],"description":"Best-effort Crit'Air block (core and rules of /vehicle/critair): present as soon as the declared characteristics allow a class - a battery electric needs neither norm nor date - otherwise in coverage.missing with its reason, never a 5xx"},"limits":{"type":"string","description":"Fixed sentence served in every dossier: it attests neither service history, mileage, an outstanding lien, accident damage, the seller's identity nor a valid roadworthiness test, and recall campaigns are candidates - open sources never say whether the remedy was carried out on this VIN. No market value, no inspection, no purchase recommendation"},"recalls":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"filters":{"type":"object","properties":{"year":{"type":"object","properties":{"applied":{"type":"string"},"reason":{"type":"string"},"unfilterable":{"type":"integer"}},"required":["applied","reason","unfilterable"]}},"required":["year"]},"reason":{"type":"string"},"sources":{"type":"array","items":{"type":"object","properties":{"as_of":{"type":"string"},"fresh":{"type":"boolean"},"name":{"type":"string"}},"required":["as_of","fresh","name"]}}},"required":["complete","reason","sources"]},"make":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"recalls":{"type":"array","items":{"type":"object","properties":{"campaign_id":{"type":"string"},"component":{"type":"string"},"match":{"type":"object","properties":{"make":{"type":"string"},"model":{"type":"array","items":{"type":"string"}},"years":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"}},"required":["from","to"]}},"required":["make"]},"published_at":{"type":"string"},"remedy":{"type":"string"},"source":{"type":"string"},"summary":{"type":"string"},"url":{"type":"string"}},"required":["campaign_id","match","source","summary"]}},"total":{"type":"integer"},"truncated":{"type":"boolean"},"year":{"type":"integer"},"vin":{"type":"object"}},"required":["coverage","make","provenance","recalls","total","truncated"],"description":"Best-effort recall block: candidate campaigns matched by the decoded make and model year, with its own multi-source provenance. The count that feeds the verdict is 'total', taken BEFORE the page cap, so no verdict depends on the cap. Listed in coverage.missing when it cannot be produced, never a 5xx"},"registration_tax":{"type":"object","properties":{"co2_malus":{"type":"object","properties":{"amount_eur":{"type":"integer"},"co2_g_km":{"type":"integer"},"exemption":{"type":"object","properties":{"article":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"}},"required":["article","id","label"]},"status":{"type":"string"},"threshold_g":{"type":"integer"}},"required":["amount_eur","co2_g_km","exemption","status","threshold_g"]},"country":{"type":"string"},"coverage":{"type":"string"},"inputs_used":{"type":"object","properties":{"co2_wltp_g_km":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"integer"}},"required":["source","value"]},"fiscal_power_cv":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"integer"}},"required":["source","value"]},"fuel":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"string"}},"required":["source","value"]},"region":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"object","properties":{"eur_per_fiscal_hp":{"type":"number"},"insee_code":{"type":"string"},"name":{"type":"string"}},"required":["eur_per_fiscal_hp","insee_code","name"]}},"required":["source","value"]},"weight_kg":{"type":"object","properties":{"source":{"type":"string"},"value":{"type":"integer"}},"required":["source","value"]}},"required":["co2_wltp_g_km","fiscal_power_cv","fuel","region","weight_kg"]},"regional_tax":{"type":"object","properties":{"amount_eur":{"type":"number"},"exemption":{"type":"object","properties":{"article":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"}},"required":["article","id","label"]},"fiscal_power_cv":{"type":"integer"},"fixed_fee_eur":{"type":"integer"},"proportional_eur":{"type":"number"},"region":{"type":"object","properties":{"eur_per_fiscal_hp":{"type":"number"},"insee_code":{"type":"string"},"name":{"type":"string"}},"required":["eur_per_fiscal_hp","insee_code","name"]},"status":{"type":"string"}},"required":["amount_eur","exemption","fiscal_power_cv","fixed_fee_eur","proportional_eur","region","status"]},"registration_date":{"type":"string"},"schedule":{"type":"object","properties":{"as_of":{"type":"string"},"co2_malus":{"type":"object","properties":{"valid_from":{"type":"string"},"valid_to":{"type":"string"}},"required":["valid_from","valid_to"]},"regional_tax_as_of":{"type":"string"},"weight_malus":{"type":"object","properties":{"valid_from":{"type":"string"},"valid_to":{"type":["string","null"]}},"required":["valid_from"]}},"required":["as_of","co2_malus","regional_tax_as_of","weight_malus"]},"total_eur":{"type":"number"},"weight_malus":{"type":"object","properties":{"amount_eur":{"type":"integer"},"exemption":{"type":"object","properties":{"article":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"}},"required":["article","id","label"]},"mass_kg":{"type":"integer"},"status":{"type":"string"},"threshold_kg":{"type":"integer"}},"required":["amount_eur","exemption","mass_kg","status","threshold_kg"]},"missing_inputs":{"type":"array"},"reason":{"type":"string"}},"required":["co2_malus","country","coverage","inputs_used","regional_tax","registration_date","schedule","total_eur","weight_malus"],"description":"French registration tax block (core of /vehicle/tax), ALWAYS present with its own closed coverage: 'computed' (items, thresholds, exemptions by article, total_eur), 'insufficient_inputs' naming what is missing, or 'date_out_of_range' when the date predates the published schedules. Never a partial total. Add 'region' and 'fiscal_power' to the query for a costing"},"verdict":{"type":"object","properties":{"decision":{"type":"string"},"reasons":{"type":"array","items":{"type":"object","properties":{"block":{"type":"string"},"code":{"type":"string"},"decision":{"type":"string"},"message":{"type":"string"}},"required":["block","code","decision","message"]},"description":"One entry per fact that weighed, each with its closed code (vin_check_digit_invalid, open_recall_campaign, recall_sources_unavailable, critair_not_eligible, block_unavailable, registration_cost_inputs_missing, registration_cost_out_of_schedule_range), the block it comes from, the decision IT carries and a message naming the quantity or campaign in cause. The facts are BORROWED from the blocks and never recomputed, so a reason can never contradict the dossier it concludes"}},"required":["decision"],"description":"The dossier's conclusion. 'decision' is a closed enumeration - ok, review, insufficient_coverage, stop - and it is the MOST SEVERE of the decisions carried by the reasons, nothing is merged: an agent that wants to weigh them differently reads the list. 'insufficient_coverage' outranks 'review' on purpose: not knowing is more binding than a point to check. 'ok' requires the TOTAL absence of reasons - five blocks produced, no campaign targeting the vehicle, a Crit'Air class obtained and a costing figure"},"vin_decode":{"type":"object","properties":{"attributes":{"type":"object","properties":{"Body Class":{"type":"string"},"Electrification Level":{"type":"string"},"Model":{"type":"string"}},"required":["Body Class","Electrification Level","Model"]},"check_digit_applicable":{"type":"boolean"},"check_digit_valid":{"type":"boolean"},"country":{"type":"string"},"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"reason":{"type":"string"}},"required":["complete"]},"make":{"type":"string"},"make_source":{"type":"string"},"manufacturer":{"type":"string"},"model_year":{"type":"integer"},"model_year_ambiguous":{"type":"boolean"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"region":{"type":"string"},"vin":{"type":"string"},"wmi":{"type":"string"}},"required":["check_digit_applicable","check_digit_valid","coverage","manufacturer","model_year_ambiguous","provenance","vin","wmi"],"description":"Mandatory base block: the full VIN decode (/vehicle/vin/decode) with its own vPIC provenance"}},"required":["coverage","limits","registration_tax","verdict","vin_decode"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"fiscal_power":{"type":"string","description":"Optional administrative horsepower (puissance fiscale, CV) from the registration certificate, field P.6. Missing, the tax block comes back 'insufficient_inputs' naming it"},"fuel":{"type":"string","description":"Optional declared fuel/powertrain (electric, hydrogen, gas (gpl/gnv), plug_in_hybrid, petrol, diesel, petrol_hybrid, diesel_hybrid), rules of /vehicle/critair: a thermal vehicle also needs 'euro_norm' or 'first_registration', a battery electric one needs neither. Nothing usable leaves the Crit'Air block missing with its reason - it never fails the dossier"},"region":{"type":"string","description":"Optional French region for the regional part of the registration tax (name or INSEE code). Missing, the tax block comes back 'insufficient_inputs' naming it: a named gap, never a guessed figure"},"registration_date":{"type":"string","description":"Optional date (YYYY-MM-DD) of the registration being priced - the date that CHOOSES the schedule, and at resale it is no longer the first registration. Falls back to 'first_registration', then to the day of the call. France is covered from 2020-01-01 onwards; an earlier date returns coverage 'date_out_of_range', which no extra attribute will ever unlock"},"vin":{"type":"string","description":"17-character Vehicle Identification Number (VIN alphabet, excludes I/O/Q). Required, and the dossier's only key. Malformed is a 400; an unknown manufacturer prefix (WMI) is a 404; and on THIS route a check digit (position 9) that is wrong WHERE IT IS REGULATORY - North America - is a 400 before any work, because one mistyped character would otherwise bill five blocks describing another vehicle. None of the three is billed. Outside North America position 9 is constrained by no text and is never held against the VIN"}},"required":["vin"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-prepurchase","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Pre-purchase check on a used vehicle from its VIN","tags":["vehicle"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.25"}},{"resource":{"url":"https://api.invoket.com/vehicle/lookup","description":"Turn a vehicle designation an agent actually holds - 'Renault Clio V', 'VW Golf 2020' - into the make/model/year key that /vehicle/recalls and /vehicle/co2 require, spelled the way the referential spells it. Sources: NHTSA and RappelConso recall campaigns, EEA European registration aggregates. Closed verdict: exact, ambiguous or none. Several model years for one model is the normal answer, and every candidate is returned - we never pick one for you.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"make":"volkswagen","q":"golf"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"make":{"type":"string","description":"Optional - narrows to one make, in any spelling the curated aliases know ('vw', 'volkswagen', 'mercedes-benz'). It only REDUCES the candidate set, it never changes the shape of the answer. Unlike the year read from the text, a filter is FIRM: it narrows even to nothing, and a make no referential knows yields 'none' rather than a wider list"},"q":{"type":"string","description":"Required - the designation as you hold it: a make, a model, a commercial name, with or without a model year ('Renault Clio V', 'VW Golf 2020'), up to 200 characters. Absent, empty or blank is a 400 and nothing is billed - a malformed request is not a 'none'. A four-digit number inside the text is read as a model year, but only as an INDICATION: it narrows when it matches and it steps aside when it would leave nothing, so 'Clio 2015' does not come back empty on a referential that publishes the Clio"}},"required":["q"]}},"output":{"type":"json","example":{"data":{"candidates":[{"accepted_by":["/vehicle/co2","/vehicle/recalls"],"id":{"make":"VOLKSWAGEN","model":"GOLF","year":2022},"id_kind":"make_model_year","label":"VOLKSWAGEN GOLF 2022","sources":["eea-co2-monitoring","rappelconso"],"years":{"from":1997,"to":2022}},{"accepted_by":["/vehicle/co2","/vehicle/recalls"],"id":{"make":"VOLKSWAGEN","model":"GOLF","year":2021},"id_kind":"make_model_year","label":"VOLKSWAGEN GOLF 2021","sources":["eea-co2-monitoring","nhtsa","rappelconso"],"years":{"from":1997,"to":2022}},{"accepted_by":["/vehicle/co2","/vehicle/recalls"],"id":{"make":"VOLKSWAGEN","model":"GOLF","year":2020},"id_kind":"make_model_year","label":"VOLKSWAGEN GOLF 2020","sources":["eea-co2-monitoring","nhtsa","rappelconso"],"years":{"from":1997,"to":2022}},{"accepted_by":["/vehicle/co2","/vehicle/recalls"],"id":{"make":"VOLKSWAGEN","model":"GOLF","year":2019},"id_kind":"make_model_year","label":"VOLKSWAGEN GOLF 2019","sources":["eea-co2-monitoring","nhtsa","rappelconso"],"years":{"from":1997,"to":2022}},{"accepted_by":["/vehicle/co2","/vehicle/recalls"],"id":{"make":"VOLKSWAGEN","model":"GOLF","year":2018},"id_kind":"make_model_year","label":"VOLKSWAGEN GOLF 2018","sources":["eea-co2-monitoring","nhtsa","rappelconso"],"years":{"from":1997,"to":2022}}],"limits":"A resolution names what the referential publishes for the text you sent, as of the date carried by the provenance; it does not certify that the entity resolved is the one you had in mind. Candidates come from the recall campaigns and the European registration aggregates already ingested: a make/model absent from both is not a statement about the vehicle, only about these referentials. Generation designations ('V', '5', 'Mk5') are not interpreted, as no referential publishes them; a four-digit number in the text is read as a model year. A candidate without a year is accepted by /vehicle/recalls, where the year is optional, but not by /vehicle/co2, which requires one.","query":"golf","total":5,"truncated":false,"verdict":"ambiguous"},"provenance":{"fetched_at":"2026-08-17T19:59:03.922266042Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"nhtsa+rappelconso+eea-co2-monitoring"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"candidates":{"type":"array","items":{"type":"object","properties":{"accepted_by":{"type":"array","items":{"type":"string"},"description":"Which endpoints of this service accept this key, COMPUTED against the store and never deduced from a convention: /vehicle/co2 only accepts a key carrying a model year, while /vehicle/recalls accepts one as soon as the make is known to its sources. This is the field that makes the promise checkable"},"id":{"type":"object","properties":{"make":{"type":"string"},"model":{"type":"string"},"year":{"type":"integer"}},"required":["make","model","year"],"description":"The key downstream accepts AS IS - copy it into the next endpoint without reworking it. It is COMPOSITE here ({make, model, year}) because that is what the vehicle referentials index; 'model' and 'year' are absent on a broader key, which 'id_kind' names"},"id_kind":{"type":"string","description":"The nature of the key: 'make_model_year' (accepted everywhere), 'make_model', or 'make' - the make-only fallback, returned when the text names a known make but no published model. That fallback is a partial match served WITH what makes it differ, never a silent 'exact'"},"label":{"type":"string","description":"The designation as the source publishes it - the commercial name verbatim when the aggregate carries one. Never recased, never re-accented, never completed"},"sources":{"type":"array","items":{"type":"string"},"description":"Which referentials publish THIS candidate: 'nhtsa' and 'rappelconso' for recall campaigns, 'eea-co2-monitoring' for the European registration aggregates"},"years":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"}},"required":["from","to"],"description":"The model years attached to this make/model in the referentials that publish it - the discriminant that lets you tell two candidates apart. Omitted when no bound is published"}},"required":["accepted_by","id","id_kind","label","sources","years"]},"description":"Always served - one element on 'exact', EMPTY on 'none', never absent and never null. Order is stable and mechanical (make, model, then model year descending), never a relevance ranking: no similarity score exists here, and a rank would read as a confidence we do not have"},"limits":{"type":"string","description":"Fixed sentence served in every response. Its first half is common to the whole lookup family; the rest is this domain's: candidates come only from the ingested recall campaigns and European aggregates, generation designations ('V', '5', 'Mk5') are NOT interpreted because no referential publishes them, and a candidate without a year is accepted by /vehicle/recalls but not by /vehicle/co2"},"query":{"type":"string","description":"The text you sent, echoed verbatim - what was actually resolved"},"total":{"type":"integer","description":"Candidates found BEFORE the 25-item cap. The verdict is derived from this number, never from the served slice, so a truncated list can never be 'exact'"},"truncated":{"type":"boolean","description":"Whether the served list is cut at the cap. There is no pagination: a second page would be a second paid call for the same question - narrow with a filter instead"},"verdict":{"type":"string","description":"Closed enumeration, and there is nothing else. 'exact': one single candidate answers. 'ambiguous': several do - the NORMAL case here, because a model spans several model years - and they are ALL returned so you choose. 'none': the referentials publish nothing for this text, at the snapshot date. All three are 200 and all three are billed: 'none' is the answer that stops an agent inventing a make and model"}},"required":["candidates","limits","query","total","truncated","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"make":{"type":"string","description":"Optional - narrows to one make, in any spelling the curated aliases know ('vw', 'volkswagen', 'mercedes-benz'). It only REDUCES the candidate set, it never changes the shape of the answer. Unlike the year read from the text, a filter is FIRM: it narrows even to nothing, and a make no referential knows yields 'none' rather than a wider list"},"q":{"type":"string","description":"Required - the designation as you hold it: a make, a model, a commercial name, with or without a model year ('Renault Clio V', 'VW Golf 2020'), up to 200 characters. Absent, empty or blank is a 400 and nothing is billed - a malformed request is not a 'none'. A four-digit number inside the text is read as a model year, but only as an INDICATION: it narrows when it matches and it steps aside when it would leave nothing, so 'Clio 2015' does not come back empty on a referential that publishes the Clio"}},"required":["q"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/vehicle-lookup","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Resolve a vehicle designation to its referential key","tags":["vehicle","lookup"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/invoice/read","description":"Read any EU structured e-invoice in one call: post a Factur-X PDF, CII or UBL XML and get faithful structured data - parties with SIREN/VAT identifiers, line items, VAT breakdown, totals, payment IBAN and due dates. Covers the three formats mandated by the French 2026-2027 e-invoicing reform (EN 16931). No account, no key, no OCR guesswork.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"document_base64":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDb3JwdXMgRi0xMDIg4oCUIGZhY3R1cmUgc3ludGjDqXRpcXVlIDogYXV0b2xpcXVpZGF0aW9uIChjYXTDqWdvcmllIEFFKSwKICAgICBjb25mb3JtZSBFTiAxNjkzMSAodmVydGUgcG91ciBsJ29yYWNsZSBvZmZpY2llbCkuIC0tPgo8SW52b2ljZSB4bWxuczpjYWM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkFnZ3JlZ2F0ZUNvbXBvbmVudHMtMiIKIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiCiB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6SW52b2ljZS0yIj4KICA8Y2JjOkN1c3RvbWl6YXRpb25JRD51cm46Y2VuLmV1OmVuMTY5MzE6MjAxNzwvY2JjOkN1c3RvbWl6YXRpb25JRD4KICA8Y2JjOklEPlNZTi1JQy0wMDE8L2NiYzpJRD4KICA8Y2JjOklzc3VlRGF0ZT4yMDI2LTA2LTE1PC9jYmM6SXNzdWVEYXRlPgogIDxjYmM6RHVlRGF0ZT4yMDI2LTA3LTE1PC9jYmM6RHVlRGF0ZT4KICA8Y2JjOkludm9pY2VUeXBlQ29kZT4zODA8L2NiYzpJbnZvaWNlVHlwZUNvZGU+CiAgPGNiYzpEb2N1bWVudEN1cnJlbmN5Q29kZT5FVVI8L2NiYzpEb2N1bWVudEN1cnJlbmN5Q29kZT4KICA8Y2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogICAgPGNhYzpQYXJ0eT4KICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgIDxjYmM6U3RyZWV0TmFtZT4xMiBydWUgZGUgbGEgUGFpeDwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgPGNiYzpDaXR5TmFtZT5QYXJpczwvY2JjOkNpdHlOYW1lPgogICAgICAgIDxjYmM6UG9zdGFsWm9uZT43NTAwMjwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+RlI8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5GUjQwMzAzMjY1MDQ1PC9jYmM6Q29tcGFueUlEPgogICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgPGNiYzpJRD5WQVQ8L2NiYzpJRD4KICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPkZvdXJuaXNzZXVyIFNBUzwvY2JjOlJlZ2lzdHJhdGlvbk5hbWU+CiAgICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lSUQ9IjAwMDIiPjMwMzI2NTA0NTwvY2JjOkNvbXBhbnlJRD4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogIDxjYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CiAgICA8Y2FjOlBhcnR5PgogICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgPGNiYzpTdHJlZXROYW1lPkhhdXB0c3RyYXNzZSAxPC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICA8Y2JjOkNpdHlOYW1lPkJlcmxpbjwvY2JjOkNpdHlOYW1lPgogICAgICAgIDxjYmM6UG9zdGFsWm9uZT4xMDExNTwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+REU8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5ERTEyMzQ1Njc4OTwvY2JjOkNvbXBhbnlJRD4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgIDxjYmM6UmVnaXN0cmF0aW9uTmFtZT5LdW5kZSBHbWJIPC9jYmM6UmVnaXN0cmF0aW9uTmFtZT4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdDdXN0b21lclBhcnR5PgogIDxjYWM6RGVsaXZlcnk+PGNiYzpBY3R1YWxEZWxpdmVyeURhdGU+MjAyNi0wNi0xMDwvY2JjOkFjdHVhbERlbGl2ZXJ5RGF0ZT48Y2FjOkRlbGl2ZXJ5TG9jYXRpb24+PGNhYzpBZGRyZXNzPjxjYWM6Q291bnRyeT48Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5ERTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT48L2NhYzpDb3VudHJ5PjwvY2FjOkFkZHJlc3M+PC9jYWM6RGVsaXZlcnlMb2NhdGlvbj48L2NhYzpEZWxpdmVyeT48Y2FjOlRheFRvdGFsPgogICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4wLjAwPC9jYmM6VGF4QW1vdW50PgogICAgPGNhYzpUYXhTdWJ0b3RhbD4KICAgICAgPGNiYzpUYXhhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOlRheGFibGVBbW91bnQ+CiAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MC4wMDwvY2JjOlRheEFtb3VudD4KICAgICAgPGNhYzpUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPks8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNiYzpUYXhFeGVtcHRpb25SZWFzb24+SW50cmEtY29tbXVuaXR5IHN1cHBseTwvY2JjOlRheEV4ZW1wdGlvblJlYXNvbj4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpUYXhDYXRlZ29yeT4KICAgIDwvY2FjOlRheFN1YnRvdGFsPgogIDwvY2FjOlRheFRvdGFsPgogIDxjYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2JjOlRheEV4Y2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEyMDAuMDA8L2NiYzpUYXhFeGNsdXNpdmVBbW91bnQ+CiAgICA8Y2JjOlRheEluY2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEyMDAuMDA8L2NiYzpUYXhJbmNsdXNpdmVBbW91bnQ+CiAgICA8Y2JjOlBheWFibGVBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMjAwLjAwPC9jYmM6UGF5YWJsZUFtb3VudD4KICA8L2NhYzpMZWdhbE1vbmV0YXJ5VG90YWw+CiAgPGNhYzpJbnZvaWNlTGluZT4KICAgIDxjYmM6SUQ+MTwvY2JjOklEPgogICAgPGNiYzpJbnZvaWNlZFF1YW50aXR5IHVuaXRDb2RlPSJEQVkiPjM8L2NiYzpJbnZvaWNlZFF1YW50aXR5PgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2FjOkl0ZW0+CiAgICAgIDxjYmM6TmFtZT5QcmVzdGF0aW9uIGRlIGNvbnNlaWw8L2NiYzpOYW1lPgogICAgICA8Y2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPks8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPlZBVDwvY2JjOklEPgogICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgPC9jYWM6Q2xhc3NpZmllZFRheENhdGVnb3J5PgogICAgPC9jYWM6SXRlbT4KICAgIDxjYWM6UHJpY2U+CiAgICAgIDxjYmM6UHJpY2VBbW91bnQgY3VycmVuY3lJRD0iRVVSIj40MDAuMDA8L2NiYzpQcmljZUFtb3VudD4KICAgIDwvY2FjOlByaWNlPgogIDwvY2FjOkludm9pY2VMaW5lPgo8L0ludm9pY2U+Cg=="},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"document_base64":{"type":"string","description":"Base64 (standard alphabet, whitespace tolerated) of the complete document: a Factur-X/ZUGFeRD PDF (PDF/A-3 with embedded XML) or a CII D16B / UBL 2.1 invoice XML. Alternatively, skip JSON entirely and POST the raw bytes with Content-Type: application/pdf or application/xml. Max body 10 MB (413 beyond). Scanned/image PDFs without embedded XML are rejected (400) - this endpoint reads the structured formats of the EN 16931 core, no OCR"}},"required":["document_base64"]}},"output":{"type":"json","example":{"data":{"coverage":{"absent_fields":["vat_accounting_currency","buyer_reference","sales_order_reference","payment_terms","business_process","preceding_invoices","allowances","charges","lines"],"notes":[]},"format":{"declared_profile":"basicwl","kind":"facturx"},"invoice":{"allowances":[],"buyer":{"address":{"city":"Lyon","country":"FR","line1":"35 rue de la République","postal_code":"69001"},"identifiers":[],"legal_registration_id":{"scheme":"0002","value":"78787878400035"},"name":"Ma jolie boutique","vat_id":"FR19787878784"},"charges":[],"contract_reference":"MSPE2017","currency":"EUR","due_date":"2017-12-13","issue_date":"2017-11-13","lines":[],"notes":[{"content":"Franco de port (commande > 300 € HT)"}],"number":"FA-2017-0010","order_reference":"PO445","payment_means":[{"credit_accounts":[{"iban_or_account":"FR2012421242124212421242124"}],"means_code":"30","remittance_info":"FA-2017-0010"}],"seller":{"address":{"city":"Malaucène","country":"FR","line1":"1242 chemin de l'olive","postal_code":"84340"},"identifiers":[],"legal_registration_id":{"scheme":"0002","value":"99999999800010"},"name":"Au bon moulin","vat_id":"FR11999999998"},"specification_id":"urn:factur-x.eu:1p0:basicwl","totals":{"due":"470.15","grand_total":"671.15","lines_net":"624.90","net":"624.90","prepaid":"201.00","vat_total":"46.25"},"type_code":"380","vat_breakdown":[{"category":"S","rate":"20.00","tax_amount":"16.38","taxable_amount":"81.90"},{"category":"S","rate":"5.50","tax_amount":"29.87","taxable_amount":"543.00"}]}},"provenance":{"fetched_at":"2026-07-11T17:17:58Z","freshness":{"kind":"live"},"source":"invoice-document"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"absent_fields":{"type":"array","items":{"type":"string"},"description":"Top-level semantic model fields the document does not carry - the coverage contract: what is not said is named, never silent"},"notes":{"type":"array","description":"Reading particularities worth knowing: embedded XML found under a non-standard attachment name, multiple PDF attachments, etc."}},"required":["absent_fields","notes"]},"format":{"type":"object","properties":{"declared_profile":{"type":["string","null"],"description":"Factur-X/ZUGFeRD profile DECLARED by the document's specification identifier (BT-24): minimum, basicwl, basic, en16931 or extended; null when absent or from an unknown family. Restated without being verified - profile conformance is /invoice/validate's job"},"kind":{"type":"string","description":"Detected document format: 'facturx' (PDF with embedded XML), 'cii' (UN/CEFACT Cross Industry Invoice D16B) or 'ubl' (UBL 2.1 Invoice/CreditNote)"}},"required":["declared_profile","kind"]},"invoice":{"type":"object","properties":{"allowances":{"type":"array"},"buyer":{"type":["object","null"],"properties":{"address":{"type":["object","null"],"properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["city","country","line1","postal_code"]},"identifiers":{"type":"array"},"legal_registration_id":{"type":["object","null"],"properties":{"scheme":{"type":"string"},"value":{"type":"string"}},"required":["scheme","value"]},"name":{"type":["string","null"]},"vat_id":{"type":["string","null"]}},"required":["address","identifiers","legal_registration_id","name","vat_id"]},"charges":{"type":"array"},"contract_reference":{"type":["string","null"]},"currency":{"type":["string","null"]},"due_date":{"type":["string","null"]},"issue_date":{"type":["string","null"]},"lines":{"type":"array","description":"Invoice lines (BG-25) with item identifiers, quantities, unit prices and VAT category per line. Empty for the Factur-X MINIMUM and BASIC WL profiles, which carry document-level data only (then listed in coverage.absent_fields)"},"notes":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string"}},"required":["content"]}},"number":{"type":["string","null"]},"order_reference":{"type":["string","null"]},"payment_means":{"type":"array","items":{"type":"object","properties":{"credit_accounts":{"type":"array","items":{"type":"object","properties":{"iban_or_account":{"type":["string","null"],"description":"Payment account identifier (BT-84, usually an IBAN) restated as written in the document - syntax and plausibility checks are /invoice/validate's job"}},"required":["iban_or_account"]}},"means_code":{"type":["string","null"]},"remittance_info":{"type":["string","null"]}},"required":["credit_accounts","means_code","remittance_info"]}},"seller":{"type":["object","null"],"properties":{"address":{"type":["object","null"],"properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["city","country","line1","postal_code"]},"identifiers":{"type":"array"},"legal_registration_id":{"type":["object","null"],"properties":{"scheme":{"type":"string"},"value":{"type":"string"}},"required":["scheme","value"]},"name":{"type":["string","null"]},"vat_id":{"type":["string","null"]}},"required":["address","identifiers","legal_registration_id","name","vat_id"]},"specification_id":{"type":["string","null"]},"totals":{"type":["object","null"],"properties":{"due":{"type":["string","null"]},"grand_total":{"type":["string","null"]},"lines_net":{"type":["string","null"]},"net":{"type":["string","null"]},"prepaid":{"type":["string","null"]},"vat_total":{"type":["string","null"]}},"required":["due","grand_total","lines_net","net","prepaid","vat_total"],"description":"Document totals (BG-22): lines net, invoice net, VAT total, grand total, prepaid and amount due - restated as written, arithmetic consistency is /invoice/validate's job"},"type_code":{"type":["string","null"]},"vat_breakdown":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"},"tax_amount":{"type":"string"},"taxable_amount":{"type":"string"}},"required":["category","rate","tax_amount","taxable_amount"]}},"business_process":{"type":["string","null"]},"buyer_reference":{"type":["string","null"]},"delivery":{"type":["object","null"]},"invoiced_object_id":{"type":["object","null"]},"invoicing_period":{"type":["object","null"]},"payee":{"type":["object","null"]},"payment_terms":{"type":["string","null"]},"preceding_invoices":{"type":"array"},"sales_order_reference":{"type":["string","null"]},"supporting_documents":{"type":"array"},"tax_point_date":{"type":["string","null"]},"tax_representative":{"type":["object","null"]},"vat_accounting_currency":{"type":["string","null"]}},"required":["allowances","buyer","charges","contract_reference","currency","due_date","issue_date","lines","notes","number","order_reference","payment_means","seller","specification_id","totals","type_code","vat_breakdown"],"description":"The EN 16931 semantic model (BT/BG terms) projected faithfully: what the document says, inconsistencies included - no conformance judgement, no guessed field. Amounts are exact decimal strings preserving the source scale. Every BT term is always present and null when the document does not carry it; every BG group is an array that may be empty. A MINIMUM-profile invoice is therefore mostly nulls - a perfectly nominal successful answer; coverage.absent_fields lists what is missing"}},"required":["coverage","format","invoice"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"document_base64":{"type":"string","description":"Base64 (standard alphabet, whitespace tolerated) of the complete document: a Factur-X/ZUGFeRD PDF (PDF/A-3 with embedded XML) or a CII D16B / UBL 2.1 invoice XML. Alternatively, skip JSON entirely and POST the raw bytes with Content-Type: application/pdf or application/xml. Max body 10 MB (413 beyond). Scanned/image PDFs without embedded XML are rejected (400) - this endpoint reads the structured formats of the EN 16931 core, no OCR"}},"required":["document_base64"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-read","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Read a structured e-invoice (Factur-X, CII, UBL)","tags":["invoice"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/invoice/validate","description":"Should you accept this invoice? Post a Factur-X PDF, CII or UBL XML and get a deterministic EN 16931 verdict: XSD conformance, every violated business rule by its official BR id with observed vs expected values, Factur-X profile consistency, and syntax checks on IBAN, SIREN/SIRET and VAT identifiers. The formats mandated by the French 2026-2027 reform. A non-conformant invoice is a paid, documented answer - no LLM guesswork. Add ?ruleset=xrechnung or ?ruleset=peppol to layer a national CIUS pack on top of the EN 16931 base: XRechnung (German BR-DE rules, DE mandate) or Peppol BIS Billing 3.0 (BE mandate, live since 2026-04), each violation sourced by its official id (BR-DE-xx, PEPPOL-EN16931-Rxxx). Each verdict also carries informational VAT consistency checks (INV-VAT-*), never mixed with the normative BR ids.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"document_base64":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDb3JwdXMgRi0xMDIg4oCUIGZhY3R1cmUgc3ludGjDqXRpcXVlIDogYXV0b2xpcXVpZGF0aW9uIChjYXTDqWdvcmllIEFFKSwKICAgICBjb25mb3JtZSBFTiAxNjkzMSAodmVydGUgcG91ciBsJ29yYWNsZSBvZmZpY2llbCkuIC0tPgo8SW52b2ljZSB4bWxuczpjYWM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkFnZ3JlZ2F0ZUNvbXBvbmVudHMtMiIKIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiCiB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6SW52b2ljZS0yIj4KICA8Y2JjOkN1c3RvbWl6YXRpb25JRD51cm46Y2VuLmV1OmVuMTY5MzE6MjAxNzwvY2JjOkN1c3RvbWl6YXRpb25JRD4KICA8Y2JjOklEPlNZTi1JQy0wMDE8L2NiYzpJRD4KICA8Y2JjOklzc3VlRGF0ZT4yMDI2LTA2LTE1PC9jYmM6SXNzdWVEYXRlPgogIDxjYmM6RHVlRGF0ZT4yMDI2LTA3LTE1PC9jYmM6RHVlRGF0ZT4KICA8Y2JjOkludm9pY2VUeXBlQ29kZT4zODA8L2NiYzpJbnZvaWNlVHlwZUNvZGU+CiAgPGNiYzpEb2N1bWVudEN1cnJlbmN5Q29kZT5FVVI8L2NiYzpEb2N1bWVudEN1cnJlbmN5Q29kZT4KICA8Y2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogICAgPGNhYzpQYXJ0eT4KICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgIDxjYmM6U3RyZWV0TmFtZT4xMiBydWUgZGUgbGEgUGFpeDwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgPGNiYzpDaXR5TmFtZT5QYXJpczwvY2JjOkNpdHlOYW1lPgogICAgICAgIDxjYmM6UG9zdGFsWm9uZT43NTAwMjwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+RlI8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5GUjQwMzAzMjY1MDQ1PC9jYmM6Q29tcGFueUlEPgogICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgPGNiYzpJRD5WQVQ8L2NiYzpJRD4KICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPkZvdXJuaXNzZXVyIFNBUzwvY2JjOlJlZ2lzdHJhdGlvbk5hbWU+CiAgICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lSUQ9IjAwMDIiPjMwMzI2NTA0NTwvY2JjOkNvbXBhbnlJRD4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogIDxjYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CiAgICA8Y2FjOlBhcnR5PgogICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgPGNiYzpTdHJlZXROYW1lPkhhdXB0c3RyYXNzZSAxPC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICA8Y2JjOkNpdHlOYW1lPkJlcmxpbjwvY2JjOkNpdHlOYW1lPgogICAgICAgIDxjYmM6UG9zdGFsWm9uZT4xMDExNTwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+REU8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5ERTEyMzQ1Njc4OTwvY2JjOkNvbXBhbnlJRD4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgIDxjYmM6UmVnaXN0cmF0aW9uTmFtZT5LdW5kZSBHbWJIPC9jYmM6UmVnaXN0cmF0aW9uTmFtZT4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdDdXN0b21lclBhcnR5PgogIDxjYWM6RGVsaXZlcnk+PGNiYzpBY3R1YWxEZWxpdmVyeURhdGU+MjAyNi0wNi0xMDwvY2JjOkFjdHVhbERlbGl2ZXJ5RGF0ZT48Y2FjOkRlbGl2ZXJ5TG9jYXRpb24+PGNhYzpBZGRyZXNzPjxjYWM6Q291bnRyeT48Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5ERTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT48L2NhYzpDb3VudHJ5PjwvY2FjOkFkZHJlc3M+PC9jYWM6RGVsaXZlcnlMb2NhdGlvbj48L2NhYzpEZWxpdmVyeT48Y2FjOlRheFRvdGFsPgogICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4wLjAwPC9jYmM6VGF4QW1vdW50PgogICAgPGNhYzpUYXhTdWJ0b3RhbD4KICAgICAgPGNiYzpUYXhhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOlRheGFibGVBbW91bnQ+CiAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MC4wMDwvY2JjOlRheEFtb3VudD4KICAgICAgPGNhYzpUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPks8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNiYzpUYXhFeGVtcHRpb25SZWFzb24+SW50cmEtY29tbXVuaXR5IHN1cHBseTwvY2JjOlRheEV4ZW1wdGlvblJlYXNvbj4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpUYXhDYXRlZ29yeT4KICAgIDwvY2FjOlRheFN1YnRvdGFsPgogIDwvY2FjOlRheFRvdGFsPgogIDxjYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2JjOlRheEV4Y2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEyMDAuMDA8L2NiYzpUYXhFeGNsdXNpdmVBbW91bnQ+CiAgICA8Y2JjOlRheEluY2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEyMDAuMDA8L2NiYzpUYXhJbmNsdXNpdmVBbW91bnQ+CiAgICA8Y2JjOlBheWFibGVBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMjAwLjAwPC9jYmM6UGF5YWJsZUFtb3VudD4KICA8L2NhYzpMZWdhbE1vbmV0YXJ5VG90YWw+CiAgPGNhYzpJbnZvaWNlTGluZT4KICAgIDxjYmM6SUQ+MTwvY2JjOklEPgogICAgPGNiYzpJbnZvaWNlZFF1YW50aXR5IHVuaXRDb2RlPSJEQVkiPjM8L2NiYzpJbnZvaWNlZFF1YW50aXR5PgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2FjOkl0ZW0+CiAgICAgIDxjYmM6TmFtZT5QcmVzdGF0aW9uIGRlIGNvbnNlaWw8L2NiYzpOYW1lPgogICAgICA8Y2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPks8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPlZBVDwvY2JjOklEPgogICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgPC9jYWM6Q2xhc3NpZmllZFRheENhdGVnb3J5PgogICAgPC9jYWM6SXRlbT4KICAgIDxjYWM6UHJpY2U+CiAgICAgIDxjYmM6UHJpY2VBbW91bnQgY3VycmVuY3lJRD0iRVVSIj40MDAuMDA8L2NiYzpQcmljZUFtb3VudD4KICAgIDwvY2FjOlByaWNlPgogIDwvY2FjOkludm9pY2VMaW5lPgo8L0ludm9pY2U+Cg=="},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"document_base64":{"type":"string","description":"Base64 (standard alphabet, whitespace tolerated) of the complete document: a Factur-X/ZUGFeRD PDF (PDF/A-3 with embedded XML) or a CII D16B / UBL 2.1 invoice XML. Alternatively, skip JSON entirely and POST the raw bytes with Content-Type: application/pdf or application/xml. Max body 10 MB (413 beyond). Optional query parameter ?profile=declared|strict (default declared): strict additionally evaluates full EN 16931 conformance even when the declared Factur-X profile is poorer (no-op for UBL). Optional query parameter ?ruleset=en16931|xrechnung|peppol (default en16931, the EN 16931 base alone): additive - the requested national CIUS pack is checked ON TOP of the four base layers, its fatal violations count toward the verdict and its warnings are surfaced separately under data.ruleset. xrechnung applies the German BR-DE rules (UBL or CII); peppol applies Peppol BIS Billing 3.0 (UBL only - a CII document with ?ruleset=peppol is a paid 200 with an invalid verdict and a peppol_requires_ubl violation, never a 4xx). Composable with ?profile=strict; an unknown value is a 400. Scanned/image PDFs without embedded XML are rejected (400) - this endpoint judges the structured formats of the EN 16931 core, no OCR"}},"required":["document_base64"]}},"output":{"type":"json","example":{"data":{"document":{"currency":"EUR","format":"cii","grand_total":"250.33","number":"12115118","seller":"De Koksmaat"},"layers":{"business_rules":{"ok":false,"violations":[{"expected":"20.73","message":"Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117).","observed":"21.73","path":"BG-22/BT-110","rule_id":"BR-CO-14","severity":"fatal"},{"expected":"251.33","message":"Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).","observed":"250.33","path":"BG-22/BT-112","rule_id":"BR-CO-15","severity":"fatal"}]},"plausibility":{"bic_format":{"status":"not_present"},"buyer_electronic_address":{"status":"not_present"},"buyer_legal_id_luhn":{"status":"not_present"},"buyer_vat_syntax":{"status":"not_present"},"currency_is_monetary":{"status":"pass"},"due_date_calendar":{"status":"pass"},"iban_checksum":{"status":"pass"},"issue_date_calendar":{"status":"pass"},"ok":true,"seller_electronic_address":{"status":"not_present"},"seller_legal_id_luhn":{"status":"not_present"},"seller_vat_syntax":{"status":"pass"}},"profile":{"content_profile":"en16931","ok":true,"profile":"en16931","status":"declared","urn":"urn:cen.eu:en16931:2017","xsd_violations":[]},"xsd":{"errors":[],"ok":true}},"summary":{"artefacts_version":"en16931-1.3.16+facturx-1.08+xrechnung-3.0.2+peppol-bis-3.0.20","coverage":{"families":["BR (mandatory information)","BR-CO (coherence and computed totals)","BR-DEC (decimal precision)","BR-S / BR-Z / BR-E / BR-AE / BR-IC / BR-G / BR-O / BR-AF / BR-AG / BR-B (VAT categories)","BR-CL (code lists)"],"not_implemented":[]},"profile_mode":"declared","violations":{"business_rules_fatal":2,"business_rules_warning":0,"plausibility_failed":0,"profile":0,"xsd":0}},"verdict":"invalid","warnings_present":false},"provenance":{"fetched_at":"2026-07-11T17:17:58Z","freshness":{"as_of":"2026-07-13T00:00:00Z","kind":"snapshot"},"source":"en16931-artefacts"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"document":{"type":"object","properties":{"currency":{"type":["string","null"]},"format":{"type":"string"},"grand_total":{"type":["string","null"]},"number":{"type":["string","null"]},"seller":{"type":["string","null"]}},"required":["currency","format","grand_total","number","seller"],"description":"Minimal identification echo of the judged document (number, seller, grand total) - the full semantic model is /invoice/read's job"},"layers":{"type":"object","properties":{"business_rules":{"type":"object","properties":{"ok":{"type":"boolean"},"violations":{"type":"array","items":{"type":"object","properties":{"expected":{"type":"string"},"message":{"type":"string"},"observed":{"type":"string","description":"Value found in the document, present only when the rule makes it computable; same for expected — neither is invented"},"path":{"type":"string"},"rule_id":{"type":"string"},"severity":{"type":"string"}},"required":["message","path","rule_id","severity"]},"description":"Layer 2 - every violated EN 16931 business rule with its OFFICIAL id (BR-xx, BR-CO-xx, BR-S-xx...), severity, normative message, semantic path (BT/BG terms) and observed vs expected values where computable - sourced verdicts, no LLM opinion"}},"required":["ok","violations"]},"plausibility":{"type":"object","properties":{"bic_format":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"buyer_electronic_address":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"buyer_legal_id_luhn":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"buyer_vat_syntax":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"currency_is_monetary":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"due_date_calendar":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"iban_checksum":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"issue_date_calendar":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"ok":{"type":"boolean"},"seller_electronic_address":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"seller_legal_id_luhn":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"seller_vat_syntax":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]}},"required":["bic_format","buyer_electronic_address","buyer_legal_id_luhn","buyer_vat_syntax","currency_is_monetary","due_date_calendar","iban_checksum","issue_date_calendar","ok","seller_electronic_address","seller_legal_id_luhn","seller_vat_syntax"],"description":"Layer 4 - 11 checks no BR rule has an opinion on, each pass/fail/not_present: IBAN mod-97, BIC ISO 9362 format, SIREN/SIRET Luhn (La Poste exception handled), VAT syntax by country prefix, calendar reality of the issue and due dates (BT-2, BT-9), electronic address form vs its EAS scheme (BT-34, BT-49), BT-5 currency usable for billing (XXX and XTS fail). One fail makes the verdict invalid - still a paid 200. Zero registry lookup - to verify the counterparty actually exists, use /company/resolve and /company/vat"},"profile":{"type":"object","properties":{"content_profile":{"type":"string"},"ok":{"type":"boolean"},"profile":{"type":"string"},"status":{"type":"string"},"urn":{"type":"string"},"xsd_violations":{"type":"array"}},"required":["content_profile","ok","profile","status","urn","xsd_violations"],"description":"Layer 3 - Factur-X/ZUGFeRD profile consistency (CII only, status 'not_applicable' for UBL): profile declared by the BT-24 URN, XSD conformance to that profile, and declared-vs-content mismatch via the smallest nested profile whose XSD accepts the document"},"xsd":{"type":"object","properties":{"errors":{"type":"array"},"ok":{"type":"boolean"}},"required":["errors","ok"],"description":"Layer 1 - schema validity against the official XSDs (CII D16B, UBL 2.1 Invoice/CreditNote, or the declared Factur-X profile's XSD)"}},"required":["business_rules","plausibility","profile","xsd"]},"summary":{"type":"object","properties":{"artefacts_version":{"type":"string","description":"Pinned version of the four embedded artefact packs dating the verdict: CEN EN 16931, FNFE Factur-X and the two ?ruleset= CIUS packs (XRechnung, Peppol BIS) - also restated as provenance.freshness.as_of"},"coverage":{"type":"object","properties":{"families":{"type":"array","items":{"type":"string"},"description":"The coverage contract: rule families actually verified are listed, anything not implemented is named in not_implemented - never silent"},"not_implemented":{"type":"array"}},"required":["families","not_implemented"]},"profile_mode":{"type":"string"},"violations":{"type":"object","properties":{"business_rules_fatal":{"type":"integer"},"business_rules_warning":{"type":"integer"},"plausibility_failed":{"type":"integer"},"profile":{"type":"integer"},"xsd":{"type":"integer"}},"required":["business_rules_fatal","business_rules_warning","plausibility_failed","profile","xsd"]},"notes":{"type":"array"}},"required":["artefacts_version","coverage","profile_mode","violations"]},"verdict":{"type":"string","description":"Deterministic verdict: 'valid' or 'invalid' (any fatal finding in any layer). A non-conformant invoice is a paid 200 - the documented negative verdict is the product; only an unreadable body is a 400"},"warnings_present":{"type":"boolean"},"ruleset":{"type":"object","description":"Report of the national CIUS pack requested with ?ruleset= (xrechnung or peppol): the packs actually evaluated, its fatal violations (which do count toward the verdict) and its non-blocking warnings (which do not). Absent in the default en16931 base mode"}},"required":["document","layers","summary","verdict","warnings_present"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"document_base64":{"type":"string","description":"Base64 (standard alphabet, whitespace tolerated) of the complete document: a Factur-X/ZUGFeRD PDF (PDF/A-3 with embedded XML) or a CII D16B / UBL 2.1 invoice XML. Alternatively, skip JSON entirely and POST the raw bytes with Content-Type: application/pdf or application/xml. Max body 10 MB (413 beyond). Optional query parameter ?profile=declared|strict (default declared): strict additionally evaluates full EN 16931 conformance even when the declared Factur-X profile is poorer (no-op for UBL). Optional query parameter ?ruleset=en16931|xrechnung|peppol (default en16931, the EN 16931 base alone): additive - the requested national CIUS pack is checked ON TOP of the four base layers, its fatal violations count toward the verdict and its warnings are surfaced separately under data.ruleset. xrechnung applies the German BR-DE rules (UBL or CII); peppol applies Peppol BIS Billing 3.0 (UBL only - a CII document with ?ruleset=peppol is a paid 200 with an invalid verdict and a peppol_requires_ubl violation, never a 4xx). Composable with ?profile=strict; an unknown value is a 400. Scanned/image PDFs without embedded XML are rejected (400) - this endpoint judges the structured formats of the EN 16931 core, no OCR"}},"required":["document_base64"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-validate","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Validate an e-invoice against EN 16931 (verdict + BR rule ids)","tags":["invoice"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/invoice/generate","description":"Before your agent bills a customer: get the invoice document itself, ready to send and archive - not a verdict on someone else's file. Post simple business JSON (parties, lines, VAT), receive XML already cleared by the full official EN 16931 rule set, totals computed, inconsistent input refused field by field. CII by default (Factur-X EN 16931 URN), syntax=ubl for UBL 2.1, ruleset=peppol for Peppol BIS Billing 3.0. vat_treatment writes the reverse charge or intra-Community exemption mention.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"100000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"100000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"buyer":{"address":{"city":"Paris","country":"FR","line1":"4 avenue du Parc","postal_code":"75011"},"name":"Agence Lumen SAS","vat_id":"FR23342663721"},"currency":"EUR","due_date":"2026-08-11","invoice_number":"FA-2026-0042","issue_date":"2026-07-12","lines":[{"description":"Fabrication comptoir chene massif","qty":"1","unit":"C62","unit_price":"1200.00","vat":{"category":"S","rate":"20"}},{"description":"Pose et finition sur site","qty":"6","unit":"HUR","unit_price":"85.00","vat":{"category":"S","rate":"20"}}],"payment":{"iban":"FR7630006000011234567890189","terms":"30 jours nets"},"seller":{"address":{"city":"Lyon","country":"FR","line1":"12 rue des Artisans","postal_code":"69003"},"legal_id":{"scheme":"0002","value":"732829320"},"name":"Menuiserie Dubois SARL","vat_id":"FR44732829320"}},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"buyer":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]},"currency":{"type":"string","description":"Invoice currency (BT-5), ISO 4217, required. It must be usable for billing: XXX (no currency) and XTS (test) are a 400 implausible_currency although BR-CL accepts them - a restriction no BR rule states; metals and units of account (XAU, XAG, XPD, XPT, XDR, XUA) are accepted"},"due_date":{"type":"string"},"invoice_number":{"type":"string","description":"Invoice number (BT-1), required. The whole input is the simple business JSON shown here - unknown or misspelled fields are refused (400 INVALID_INVOICE_INPUT), a typo is never silently ignored. Max body 10 MB (413 beyond). Optional syntax: 'cii' (default, Factur-X CII D16B) or 'ubl' (UBL 2.1 Invoice). Optional ruleset: 'peppol' guarantees a Peppol BIS Billing 3.0 document (Belgium mandate) - it requires syntax='ubl' (else 400 ruleset_requires_ubl), a buyer_reference (BT-10), and on both seller and buyer an electronic_address {value, scheme} whose scheme is an EAS code (e.g. 0208 Belgian company number, 0009 SIRET); an unknown scheme is a 400 invalid_eas_scheme. The generated document is re-validated against the requested ruleset before being served. Under ANY ruleset, a supplied electronic_address is form-checked: a value repeating its own EAS code, or malformed for the declared scheme, is a 400 implausible_identifier"},"issue_date":{"type":"string","description":"Issue date (BT-2), required, YYYY-MM-DD AND a real calendar date - 2026-13-99 fits the pattern but is a 400 invalid_date. Optional due_date (BT-9, same check) and type_code (BT-3, default 380 commercial invoice, 381 credit note)"},"lines":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"qty":{"type":"string"},"unit":{"type":"string"},"unit_price":{"type":"string"},"vat":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"}},"required":["category","rate"],"description":"Line VAT: category (BT-151, UNTDID 5305: S standard, Z zero-rated, E exempt, AE reverse charge...), rate in percent (BT-152), and for exempt categories an exemption_reason (BT-120) carried onto the VAT breakdown - all EN 16931 VAT rules (BR-S/E/AE/Z...) are enforced, violations come back as 400 issues with their official BR ids"}},"required":["description","qty","unit","unit_price","vat"]},"description":"Invoice lines (BG-25), required non-empty. Line ids (BT-126) are numbered for you; each line net (BT-131) is computed as qty x unit_price with the official EN 16931 rounding. Document totals (BG-22) and the VAT breakdown (BG-23) are computed from the lines; an optional top-level `totals` object is VERIFIED against that computation and rejected with code inconsistent_totals if it diverges - never silently repaired"},"payment":{"type":"object","properties":{"iban":{"type":"string","description":"Optional. Payment IBAN (BT-84), becomes a credit-transfer payment instruction (BG-16, UNTDID 4461 code 30). Mod-97 checksum enforced. Optional payment.terms (BT-20)"},"terms":{"type":"string"}},"required":[]},"seller":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"legal_id":{"type":"object","properties":{"scheme":{"type":"string"},"value":{"type":"string"}},"required":["value"],"description":"Optional. Seller legal registration identifier (BT-30): value plus optional ISO 6523 scheme (0002 SIREN). Syntax-checked (Luhn) like the VAT ids and the IBAN - an implausible identifier is rejected (400 with code implausible_identifier). To verify the party actually exists, use /company/resolve"},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]}},"required":["buyer","currency","invoice_number","issue_date","lines","seller"]}},"output":{"type":"json","example":{"data":{"computed":{"totals":{"due":"2052","grand_total":"2052","lines_net":"1710","net":"1710","vat_total":"342"},"vat_breakdown":[{"category":"S","rate":"20","tax_amount":"342","taxable_amount":"1710"}]},"profile":"urn:cen.eu:en16931:2017","validated":true,"xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- the three standard CII D16B namespace declarations (rsm/ram/udt) on the root tag,\n     and the ExchangedDocumentContext carrying the BT-24 profile URN (echoed verbatim\n     in data.profile), elided for brevity -->\n<rsm:CrossIndustryInvoice>\n  <rsm:ExchangedDocument>\n    <ram:ID>FA-2026-0042</ram:ID><ram:TypeCode>380</ram:TypeCode>\n    <ram:IssueDateTime><udt:DateTimeString format=\"102\">20260712</udt:DateTimeString></ram:IssueDateTime>\n  </rsm:ExchangedDocument>\n  <rsm:SupplyChainTradeTransaction>\n    <!-- 2 IncludedSupplyChainTradeLineItem (BG-25), the SellerTradeParty/BuyerTradeParty\n         (names, legal ids schemeID=\"0002\", postal addresses, VAT registrations schemeID=\"VA\")\n         and the payment means (IBAN, TypeCode 30) elided for brevity -->\n    <ram:ApplicableHeaderTradeSettlement>\n      <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>\n      <!-- ApplicableTradeTax (VAT S 20%: basis 1710, tax 342), payment terms (due 20260811)\n           and the SpecifiedTradeSettlementHeaderMonetarySummation (BG-22, restated exactly\n           under data.computed.totals) elided -->\n    </ram:ApplicableHeaderTradeSettlement>\n  </rsm:SupplyChainTradeTransaction>\n</rsm:CrossIndustryInvoice>\n"},"provenance":{"fetched_at":"2026-07-12T14:18:41Z","freshness":{"as_of":"2026-07-13T00:00:00Z","kind":"snapshot"},"source":"en16931-artefacts"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"computed":{"type":"object","properties":{"totals":{"type":"object","properties":{"due":{"type":"string"},"grand_total":{"type":"string"},"lines_net":{"type":"string"},"net":{"type":"string"},"vat_total":{"type":"string"}},"required":["due","grand_total","lines_net","net","vat_total"]},"vat_breakdown":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"},"tax_amount":{"type":"string"},"taxable_amount":{"type":"string"}},"required":["category","rate","tax_amount","taxable_amount"]}}},"required":["totals","vat_breakdown"],"description":"The totals (BG-22) and VAT breakdown (BG-23) actually serialized in the XML, restated for agent re-reading: computed from the lines when not provided, verified when provided. Amounts are exact decimal strings"},"profile":{"type":["string","null"],"description":"Profile URN emitted in the XML's BT-24 for CII output: urn:cen.eu:en16931:2017 (Factur-X EN 16931) - the legal core of the French 2026-2027 reform. Null for UBL output (the Factur-X profile is a CII notion; the UBL CustomizationID carries the bare EN 16931 identifier, or the Peppol BIS Billing 3.0 customization when ruleset=peppol). The response also echoes syntax ('ubl' only, omitted for the CII default) and ruleset ('peppol' only). PDF/A-3 (Factur-X envelope) is the dedicated /invoice/generate-pdf endpoint"},"validated":{"type":"boolean","description":"Post-condition echo: always true on a 200 (generated-then-validated guarantee)"},"xml":{"type":"string","description":"The complete generated CII D16B XML, guaranteed conformant: before being served it is re-parsed and re-validated by the service's own EN 16931 engine (the four layers of /invoice/validate: XSD, business rules BR-xx, Factur-X profile, identifier plausibility). A generation that would fail its own validation is a 500 - never served, never charged"},"ruleset":{"type":"string"},"syntax":{"type":"string"},"vat_treatment":{"type":"object"},"warnings":{"type":"array"}},"required":["computed","profile","validated","xml"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"buyer":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]},"currency":{"type":"string","description":"Invoice currency (BT-5), ISO 4217, required. It must be usable for billing: XXX (no currency) and XTS (test) are a 400 implausible_currency although BR-CL accepts them - a restriction no BR rule states; metals and units of account (XAU, XAG, XPD, XPT, XDR, XUA) are accepted"},"due_date":{"type":"string"},"invoice_number":{"type":"string","description":"Invoice number (BT-1), required. The whole input is the simple business JSON shown here - unknown or misspelled fields are refused (400 INVALID_INVOICE_INPUT), a typo is never silently ignored. Max body 10 MB (413 beyond). Optional syntax: 'cii' (default, Factur-X CII D16B) or 'ubl' (UBL 2.1 Invoice). Optional ruleset: 'peppol' guarantees a Peppol BIS Billing 3.0 document (Belgium mandate) - it requires syntax='ubl' (else 400 ruleset_requires_ubl), a buyer_reference (BT-10), and on both seller and buyer an electronic_address {value, scheme} whose scheme is an EAS code (e.g. 0208 Belgian company number, 0009 SIRET); an unknown scheme is a 400 invalid_eas_scheme. The generated document is re-validated against the requested ruleset before being served. Under ANY ruleset, a supplied electronic_address is form-checked: a value repeating its own EAS code, or malformed for the declared scheme, is a 400 implausible_identifier"},"issue_date":{"type":"string","description":"Issue date (BT-2), required, YYYY-MM-DD AND a real calendar date - 2026-13-99 fits the pattern but is a 400 invalid_date. Optional due_date (BT-9, same check) and type_code (BT-3, default 380 commercial invoice, 381 credit note)"},"lines":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"qty":{"type":"string"},"unit":{"type":"string"},"unit_price":{"type":"string"},"vat":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"}},"required":["category","rate"],"description":"Line VAT: category (BT-151, UNTDID 5305: S standard, Z zero-rated, E exempt, AE reverse charge...), rate in percent (BT-152), and for exempt categories an exemption_reason (BT-120) carried onto the VAT breakdown - all EN 16931 VAT rules (BR-S/E/AE/Z...) are enforced, violations come back as 400 issues with their official BR ids"}},"required":["description","qty","unit","unit_price","vat"]},"description":"Invoice lines (BG-25), required non-empty. Line ids (BT-126) are numbered for you; each line net (BT-131) is computed as qty x unit_price with the official EN 16931 rounding. Document totals (BG-22) and the VAT breakdown (BG-23) are computed from the lines; an optional top-level `totals` object is VERIFIED against that computation and rejected with code inconsistent_totals if it diverges - never silently repaired"},"payment":{"type":"object","properties":{"iban":{"type":"string","description":"Optional. Payment IBAN (BT-84), becomes a credit-transfer payment instruction (BG-16, UNTDID 4461 code 30). Mod-97 checksum enforced. Optional payment.terms (BT-20)"},"terms":{"type":"string"}},"required":[]},"seller":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"legal_id":{"type":"object","properties":{"scheme":{"type":"string"},"value":{"type":"string"}},"required":["value"],"description":"Optional. Seller legal registration identifier (BT-30): value plus optional ISO 6523 scheme (0002 SIREN). Syntax-checked (Luhn) like the VAT ids and the IBAN - an implausible identifier is rejected (400 with code implausible_identifier). To verify the party actually exists, use /company/resolve"},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]}},"required":["buyer","currency","invoice_number","issue_date","lines","seller"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-generate","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Generate a conformant EN 16931 e-invoice (CII XML)","tags":["invoice"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.10"}},{"resource":{"url":"https://api.invoket.com/invoice/generate-pdf","description":"Before your agent bills a customer: get the whole Factur-X file it sends and the customer reads - a PDF/A-3B embedding the EN 16931 CII XML, the hybrid invoice mandated by the French 2026-2027 reform. Post simple business JSON (parties, lines, VAT), get a file ready to send and archive: totals computed, inconsistent input refused field by field, the official rule set cleared and the embedded XML re-read byte for byte. vat_treatment writes the reverse charge or intra-Community exemption mention.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"100000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"100000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"buyer":{"address":{"city":"Paris","country":"FR","line1":"4 avenue du Parc","postal_code":"75011"},"name":"Agence Lumen SAS","vat_id":"FR23342663721"},"currency":"EUR","due_date":"2026-08-11","invoice_number":"FA-2026-0042","issue_date":"2026-07-12","lines":[{"description":"Fabrication comptoir chene massif","qty":"1","unit":"C62","unit_price":"1200.00","vat":{"category":"S","rate":"20"}},{"description":"Pose et finition sur site","qty":"6","unit":"HUR","unit_price":"85.00","vat":{"category":"S","rate":"20"}}],"payment":{"iban":"FR7630006000011234567890189","terms":"30 jours nets"},"seller":{"address":{"city":"Lyon","country":"FR","line1":"12 rue des Artisans","postal_code":"69003"},"legal_id":{"scheme":"0002","value":"732829320"},"name":"Menuiserie Dubois SARL","vat_id":"FR44732829320"}},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"buyer":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]},"currency":{"type":"string","description":"Invoice currency (BT-5), ISO 4217, required. It must be usable for billing: XXX (no currency) and XTS (test) are a 400 implausible_currency although BR-CL accepts them - a restriction no BR rule states; metals and units of account (XAU, XAG, XPD, XPT, XDR, XUA) are accepted"},"due_date":{"type":"string"},"invoice_number":{"type":"string","description":"Invoice number (BT-1), required. The whole input is the simple business JSON shown here (identical to /invoice/generate) - unknown or misspelled fields are refused (400 INVALID_INVOICE_INPUT), a typo is never silently ignored. Max body 10 MB (413 beyond). A supplied electronic_address {value, scheme} is form-checked here too: a value repeating its own EAS code, or malformed for the declared scheme, is a 400 implausible_identifier"},"issue_date":{"type":"string","description":"Issue date (BT-2), required, YYYY-MM-DD AND a real calendar date - 2026-13-99 fits the pattern but is a 400 invalid_date. Optional due_date (BT-9, same check) and type_code (BT-3, default 380 commercial invoice, 381 credit note)"},"lines":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"qty":{"type":"string"},"unit":{"type":"string"},"unit_price":{"type":"string"},"vat":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"}},"required":["category","rate"],"description":"Line VAT: category (BT-151, UNTDID 5305: S standard, Z zero-rated, E exempt, AE reverse charge...), rate in percent (BT-152), and for exempt categories an exemption_reason (BT-120) carried onto the VAT breakdown - all EN 16931 VAT rules (BR-S/E/AE/Z...) are enforced, violations come back as 400 issues with their official BR ids"}},"required":["description","qty","unit","unit_price","vat"]},"description":"Invoice lines (BG-25), required non-empty. Line ids (BT-126) are numbered for you; each line net (BT-131) is computed as qty x unit_price with the official EN 16931 rounding. Document totals (BG-22) and the VAT breakdown (BG-23) are computed from the lines; an optional top-level `totals` object is VERIFIED against that computation and rejected with code inconsistent_totals if it diverges - never silently repaired"},"payment":{"type":"object","properties":{"iban":{"type":"string","description":"Optional. Payment IBAN (BT-84), becomes a credit-transfer payment instruction (BG-16, UNTDID 4461 code 30). Mod-97 checksum enforced. Optional payment.terms (BT-20)"},"terms":{"type":"string"}},"required":[]},"seller":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"legal_id":{"type":"object","properties":{"scheme":{"type":"string"},"value":{"type":"string"}},"required":["value"],"description":"Optional. Seller legal registration identifier (BT-30): value plus optional ISO 6523 scheme (0002 SIREN). Syntax-checked (Luhn) like the VAT ids and the IBAN - an implausible identifier is rejected (400 with code implausible_identifier). To verify the party actually exists, use /company/resolve"},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]}},"required":["buyer","currency","invoice_number","issue_date","lines","seller"]}},"output":{"type":"json","example":{"data":{"computed":{"totals":{"due":"2052","grand_total":"2052","lines_net":"1710","net":"1710","vat_total":"342"},"vat_breakdown":[{"category":"S","rate":"20","tax_amount":"342","taxable_amount":"1710"}]},"pdf_base64":"JVBERi0xLjcKJYCAgIAKMSAwIG9iago8PC9UeXBlL1BhZ2VzL0NvdW50IDEvS2lkc1s5IDAgUl0+PgplbmRvYmoKMiAwIG9iago8PC9UeXBlL091dHB1dEludGVudC9E …[base64 truncated for the 402 header budget — full response is 34108 base64 chars = a 25 580-byte PDF/A-3B, veraPDF-green; decode client-side]","profile":"urn:cen.eu:en16931:2017","validated":true,"xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rsm:CrossIndustryInvoice xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\" xmlns:ram=\"urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100\" xmlns:qdt=\"urn:un:unece:uncefact:data:standard:QualifiedDataType:100\" xmlns:udt=\"urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100\">\n  <rsm:ExchangedDocumentContext>\n    <ram:GuidelineSpecifiedDocumentContextParameter>\n      <ram:ID>urn:cen.eu:en16931:2017</ram:ID>\n    </ram:GuidelineSpecifiedDocumentContextParameter>\n  </rsm:ExchangedDocumentContext>\n  <rsm:ExchangedDocument>\n    <ram:ID>FA-2026-0042</ram:ID>\n    <ram:TypeCode>380</ram:TypeCode>\n    <ram:IssueDateTime>\n      <udt:DateTimeString format=\"102\">20260712</udt:DateTimeString>\n    </ram:IssueDateTime>\n  </rsm:ExchangedDocument>\n  <!-- SupplyChainTradeTransaction (two BG-25 line items, parties, VAT S 20%,\n       payment IBAN, monetary summation grand total 2052) elided for brevity —\n       identical byte-for-byte to /invoice/generate; also embedded in the PDF -->\n</rsm:CrossIndustryInvoice>\n"},"provenance":{"fetched_at":"2026-07-13T15:16:33Z","freshness":{"as_of":"2026-07-13T00:00:00Z","kind":"snapshot"},"source":"en16931-artefacts"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"computed":{"type":"object","properties":{"totals":{"type":"object","properties":{"due":{"type":"string"},"grand_total":{"type":"string"},"lines_net":{"type":"string"},"net":{"type":"string"},"vat_total":{"type":"string"}},"required":["due","grand_total","lines_net","net","vat_total"]},"vat_breakdown":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"},"tax_amount":{"type":"string"},"taxable_amount":{"type":"string"}},"required":["category","rate","tax_amount","taxable_amount"]}}},"required":["totals","vat_breakdown"],"description":"The totals (BG-22) and VAT breakdown (BG-23) actually serialized in the XML, restated for agent re-reading: computed from the lines when not provided, verified when provided. Amounts are exact decimal strings"},"pdf_base64":{"type":"string","description":"The complete Factur-X document, base64-encoded (standard alphabet): a PDF/A-3B file (human-readable, proven veraPDF-green) with the EN 16931 CII XML embedded plus its XMP metadata - the hybrid invoice the French 2026-2027 reform mandates. Decode it client-side to get the PDF bytes. Truncated in this discovery example to keep the 402 challenge header small; the real response carries it in full"},"profile":{"type":"string","description":"Profile URN emitted in the embedded XML's BT-24: always urn:cen.eu:en16931:2017 (Factur-X EN 16931) in v1 - the legal core of the French 2026-2027 reform. UBL output and national CIUS (XRechnung) are out of scope"},"validated":{"type":"boolean","description":"Post-condition echo: always true on a 200 (generated-then-validated AND embedded-XML re-read byte-for-byte)"},"xml":{"type":"string","description":"The embedded CII D16B XML served flat too, so the agent need not re-extract it - identical byte-for-byte to the XML inside the PDF, and guaranteed conformant: before being served the whole document is re-validated by the service's own EN 16931 engine (the four layers of /invoice/validate) AND its embedded XML is re-read by our own reader (F-002) and compared byte-for-byte. Any post-condition miss is a 500 - never served, never charged"},"vat_treatment":{"type":"object"}},"required":["computed","pdf_base64","profile","validated","xml"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"buyer":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]},"currency":{"type":"string","description":"Invoice currency (BT-5), ISO 4217, required. It must be usable for billing: XXX (no currency) and XTS (test) are a 400 implausible_currency although BR-CL accepts them - a restriction no BR rule states; metals and units of account (XAU, XAG, XPD, XPT, XDR, XUA) are accepted"},"due_date":{"type":"string"},"invoice_number":{"type":"string","description":"Invoice number (BT-1), required. The whole input is the simple business JSON shown here (identical to /invoice/generate) - unknown or misspelled fields are refused (400 INVALID_INVOICE_INPUT), a typo is never silently ignored. Max body 10 MB (413 beyond). A supplied electronic_address {value, scheme} is form-checked here too: a value repeating its own EAS code, or malformed for the declared scheme, is a 400 implausible_identifier"},"issue_date":{"type":"string","description":"Issue date (BT-2), required, YYYY-MM-DD AND a real calendar date - 2026-13-99 fits the pattern but is a 400 invalid_date. Optional due_date (BT-9, same check) and type_code (BT-3, default 380 commercial invoice, 381 credit note)"},"lines":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"qty":{"type":"string"},"unit":{"type":"string"},"unit_price":{"type":"string"},"vat":{"type":"object","properties":{"category":{"type":"string"},"rate":{"type":"string"}},"required":["category","rate"],"description":"Line VAT: category (BT-151, UNTDID 5305: S standard, Z zero-rated, E exempt, AE reverse charge...), rate in percent (BT-152), and for exempt categories an exemption_reason (BT-120) carried onto the VAT breakdown - all EN 16931 VAT rules (BR-S/E/AE/Z...) are enforced, violations come back as 400 issues with their official BR ids"}},"required":["description","qty","unit","unit_price","vat"]},"description":"Invoice lines (BG-25), required non-empty. Line ids (BT-126) are numbered for you; each line net (BT-131) is computed as qty x unit_price with the official EN 16931 rounding. Document totals (BG-22) and the VAT breakdown (BG-23) are computed from the lines; an optional top-level `totals` object is VERIFIED against that computation and rejected with code inconsistent_totals if it diverges - never silently repaired"},"payment":{"type":"object","properties":{"iban":{"type":"string","description":"Optional. Payment IBAN (BT-84), becomes a credit-transfer payment instruction (BG-16, UNTDID 4461 code 30). Mod-97 checksum enforced. Optional payment.terms (BT-20)"},"terms":{"type":"string"}},"required":[]},"seller":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"line1":{"type":"string"},"postal_code":{"type":"string"}},"required":["country"]},"legal_id":{"type":"object","properties":{"scheme":{"type":"string"},"value":{"type":"string"}},"required":["value"],"description":"Optional. Seller legal registration identifier (BT-30): value plus optional ISO 6523 scheme (0002 SIREN). Syntax-checked (Luhn) like the VAT ids and the IBAN - an implausible identifier is rejected (400 with code implausible_identifier). To verify the party actually exists, use /company/resolve"},"name":{"type":"string"},"vat_id":{"type":"string"}},"required":["address","name"]}},"required":["buyer","currency","invoice_number","issue_date","lines","seller"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-generate-pdf","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Generate a complete Factur-X invoice (PDF/A-3 + EN 16931 XML)","tags":["invoice"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.10"}},{"resource":{"url":"https://api.invoket.com/invoice/vat-treatment","description":"Before your agent issues or books a cross-border invoice: who charges the VAT, under which mechanism, where the supply is taxed and with which compulsory wording. Post one transaction (countries, goods or services, business or consumer customer, supply kind, date, optional amount) and get a determination sourced article by article under Directive 2006/112/EC: place of supply, person liable, standard VAT, reverse charge, intra-Community exemption or out of scope, the rate in force at that date, and the exact invoice mentions to print. An invoice missing its reverse-charge mention passes the EN 16931 rules and is still refused by the tax authority - the check /invoice/validate cannot make. The customer's VAT number is taken AS DECLARED (zero network): verify it live with /company/vat. Uncovered regimes (OSS/IOSS, import VAT, margin schemes, triangulars) come back as a motivated undetermined, never a plausible default.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"amount":"12500.00","currency":"EUR","customer_country":"DE","customer_type":"business","customer_vat_status":"valid","date":"2026-07-01","supplier_country":"FR","supply_kind":"intra_eu_dispatch","transaction_type":"goods"},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"amount":{"type":"string","description":"Optional taxable base (simple decimal string): supplying it triggers computed, and then currency (ISO 4217; XXX and XTS refused) is required. An overflowing amount is a 400, never a 5xx"},"currency":{"type":"string"},"customer_country":{"type":"string"},"customer_type":{"type":"string"},"customer_vat_status":{"type":"string","description":"Optional. valid | invalid | unknown (default). DECLARED, never verified here: zero network by design. invalid and unknown are treated identically - the Directive does not distinguish them - and both make the intra-Community exemption (Art. 138(1)(b)) and the Art. 196 reverse charge fall away, the supply being taxed at the supplier's rate. Live check: GET /company/vat"},"date":{"type":"string","description":"Date VAT becomes chargeable (YYYY-MM-DD, and a real calendar date): the rate served is the one in force AT THAT DATE, each rate carrying its own validity in the committed TEDB snapshot. Earlier than the snapshot is a 400, never extrapolated"},"supplier_country":{"type":"string","description":"Where the supplier is established, ISO 3166-1 alpha-2 (EL accepted for GR), required - as is customer_country (where the customer is established, or where the goods arrive). Both are checked together, so two bad codes are two issues in one 400. Territories outside the VAT territory of the Union that ISO can express (IC, EA, AX, French overseas departments) are third territories; Monaco is FR"},"supply_kind":{"type":"string","description":"Closed enumeration, required: general (domestic), intra_eu_dispatch, export_outside_eu, import, services_b2b_general, services_b2c_general, services_land_related (then add property_country), services_electronic_b2c. A value outside the list is a 400 naming the admitted values - never a fallback to general"},"transaction_type":{"type":"string","description":"goods | services, required - as is customer_type (business | consumer). Both must be CONSISTENT with supply_kind: a services_b2b_general declared with a consumer customer is a motivated refusal (paid 200, undetermined), never a guess"}},"required":["customer_country","customer_type","date","supplier_country","supply_kind","transaction_type"]}},"output":{"type":"json","example":{"data":{"caveats":["The rate returned is the one the customer self-assesses in the Member State of arrival; the supplier invoices no VAT.","…3 more elided for the 402 header budget; the real response serves all 4."],"computed":{"currency":"EUR","note":"The supplier charges no VAT: the customer accounts for it under the reverse charge, so the invoice total carries no VAT and must bear the mention above.","rate_percentage":"0","rounding":"rounded to 2 decimals with fn:round(x*100) div 100, the rounding of the EN 16931 engine (the minor unit of every Member State currency is the hundredth)","taxable_amount":"12500.00","total_amount":"12500.00","vat_amount":"0.00"},"customer_vat_check":{"how_to_verify":"GET /company/vat?vat_number=<the customer's VAT number, e.g. DE…> (company_grid, live VIES lookup)","status":"declared_valid"},"legal_basis":[{"article":"138","celex":"32006L0112","query":"/legal/eu-act?celex=32006L0112&article=138","title":"Exemption of intra-Community supplies of goods"}],"liable":"customer","limits":["the margin schemes (second-hand goods, works of art, travel agents) and the special scheme for investment gold are not applied","…5 more elided for the 402 header budget; the real response serves all 6."],"mechanism":"reverse_charge","notes":[],"place_of_supply":{"basis":{"article":"40","celex":"32006L0112","query":"/legal/eu-act?celex=32006L0112&article=40","title":"Place of an intra-Community acquisition of goods: where dispatch ends"},"country":"DE"},"rate":{"country":"DE","has_regional_rates":false,"kind":"standard","percentage":"19","reduced_rate_candidates":["7"],"super_reduced_rate_candidates":[]},"required_invoice_mentions":[{"basis":[{"article":"226","celex":"32006L0112","query":"/legal/eu-act?celex=32006L0112&article=226","title":"Compulsory particulars on invoices"}],"language":"en","text":"Reverse charge"}],"rule_id":"INV-VAT-D01","rule_summary":"Intra-EU B2B dispatch with a proven VAT number: exempt supply, customer self-accounts in the Member State of arrival (Art. 138, 40, 200)"},"provenance":{"fetched_at":"2026-07-29T09:41:42Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"directive-2006-112 + tedb"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"caveats":{"type":"array","items":{"type":"string"}},"computed":{"type":"object","properties":{"currency":{"type":"string"},"note":{"type":"string"},"rate_percentage":{"type":"string"},"rounding":{"type":"string"},"taxable_amount":{"type":"string"},"total_amount":{"type":"string"},"vat_amount":{"type":"string"}},"required":["currency","note","rate_percentage","rounding","taxable_amount","total_amount","vat_amount"],"description":"Served only when amount is supplied and the mechanism is determined. Careful: computed.rate_percentage is what the SUPPLIER charges (0 under reverse charge, exemption or out of scope) while rate is that of the place of taxation - an agent filling an invoice reads computed. Rounded to the cent with the EN 16931 rounding"},"customer_vat_check":{"type":"object","properties":{"how_to_verify":{"type":"string"},"status":{"type":"string"}},"required":["how_to_verify","status"],"description":"declared_valid | declared_invalid | not_checked, plus how_to_verify: the /company/vat request performing the live VIES lookup this service deliberately does not do"},"legal_basis":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string"},"query":{"type":"string"},"title":{"type":"string"}},"required":["article","celex","query","title"]}},"liable":{"type":"string"},"limits":{"type":"array","items":{"type":"string"},"description":"Constant in every response (abridged here): OSS/IOSS and distance-selling thresholds, import VAT and customs, margin schemes, chains and triangulars, product classification to reduced rates - NOT covered; the verdict is rendered on declared data"},"mechanism":{"type":"string","description":"standard | reverse_charge | exempt_with_credit | out_of_scope | undetermined, with liable (supplier | customer | not_taxable_in_eu | undetermined) and rule_id, always an INV-VAT-* id never mixed with the normative BR-* of /invoice/validate. An uncovered regime or an inconsistent input returns undetermined WITH its rationale, as a paid 200"},"notes":{"type":"array"},"place_of_supply":{"type":"object","properties":{"basis":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string"},"query":{"type":"string"},"title":{"type":"string"}},"required":["article","celex","query","title"]},"country":{"type":["string","null"],"description":"Place of taxation as an ISO 3166-1 alpha-2 code, null when it cannot be determined (an operation outside the territorial scope of the Directive) — never guessed"}},"required":["country"]},"rate":{"type":"object","properties":{"country":{"type":"string"},"has_regional_rates":{"type":"boolean"},"kind":{"type":"string"},"percentage":{"type":"string"},"reduced_rate_candidates":{"type":"array","items":{"type":"string"}},"super_reduced_rate_candidates":{"type":"array"}},"required":["country","has_regional_rates","kind","percentage","reduced_rate_candidates","super_reduced_rate_candidates"],"description":"Standard rate of the place of supply at the requested date (committed TEDB snapshot). kind is always standard in v1: NO product classification - reduced rates are candidates only, and has_regional_rates flags territorial rates outside the snapshot"},"required_invoice_mentions":{"type":"array","items":{"type":"object","properties":{"basis":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string"},"query":{"type":"string"},"title":{"type":"string"}},"required":["article","celex","query","title"]}},"language":{"type":"string"},"text":{"type":"string"},"national_basis":{"type":"object"}},"required":["basis","language","text"]},"description":"The wordings to print, each with its basis (Art. 226) and, where it exists, a national_basis reference - four here, one shown. Pass the determination to /invoice/generate through its vat_treatment field and it is written into BT-120 for you"},"rule_id":{"type":"string"},"rule_summary":{"type":"string"},"rationale":{"type":"string","description":"Why the determination is not the nominal case: an honest refusal (liable/mechanism undetermined), a substantive condition not met, or inconsistent inputs. Present exactly when there is something to explain — the answer stays a paid 200"}},"required":["caveats","customer_vat_check","legal_basis","liable","limits","mechanism","notes","place_of_supply","required_invoice_mentions","rule_id","rule_summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"amount":{"type":"string","description":"Optional taxable base (simple decimal string): supplying it triggers computed, and then currency (ISO 4217; XXX and XTS refused) is required. An overflowing amount is a 400, never a 5xx"},"currency":{"type":"string"},"customer_country":{"type":"string"},"customer_type":{"type":"string"},"customer_vat_status":{"type":"string","description":"Optional. valid | invalid | unknown (default). DECLARED, never verified here: zero network by design. invalid and unknown are treated identically - the Directive does not distinguish them - and both make the intra-Community exemption (Art. 138(1)(b)) and the Art. 196 reverse charge fall away, the supply being taxed at the supplier's rate. Live check: GET /company/vat"},"date":{"type":"string","description":"Date VAT becomes chargeable (YYYY-MM-DD, and a real calendar date): the rate served is the one in force AT THAT DATE, each rate carrying its own validity in the committed TEDB snapshot. Earlier than the snapshot is a 400, never extrapolated"},"supplier_country":{"type":"string","description":"Where the supplier is established, ISO 3166-1 alpha-2 (EL accepted for GR), required - as is customer_country (where the customer is established, or where the goods arrive). Both are checked together, so two bad codes are two issues in one 400. Territories outside the VAT territory of the Union that ISO can express (IC, EA, AX, French overseas departments) are third territories; Monaco is FR"},"supply_kind":{"type":"string","description":"Closed enumeration, required: general (domestic), intra_eu_dispatch, export_outside_eu, import, services_b2b_general, services_b2c_general, services_land_related (then add property_country), services_electronic_b2c. A value outside the list is a 400 naming the admitted values - never a fallback to general"},"transaction_type":{"type":"string","description":"goods | services, required - as is customer_type (business | consumer). Both must be CONSISTENT with supply_kind: a services_b2b_general declared with a consumer customer is a motivated refusal (paid 200, undetermined), never a guess"}},"required":["customer_country","customer_type","date","supplier_country","supply_kind","transaction_type"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-vat-treatment","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Determine the VAT treatment of a transaction (EU, Directive 2006/112)","tags":["invoice"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/invoice/vat-treatment/batch","description":"A sales ledger or an order book judged in one call: up to 200 transactions, one VAT determination each, one settlement. Same verdicts as /invoice/vat-treatment - place of supply, person liable, standard VAT, reverse charge, intra-Community exemption or out of scope, the rate in force at the date of each line, the compulsory invoice mentions and the articles of Directive 2006/112/EC they rest on. A malformed item is reported at its position instead of failing the batch; only an empty or oversized batch is a 400. Legal bases and caveats are shared across the batch and cited by key, and the summary counts the five mechanisms. Customer VAT numbers are taken AS DECLARED (zero network by design) - verify them with /company/vat; uncovered regimes (OSS/IOSS, import VAT, margin schemes, triangular transactions) come back as a motivated undetermined, never a plausible default.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"items":[{"amount":"1200.00","currency":"EUR","customer_country":"FR","customer_type":"business","date":"2026-07-01","supplier_country":"FR","supply_kind":"general","transaction_type":"goods"},{"customer_country":"DE","customer_type":"business","date":"2026-07-01","supplier_country":"FRA","supply_kind":"general","transaction_type":"goods"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"},"customer_country":{"type":"string"},"customer_type":{"type":"string"},"date":{"type":"string"},"supplier_country":{"type":"string"},"supply_kind":{"type":"string"},"transaction_type":{"type":"string"}},"required":["customer_country","customer_type","date","supplier_country","supply_kind","transaction_type"]},"description":"Array of transactions judged in one settlement. Its length is priced per unit (base + N x unit), capped at 200 (an empty or oversized batch is a 400 invalid_batch_size, never charged). Each item is EXACTLY the body of /invoice/vat-treatment: supplier_country and customer_country (ISO 3166-1 alpha-2), transaction_type (goods | services), customer_type (business | consumer), supply_kind (general, intra_eu_dispatch, export_outside_eu, import, services_b2b_general, services_b2c_general, services_land_related, services_electronic_b2c), date, and the optional customer_vat_status (valid | invalid | unknown, DECLARED - verify it with /company/vat) plus amount and currency. A malformed item is reported at its position; the batch is not rejected for it"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"count":2,"limits":["the one-stop-shop schemes (OSS, IOSS) and the distance-selling thresholds of Art. 33 and 59c are not applied: a supply that falls under them is returned as undetermined, never guessed","…5 more elided for the 402 header budget; the real response serves all 6."],"results":[{"caveats_ref":0,"index":0,"legal_basis_ref":0,"status":"ok","verdict":{"computed":{"currency":"EUR","note":"VAT is charged by the supplier at the standard rate of the place of supply.","rate_percentage":"20","rounding":"rounded to 2 decimals with fn:round(x*100) div 100, the rounding of the EN 16931 engine (the minor unit of every Member State currency is the hundredth)","taxable_amount":"1200.00","total_amount":"1440.00","vat_amount":"240.00"},"customer_vat_check":{"how_to_verify":"GET /company/vat?vat_number=<the customer's VAT number, e.g. FR…> (company_grid, live VIES lookup)","status":"not_checked"},"liable":"supplier","mechanism":"standard","notes":[],"place_of_supply":{"basis":{"article":"31","celex":"32006L0112","query":"/legal/eu-act?celex=32006L0112&article=31","title":"Place of supply of goods not dispatched or transported"},"country":"FR"},"rate":{"country":"FR","has_regional_rates":true,"kind":"standard","percentage":"20","reduced_rate_candidates":["5.5","10"],"super_reduced_rate_candidates":["2.1"]},"required_invoice_mentions":[],"rule_id":"INV-VAT-G01","rule_summary":"Domestic supply of goods: taxed where the goods are when supplied (Art. 31)"}},{"error":{"code":"INVALID_INVOICE_INPUT","issues":[{"code":"invalid_country","message":"supplier_country must be an ISO 3166-1 alpha-2 country code, got \"FRA\"","path":"supplier_country"}],"message":"VAT treatment input is invalid: 1 actionable issue(s) listed in issues[]"},"index":1,"status":"error"}],"shared":{"caveats":[["This country applies territory-specific rates (Corsica, overseas departments, Madeira, the Azores, Greek islands...) that are outside the embedded snapshot: the rate returned is the national one.","…2 more elided for the 402 header budget."]],"legal_basis":[[{"article":"31","celex":"32006L0112","query":"/legal/eu-act?celex=32006L0112&article=31","title":"Place of supply of goods not dispatched or transported"},{"article":"193","celex":"32006L0112","query":"/legal/eu-act?celex=32006L0112&article=193","title":"VAT is payable by the taxable person carrying out the supply"}]]},"summary":{"errors":1,"items":2,"mechanisms":{"exempt_with_credit":0,"out_of_scope":0,"reverse_charge":0,"standard":1,"undetermined":0},"ok":1}},"provenance":{"fetched_at":"2026-07-29T09:43:50Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"directive-2006-112 + tedb"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","description":"Number of results returned, equal to the number of items submitted (capped at 200) - faulty items included, since a bad item is reported at its position rather than dropped. Also served as summary.items"},"limits":{"type":"array","items":{"type":"string"},"description":"Constant, served once for the whole batch (abridged in this example): OSS/IOSS and distance-selling thresholds, import VAT and customs, margin schemes, chains and triangulars and product classification to reduced rates are NOT covered"},"results":{"type":"array","items":{"type":"object","properties":{"caveats_ref":{"type":"integer"},"index":{"type":"integer"},"legal_basis_ref":{"type":"integer"},"status":{"type":"string"},"verdict":{"type":"object","properties":{"computed":{"type":"object","properties":{"currency":{"type":"string"},"note":{"type":"string"},"rate_percentage":{"type":"string"},"rounding":{"type":"string"},"taxable_amount":{"type":"string"},"total_amount":{"type":"string"},"vat_amount":{"type":"string"}},"required":["currency","note","rate_percentage","rounding","taxable_amount","total_amount","vat_amount"]},"customer_vat_check":{"type":"object","properties":{"how_to_verify":{"type":"string"},"status":{"type":"string"}},"required":["how_to_verify","status"]},"liable":{"type":"string"},"mechanism":{"type":"string"},"notes":{"type":"array"},"place_of_supply":{"type":"object","properties":{"basis":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string"},"query":{"type":"string"},"title":{"type":"string"}},"required":["article","celex","query","title"]},"country":{"type":["string","null"]}},"required":["country"]},"rate":{"type":"object","properties":{"country":{"type":"string"},"has_regional_rates":{"type":"boolean"},"kind":{"type":"string"},"percentage":{"type":"string"},"reduced_rate_candidates":{"type":"array","items":{"type":"string"}},"super_reduced_rate_candidates":{"type":"array","items":{"type":"string"}}},"required":["country","has_regional_rates","kind","percentage","reduced_rate_candidates","super_reduced_rate_candidates"]},"required_invoice_mentions":{"type":"array"},"rule_id":{"type":"string"},"rule_summary":{"type":"string"},"rationale":{"type":"string"}},"required":["customer_vat_check","liable","mechanism","notes","place_of_supply","required_invoice_mentions","rule_id","rule_summary"],"description":"Exactly the data of /invoice/vat-treatment minus legal_basis, caveats and limits, which are shared: rule_id (always INV-VAT-*, never a normative BR-*), liable, mechanism, place_of_supply, rate, required_invoice_mentions and, when the item carries an amount, computed"},"error":{"type":"object","description":"What a unitary call would have returned as a 400 for this item, in the exact same shape (code, message, issues[]): one bad item never fails the batch, which stays a paid 200 — the item carries error instead of verdict"}},"required":["index","status"]},"description":"One result per submitted item, IN INPUT ORDER and carrying its own index. status = ok with the verdict of the unit call minus the shared blocks, or status = error with the unit error vocabulary (INVALID_INVOICE_INPUT listing every fault of that item at once, or INVALID_INPUT for an unreadable item) - the batch itself stays a paid 200"},"shared":{"type":"object","properties":{"caveats":{"type":"array","items":{"type":"array","items":{"type":"string"}}},"legal_basis":{"type":"array","items":{"type":"array","items":{"type":"object","properties":{"article":{"type":"string"},"celex":{"type":"string"},"query":{"type":"string"},"title":{"type":"string"}},"required":["article","celex","query","title"]}}}},"required":["caveats","legal_basis"],"description":"Deduplicated sets of legal bases and caveats: each result cites them by key (legal_basis_ref, caveats_ref = index into shared.legal_basis / shared.caveats). Over 200 lines mixing the five mechanisms the distinct sets can be counted on one hand"},"summary":{"type":"object","properties":{"errors":{"type":"integer"},"items":{"type":"integer"},"mechanisms":{"type":"object","properties":{"exempt_with_credit":{"type":"integer"},"out_of_scope":{"type":"integer"},"reverse_charge":{"type":"integer"},"standard":{"type":"integer"},"undetermined":{"type":"integer"}},"required":["exempt_with_credit","out_of_scope","reverse_charge","standard","undetermined"]},"ok":{"type":"integer"}},"required":["errors","items","mechanisms","ok"],"description":"items, ok, errors, and the count of the FIVE mechanisms (standard, reverse_charge, exempt_with_credit, out_of_scope, undetermined) - zeros included, an absent key would read as an omission"}},"required":["count","limits","results","shared","summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"},"customer_country":{"type":"string"},"customer_type":{"type":"string"},"date":{"type":"string"},"supplier_country":{"type":"string"},"supply_kind":{"type":"string"},"transaction_type":{"type":"string"}},"required":["customer_country","customer_type","date","supplier_country","supply_kind","transaction_type"]},"description":"Array of transactions judged in one settlement. Its length is priced per unit (base + N x unit), capped at 200 (an empty or oversized batch is a 400 invalid_batch_size, never charged). Each item is EXACTLY the body of /invoice/vat-treatment: supplier_country and customer_country (ISO 3166-1 alpha-2), transaction_type (goods | services), customer_type (business | consumer), supply_kind (general, intra_eu_dispatch, export_outside_eu, import, services_b2b_general, services_b2c_general, services_land_related, services_electronic_b2c), date, and the optional customer_vat_status (valid | invalid | unknown, DECLARED - verify it with /company/vat) plus amount and currency. A malformed item is reported at its position; the batch is not rejected for it"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-vat-treatment","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Determine the VAT treatment of up to 200 transactions (EU)","tags":["invoice"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":200,"unitField":"items"}}},{"resource":{"url":"https://api.invoket.com/invoice/late-payment","description":"Before your agent sends a dunning letter or books a receivable: what is legally due on an unpaid B2B invoice. Post the claim (amount, currency, country, due date - or invoice date plus agreed terms - and payment date) and get late-payment interest computed PERIOD BY PERIOD under Directive 2011/7/EU: the reference rate changes every 1 January and 1 July, so a claim straddling several half-years is split into tranches, each at the rate of its own half-year - applying today's rate to the whole period is simply wrong. Statutory rate = ECB main refinancing rate (NBP reference rate for Poland) plus the national margin, with the national transposition actually applied: France 10 points, Germany 9 on the Basiszinssatz base, Belgium rounding the reference up to the half point, 8 points elsewhere. Covers FR, DE, ES, IT, NL, BE, PT and PL, with an explicit fallback to the Directive minimum for the other Member States - a national rule is never guessed. Adds the fixed recovery compensation of Art. 6 (EUR 40, tiered in Poland), each component cited to its article. Paying on time is a valid answer, not an error.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"amount":"25000","country":"FR","currency":"EUR","due_date":"2025-08-31","paid_date":"2026-07-27"},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"amount":{"type":"string","description":"Principal of the unpaid claim, simple decimal string, strictly positive. currency is ISO 4217 and required (XXX and XTS refused). Interest is computed in the currency of the claim while the fixed compensation is in euros by the Directive: outside the euro, total_due is null and a note says so - NO conversion is performed"},"country":{"type":"string","description":"Member State whose transposition applies, ISO 3166-1 alpha-2 (EL accepted for GR), required. FR, DE, ES, IT, NL, BE, PT and PL carry their own national rule; any other Member State gets the Directive minimum, explicitly flagged rule_source eu_minimum_fallback. A third country is refused (unsupported_country): the Directive governs commercial transactions within the Union, and no rule is guessed beyond it"},"currency":{"type":"string"},"due_date":{"type":"string","description":"Optional. Contractual due date. Alternatively supply invoice_date plus payment_terms_days; with neither, the national statutory default applies and the response says so. A term beyond the 60-day legal cap is NOT refused: it is computed as supplied, with a note recalling the cap may make it unenforceable. Dates must be real calendar dates, and a date outside the snapshot coverage (before 2011, or beyond the last published half-year) is a 400 date_out_of_range - the rate of an unopened half-year is never extrapolated"},"paid_date":{"type":"string","description":"Optional. Date of payment or of the assessment, defaulting to today. Paying on time is a valid, paid answer: days_late 0, total_due 0, flat_fee.source not_due, with the rationale citing art. 3(1). An optional contractual_rate (annual, in points) applies ONLY if it exceeds the statutory rate, which stays a public-policy floor (art. 7); otherwise the statutory rate applies and a note says so"}},"required":["amount","country","currency"]}},"output":{"type":"json","example":{"data":{"claim":{"amount":"25000","currency":"EUR"},"day_count_convention":"calendar days, actual/365","days_late":330,"due_date":"2025-08-31","due_date_source":"contractual_due_date","flat_fee":{"amount":{"amount":"40","currency":"EUR"},"source":"flat"},"interest_total":{"amount":"2750.86","currency":"EUR"},"limits":["consumer claims are out of scope: Directive 2011/7/EU governs commercial transactions between undertakings and with public authorities","…5 more constant limits elided for the 402 header budget; the real response serves all 6."],"notes":[],"paid_date":"2026-07-27","periods":[{"applied_rate":"12.15","days":122,"from":"2025-09-01","interest":"1015.27","rate_source":"statutory","reference_basis":"ecb","reference_rate":"2.15","statutory_rate":"12.15","to":"2025-12-31"},{"applied_rate":"12.15","days":181,"from":"2026-01-01","interest":"1506.27","rate_source":"statutory","reference_basis":"ecb","reference_rate":"2.15","statutory_rate":"12.15","to":"2026-06-30"},{"applied_rate":"12.40","days":27,"from":"2026-07-01","interest":"229.32","rate_source":"statutory","reference_basis":"ecb","reference_rate":"2.40","statutory_rate":"12.40","to":"2026-07-27"}],"rule":{"country":"FR","default_payment_term_days":30,"flat_fee_eur":"40","legal_basis":[{"celex":"32011L0007","query":"/legal/eu-act?celex=32011L0007&article=3","reference":"Directive 2011/7/EU, art. 3 (interest for late payment, at the reference rate plus at least eight percentage points)","scope":"eu"},{"celex":"32011L0007","query":"/legal/eu-act?celex=32011L0007&article=6","reference":"Directive 2011/7/EU, art. 6 (compensation for recovery costs: a fixed sum of at least EUR 40, due as of right)","scope":"eu"},{"reference":"Code de commerce, art. L441-10 (délai supplétif de 30 jours, taux BCE majoré de dix points, indemnité forfaitaire) et art. L441-11 (plafond de 60 jours), art. D441-5 (montant de l'indemnité : 40 EUR) — loi n° 2012-387 du 22 mars 2012, applicable aux contrats conclus à compter du 1er janvier 2013","scope":"national"}],"margin_points":"10","max_payment_term_days":60,"reference_basis":"ecb","rule_source":"national"},"total_due":{"amount":"2790.86","currency":"EUR"}},"provenance":{"fetched_at":"2026-07-29T09:42:23Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"late-payment-snapshots"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"claim":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"day_count_convention":{"type":"string"},"days_late":{"type":"integer","description":"Calendar days from the day AFTER the due date (art. 3(1): interest runs from the following day) to the payment date INCLUDED, on an actual/365 basis restated in day_count_convention. Interest is simple: never capitalised"},"due_date":{"type":"string"},"due_date_source":{"type":"string"},"flat_fee":{"type":"object","properties":{"amount":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"source":{"type":"string"}},"required":["amount","source"],"description":"Fixed compensation for recovery costs (art. 6), due as of right as soon as interest is due, without any reminder: EUR 40 in every covered State, tiered by claim size in Poland since 2020 (source flat | tiered | not_due). Reasonable costs actually incurred beyond it (art. 6(3)) are not quantified here"},"interest_total":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"limits":{"type":"array","items":{"type":"string"},"description":"Constant in every response (abridged in this example): consumer claims, public authorities as debtors and sector-specific terms, recovery costs above the fixed sum, limitation of the claim, judicial interest and other contractual penalties are NOT assessed"},"notes":{"type":"array"},"paid_date":{"type":"string"},"periods":{"type":"array","items":{"type":"object","properties":{"applied_rate":{"type":"string"},"days":{"type":"integer"},"from":{"type":"string"},"interest":{"type":"string"},"rate_source":{"type":"string"},"reference_basis":{"type":"string"},"reference_rate":{"type":"string"},"statutory_rate":{"type":"string"},"to":{"type":"string"}},"required":["applied_rate","days","from","interest","rate_source","reference_basis","reference_rate","statutory_rate","to"]},"description":"The reason this endpoint exists: one tranche per boundary crossed - the half-year of the reference rate (1 January, 1 July) AND any change in the national transposition - each with its days, reference rate, statutory rate, applied rate and interest rounded to the cent. interest_total is exactly the sum of the tranches served, so an agent can recompute it"},"rule":{"type":"object","properties":{"country":{"type":"string"},"default_payment_term_days":{"type":"integer"},"flat_fee_eur":{"type":"string"},"legal_basis":{"type":"array","items":{"type":"object","properties":{"celex":{"type":"string"},"query":{"type":"string"},"reference":{"type":"string"},"scope":{"type":"string"}},"required":["celex","query","reference","scope"]}},"margin_points":{"type":"string"},"max_payment_term_days":{"type":"integer"},"reference_basis":{"type":"string"},"rule_source":{"type":"string"}},"required":["country","default_payment_term_days","flat_fee_eur","legal_basis","margin_points","max_payment_term_days","reference_basis","rule_source"],"description":"The national rule actually applied and why it says what it says: rule_source (national | eu_minimum_fallback), reference_basis (ecb | nbp), margin_points, fixed fee, statutory default and legal cap on payment terms, plus the EU and national legal bases - the EU ones carrying a ready-made /legal/eu-act query served by the platform itself"},"total_due":{"type":["object","null"],"properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"],"description":"Interest plus flat fee, served only when the claim is in euros: the flat fee is a euro amount fixed by the Directive, so no conversion is invented for another currency and the field is null — the notes say so"},"rationale":{"type":"string","description":"Why the count is what it is when that is not the nominal case (payment on time, for instance) — present exactly when there is something to explain"}},"required":["claim","day_count_convention","days_late","due_date","due_date_source","flat_fee","interest_total","limits","notes","paid_date","periods","rule","total_due"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"amount":{"type":"string","description":"Principal of the unpaid claim, simple decimal string, strictly positive. currency is ISO 4217 and required (XXX and XTS refused). Interest is computed in the currency of the claim while the fixed compensation is in euros by the Directive: outside the euro, total_due is null and a note says so - NO conversion is performed"},"country":{"type":"string","description":"Member State whose transposition applies, ISO 3166-1 alpha-2 (EL accepted for GR), required. FR, DE, ES, IT, NL, BE, PT and PL carry their own national rule; any other Member State gets the Directive minimum, explicitly flagged rule_source eu_minimum_fallback. A third country is refused (unsupported_country): the Directive governs commercial transactions within the Union, and no rule is guessed beyond it"},"currency":{"type":"string"},"due_date":{"type":"string","description":"Optional. Contractual due date. Alternatively supply invoice_date plus payment_terms_days; with neither, the national statutory default applies and the response says so. A term beyond the 60-day legal cap is NOT refused: it is computed as supplied, with a note recalling the cap may make it unenforceable. Dates must be real calendar dates, and a date outside the snapshot coverage (before 2011, or beyond the last published half-year) is a 400 date_out_of_range - the rate of an unopened half-year is never extrapolated"},"paid_date":{"type":"string","description":"Optional. Date of payment or of the assessment, defaulting to today. Paying on time is a valid, paid answer: days_late 0, total_due 0, flat_fee.source not_due, with the rationale citing art. 3(1). An optional contractual_rate (annual, in points) applies ONLY if it exceeds the statutory rate, which stays a public-policy floor (art. 7); otherwise the statutory rate applies and a note says so"}},"required":["amount","country","currency"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/invoice-late-payment","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Compute late-payment interest and recovery compensation (EU, Directive 2011/7)","tags":["invoice"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/preflight/invoice-payment","description":"Before your agent pays a supplier invoice: send the invoice file itself (Factur-X PDF, CII or UBL XML) and get one verdict - pay, hold, stop, insufficient_coverage - over the document's EN 16931 compliance, the supplier in the INSEE Sirene and BODACC registers, live EU VAT (VIES), sanctions screening of the party actually credited, VAT consistency and the statutory due date. Every reason names the block and the source it comes from.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"250000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"250000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"document_base64":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDb3JwdXMgRi0xMDIg4oCUIGZhY3R1cmUgc3ludGjDqXRpcXVlIDogYXV0b2xpcXVpZGF0aW9uIChjYXTDqWdvcmllIEFFKSwKICAgICBjb25mb3JtZSBFTiAxNjkzMSAodmVydGUgcG91ciBsJ29yYWNsZSBvZmZpY2llbCkuIC0tPgo8SW52b2ljZSB4bWxuczpjYWM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkFnZ3JlZ2F0ZUNvbXBvbmVudHMtMiIKIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiCiB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6SW52b2ljZS0yIj4KICA8Y2JjOkN1c3RvbWl6YXRpb25JRD51cm46Y2VuLmV1OmVuMTY5MzE6MjAxNzwvY2JjOkN1c3RvbWl6YXRpb25JRD4KICA8Y2JjOklEPlNZTi1JQy0wMDE8L2NiYzpJRD4KICA8Y2JjOklzc3VlRGF0ZT4yMDI2LTA2LTE1PC9jYmM6SXNzdWVEYXRlPgogIDxjYmM6RHVlRGF0ZT4yMDI2LTA3LTE1PC9jYmM6RHVlRGF0ZT4KICA8Y2JjOkludm9pY2VUeXBlQ29kZT4zODA8L2NiYzpJbnZvaWNlVHlwZUNvZGU+CiAgPGNiYzpEb2N1bWVudEN1cnJlbmN5Q29kZT5FVVI8L2NiYzpEb2N1bWVudEN1cnJlbmN5Q29kZT4KICA8Y2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogICAgPGNhYzpQYXJ0eT4KICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgIDxjYmM6U3RyZWV0TmFtZT4xMiBydWUgZGUgbGEgUGFpeDwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgPGNiYzpDaXR5TmFtZT5QYXJpczwvY2JjOkNpdHlOYW1lPgogICAgICAgIDxjYmM6UG9zdGFsWm9uZT43NTAwMjwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+RlI8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5GUjQwMzAzMjY1MDQ1PC9jYmM6Q29tcGFueUlEPgogICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgPGNiYzpJRD5WQVQ8L2NiYzpJRD4KICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPkZvdXJuaXNzZXVyIFNBUzwvY2JjOlJlZ2lzdHJhdGlvbk5hbWU+CiAgICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lSUQ9IjAwMDIiPjMwMzI2NTA0NTwvY2JjOkNvbXBhbnlJRD4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogIDxjYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CiAgICA8Y2FjOlBhcnR5PgogICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgPGNiYzpTdHJlZXROYW1lPkhhdXB0c3RyYXNzZSAxPC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICA8Y2JjOkNpdHlOYW1lPkJlcmxpbjwvY2JjOkNpdHlOYW1lPgogICAgICAgIDxjYmM6UG9zdGFsWm9uZT4xMDExNTwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+REU8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5ERTEyMzQ1Njc4OTwvY2JjOkNvbXBhbnlJRD4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgIDxjYmM6UmVnaXN0cmF0aW9uTmFtZT5LdW5kZSBHbWJIPC9jYmM6UmVnaXN0cmF0aW9uTmFtZT4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdDdXN0b21lclBhcnR5PgogIDxjYWM6RGVsaXZlcnk+PGNiYzpBY3R1YWxEZWxpdmVyeURhdGU+MjAyNi0wNi0xMDwvY2JjOkFjdHVhbERlbGl2ZXJ5RGF0ZT48Y2FjOkRlbGl2ZXJ5TG9jYXRpb24+PGNhYzpBZGRyZXNzPjxjYWM6Q291bnRyeT48Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5ERTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT48L2NhYzpDb3VudHJ5PjwvY2FjOkFkZHJlc3M+PC9jYWM6RGVsaXZlcnlMb2NhdGlvbj48L2NhYzpEZWxpdmVyeT48Y2FjOlBheW1lbnRNZWFucz48Y2JjOlBheW1lbnRNZWFuc0NvZGU+MzA8L2NiYzpQYXltZW50TWVhbnNDb2RlPjxjYWM6UGF5ZWVGaW5hbmNpYWxBY2NvdW50PjxjYmM6SUQ+RlI3NjMwMDA2MDAwMDExMjM0NTY3ODkwMTg5PC9jYmM6SUQ+PC9jYWM6UGF5ZWVGaW5hbmNpYWxBY2NvdW50PjwvY2FjOlBheW1lbnRNZWFucz48Y2FjOlRheFRvdGFsPgogICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4wLjAwPC9jYmM6VGF4QW1vdW50PgogICAgPGNhYzpUYXhTdWJ0b3RhbD4KICAgICAgPGNiYzpUYXhhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOlRheGFibGVBbW91bnQ+CiAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MC4wMDwvY2JjOlRheEFtb3VudD4KICAgICAgPGNhYzpUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPks8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNiYzpUYXhFeGVtcHRpb25SZWFzb24+SW50cmEtY29tbXVuaXR5IHN1cHBseTwvY2JjOlRheEV4ZW1wdGlvblJlYXNvbj4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+VkFUPC9jYmM6SUQ+CiAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpUYXhDYXRlZ29yeT4KICAgIDwvY2FjOlRheFN1YnRvdGFsPgogIDwvY2FjOlRheFRvdGFsPgogIDxjYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2JjOlRheEV4Y2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEyMDAuMDA8L2NiYzpUYXhFeGNsdXNpdmVBbW91bnQ+CiAgICA8Y2JjOlRheEluY2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEyMDAuMDA8L2NiYzpUYXhJbmNsdXNpdmVBbW91bnQ+CiAgICA8Y2JjOlBheWFibGVBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMjAwLjAwPC9jYmM6UGF5YWJsZUFtb3VudD4KICA8L2NhYzpMZWdhbE1vbmV0YXJ5VG90YWw+CiAgPGNhYzpJbnZvaWNlTGluZT4KICAgIDxjYmM6SUQ+MTwvY2JjOklEPgogICAgPGNiYzpJbnZvaWNlZFF1YW50aXR5IHVuaXRDb2RlPSJEQVkiPjM8L2NiYzpJbnZvaWNlZFF1YW50aXR5PgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTIwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2FjOkl0ZW0+CiAgICAgIDxjYmM6TmFtZT5QcmVzdGF0aW9uIGRlIGNvbnNlaWw8L2NiYzpOYW1lPgogICAgICA8Y2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPks8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPlZBVDwvY2JjOklEPgogICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgPC9jYWM6Q2xhc3NpZmllZFRheENhdGVnb3J5PgogICAgPC9jYWM6SXRlbT4KICAgIDxjYWM6UHJpY2U+CiAgICAgIDxjYmM6UHJpY2VBbW91bnQgY3VycmVuY3lJRD0iRVVSIj40MDAuMDA8L2NiYzpQcmljZUFtb3VudD4KICAgIDwvY2FjOlByaWNlPgogIDwvY2FjOkludm9pY2VMaW5lPgo8L0ludm9pY2U+Cg=="},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"document_base64":{"type":"string","description":"The invoice itself, base64-encoded, in the JSON form. Two other forms are accepted and need no JSON at all: raw 'application/pdf' (Factur-X, the XML is extracted from the PDF/A-3 attachment) and raw 'application/xml' (CII or UBL). Body cap 10 MB (413 above). One optional query parameter, '?screen_payee=false', drops the screening of the real payee; any other query key is a 400"}},"required":["document_base64"]}},"output":{"type":"json","example":{"data":{"assessed_on":"2026-08-17","blocks":{"document":{"coverage":"complete","data":{"document":{"currency":"EUR","format":"ubl","grand_total":"1200.00","number":"SYN-IC-001","seller":"Fournisseur SAS"},"summary":{"artefacts_version":"en16931-1.3.16+facturx-1.08+xrechnung-3.0.2+peppol-bis-3.0.20","profile_mode":"declared","violations":{"business_rules_fatal":0,"business_rules_warning":0,"plausibility_failed":0,"profile":0,"xsd":0}},"verdict":"valid","warnings_present":false},"provenance":{"fetched_at":"2026-08-17T18:45:28.266830402Z","freshness":{"as_of":"2026-07-13T00:00:00Z","kind":"snapshot"},"source":"en16931-artefacts"}},"payee":{"coverage":"not_applicable","reason":"no_payee_declared"},"payment_terms":{"coverage":"complete","data":{"claim":{"amount":"1200.00","currency":"EUR"},"day_count_convention":"calendar days, actual/365","days_late":33,"due_date":"2026-07-15","due_date_source":"contractual_due_date","flat_fee":{"amount":{"amount":"40","currency":"EUR"},"source":"flat"},"interest_total":{"amount":"13.45","currency":"EUR"},"paid_date":"2026-08-17","total_due":{"amount":"53.45","currency":"EUR"}},"provenance":{"fetched_at":"2026-08-17T18:45:28.266841495Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"late-payment-snapshots"}},"supplier":{"coverage":"complete","data":{"query":{"iban_submitted":true,"key":"siren","screen_parent":true,"value":"303265045"},"subject":{"lei":"969500GZTMR1IRVURM23","name":"SODIMAS","siren":"303265045"},"verdict":"ok","verdict_reasons":[]},"provenance":{"fetched_at":"2026-08-17T18:45:28.273785443Z","freshness":{"as_of":"2026-07-31T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}},"vat":{"coverage":"complete","data":{"findings":[],"informational":true,"note":"Invoket consistency checks (INV-VAT-*), not EN 16931 rules: they are informational, they never appear among the EN 16931 violations and they do not change the verdict of this response."},"provenance":{"fetched_at":"2026-08-17T18:45:28.266839726Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"directive-2006-112 + tedb"}}},"limits":"This verdict is a deterministic decision table over the invoice as posted and over sourced, dated facts from public registers; it is not a credit opinion, a risk score or a recommendation to act. It does not attest that the goods or services billed were actually supplied, that the payment instruction was not tampered with (invoice redirection fraud), nor that the bank account belongs to the supplier named on the invoice - none of the three is decidable from the document and the registers. 'pay' only means that every requested check was answered and none of them raised a signal, on the data served (see each block's coverage and provenance). The VAT treatment of the transaction (place of supply, reverse charge) is not determined here: it depends on facts the document does not carry - POST /invoice/vat-treatment renders it.","query":{"iban_submitted":true,"screen_payee":true,"supplier_siren":"303265045"},"subject":{"currency":"EUR","due_date":"2026-07-15","invoice_number":"SYN-IC-001","issue_date":"2026-06-15","payable_amount":"1200.00","payable_amount_term":"BT-115 (amount due for payment)","payment_account":"FR7630006000011234567890189","payment_account_count":1,"seller_country":"FR","seller_legal_id":"303265045","seller_legal_id_scheme":"0002","seller_name":"Fournisseur SAS","seller_vat_id":"FR40303265045"},"verdict":"hold","verdict_reasons":[{"block":"supplier","code":"registered_name_mismatch","detail":"the invoice names \"Fournisseur SAS\" while the register publishes \"SODIMAS\"","severity":"review"},{"block":"payment_terms","code":"due_date_passed","detail":"payment was due on 2026-07-15 (33 day(s) ago): statutory interest and the fixed recovery sum are quantified in this block","severity":"review"}]},"provenance":{"fetched_at":"2026-08-17T18:45:28.890224707Z","freshness":{"kind":"live"},"source":"invoice-document"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"assessed_on":{"type":"string"},"blocks":{"type":"object","properties":{"document":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"document":{"type":"object","properties":{"currency":{"type":"string"},"format":{"type":"string"},"grand_total":{"type":"string"},"number":{"type":"string"},"seller":{"type":"string"}},"required":["currency","format","grand_total","number","seller"]},"summary":{"type":"object","properties":{"artefacts_version":{"type":"string"},"profile_mode":{"type":"string"},"violations":{"type":"object","properties":{"business_rules_fatal":{"type":"integer"},"business_rules_warning":{"type":"integer"},"plausibility_failed":{"type":"integer"},"profile":{"type":"integer"},"xsd":{"type":"integer"}},"required":["business_rules_fatal","business_rules_warning","plausibility_failed","profile","xsd"]}},"required":["artefacts_version","profile_mode","violations"]},"verdict":{"type":"string"},"warnings_present":{"type":"boolean"}},"required":["document","summary","verdict","warnings_present"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"},"retryable":{"type":"boolean"}},"required":["coverage","data","provenance"]},"payee":{"type":"object","properties":{"coverage":{"type":"string"},"reason":{"type":"string"},"data":{"type":"object"},"provenance":{"type":"object"}},"required":["coverage","reason"],"description":"The same check on the party actually credited (BG-10) when the invoice declares one distinct from the seller - the account the money leaves for. 'not_applicable' with reason 'no_payee_declared' means the seller IS the payee: that is an answer, not a gap. With '?screen_payee=false' the block is 'not_requested' and a notice says so, so the caller's choice is never silent"},"payment_terms":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"claim":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"day_count_convention":{"type":"string"},"days_late":{"type":"integer"},"due_date":{"type":"string"},"due_date_source":{"type":"string"},"flat_fee":{"type":"object","properties":{"amount":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"source":{"type":"string"}},"required":["amount","source"]},"interest_total":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"paid_date":{"type":"string"},"total_due":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]}},"required":["claim","day_count_convention","days_late","due_date","due_date_source","flat_fee","interest_total","paid_date","total_due"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage","data","provenance"],"description":"The due date retained (contractual, or the national statutory default), the days late and what they cost: statutory interest tranche by tranche and the fixed recovery sum of art. 6 of Directive 2011/7/EU. Served in the shape of /invoice/late-payment, whose parameters (agreed rate, assessment date) are not settable here"},"supplier":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"query":{"type":"object","properties":{"iban_submitted":{"type":"boolean"},"key":{"type":"string"},"screen_parent":{"type":"boolean"},"value":{"type":"string"}},"required":["iban_submitted","key","screen_parent","value"]},"subject":{"type":"object","properties":{"lei":{"type":"string"},"name":{"type":"string"},"siren":{"type":"string"}},"required":["lei","name","siren"]},"verdict":{"type":"string"},"verdict_reasons":{"type":"array"}},"required":["query","subject","verdict","verdict_reasons"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"},"retryable":{"type":"boolean"}},"required":["coverage","data","provenance"],"description":"The counterparty response relayed as it is served, with ITS provenance: identity and status (INSEE Sirene or GLEIF), BODACC announcements, live EU VAT (VIES), Peppol reachability, control chain, sanctions screening of the company AND of its ultimate parent, and the check of the IBAN to credit. Its own reasons are relayed verbatim into the reasons above. When the document carries no seller legal id, or the service cannot be reached, the block is 'unavailable' with its reason - never a 5xx, and never a 'pay'"},"vat":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"findings":{"type":"array"},"informational":{"type":"boolean"},"note":{"type":"string"}},"required":["findings","informational","note"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage","data","provenance"],"description":"Invoket consistency checks INV-VAT-01..04 (missing reverse-charge mention on an intra-Community supply, a rate not published for the country of taxation, reverse charge claimed between two parties of the same country, buyer VAT id missing under an exemption). They are informational: they never appear among the EN 16931 violations. The VAT TREATMENT of the transaction is a different question and a different endpoint (POST /invoice/vat-treatment)"}},"required":["document","payee","payment_terms","supplier","vat"],"description":"The five blocks, each with its own coverage, its own provenance and - when complete - its data in the EXACT shape of the matching standalone endpoint, never flattened. 'document' is the /invoice/validate verdict, 'supplier' the /preflight/supplier response as served by the counterparty service, 'payee' the same check on the real payee (BG-10), 'vat' the Invoket consistency checks and 'payment_terms' the statutory due date and what the delay costs"},"limits":{"type":"string","description":"Fixed sentence served inside every response, and it names the three things this verdict does NOT attest - that the goods or services were supplied, that the payment instruction was not tampered with (invoice redirection fraud), and that the bank account belongs to the supplier named on the invoice. None of the three is decidable from the document and the registers"},"query":{"type":"object","properties":{"iban_submitted":{"type":"boolean"},"screen_payee":{"type":"boolean"},"supplier_siren":{"type":"string"},"payee_siren":{"type":["string","null"]}},"required":["iban_submitted","screen_payee","supplier_siren"],"description":"What was actually retained from the document and from the query: the supplier legal id used as the register key, the payee one when a real payee is declared, whether an account to credit was submitted, and whether the payee screening was requested. A French SIREN is only used as a French key when the document says so (ISO 6523 scheme 0002/0009, or a numeric value carried by a party established in France): a nine-digit foreign register id would return a verdict on another company"},"subject":{"type":"object","properties":{"currency":{"type":"string"},"due_date":{"type":"string"},"invoice_number":{"type":"string"},"issue_date":{"type":"string"},"payable_amount":{"type":"string"},"payable_amount_term":{"type":"string"},"payment_account":{"type":["string","null"]},"payment_account_count":{"type":"integer"},"seller_country":{"type":"string"},"seller_legal_id":{"type":["string","null"]},"seller_legal_id_scheme":{"type":["string","null"]},"seller_name":{"type":"string"},"seller_vat_id":{"type":["string","null"]},"payee_legal_id":{"type":["string","null"]},"payee_legal_id_scheme":{"type":["string","null"]},"payee_name":{"type":["string","null"]}},"required":["currency","due_date","invoice_number","issue_date","payable_amount","payable_amount_term","payment_account","payment_account_count","seller_country","seller_legal_id","seller_legal_id_scheme","seller_name","seller_vat_id"],"description":"The invoice as posted, at EN 16931 terms (BT-115 payable amount, BT-5 currency, BT-9 due date, BT-30 seller legal id, BT-84 payment account): what the verdict was rendered on. 'payment_account_count' above 1 means several distinct accounts are present and only one was checked - the caller has to choose"},"verdict":{"type":"string","description":"Closed enumeration. 'stop': a published fact opposes the payment. 'hold': a signal calls for a human eye before paying. 'pay': every requested check was answered and none raised a signal. 'insufficient_coverage': at least one check could not be rendered - 'pay' is then forbidden, which is the whole point of the value. A single block with coverage 'unavailable' makes 'pay' impossible"},"verdict_reasons":{"type":"array","items":{"type":"object","properties":{"block":{"type":"string"},"code":{"type":"string"},"detail":{"type":"string"},"severity":{"type":"string"}},"required":["block","code","severity"]},"description":"Every reason attached to the block it comes from, with its severity (stop > review > gap > notice) and its detail, sorted most severe first. Reasons coming from the counterparty service are relayed VERBATIM, never rewritten: rewriting them would make them drift the first time that service evolves. The verdict is the maximum severity, so an agent can replay the decision without taking our word for it"}},"required":["assessed_on","blocks","limits","query","subject","verdict","verdict_reasons"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"document_base64":{"type":"string","description":"The invoice itself, base64-encoded, in the JSON form. Two other forms are accepted and need no JSON at all: raw 'application/pdf' (Factur-X, the XML is extracted from the PDF/A-3 attachment) and raw 'application/xml' (CII or UBL). Body cap 10 MB (413 above). One optional query parameter, '?screen_payee=false', drops the screening of the real payee; any other query key is a 400"}},"required":["document_base64"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/preflight-invoice-payment","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Pre-flight a supplier invoice before you pay it","tags":["invoice","company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.25"}},{"resource":{"url":"https://api.invoket.com/company/resolve","description":"Verify a French company before you invoice, pay or onboard it: legal name, active/ceased status, legal form, NAF activity, workforce band, creation date and head-office address from the official INSEE Sirene register (30M+ legal units, monthly snapshot). Lookup by SIREN or SIRET. No account, no key, pay per call.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"siren":"552081317"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN of the legal unit. Provide exactly one of 'siren' or 'siret'. Malformed input is a 400 (INVALID_INPUT), a failed Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo), a well-formed SIREN absent from the register is a 404 (unbilled)"}},"required":[]}},"output":{"type":"json","example":{"data":{"acronym":"EDF","coverage":{"missing":[]},"created_on":"1955-01-01","headquarters":{"address":{"city":"PARIS","line":"22 AVENUE DE WAGRAM","postal_code":"75008"},"created_on":"2006-08-01","siret":"55208131766522","status":"active"},"last_processed_on":"2026-06-10","legal_form":{"code":"5599","label":"SA à conseil d'administration (s.a.i.)"},"main_activity":{"code":"35.11Z","label":"Production d'électricité","nomenclature":"NAFRev2"},"name":"ELECTRICITE DE FRANCE","siren":"552081317","social_economy":false,"status":"active","workforce":{"bracket":"53","year":2023}},"provenance":{"fetched_at":"2026-07-11T18:22:08Z","freshness":{"as_of":"2026-06-30T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"acronym":{"type":["string","null"]},"coverage":{"type":"object","properties":{"missing":{"type":"array"},"establishment":{"type":"string"}},"required":["missing"],"description":"Honest coverage: register fields that are absent (partial/protected dissemination) are listed in 'missing' as JSON paths of data, never filled in - and never a 5xx"},"created_on":{"type":["string","null"]},"headquarters":{"type":["object","null"],"properties":{"address":{"type":"object","properties":{"city":{"type":["string","null"]},"line":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"country":{"type":["string","null"]}},"required":["city","line","postal_code"]},"created_on":{"type":["string","null"]},"siret":{"type":"string"},"status":{"type":"string"}},"required":["address","created_on","siret","status"],"description":"Head-office establishment (SIRET, status, structured address, creation date); address.country is null for France. A 'siret' query for a secondary establishment resolves to its legal unit with coverage.establishment='resolved_to_legal_unit'"},"last_processed_on":{"type":["string","null"]},"legal_form":{"type":["object","null"],"properties":{"code":{"type":"string"},"label":{"type":["string","null"]}},"required":["code","label"],"description":"INSEE legal category code with its label from the embedded official nomenclature; label is null for a code outside the nomenclature, never a guessed label"},"main_activity":{"type":["object","null"],"properties":{"code":{"type":"string"},"label":{"type":["string","null"]},"nomenclature":{"type":["string","null"]}},"required":["code","label","nomenclature"]},"name":{"type":["string","null"],"description":"Legal name of the company, null for a sole trader (an individual): the identity then sits in natural_person. Both cases are ordinary successful answers"},"siren":{"type":"string"},"social_economy":{"type":["boolean","null"]},"status":{"type":"string","description":"Administrative status in the Sirene register: 'active' or 'ceased'. A ceased company is a successful, billed answer - the status is the information"},"workforce":{"type":["object","null"],"properties":{"bracket":{"type":"string"},"year":{"type":["integer","null"]}},"required":["bracket","year"],"description":"INSEE workforce band code with its validity year - a band, never a guessed headcount"},"is_employer":{"type":["boolean","null"]},"is_headquarters":{"type":"boolean"},"lei":{"type":"object","description":"Global legal identity attached to this SIREN, present when a LEI record declares it — absent means no LEI declares this SIREN, never that the company has none"},"natural_person":{"type":["object","null"]}},"required":["acronym","coverage","created_on","headquarters","last_processed_on","legal_form","main_activity","name","siren","social_economy","status","workforce"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN of the legal unit. Provide exactly one of 'siren' or 'siret'. Malformed input is a 400 (INVALID_INPUT), a failed Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo), a well-formed SIREN absent from the register is a 404 (unbilled)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-resolve","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Resolve a French company","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/company/events","description":"Check a French company for official insolvency, deregistration and business-sale announcements before you invoice or extend credit: dated event timeline and factual flags from the official BODACC gazette, by SIREN. An empty list is a paid answer: no known announcement over the covered window. No account, no key.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"family":"insolvency","siren":"321875205"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"family":{"type":"string","description":"Optional filter on the served view: 'insolvency' (collective proceedings: safeguard, receivership, liquidation), 'deregistration' or 'sale' (business sales and transfers). Default serves all families. The filter narrows events[], never the flags - facts are derived from the complete timeline"},"siren":{"type":"string","description":"9-digit SIREN of the legal unit (required). Malformed input is a 400 (INVALID_INPUT), a failed Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo). BODACC knows announcements, not companies: a SIREN known to the Sirene register with no announcement is a successful empty timeline (200, billed), never a 404. A well-formed SIREN absent from the Sirene register is a 404 (unbilled, same answer as /company/resolve) - 'unknown to the register' and 'known, no announcement' are different answers"}},"required":["siren"]}},"output":{"type":"json","example":{"data":{"company":{"name":"SAN MARINA","status":"active"},"coverage":{"window":{"from":"2008-01-01","to":"2026-07-12"}},"events":[{"court":"Greffe du Tribunal de Commerce de Marseille","effective_on":"2023-08-25","family":"insolvency","gazette_issue":"20230170","nature":"Dépôt de l'état des créances","notice_number":2594,"published_on":"2023-09-05","text":"L'état des créances est déposé au greffe où tout intéressé peut présenter réclamation devant le juge-commissaire dans le délai d'un mois à compter de la présente publication."},{"court":"Greffe du Tribunal de Commerce de Marseille","effective_on":"2023-02-20","family":"insolvency","gazette_issue":"20230038","nature":"Jugement de conversion en liquidation judiciaire","notice_number":1758,"published_on":"2023-02-23","text":"Jugement prononçant la liquidation judiciaire désignant liquidateur SCP J.P Louis & A.Lageat, Mandat Conduit Par Me J.P Louis 30 Rue Cours Lieutaud 13001 Marseille et SAS LES MANDATAIRES mission conduite par Me Vincent DE CARRIERE 50 Rue Sylvabelle 13006 MARSEILLE."},{"court":"Greffe du Tribunal de Commerce de Marseille","effective_on":"2022-09-22","family":"insolvency","gazette_issue":"20220187","nature":"Jugement d'ouverture d'une procédure de redressement judiciaire","notice_number":3494,"published_on":"2022-09-27","text":"Jugement prononçant l'ouverture d'une procédure de redressement judiciaire, date de cessation des paiements le 25 août 2022 désignant administrateur SCP Avazeri-Bonetto, Mission Conduite Par Me F.Avazeri 23/29 Rue Haxo 13001 Marseille et SELARL GILLIBERT & ASSOCIES, mission conduite par Me Vincent GILLIBERT 11 Rue Venture 13001 MARSEILLE avec les pouvoirs : assister le débiteur pour tous les actes de gestion, mandataire judiciaire SCP J.P Louis & A.Lageat, Mandat Conduit Par Me J.P Louis 30 Rue…"}],"flags":{"has_open_insolvency_announcement":true,"is_deregistered":false,"latest_event":{"date":"2017-05-22","family":"sale"}},"siren":"321875205","total":3,"truncated":false},"provenance":{"fetched_at":"2026-07-12T14:50:57Z","freshness":{"as_of":"2026-07-12T00:00:00Z","kind":"snapshot"},"source":"dila-bodacc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"company":{"type":["object","null"],"properties":{"name":{"type":["string","null"]},"status":{"type":"string"},"natural_person":{"type":["object","null"]}},"required":["name","status"],"description":"Minimal Sirene identity echo (name or natural person, active/ceased status) for cross-reading with /company/resolve; null when the SIREN is unknown to the Sirene stock, stated in coverage.identity - never an error"},"coverage":{"type":"object","properties":{"window":{"type":"object","properties":{"from":{"type":["string","null"]},"to":{"type":"string"}},"required":["from","to"]},"identity":{"type":"string"}},"required":["window"],"description":"Honest coverage: 'window' is the BODACC history span actually ingested (from/to) - an empty timeline is only meaningful over this window; 'identity' is present when the Sirene echo could not be served; 'insolvency_flag' is present (undetermined_latest_notice) when the insolvency flag is null - the announcements are still served, we just refuse to over-qualify them. Never a 5xx for staleness"},"events":{"type":"array","items":{"type":"object","properties":{"court":{"type":["string","null"]},"effective_on":{"type":["string","null"]},"family":{"type":"string"},"gazette_issue":{"type":"string"},"nature":{"type":["string","null"]},"notice_number":{"type":"integer"},"published_on":{"type":"string"},"text":{"type":["string","null"]}},"required":["court","effective_on","family","gazette_issue","nature","notice_number","published_on","text"]},"description":"BODACC announcements, most recent first: family, original nature label (null when the gazette does not state it, never guessed), effective/judgment date when distinct from publication, publication date, gazette issue and notice number, court, original short text. Capped at the 100 most recent (truncated=true, total stays honest)"},"flags":{"type":"object","properties":{"has_open_insolvency_announcement":{"type":"boolean"},"is_deregistered":{"type":"boolean"},"latest_event":{"type":["object","null"],"properties":{"date":{"type":"string"},"family":{"type":"string"}},"required":["date","family"],"description":"Family and date of the most recent announcement, null when the timeline is empty over the covered window — an empty timeline is a successful, billed answer"}},"required":["has_open_insolvency_announcement","is_deregistered","latest_event"],"description":"Factual flags derived mechanically from the complete timeline, never a score or a solvency opinion: has_open_insolvency_announcement (true when the latest QUALIFYING collective-proceeding announcement is an act of proceedings, false when it is a closure or there is none, NULL when no announcement states the status - see coverage.insolvency_flag; the DILA catch-all label never carries it alone), is_deregistered (a deregistration was published), latest_event (family and date of the most recent announcement)"},"siren":{"type":"string"},"total":{"type":"integer"},"truncated":{"type":"boolean"}},"required":["company","coverage","events","flags","siren","total","truncated"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"family":{"type":"string","description":"Optional filter on the served view: 'insolvency' (collective proceedings: safeguard, receivership, liquidation), 'deregistration' or 'sale' (business sales and transfers). Default serves all families. The filter narrows events[], never the flags - facts are derived from the complete timeline"},"siren":{"type":"string","description":"9-digit SIREN of the legal unit (required). Malformed input is a 400 (INVALID_INPUT), a failed Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo). BODACC knows announcements, not companies: a SIREN known to the Sirene register with no announcement is a successful empty timeline (200, billed), never a 404. A well-formed SIREN absent from the Sirene register is a 404 (unbilled, same answer as /company/resolve) - 'unknown to the register' and 'known, no announcement' are different answers"}},"required":["siren"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-events","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check French company legal events","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/company/vat","description":"Validate any EU VAT number live against the official European Commission VIES service before you invoice cross-border, or derive and check the French VAT number from a SIREN. Returns valid/invalid or an honest 'unverifiable' when the member state is down - syntax check always included. No account, no key.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"vat":"FR40303265045"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"vat":{"type":"string","description":"Optional on its own - Complete VAT number with its country prefix, any EU member state plus XI (Northern Ireland), EL for Greece. Provide exactly one of 'vat' or 'siren' - 'siren' (9 digits) derives the French VAT number by pure computation, traced in derived_from_siren. Malformed number or unknown prefix is a 400 (INVALID_INPUT), an inconsistent FR key or Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo). There is no 404"}},"required":[]}},"output":{"type":"json","example":{"data":{"address":"11 RUE AMPERE\n26600 PONT DE L ISERE","checked_at":"2026-07-12T15:30:31Z","country":"FR","name":"SA SODIMAS","status":"valid","syntax_valid":true,"vat_number":"FR40303265045"},"provenance":{"fetched_at":"2026-07-12T15:30:31Z","freshness":{"kind":"live"},"source":"vies"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"address":{"type":"string"},"checked_at":{"type":"string","description":"Timestamp of the live check against VIES - freshness is 'live', this is never a cached answer"},"country":{"type":"string"},"name":{"type":"string","description":"Legal name relayed verbatim when the member state discloses it (status 'valid' only); absent when not disclosed ('---' in VIES), never guessed. Same for address"},"status":{"type":"string","description":"'valid' or 'invalid' are firm answers from the member state - both billed, a firm no is useful. 'unverifiable' is the honest degraded answer when VIES or the member state is down: the syntax check is still served, with 'reason' (MS_UNAVAILABLE, timeout...) and coverage='syntax_only' - never a 5xx for a VIES outage"},"syntax_valid":{"type":"boolean","description":"Always true on a 200: a syntactically invalid number is a 400. Stated explicitly so the 'unverifiable' degraded answer stays useful - the syntax, at least, is good"},"vat_number":{"type":"string"},"coverage":{"type":"string"},"derived_from_siren":{"type":"string"},"reason":{"type":"string"}},"required":["checked_at","country","status","syntax_valid","vat_number"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"vat":{"type":"string","description":"Optional on its own - Complete VAT number with its country prefix, any EU member state plus XI (Northern Ireland), EL for Greece. Provide exactly one of 'vat' or 'siren' - 'siren' (9 digits) derives the French VAT number by pure computation, traced in derived_from_siren. Malformed number or unknown prefix is a 400 (INVALID_INPUT), an inconsistent FR key or Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo). There is no 404"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-vat","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Validate an EU VAT number","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/company/peppol","description":"Check whether a company can receive e-invoices on the Peppol network before you send one: participant identifiers and accepted document types from the official Peppol Directory export, by SIREN, SIRET or explicit Peppol participant ID. 'Not registered' is a paid, dated answer. No account, no key.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"siren":"333285633"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN of the French legal unit. Provide exactly one of 'siren', 'siret' (14 digits, matched on its SIREN prefix) or 'participant' ('<icd>:<value>', explicit Peppol participant ID, any country - e.g. '0009:33328563300033'). Malformed input is a 400 (INVALID_INPUT), a failed Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo). An identifier absent from the directory is NOT a 404: it is a successful 'reachable: false' answer (200, billed). The only 404 on this route is a well-formed 'siret' or 'siren' that does not exist in the Sirene register (a mistyped number, or an ERP filler value such as 000000000) - not billed, same answer as /company/resolve; 'participant' has no existence check (any country)"}},"required":[]}},"output":{"type":"json","example":{"data":{"company":{"name":"EQUIP'TEC","status":"active"},"coverage":{"directory_as_of":"2026-07-12","note":"reachability reflects the public Peppol directory export dated directory_as_of, not a live SMP lookup"},"participants":[{"country":"FR","document_types":[{"display_name":"Peppol Invoice Response transaction 3.0","identifier":"urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:fdc:peppol.eu:poacc:trns:invoice_response:3::2.1","label":"application-response"},{"display_name":"Peppol Message Level Response transaction 3.0","identifier":"urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:fdc:peppol.eu:poacc:trns:mlr:3::2.1","label":"application-response"}],"id":"0009:33328563300033","names":["EQUIPTEC"],"registered_on":"2023-03-27","scheme":"0009","value":"33328563300033"},{"country":"FR","document_types":[{"display_name":"France UBL Invoice CIUS","identifier":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:peppol:france:billing:cius:1.0::2.1","label":"invoice"},{"display_name":"France CII Invoice CIUS","identifier":"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100::CrossIndustryInvoice##urn:cen.eu:en16931:2017#compliant#urn:peppol:france:billing:cius:1.0::D22B","label":"cross-industry-invoice"},{"display_name":"France UBL Invoice Extension","identifier":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#conformant#urn:peppol:france:billing:extended:1.0::2.1","label":"invoice"},{"display_name":"France CII Invoice Extension","identifier":"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100::CrossIndustryInvoice##urn:cen.eu:en16931:2017#conformant#urn:peppol:france:billing:extended:1.0::D22B","label":"cross-industry-invoice"},{"display_name":"Peppol BIS Billing UBL Invoice V3","identifier":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1","label":"invoice"},{"display_name":"France UBL Credit Note CIUS","identifier":"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote##urn:cen.eu:en16931:2017#compliant#urn:peppol:france:billing:cius:1.0::2.1","label":"credit-note"},{"display_name":"France UBL Credit Note Extension","identifier":"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote##urn:cen.eu:en16931:2017#conformant#urn:peppol:france:billing:extended:1.0::2.1","label":"credit-note"},{"display_name":"Peppol BIS Billing UBL Credit Note V3","identifier":"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1","label":"credit-note"},{"display_name":"France CDAR","identifier":"urn:un:unece:uncefact:data:standard:CrossDomainAcknowledgementAndResponse:100::CrossDomainAcknowledgementAndResponse##urn:peppol:france:billing:cdv:1.0::D22B","label":"cross-domain-acknowledgement-and-response"}],"id":"0225:333285633","names":["equiptec_Sage_Company_FUll_Name"],"registered_on":"0001-01-01","scheme":"0225","value":"333285633"}],"reachable":true},"provenance":{"fetched_at":"2026-07-12T20:35:21Z","freshness":{"as_of":"2026-07-12T00:00:00Z","kind":"snapshot"},"source":"peppol-directory"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"company":{"type":"object","properties":{"name":{"type":["string","null"]},"status":{"type":"string"},"natural_person":{"type":["object","null"]}},"required":["name","status"],"description":"Minimal Sirene identity echo (name or natural person, active/ceased status) for cross-reading with /company/resolve; only for siren=/siret= input (absent for an explicit participant= lookup); when the SIREN is unknown to the Sirene stock it is stated in coverage.identity - never an error"},"coverage":{"type":"object","properties":{"directory_as_of":{"type":"string"},"note":{"type":"string"},"identity":{"type":"string"}},"required":["directory_as_of","note"],"description":"Honest coverage: 'directory_as_of' dates the ingested directory export and 'note' restates that reachability is a snapshot, not a live SMP lookup; 'identity' appears when the Sirene echo could not be served. Never a 5xx for staleness"},"participants":{"type":"array","items":{"type":"object","properties":{"country":{"type":["string","null"]},"document_types":{"type":"array","items":{"type":"object","properties":{"display_name":{"type":["string","null"]},"identifier":{"type":"string"},"label":{"type":["string","null"]}},"required":["display_name","identifier","label"]}},"id":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"registered_on":{"type":["string","null"]},"scheme":{"type":"string"},"value":{"type":"string"}},"required":["country","document_types","id","names","registered_on","scheme","value"]},"description":"Every directory registration matching the query - a French SIREN can appear under several identifiers: head-office SIRET (ICD 0009), bare SIREN (0002/0225) and CTC routing sub-addresses of the French 2026 e-invoicing reform. Each entry carries the full Peppol ID (scheme:value), declared names and registration date relayed verbatim (never corrected), and the accepted document_types: full Peppol identifier, declared display_name, and a derived short label ('invoice', 'credit-note'... - null when not derivable, never guessed)"},"reachable":{"type":"boolean","description":"True when at least one participant identifier matches the query in the ingested directory export. False is a paid, useful answer: the company is not registered on Peppol as of the export date - dated by coverage.directory_as_of, never presented as a live SMP truth"}},"required":["coverage","participants","reachable"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN of the French legal unit. Provide exactly one of 'siren', 'siret' (14 digits, matched on its SIREN prefix) or 'participant' ('<icd>:<value>', explicit Peppol participant ID, any country - e.g. '0009:33328563300033'). Malformed input is a 400 (INVALID_INPUT), a failed Luhn checksum is a 400 (INVALID_CHECKSUM, likely a typo). An identifier absent from the directory is NOT a 404: it is a successful 'reachable: false' answer (200, billed). The only 404 on this route is a well-formed 'siret' or 'siren' that does not exist in the Sirene register (a mistyped number, or an ERP filler value such as 000000000) - not billed, same answer as /company/resolve; 'participant' has no existence check (any country)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-peppol","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check Peppol e-invoicing reachability","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/company/report","description":"Full counterparty due-diligence on a French company in one paid call, by SIREN: Sirene identity and status, dated BODACC insolvency/deregistration/sale announcements, live EU VAT validation (VIES) and Peppol e-invoicing reachability - each block with its own provenance. The pre-action check before you invoice, pay or onboard. No account, no key.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"100000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"100000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"siren":"333285633"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"siren":{"type":"string","description":"9-digit SIREN (Luhn-checked, 400 on a typo). Optional 'include=identity,events,vat,peppol,lei' trims the report; dropping 'vat' makes it fully offline. Unknown SIREN = 404, no empty report billed"}},"required":["siren"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true},"events":{"company":{"name":"EQUIP'TEC","status":"active"},"coverage":{"window":{"from":"2008-01-01","to":"2026-07-12"}},"events":[{"family":"sale","gazette_issue":"20090087","notice_number":382,"published_on":"2009-05-06"}],"flags":{"has_open_insolvency_announcement":false,"is_deregistered":false,"latest_event":{"date":"2009-05-06","family":"sale"}},"provenance":{"fetched_at":"2026-07-12T21:03:42Z","freshness":{"as_of":"2026-07-12T00:00:00Z","kind":"snapshot"},"source":"dila-bodacc"},"siren":"333285633","total":1,"truncated":false},"identity":{"coverage":{"missing":[]},"created_on":"1985-08-01","headquarters":{"address":{"city":"CARVIN","line":"1 RUE DE L’INDUSTRIE","postal_code":"62220"},"created_on":"2013-04-30","siret":"33328563300033","status":"active"},"last_processed_on":"2025-12-06","legal_form":{"code":"5710","label":"SAS, société par actions simplifiée"},"main_activity":{"code":"46.69B","label":"Commerce de gros de fournitures et équipements industriels divers","nomenclature":"NAFRev2"},"name":"EQUIP'TEC","provenance":{"fetched_at":"2026-07-12T21:03:42Z","freshness":{"as_of":"2026-06-30T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"},"siren":"333285633","status":"active","workforce":{"bracket":"02","year":2023}},"lei":{"entity_status":"ACTIVE","legal_name":"EQUIP'TEC","lei":"969500J1H2W1QK3T8N54","limits":"Accounting consolidation parent, NOT beneficial ownership (AML/KYC), no ownership percentage published. Absence of a declared parent is not evidence of absence of control.","provenance":{"fetched_at":"2026-07-12T21:03:42Z","freshness":{"as_of":"2026-07-12T00:00:00Z","kind":"snapshot"},"source":"gleif"},"registration_status":"ISSUED","total_matches":1,"ultimate_parent":{"link":{"entity":{"legal_country":"FR","legal_name":"GROUPE EQUIPTEC HOLDING"},"lei":"969500M4TQ2S8K1P0R37","relationship_status":"ACTIVE"},"status":"declared"},"verified_against_sirene":true},"peppol":{"company":{"name":"EQUIP'TEC","status":"active"},"coverage":{"directory_as_of":"2026-07-12","note":"reachability reflects the public Peppol directory export dated directory_as_of, not a live SMP lookup"},"participants":[{"country":"FR","document_types":[{"display_name":"France UBL Invoice CIUS","identifier":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:peppol:france:billing:cius:1.0::2.1","label":"invoice"}],"id":"0225:333285633","names":["equiptec_Sage_Company_FUll_Name"],"registered_on":"0001-01-01","scheme":"0225","value":"333285633"}],"provenance":{"fetched_at":"2026-07-12T21:03:42Z","freshness":{"as_of":"2026-07-12T00:00:00Z","kind":"snapshot"},"source":"peppol-directory"},"reachable":true},"siren":"333285633","summary":{"has_open_insolvency_announcement":false,"peppol_reachable":true,"status":"active","vat_status":"valid"},"vat":{"address":"1 RUE DE L INDUSTRIE\n62220 CARVIN","checked_at":"2026-07-12T21:03:42Z","country":"FR","derived_from_siren":"333285633","name":"SAS EQUIP'TEC","provenance":{"fetched_at":"2026-07-12T21:03:42Z","freshness":{"kind":"live"},"source":"vies + pure-computation"},"status":"valid","syntax_valid":true,"vat_number":"FR20333285633"}},"provenance":{"fetched_at":"2026-07-12T21:03:42Z","freshness":{"as_of":"2026-06-30T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"excluded":{"type":"array"},"unavailable":{"type":"array"}},"required":["complete"],"description":"'complete' true only when every block was served; 'unavailable' names degraded blocks, 'excluded' those trimmed by include="},"events":{"type":"object","properties":{"company":{"type":["object","null"],"properties":{"name":{"type":"string"},"status":{"type":"string"}},"required":["name","status"]},"coverage":{"type":"object","properties":{"window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"required":["window"]},"events":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string"},"gazette_issue":{"type":"string"},"notice_number":{"type":"integer"},"published_on":{"type":"string"},"court":{"type":["string","null"]},"effective_on":{"type":["string","null"]},"nature":{"type":["string","null"]},"text":{"type":["string","null"]}},"required":["family","gazette_issue","notice_number","published_on"]}},"flags":{"type":"object","properties":{"has_open_insolvency_announcement":{"type":"boolean"},"is_deregistered":{"type":"boolean"},"latest_event":{"type":["object","null"],"properties":{"date":{"type":"string"},"family":{"type":"string"}},"required":["date","family"]}},"required":["has_open_insolvency_announcement","is_deregistered","latest_event"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"siren":{"type":"string"},"total":{"type":"integer"},"truncated":{"type":"boolean"},"unavailable":{"type":"string"}},"required":["company","coverage","events","flags","provenance","siren","total","truncated"],"description":"BODACC block, shape of /company/events: dated insolvency/deregistration/sale announcements with factual flags. Empty list = stated fact; missing dataset degrades to 'unavailable', never a 5xx"},"identity":{"type":"object","properties":{"coverage":{"type":"object","properties":{"missing":{"type":"array"}},"required":["missing"]},"created_on":{"type":"string"},"headquarters":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"line":{"type":"string"},"postal_code":{"type":"string"}},"required":["city","line","postal_code"]},"created_on":{"type":"string"},"siret":{"type":"string"},"status":{"type":"string"}},"required":["address","created_on","siret","status"]},"last_processed_on":{"type":"string"},"legal_form":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"}},"required":["code","label"]},"main_activity":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"},"nomenclature":{"type":"string"}},"required":["code","label","nomenclature"]},"name":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"siren":{"type":"string"},"status":{"type":"string"},"workforce":{"type":"object","properties":{"bracket":{"type":"string"},"year":{"type":"integer"}},"required":["bracket","year"]},"acronym":{"type":["string","null"]},"is_employer":{"type":["boolean","null"]},"natural_person":{"type":["object","null"]},"social_economy":{"type":["boolean","null"]}},"required":["coverage","provenance","siren","status"],"description":"Mandatory base block, shape of /company/resolve, from the monthly INSEE Sirene snapshot. The report is only billed when this block exists"},"lei":{"type":"object","properties":{"entity_status":{"type":["string","null"]},"legal_name":{"type":["string","null"]},"lei":{"type":["string","null"]},"limits":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"registration_status":{"type":["string","null"]},"total_matches":{"type":"integer"},"ultimate_parent":{"type":"object","properties":{"link":{"type":"object","properties":{"entity":{"type":"object","properties":{"legal_country":{"type":"string"},"legal_name":{"type":"string"}},"required":["legal_country","legal_name"]},"lei":{"type":"string"},"relationship_status":{"type":"string"}},"required":["entity","lei","relationship_status"]},"status":{"type":"string"}},"required":["link","status"]},"verified_against_sirene":{"type":["boolean","null"]},"unavailable":{"type":"string"}},"required":["entity_status","legal_name","lei","limits","provenance","registration_status","total_matches","verified_against_sirene"],"description":"GLEIF block (CC0): global legal identity matched from the SIREN, plus 'ultimate_parent', the consolidating group head - the check an endpoint-by-endpoint review misses. Accounting parent, NOT beneficial ownership. total_matches 0 = no LEI, a stated fact"},"peppol":{"type":"object","properties":{"company":{"type":["object","null"],"properties":{"name":{"type":"string"},"status":{"type":"string"}},"required":["name","status"]},"coverage":{"type":"object","properties":{"directory_as_of":{"type":"string"},"note":{"type":"string"}},"required":["directory_as_of","note"]},"participants":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string"},"document_types":{"type":"array","items":{"type":"object","properties":{"display_name":{"type":"string"},"identifier":{"type":"string"},"label":{"type":"string"}},"required":["display_name","identifier","label"]}},"id":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"registered_on":{"type":"string"},"scheme":{"type":"string"},"value":{"type":"string"}},"required":["country","document_types","id","names","registered_on","scheme","value"]}},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reachable":{"type":"boolean"},"unavailable":{"type":"string"}},"required":["company","coverage","participants","provenance","reachable"],"description":"Peppol block, shape of /company/peppol: e-invoicing reachability and accepted document types from the dated directory export. 'reachable: false' is a paid, dated fact; missing dataset = 'unavailable', never a 5xx"},"siren":{"type":"string"},"summary":{"type":"object","properties":{"has_open_insolvency_announcement":{"type":"boolean"},"peppol_reachable":{"type":"boolean"},"status":{"type":"string"},"vat_status":{"type":"string"},"lei":{"type":"string"}},"required":["status"],"description":"Factual synthesis derived mechanically from the served blocks - never a rating or risk score. A missing field means the block was excluded, unavailable, or undetermined (has_open_insolvency_announcement when no BODACC announcement states the status), stated in coverage - an unknown fact is never folded into false"},"vat":{"type":"object","properties":{"address":{"type":"string"},"checked_at":{"type":"string"},"country":{"type":"string"},"derived_from_siren":{"type":"string"},"name":{"type":"string"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"status":{"type":"string"},"syntax_valid":{"type":"boolean"},"vat_number":{"type":"string"},"coverage":{"type":"string"},"reason":{"type":"string"}},"required":["checked_at","country","provenance","status","syntax_valid","vat_number"],"description":"VAT block, shape of /company/vat: FR VAT number derived from the SIREN, checked live against VIES (the report's only network call). VIES down = status 'unverifiable' with a reason, never a 5xx"}},"required":["coverage","identity","siren","summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"siren":{"type":"string","description":"9-digit SIREN (Luhn-checked, 400 on a typo). Optional 'include=identity,events,vat,peppol,lei' trims the report; dropping 'vat' makes it fully offline. Unknown SIREN = 404, no empty report billed"}},"required":["siren"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-report","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a full company due-diligence report","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.10"}},{"resource":{"url":"https://api.invoket.com/company/lei","description":"Identify the company behind a bank identifier, a French SIREN, an ISIN or an exact name before you onboard, pay or invoice it: official GLEIF LEI identity - legal name, jurisdiction, entity and registration status, addresses, national registration number, mapped BICs and ISINs. Lookup by LEI, BIC (8 or 11), ISIN, SIREN, or exact legal name plus country. Homonyms are returned as candidates, never silently resolved.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"lei":"529900S21EQ1BO4ESM68"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"lei":{"type":"string","description":"Optional on its own - 20-character LEI (ISO 17442, check digits verified). Provide EXACTLY ONE key: 'lei', 'bic' (8 or 11 characters - both forms are looked up, so the BIC-8 of an IBAN resolves), 'isin' (12 characters, Luhn), 'siren' (9 digits, French bridge) or 'name' plus 'country' (ISO 3166-1 alpha-2, exact normalized equality - no fuzzy search). Zero or two keys is a 400; a failed check digit is a 400 INVALID_CHECKSUM; a well-formed key absent from the reference is a 404, unbilled"}},"required":[]}},"output":{"type":"json","example":{"data":{"entity":{"entity_category":"GENERAL","entity_status":"ACTIVE","headquarters_address":{"city":"Courbevoie","country":"FR","line":"2 Place Jean Millier - La Défense 6","postal_code":"92400","region":"FR-IDF"},"identifiers":{"bics":[],"bics_total":0,"isins":["FR0000120271","FR0000CR5295","FR0000CR6103","FR0010314021","US89151E1091"],"isins_total":5},"legal_address":{"city":"Courbevoie","country":"FR","line":"2 Place Jean Millier - La Défense 6","postal_code":"92400","region":"FR-IDF"},"legal_form":"TPNT","legal_jurisdiction":"FR","legal_name":"TotalEnergies SE","lei":"529900S21EQ1BO4ESM68","other_names":[],"registration":{"initial_registration_date":"2016-11-11","last_update_date":"2025-10-28","managing_lou":"5299000J2N45DDNE4Y28","next_renewal_date":"2026-12-12","status":"ISSUED"},"registration_authority":{"ra_code":"RA000192","registration_number":"542 051 180","siren":"542051180","verified_against_sirene":true}},"matches":[],"query":{"key":"lei","value":"529900S21EQ1BO4ESM68"},"total_matches":1},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"gleif"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"entity":{"type":["object","null"],"properties":{"entity_category":{"type":["string","null"]},"entity_status":{"type":"string","description":"Entity status as published: 'ACTIVE', 'INACTIVE', or the literal 'NULL' GLEIF publishes on some records. Served without comment - the fact, never a verdict"},"headquarters_address":{"type":"object","properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"]},"line":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"region":{"type":["string","null"]}},"required":["city","country","line","postal_code","region"]},"identifiers":{"type":"object","properties":{"bics":{"type":"array"},"bics_total":{"type":"integer"},"isins":{"type":"array","items":{"type":"string"}},"isins_total":{"type":"integer"}},"required":["bics","bics_total","isins","isins_total"],"description":"Market identifiers mapped by GLEIF: BICs and ISINs, each capped at 20 entries with an exact total. The BIC mapping publishes 11-character codes only, which is why an 8-character BIC from an IBAN still resolves"},"legal_address":{"type":"object","properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"]},"line":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"region":{"type":["string","null"]}},"required":["city","country","line","postal_code","region"]},"legal_form":{"type":["string","null"]},"legal_jurisdiction":{"type":["string","null"]},"legal_name":{"type":"string"},"lei":{"type":"string"},"other_names":{"type":"array"},"registration":{"type":"object","properties":{"initial_registration_date":{"type":["string","null"]},"last_update_date":{"type":["string","null"]},"managing_lou":{"type":["string","null"]},"next_renewal_date":{"type":["string","null"]},"status":{"type":["string","null"],"description":"LEI registration status as published: ISSUED, LAPSED, RETIRED, DUPLICATE, ANNULLED, PENDING_TRANSFER, PENDING_ARCHIVAL. A LAPSED registration (renewal not filed) is a due-diligence signal for the agent to weigh, not a judgement we make"}},"required":["initial_registration_date","last_update_date","managing_lou","next_renewal_date","status"]},"registration_authority":{"type":["object","null"],"properties":{"ra_code":{"type":"string"},"registration_number":{"type":"string"},"siren":{"type":"string"},"verified_against_sirene":{"type":"boolean"}},"required":["ra_code","registration_number"],"description":"National registering authority code and registration number EXACTLY as published (spaces included). For French entities registered with Sirene or the RCS, 'siren' is the normalized bridge value and 'verified_against_sirene' says whether that SIREN actually exists in the Sirene register: true, false (GLEIF declares a SIREN that does not exist - served with its flag, never corrected) or null (not checked)"}},"required":["entity_category","entity_status","headquarters_address","identifiers","legal_address","legal_form","legal_jurisdiction","legal_name","lei","other_names","registration","registration_authority"],"description":"The GLEIF Level 1 record, served as published: legal name, ELF legal-form code (no label - GLEIF publishes none), jurisdiction, statuses, legal and headquarters addresses, national registration authority and number, mapped BICs and ISINs. Null when the key is ambiguous - exactly one of 'entity' and 'matches' is filled"},"matches":{"type":"array","description":"Ambiguity is served, never resolved for you: when a key designates several entities (homonyms in a country, a BIC with several historical registrations, a SIREN with several LEIs), up to 10 short identities are returned here with 'entity' null and 'total_matches' exact"},"query":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"},"country":{"type":"string"}},"required":["key","value"]},"total_matches":{"type":"integer","description":"Exact number of entities the key designates (SQL count, not the length of the served slice). 1 with an 'entity' filled is the unambiguous case"}},"required":["entity","matches","query","total_matches"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"lei":{"type":"string","description":"Optional on its own - 20-character LEI (ISO 17442, check digits verified). Provide EXACTLY ONE key: 'lei', 'bic' (8 or 11 characters - both forms are looked up, so the BIC-8 of an IBAN resolves), 'isin' (12 characters, Luhn), 'siren' (9 digits, French bridge) or 'name' plus 'country' (ISO 3166-1 alpha-2, exact normalized equality - no fuzzy search). Zero or two keys is a 400; a failed check digit is a 400 INVALID_CHECKSUM; a well-formed key absent from the reference is a 404, unbilled"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-lei","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Identify a company worldwide (LEI)","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/company/ownership","description":"Find out who controls a counterparty before you onboard, pay or invoice it: the declared control chain from the official GLEIF Level 2 reference, by LEI - direct parent, ultimate parent, the dated chain between them, and direct subsidiaries. A declared absence of parent comes back with its official reason, never as an empty block. This is the accounting consolidation parent, not beneficial ownership.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"depth":"5","direction":"up","lei":"9695000AHZHGK28ZO963"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"depth":{"type":"string","description":"Optional. Chain depth, 1 to 5 (default 3). A HARD bound: out of range is a 400, never a silent trim - an agent that asks for 7 must know it was not served 7. When the walk stops on the bound, 'chain_truncated' says so, and the declared ultimate parent is still served"},"direction":{"type":"string","description":"Optional. 'up' (default) walks the parents, 'down' returns 'direct_children' - the entities declaring this LEI as their direct parent, capped at 100 with 'total_children' exact - and 'both' does both. Only DIRECT subsidiaries are served, there is no multi-level org chart. A block you did not ask for is null, which is distinct from [] meaning 'asked, nothing declared'"},"lei":{"type":"string","description":"20-character LEI (ISO 17442, check digits verified) of the entity to look up - required. Get it from /company/lei if you only hold a SIREN, a BIC or a name. A well-formed LEI absent from the reference is a 404, unbilled, with the same message as /company/lei"}},"required":["lei"]}},"output":{"type":"json","example":{"data":{"chain":[{"entity":{"entity_status":"ACTIVE","legal_country":"FR","legal_jurisdiction":"FR","legal_name":"ASSURECUREUIL PIERRE 4","lei":"969500B5IW6GWFPJ1347","registration_status":"ISSUED"},"lei":"969500B5IW6GWFPJ1347","period":{"start":"2002-12-24"},"relationship_status":"ACTIVE"},{"entity":{"legal_name":"CNP ASSURANCES"},"lei":"969500QKVPV2H8UXM738","period":{"start":"1994-10-14"},"relationship_status":"ACTIVE"},{"entity":{"legal_name":"CNP ASSURANCES HOLDING"},"lei":"9695008OXM90U326XP05","period":{"start":"2023-01-01"},"relationship_status":"ACTIVE"},{"entity":{"legal_name":"LA BANQUE POSTALE"},"lei":"96950066U5XAAIRCPA78","period":{"start":"2009-07-25"},"relationship_status":"ACTIVE"},{"entity":{"legal_name":"LA POSTE"},"lei":"9695000YG7TR7PAP0L59","period":{"start":"2005-12-31"},"relationship_status":"ACTIVE"}],"chain_truncated":true,"children_truncated":false,"cycle_detected":false,"direct_parent":{"link":{"entity":{"entity_status":"ACTIVE","legal_country":"FR","legal_jurisdiction":"FR","legal_name":"ASSURECUREUIL PIERRE 4","lei":"969500B5IW6GWFPJ1347","registration_status":"ISSUED"},"lei":"969500B5IW6GWFPJ1347","period":{"start":"2002-12-24"},"relationship_status":"ACTIVE"},"status":"declared"},"limits":"Relationships are self-declared by the entities to GLEIF and describe accounting consolidation (the parent that consolidates the entity in its financial statements). This is NOT beneficial ownership under AML/KYC rules, and Level 2 publishes no ownership percentage. The absence of a declared parent is not evidence of an absence of control.","query":{"depth":5,"direction":"up","lei":"9695000AHZHGK28ZO963"},"subject":{"entity_status":"ACTIVE","legal_country":"FR","legal_jurisdiction":"FR","legal_name":"LE MARQUIS","lei":"9695000AHZHGK28ZO963","registration_status":"ISSUED"},"ultimate_parent":{"link":{"entity":{"entity_status":"ACTIVE","legal_country":"FR","legal_jurisdiction":"FR","legal_name":"CAISSE DES DEPOTS ET CONSIGNATIONS","lei":"969500Q2PFTTP0Y5QL44","registration_status":"ISSUED"},"lei":"969500Q2PFTTP0Y5QL44","period":{"start":"2002-12-24"},"relationship_status":"ACTIVE"},"status":"declared"}},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"gleif"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"chain":{"type":["array","null"],"items":{"type":"object","properties":{"entity":{"type":["object","null"],"properties":{"entity_status":{"type":"string"},"legal_country":{"type":["string","null"]},"legal_jurisdiction":{"type":["string","null"]},"legal_name":{"type":"string"},"lei":{"type":"string"},"registration_status":{"type":["string","null"]}},"required":["entity_status","legal_country","legal_jurisdiction","legal_name","lei","registration_status"]},"lei":{"type":"string"},"period":{"type":"object","properties":{"start":{"type":["string","null"]},"end":{"type":["string","null"]}},"required":["start"]},"relationship_status":{"type":"string"}},"required":["entity","lei","period","relationship_status"]},"description":"Walk from direct parent to direct parent, capped by 'depth', each link dated with its relationship status as published (ACTIVE outranks a historical INACTIVE link - deterministic selection, never SQLite order). A link whose parent is absent from the Level 1 reference is served with entity null: the link is published even when the record is not. Null when direction='down'"},"chain_truncated":{"type":"boolean","description":"True when the walk stopped on the 'depth' bound while a parent still existed above. Combine with ultimate_parent to know the group head without raising depth"},"children_truncated":{"type":"boolean","description":"True when more than 100 direct subsidiaries were declared; 'total_children' stays exact. Both are null under direction='up', where 'direct_children' was not asked for"},"cycle_detected":{"type":"boolean","description":"True when an already-visited LEI cut the walk. Real data has no consolidation cycle, but nothing in the format forbids one - so it is detected and stated rather than looped over"},"direct_parent":{"type":"object","properties":{"link":{"type":["object","null"],"properties":{"entity":{"type":["object","null"],"properties":{"entity_status":{"type":"string"},"legal_country":{"type":["string","null"]},"legal_jurisdiction":{"type":["string","null"]},"legal_name":{"type":"string"},"lei":{"type":"string"},"registration_status":{"type":["string","null"]}},"required":["entity_status","legal_country","legal_jurisdiction","legal_name","lei","registration_status"]},"lei":{"type":"string"},"period":{"type":"object","properties":{"start":{"type":["string","null"]},"end":{"type":["string","null"]}},"required":["start"]},"relationship_status":{"type":"string"}},"required":["entity","lei","period","relationship_status"]},"status":{"type":"string"},"exception":{"type":["object","null"],"properties":{"category":{"type":"string"},"reasons":{"type":"array"}},"description":"Published reason why no parent is reported (GLEIF codes such as NATURAL_PERSONS, NON_CONSOLIDATING, NO_KNOWN_PERSON, NO_LEI), served when status is reporting_exception — null otherwise, exactly as link is null unless status is declared. The codes carry no label because the Golden Copy publishes none"}},"required":["link","status"],"description":"Declared direct accounting-consolidation parent. 'status' is one of: 'declared' (a 'link' is served), 'reporting_exception' (the entity officially declared why it reports no parent - an 'exception' with GLEIF reason codes such as NATURAL_PERSONS, NON_CONSOLIDATING, NO_KNOWN_PERSON, NO_LEI), or 'not_declared'. An absence of parent is a declaration, never an empty block"},"limits":{"type":"string","description":"Fixed sentence served inside every response: Level 2 describes accounting consolidation, it is NOT beneficial ownership under AML/KYC rules, no ownership percentage is published, and the absence of a declared parent is not evidence of an absence of control"},"query":{"type":"object","properties":{"depth":{"type":"integer"},"direction":{"type":"string"},"lei":{"type":"string"}},"required":["depth","direction","lei"]},"subject":{"type":"object","properties":{"entity_status":{"type":"string"},"legal_country":{"type":["string","null"]},"legal_jurisdiction":{"type":["string","null"]},"legal_name":{"type":"string"},"lei":{"type":"string"},"registration_status":{"type":["string","null"]}},"required":["entity_status","legal_country","legal_jurisdiction","legal_name","lei","registration_status"]},"ultimate_parent":{"type":"object","properties":{"link":{"type":["object","null"],"properties":{"entity":{"type":["object","null"],"properties":{"entity_status":{"type":"string"},"legal_country":{"type":["string","null"]},"legal_jurisdiction":{"type":["string","null"]},"legal_name":{"type":"string"},"lei":{"type":"string"},"registration_status":{"type":["string","null"]}},"required":["entity_status","legal_country","legal_jurisdiction","legal_name","lei","registration_status"]},"lei":{"type":"string"},"period":{"type":"object","properties":{"start":{"type":["string","null"]},"end":{"type":["string","null"]}},"required":["start"]},"relationship_status":{"type":"string"}},"required":["entity","lei","period","relationship_status"]},"status":{"type":"string"},"exception":{"type":["object","null"],"properties":{"category":{"type":"string"},"reasons":{"type":"array"}}}},"required":["link","status"],"description":"Declared ultimate consolidating parent, same shape as direct_parent. It is DECLARED by the entity, not inferred from the walk: it is served even when 'depth' truncated the chain. This is the accounting group head, NOT the beneficial owner"},"direct_children":{"type":["array","null"]},"total_children":{"type":["integer","null"]}},"required":["chain","chain_truncated","children_truncated","cycle_detected","direct_parent","limits","query","subject","ultimate_parent"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"depth":{"type":"string","description":"Optional. Chain depth, 1 to 5 (default 3). A HARD bound: out of range is a 400, never a silent trim - an agent that asks for 7 must know it was not served 7. When the walk stops on the bound, 'chain_truncated' says so, and the declared ultimate parent is still served"},"direction":{"type":"string","description":"Optional. 'up' (default) walks the parents, 'down' returns 'direct_children' - the entities declaring this LEI as their direct parent, capped at 100 with 'total_children' exact - and 'both' does both. Only DIRECT subsidiaries are served, there is no multi-level org chart. A block you did not ask for is null, which is distinct from [] meaning 'asked, nothing declared'"},"lei":{"type":"string","description":"20-character LEI (ISO 17442, check digits verified) of the entity to look up - required. Get it from /company/lei if you only hold a SIREN, a BIC or a name. A well-formed LEI absent from the reference is a 404, unbilled, with the same message as /company/lei"}},"required":["lei"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/company-ownership","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Find who controls a company","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/preflight/supplier","description":"Run every check on a supplier before you onboard, pay or invoice it, in one call: identity and status (INSEE Sirene or GLEIF), BODACC insolvency and deregistration announcements, live EU VAT validation (VIES), Peppol e-invoicing reachability, the declared control chain, and OFAC/EU/UN sanctions screening of both the company and its ultimate parent. Returns a verdict - stop, review, insufficient_coverage, ok - with every reason attached to its block and source.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"250000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"250000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"screen_parent":"true","siren":"316037753"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"screen_parent":{"type":"string","description":"Optional. Screen the ultimate parent against the sanctions lists too (default true). False makes that block 'not_requested', which does NOT block an 'ok': your explicit choice is not a coverage gap. WARNING: a sanctions hit on the ultimate parent is a 'stop', so false can turn a stop or a review into an 'ok'. When a parent IS declared, the response says so: verdict_reasons then carries a non-blocking 'parent_screening_skipped_by_caller' naming the parent left unscreened - an 'ok' with a non-empty verdict_reasons. Not knowing whether a parent exists is different - that is 'unavailable', and it does block 'ok'"},"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN (Luhn-checked). Give EXACTLY ONE entity key, 'siren' or 'lei' (20 characters); zero or two is a 400. Both keys pre-flight the same company: a 'lei' whose GLEIF record declares an existing SIREN reopens the French blocks (events, Peppol, derived VAT), stated in query.resolved_siren; a foreign entity gets them as 'not_applicable'. Optional: 'iban' adds the bank block, 'vat_number' replaces the derived one. A well-formed key unknown to the register is a 404, unbilled - no empty pre-flight is billed"}},"required":[]}},"output":{"type":"json","example":{"data":{"blocks":{"events":{"coverage":"complete","data":{"coverage":{"window":{"from":"2008-01-01","to":"2026-07-26"}},"events":[],"flags":{"has_open_insolvency_announcement":false,"is_deregistered":false},"siren":"316037753","total":0,"truncated":false},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-07-26T00:00:00Z","kind":"snapshot"},"source":"dila-bodacc"}},"group":{"coverage":"complete","data":{"legal_country":"FR","lei":"0XKTQGPTA3P542CII630","ultimate_parent":{"link":{"entity":{"legal_country":"US","legal_name":"INTERNATIONAL BUSINESS MACHINES CORPORATION"},"lei":"VGRQXHF3J8VDLUA7XE92","period":{"start":"1988-07-08"},"relationship_status":"ACTIVE"},"status":"declared"}},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"gleif"}},"identity":{"coverage":"complete","data":{"coverage":{"missing":[]},"headquarters":{"siret":"31603775300050","status":"active"},"legal_form":{"code":"5710"},"lei":{"lei":"0XKTQGPTA3P542CII630","registration_status":"ISSUED","verified_against_sirene":true},"name":"IBM FRANCE FINANCEMENT","siren":"316037753","status":"active"},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-06-30T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}},"name_screening":{"coverage":"complete","data":{"hits":[],"lists_screened":[{"entities":19157,"list":"OFAC-SDN"}],"query":{"name":"IBM FRANCE FINANCEMENT"},"total_matches":0,"truncated":false,"verdict":"no_hit"},"provenance":{"fetched_at":"2026-07-28T20:42:05Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"parent_screening":{"coverage":"complete","data":{"hits":[{"id":"OFAC-SDN:45091","list_source":"OFAC-SDN","listed_on":"2023-09-14","match_type":"partial_tokens","matched_name":"LIMITED LIABILITY COMPANY INTERNATIONAL BUSINESS CORPORATION"}],"query":{"name":"INTERNATIONAL BUSINESS MACHINES CORPORATION"},"total_matches":3,"truncated":false,"verdict":"weak_hit"},"provenance":{"fetched_at":"2026-07-28T20:42:05Z","freshness":{"as_of":"2026-07-28T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"peppol":{"coverage":"complete","data":{"coverage":{"directory_as_of":"2026-07-26"},"participants":[],"reachable":false},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-07-26T00:00:00Z","kind":"snapshot"},"source":"peppol-directory"}},"vat":{"coverage":"complete","data":{"checked_at":"2026-07-28T20:42:06Z","country":"FR","derived_from_siren":"316037753","status":"valid","syntax_valid":true,"vat_number":"FR60316037753"},"provenance":{"fetched_at":"2026-07-28T20:42:06Z","freshness":{"kind":"live"},"source":"vies + pure-computation"}}},"limits":"This verdict is a deterministic decision table over sourced, dated facts from public registers; it is not a credit opinion, a risk score or a recommendation to act. 'ok' only means that every requested check was answered and none of them raised a signal, on the data served (see each block's provenance and coverage). Parent screening covers the declared accounting consolidation parent, never the beneficial owner.","query":{"iban_submitted":false,"key":"siren","screen_parent":true,"value":"316037753"},"subject":{"lei":"0XKTQGPTA3P542CII630","name":"IBM FRANCE FINANCEMENT","siren":"316037753"},"verdict":"review","verdict_reasons":[{"block":"parent_screening","code":"parent_weak_sanctions_hit","detail":"partial_tokens","severity":"review"}]},"provenance":{"fetched_at":"2026-07-28T20:42:04Z","freshness":{"as_of":"2026-06-30T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"blocks":{"type":"object","properties":{"events":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"required":["window"]},"events":{"type":"array"},"flags":{"type":"object","properties":{"has_open_insolvency_announcement":{"type":"boolean"},"is_deregistered":{"type":"boolean"}},"required":["has_open_insolvency_announcement","is_deregistered"]},"siren":{"type":"string"},"total":{"type":"integer"},"truncated":{"type":"boolean"}},"required":["coverage","events","flags","siren","total","truncated"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"]},"group":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"legal_country":{"type":"string"},"lei":{"type":"string"},"ultimate_parent":{"type":"object","properties":{"link":{"type":"object","properties":{"entity":{"type":"object","properties":{"legal_country":{"type":"string"},"legal_name":{"type":"string"}},"required":["legal_country","legal_name"]},"lei":{"type":"string"},"period":{"type":"object","properties":{"start":{"type":"string"}},"required":["start"]},"relationship_status":{"type":"string"}},"required":["entity","lei","period","relationship_status"]},"status":{"type":"string"}},"required":["link","status"]}},"required":["legal_country","lei","ultimate_parent"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"],"description":"Declared control chain from GLEIF Level 2: the LEI retained, its direct and ultimate parent, and the same fixed limits sentence as /company/ownership. Accounting consolidation parent, NOT the beneficial owner, no percentage published. A French company with no LEI cannot have this block: the chain is unavailable and the verdict is 'insufficient_coverage' - a structural limit of the LEI reference, not an outage"},"identity":{"type":"object","properties":{"coverage":{"type":"string","description":"Closed enumeration, on every block: 'complete' (answered), 'unavailable' (not answered - missing dataset, internal service unreachable, member state down; degraded data may still be served, and this forbids 'ok'), 'not_applicable' (nothing to check: no French register for a foreign entity, no declared parent, no VAT number) or 'not_requested'. The last two are never confused with the first: an unverifiable VAT answer is a gap, an invalid one is a signal"},"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"missing":{"type":"array"}},"required":["missing"]},"headquarters":{"type":"object","properties":{"siret":{"type":"string"},"status":{"type":"string"}},"required":["siret","status"]},"legal_form":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]},"lei":{"type":"object","properties":{"lei":{"type":"string"},"registration_status":{"type":"string"},"verified_against_sirene":{"type":"boolean"}},"required":["lei","registration_status","verified_against_sirene"]},"name":{"type":"string"},"siren":{"type":"string"},"status":{"type":"string"}},"required":["coverage","headquarters","legal_form","lei","name","siren","status"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string","description":"Short stable reason why the block is not complete (bodacc_dataset_unavailable, timeout, no_parent_declared, group_unavailable...), on every block. A block that is not complete carries neither data nor provenance — the gap is stated, never filled"}},"required":["coverage"]},"name_screening":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"hits":{"type":"array"},"lists_screened":{"type":"array","items":{"type":"object","properties":{"entities":{"type":"integer"},"list":{"type":"string"}},"required":["entities","list"]}},"query":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"total_matches":{"type":"integer"},"truncated":{"type":"boolean"},"verdict":{"type":"string"}},"required":["hits","lists_screened","query","total_matches","truncated","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"]},"parent_screening":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"list_source":{"type":"string"},"listed_on":{"type":"string"},"match_type":{"type":"string"},"matched_name":{"type":"string"}},"required":["id","list_source","listed_on","match_type","matched_name"]}},"query":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"total_matches":{"type":"integer"},"truncated":{"type":"boolean"},"verdict":{"type":"string"}},"required":["hits","query","total_matches","truncated","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"],"description":"Sanctions screening of the ULTIMATE PARENT's name - the check an endpoint-by-endpoint review misses, and the reason this endpoint exists. A 'hit' is a stop; a 'weak_hit' (name-token overlap) is a review, never a stop. When the control chain is unknown the block is 'unavailable' with reason 'group_unavailable', never 'no parent'"},"peppol":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"directory_as_of":{"type":"string"}},"required":["directory_as_of"]},"participants":{"type":"array"},"reachable":{"type":"boolean"}},"required":["coverage","participants","reachable"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"]},"vat":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"checked_at":{"type":"string"},"country":{"type":"string"},"derived_from_siren":{"type":"string"},"status":{"type":"string"},"syntax_valid":{"type":"boolean"},"vat_number":{"type":"string"}},"required":["checked_at","country","derived_from_siren","status","syntax_valid","vat_number"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"]},"bank":{"type":"object"}},"required":["events","group","identity","name_screening","parent_screening","peppol","vat"],"description":"One block per check, each with its own provenance (the snapshots are dated differently, the VAT check is live) and its 'data' in the EXACT shape of the matching standalone endpoint, never flattened - the example is abridged, real blocks carry the full unit responses. The 'bank' block exists only when you pass an iban. A block whose data is served but whose question went unanswered (events with an undetermined insolvency flag) is 'unavailable' with a reason: a gap, never a stop"},"limits":{"type":"string","description":"Fixed sentence served inside every response: a deterministic decision table over sourced, dated public-register facts - not a credit opinion, not a risk score, not a recommendation to act"},"query":{"type":"object","properties":{"iban_submitted":{"type":"boolean"},"key":{"type":"string"},"screen_parent":{"type":"boolean"},"value":{"type":"string"},"resolved_siren":{"type":"string"}},"required":["iban_submitted","key","screen_parent","value"]},"subject":{"type":"object","properties":{"lei":{"type":["string","null"]},"name":{"type":["string","null"]},"siren":{"type":["string","null"]}},"required":["lei","name","siren"]},"verdict":{"type":"string","description":"Closed enumeration, the maximum severity found. 'stop': ceased or INACTIVE entity, published deregistration, open insolvency proceeding, sanctions hit on the company or its ultimate parent, bank-check stop. 'review': weak sanctions hit, firmly invalid VAT number, legal event in the last 365 days, FATF call-for-action jurisdiction, LAPSED LEI registration, bank-check review. 'insufficient_coverage': no signal, but a requested block went unanswered. 'ok' is IMPOSSIBLE while any block is 'unavailable' - a check that did not happen never passes"},"verdict_reasons":{"type":"array","items":{"type":"object","properties":{"block":{"type":"string"},"code":{"type":"string"},"detail":{"type":"string"},"severity":{"type":"string"}},"required":["block","code","severity"]},"description":"Every reason behind the verdict, most severe first, each carrying the block it came from, a stable code, its 'severity' (stop | review | gap | notice) and a detail when there is one. The verdict is the MAXIMUM severity served, so you reconstruct it from the reasons instead of taking it on trust. A 'notice' weighs nothing: 'parent_screening_skipped_by_caller' names a check YOU turned off (screen_parent=false). Read this before filtering: an 'ok' is NOT a promise that every requested check happened, only that none of them raised a reason to hold back"}},"required":["blocks","limits","query","subject","verdict","verdict_reasons"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"screen_parent":{"type":"string","description":"Optional. Screen the ultimate parent against the sanctions lists too (default true). False makes that block 'not_requested', which does NOT block an 'ok': your explicit choice is not a coverage gap. WARNING: a sanctions hit on the ultimate parent is a 'stop', so false can turn a stop or a review into an 'ok'. When a parent IS declared, the response says so: verdict_reasons then carries a non-blocking 'parent_screening_skipped_by_caller' naming the parent left unscreened - an 'ok' with a non-empty verdict_reasons. Not knowing whether a parent exists is different - that is 'unavailable', and it does block 'ok'"},"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN (Luhn-checked). Give EXACTLY ONE entity key, 'siren' or 'lei' (20 characters); zero or two is a 400. Both keys pre-flight the same company: a 'lei' whose GLEIF record declares an existing SIREN reopens the French blocks (events, Peppol, derived VAT), stated in query.resolved_siren; a foreign entity gets them as 'not_applicable'. Optional: 'iban' adds the bank block, 'vat_number' replaces the derived one. A well-formed key unknown to the register is a 404, unbilled - no empty pre-flight is billed"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/preflight-supplier","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Pre-flight a supplier before you pay it","tags":["company"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.25"}},{"resource":{"url":"https://api.invoket.com/certify/batch","description":"Clean a customer or supplier file before the French e-invoicing switchover: submit up to 200 lines with their SIREN or SIRET and get one sourced verdict per line - existence and administrative state in the INSEE Sirene register, insolvency and deregistration announcements in the BODACC gazette, and the name you hold compared to the one the register publishes. The batch carries a signed Merkle root, so the buyer of the file can verify any single line offline.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"70000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"70000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"profile":"e-invoicing-fr","subjects":[{"expected_name":"AIR LIQUIDE","ref":"row-42","siren":"552096281"},{"ref":"row-43","siret":"39503084400124"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"profile":{"type":"string","description":"Must be 'e-invoicing-fr' on this path. That profile answers the identity and events blocks only - offline, no VAT, no Peppol, no group, no sanctions screening - which is why 200 lines come back in one synchronous response. The profile is echoed in the signed certificate: a batch can never claim a check it did not run. The full eight-block supplier profile is a different path and a different price"},"subjects":{"type":"array","items":{"type":"object","properties":{"expected_name":{"type":"string","description":"Optional. The company name you hold for this line, compared to the one the register publishes. A mismatch makes the line 'review' with reason 'expected_name_mismatch' - this is the typical e-invoicing failure: one transposed digit gives a valid SIREN belonging to somebody else. When the register publishes no name at all, the check reports 'not_checkable' and weighs nothing: 'not comparable' is not 'does not match'"},"ref":{"type":"string","description":"Your own reference for this line (row number, customer id) - required, and CERTIFIED: it is what ties the proof back to your file. It is copied verbatim into the hashed scope, so two lines of the same batch are never interchangeable"},"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN of the legal unit. Give EXACTLY ONE key per line, 'siren' or 'siret' (14 digits); a SIRET is resolved to its legal unit. A malformed key (bad shape or failed Luhn checksum) rejects the WHOLE batch with a 400 listing every offending line by index and ref - nothing is billed, and half a certified file would be worse than none. A well-formed key simply absent from the register is the opposite: a served, billed line with issue 'unresolved'"},"siret":{"type":"string"}},"required":["ref"]},"description":"The lines of your file, up to 200 per call, and the array the price is counted on (base + N x unit) - N is the number of lines SUBMITTED, not the number found in the register: 'this SIREN is not in the register' is exactly the answer you are buying here. An empty array or more than 200 lines is a 400. Order matters and is preserved: a line's rank indexes its leaf in the Merkle tree, hence its inclusion proof"}},"required":["profile","subjects"]}},"output":{"type":"json","example":{"data":{"certificate":{"alg":"Ed25519","certificate_version":1,"issued_at":"2026-08-13T21:43:42.003755674Z","key_id":"invoket-2026-08","payload_hash":"sha256:LM-accTSUNwGOT80qthevPbS71Osdn3ZiyJAoGYQJkU","profile":"e-invoicing-fr","signature":"DbvPMPWFc8CLiUhrmuDHu-A64iSYZlHbd81nC5OALv_P5tbodKEf1SKJmiJAHP2p_EG6Gzdiend_KxY3stOeAA","subject_count":1},"limits":"This certifies, for each subject, its existence, its administrative state and its published legal events in the French Sirene and BODACC registers, as of the dates carried by each record's provenance - and nothing else. It does NOT certify that an email address is deliverable, that the subject is registered in the French e-invoicing directory (AIFE) or reachable there, nor that a company name resolves to a SIREN: a line without an exact, well-formed key is returned 'unresolved', never guessed. The 'e-invoicing-fr' profile answers the identity and events blocks only - VAT, Peppol, group and sanctions screening are not part of it, so a verdict of 'ok' is an 'ok' on those two blocks. Each record's timeline is capped at the 10 most recent notices ('total' and 'truncated' say so; the flags are derived from the full history, so no verdict depends on the cap). A verdict is a deterministic decision table over sourced, dated facts; it is not a credit opinion, a risk score or a recommendation to act.","profile":"e-invoicing-fr","proofs":{"available_until":"2026-08-14T21:43:42.003755674Z","batch_id":"batch_AaFqoqU2kU6v58C8o6DJ6g","retention":"This index keeps only the record digests and the batch root - never the records themselves. It lives in memory: a restart of the service, or a burst of batches, can drop it before 'available_until'. It is a convenience, never a source of truth: every record of this response carries its 'fingerprint', so any inclusion path can be recomputed offline, without us."},"records":[{"data":{"blocks":{"events":{"coverage":"complete","data":{"coverage":{"window":{"from":"2008-01-01","to":"2026-08-09"}},"events":[{"court":"GREFFE DU TRIBUNAL DE COMMERCE DE NANTERRE","effective_on":"2017-11-01","family":"sale","gazette_issue":"20170248","nature":"Achat d'un fonds par une personne morale (insertion provisoire)","notice_number":1358,"published_on":"2017-12-27","text":"- Acte SSP en date du 24/10/2017 enregistré au service de la publicité foncière et de l'enregistrement de Nanterre 3 le 17/11/2017…"}],"flags":{"has_open_insolvency_announcement":false,"is_deregistered":false,"latest_event":{"date":"2017-11-01","family":"sale"}},"siren":"552096281","total":3,"truncated":false},"provenance":{"fetched_at":"2026-08-13T21:43:42.003755674Z","freshness":{"as_of":"2026-08-09T00:00:00Z","kind":"snapshot"},"source":"dila-bodacc"}},"identity":{"coverage":"complete","data":{"coverage":{"missing":[]},"created_on":"1955-01-01","diffusion_status":"full","headquarters":{"address":{"city":"PARIS","line":"75 QUAI D'ORSAY","postal_code":"75007"},"siret":"55209628100019","status":"active"},"legal_form":{"code":"5599","label":"SA à conseil d'administration (s.a.i.)"},"main_activity":{"code":"78.30Z","nomenclature":"NAFRev2"},"name":"L'AIR LIQUIDE SOCIETE ANONYME POUR L'ETUDE ET L'EXPLOITATION DES PROCEDES GEORGES CLAUDE","siren":"552096281","status":"active"},"provenance":{"fetched_at":"2026-08-13T21:43:42.003755674Z","freshness":{"as_of":"2026-07-31T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}}},"subject":{"expected_name":"AIR LIQUIDE","expected_name_check":"mismatch","index":0,"key":"siren","name":"L'AIR LIQUIDE SOCIETE ANONYME POUR L'ETUDE ET L'EXPLOITATION DES PROCEDES GEORGES CLAUDE","ref":"row-42","siren":"552096281","value":"552096281"},"verdict":"review","verdict_reasons":[{"block":"identity","code":"expected_name_mismatch","detail":"the register publishes \"L'AIR LIQUIDE SOCIETE ANONYME POUR L'ETUDE ET L'EXPLOITATION DES PROCEDES GEORGES CLAUDE\"","severity":"review"}]},"fingerprint":"sha256:LM-accTSUNwGOT80qthevPbS71Osdn3ZiyJAoGYQJkU","issue":"certified","provenance":{"fetched_at":"2026-08-13T21:43:42.003755674Z","freshness":{"as_of":"2026-07-31T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}}],"summary":{"by_issue":{"certified":1,"unresolved":0},"by_notice":{},"by_reason":{"expected_name_mismatch":1},"by_verdict":{"insufficient_coverage":0,"ok":0,"review":1,"stop":0},"subjects":1}},"provenance":{"fetched_at":"2026-08-13T21:43:42.003755674Z","freshness":{"as_of":"2026-07-31T00:00:00Z","kind":"snapshot"},"source":"insee-sirene"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"certificate":{"type":"object","properties":{"alg":{"type":"string"},"certificate_version":{"type":"integer"},"issued_at":{"type":"string"},"key_id":{"type":"string"},"payload_hash":{"type":"string"},"profile":{"type":"string"},"signature":{"type":"string"},"subject_count":{"type":"integer"}},"required":["alg","certificate_version","issued_at","key_id","payload_hash","profile","signature","subject_count"],"description":"What makes the verdict transferable. 'payload_hash' is the Merkle root of the record fingerprints, computed by the service (JCS RFC 8785 canonicalization, SHA-256, domain-separated tree); 'alg', 'key_id' and 'signature' are written by the gateway with a key the service never holds. The signature never covers the field carrying it. Verify with the public key published at /.well-known/certificate-keys - the hashed scope of each record is exactly {subject, verdict, verdict_reasons, blocks, provenance}"},"limits":{"type":"string","description":"Fixed sentence served inside every batch, and it comes first on purpose: this certifies existence, administrative state and published legal events in the Sirene and BODACC registers at the dates each record carries - and nothing else. It does NOT certify that an email is deliverable, that the subject is registered in or reachable through the French e-invoicing directory (AIFE), nor that a company name resolves to a SIREN"},"profile":{"type":"string"},"proofs":{"type":"object","properties":{"available_until":{"type":"string"},"batch_id":{"type":"string"},"retention":{"type":"string"}},"required":["available_until","batch_id","retention"],"description":"Handle to ask later for the inclusion path of one line, and the expiry of that convenience. It is a commodity, never a source of truth: every fingerprint is already in this response, so any path can be recomputed offline. The handle is 16 bytes of OS entropy and is NOT part of the certificate - a proof verifies against the signed root, not against a URL"},"records":{"type":"array","items":{"type":"object","properties":{"data":{"type":"object","properties":{"blocks":{"type":"object","properties":{"events":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"window":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"required":["window"]},"events":{"type":"array","items":{"type":"object","properties":{"court":{"type":"string"},"effective_on":{"type":["string","null"]},"family":{"type":"string"},"gazette_issue":{"type":"string"},"nature":{"type":"string"},"notice_number":{"type":"integer"},"published_on":{"type":"string"},"text":{"type":["string","null"]}},"required":["court","effective_on","family","gazette_issue","nature","notice_number","published_on","text"]},"description":"The BODACC timeline of this line, capped at the 10 most recent notices ('total' and 'truncated' say so). The flags - and therefore the verdict - are derived from the COMPLETE history, so no verdict depends on the cap. The standalone /company/events serves up to 100"},"flags":{"type":"object","properties":{"has_open_insolvency_announcement":{"type":"boolean"},"is_deregistered":{"type":"boolean"},"latest_event":{"type":"object","properties":{"date":{"type":"string"},"family":{"type":"string"}},"required":["date","family"]}},"required":["has_open_insolvency_announcement","is_deregistered","latest_event"]},"siren":{"type":"string"},"total":{"type":"integer"},"truncated":{"type":"boolean"}},"required":["coverage","events","flags","siren","total","truncated"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"]},"identity":{"type":"object","properties":{"coverage":{"type":"string"},"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"missing":{"type":"array"}},"required":["missing"]},"created_on":{"type":"string"},"diffusion_status":{"type":"string"},"headquarters":{"type":"object","properties":{"address":{"type":"object","properties":{"city":{"type":"string"},"line":{"type":"string"},"postal_code":{"type":"string"}},"required":["city","line","postal_code"]},"siret":{"type":"string"},"status":{"type":"string"}},"required":["address","siret","status"]},"legal_form":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"}},"required":["code","label"]},"main_activity":{"type":"object","properties":{"code":{"type":"string"},"nomenclature":{"type":"string"}},"required":["code","nomenclature"]},"name":{"type":"string"},"siren":{"type":"string"},"status":{"type":"string"}},"required":["coverage","created_on","diffusion_status","headquarters","legal_form","main_activity","name","siren","status"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]},"reason":{"type":"string"}},"required":["coverage"]}},"required":["events","identity"],"description":"The blocks this profile answers, each with its own provenance and coverage, and each in the EXACT shape of the matching standalone endpoint (/company/resolve, /company/events) - never flattened, so extracting a line needs no transformation. The example is abridged; real blocks carry the full unit responses. A block out of profile is not served empty, it is not served at all: the signed 'profile' says which ones were run"},"subject":{"type":"object","properties":{"expected_name":{"type":"string"},"expected_name_check":{"type":"string"},"index":{"type":"integer"},"key":{"type":"string"},"name":{"type":["string","null"]},"ref":{"type":"string"},"siren":{"type":["string","null"]},"value":{"type":"string"}},"required":["index","key","name","ref","siren","value"]},"verdict":{"type":["string","null"],"description":"Same closed enumeration and same decision table as /preflight/supplier, applied to the two blocks this profile answers. 'stop': ceased unit, published deregistration, open insolvency proceeding. 'review': a legal event in the last 365 days, or a name that does not match the register. 'insufficient_coverage': no signal, but a block went unanswered. 'ok' is impossible while any block is 'unavailable'. Null on an 'unresolved' line"},"verdict_reasons":{"type":"array","items":{"type":"object","properties":{"block":{"type":"string"},"code":{"type":"string"},"detail":{"type":"string"},"severity":{"type":"string"}},"required":["block","code","severity"]}}},"required":["blocks","subject","verdict","verdict_reasons"]},"fingerprint":{"type":"string","description":"SHA-256 of this record's hashed scope, served so you can recompute the root - and any inclusion path - offline. It is the leaf of the tree; its position is the line's rank in your request"},"issue":{"type":"string","description":"'certified' (the key exists in the Sirene register and was judged) or 'unresolved' (well-formed key, absent from the dated stock). 'unresolved' is a served, billed answer with verdict null and blocks reduced to {coverage, reason} - never a guessed match, and never a default verdict: running the decision table over empty blocks would return 'ok' on a company that does not exist"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","fingerprint","issue","provenance"]},"description":"One record per submitted line, in the order of the request. A record IS a response - {data, provenance} plus its fingerprint - so the buyer of your file extracts one line, attaches the batch certificate to it and verifies it offline, without receiving the other 199 and without calling us"},"summary":{"type":"object","properties":{"by_issue":{"type":"object","properties":{"certified":{"type":"integer"},"unresolved":{"type":"integer"}},"required":["certified","unresolved"]},"by_notice":{"type":"object","properties":{},"required":[]},"by_reason":{"type":"object","properties":{"expected_name_mismatch":{"type":"integer"}},"required":["expected_name_mismatch"]},"by_verdict":{"type":"object","properties":{"insufficient_coverage":{"type":"integer"},"ok":{"type":"integer"},"review":{"type":"integer"},"stop":{"type":"integer"}},"required":["insufficient_coverage","ok","review","stop"]},"subjects":{"type":"integer"}},"required":["by_issue","by_notice","by_reason","by_verdict","subjects"],"description":"Counts, never a file score: by issue, by verdict (all four keys served, at zero if need be), by reason and by notice - the last two are what tell you what to fix in your file. They are SEPARATE on purpose: 'by_reason' counts what weighed on a verdict, 'by_notice' counts mentions that changed nothing (a check that could not happen, e.g. a register that publishes no legal name for a partially-disclosed sole trader). Read '3 problems, 1 mention', never '4 reasons'. Both are served even empty. No average, no grade, no recommendation to act"}},"required":["certificate","limits","profile","records","summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"profile":{"type":"string","description":"Must be 'e-invoicing-fr' on this path. That profile answers the identity and events blocks only - offline, no VAT, no Peppol, no group, no sanctions screening - which is why 200 lines come back in one synchronous response. The profile is echoed in the signed certificate: a batch can never claim a check it did not run. The full eight-block supplier profile is a different path and a different price"},"subjects":{"type":"array","items":{"type":"object","properties":{"expected_name":{"type":"string","description":"Optional. The company name you hold for this line, compared to the one the register publishes. A mismatch makes the line 'review' with reason 'expected_name_mismatch' - this is the typical e-invoicing failure: one transposed digit gives a valid SIREN belonging to somebody else. When the register publishes no name at all, the check reports 'not_checkable' and weighs nothing: 'not comparable' is not 'does not match'"},"ref":{"type":"string","description":"Your own reference for this line (row number, customer id) - required, and CERTIFIED: it is what ties the proof back to your file. It is copied verbatim into the hashed scope, so two lines of the same batch are never interchangeable"},"siren":{"type":"string","description":"Optional on its own - 9-digit SIREN of the legal unit. Give EXACTLY ONE key per line, 'siren' or 'siret' (14 digits); a SIRET is resolved to its legal unit. A malformed key (bad shape or failed Luhn checksum) rejects the WHOLE batch with a 400 listing every offending line by index and ref - nothing is billed, and half a certified file would be worse than none. A well-formed key simply absent from the register is the opposite: a served, billed line with issue 'unresolved'"},"siret":{"type":"string"}},"required":["ref"]},"description":"The lines of your file, up to 200 per call, and the array the price is counted on (base + N x unit) - N is the number of lines SUBMITTED, not the number found in the register: 'this SIREN is not in the register' is exactly the answer you are buying here. An empty array or more than 200 lines is a 400. Order matters and is preserved: a line's rank indexes its leaf in the Merkle tree, hence its inclusion proof"}},"required":["profile","subjects"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/certify-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Certify a file of French counterparties","tags":["company"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.05","unitUsd":"0.02","minUsd":"0.07","maxUnits":200,"unitField":"subjects"}}},{"resource":{"url":"https://api.invoket.com/certify/screening","description":"Screen a file of counterparties against sanctions lists and keep the proof: up to 200 names or crypto addresses in one call, each compared to the OFAC, EU and UN lists with the publication date of every list served. The batch carries a signed Merkle root, so whoever receives your file verifies a single line offline - what was screened, against which lists, on which dates.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"70000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"70000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"include_weak":false,"profile":"sanctions-screening","subjects":[{"country":"DE","kind":"entity","name":"Europäisch-Iranische Handelsbank","ref":"invoice-2211"},{"address":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A","ref":"invoice-2212"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"include_weak":{"type":"boolean","description":"Optional policy of the WHOLE batch (default false): whether weak matches - token overlap without an exact match - are returned as 'weak_hit'. It is attested per line, because it is part of what was actually run"},"profile":{"type":"string","description":"Must be 'sanctions-screening' on this path: one profile, one path, so the body can only confirm the path, never change it. The profile is echoed inside the signed certificate - a batch can never claim a check it did not run"},"subjects":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","description":"Optional country filter of a name (ISO 3166-1 alpha-2), same rules as GET /screen/entity, and attested with the other filters"},"kind":{"type":"string","description":"Optional qualifier of a name (individual, entity, vessel, aircraft), same values and same validation as GET /screen/entity. It is part of what is attested: the same name screened under two different filters does not produce the same fingerprint"},"name":{"type":"string","description":"Optional on its own - the name to screen, when the line is not an address. Give EXACTLY ONE key per line, 'name' or 'address'. Unknown or misspelled fields are refused rather than ignored: on a certified batch, a silently dropped 'adress:' would become a billed line instead of a correctable typo. A malformed key rejects the WHOLE batch with a 400 naming every offending line by index and ref - nothing is billed, and a half-certified file would be worse than none"},"ref":{"type":"string","description":"Your own reference for this line (invoice number, row id), 128 characters at most - required, and CERTIFIED: it is what ties the proof back to your file. Together with the rank it makes two lines of the same batch non-interchangeable"},"address":{"type":"string"},"birth_year":{"type":"integer"},"chain":{"type":"string"}},"required":["ref"]},"description":"The lines of your file, 1 to 200 per call, names and crypto addresses freely mixed, and the array the price is counted on (base + N x unit) - N is the number of lines SUBMITTED, not the number found on a list: 'no list publishes this address' is exactly the answer you are buying. Order matters and is preserved: a line's rank indexes its leaf in the Merkle tree, hence its inclusion proof. An empty array or more than 200 lines is a 400"}},"required":["profile","subjects"]}},"output":{"type":"json","example":{"data":{"certificate":{"alg":"Ed25519","certificate_version":1,"issued_at":"2026-08-17T19:03:54.617740535Z","key_id":"invoket-2026-08","payload_hash":"sha256:gROnF2BDxwhrsF19rfMeGZ6_vw7Cb-rNF3m9XagVVoA","profile":"sanctions-screening","signature":"2J5dIfccNcvlczDLL9wbtgqUaD-iGvmpCVdDBEOlJdhoo1A1YLLrkjYgbmlpo1meA3Pc63sTjMA4iBftr-lwBg","subject_count":2},"limits":"This certifies, for each subject, the verdict returned by screening it against the designation lists named in the record, each carrying its own snapshot date, on the date of issue. A 'no_hit' or 'not_listed' verdict is NOT a certificate of non-membership: it is a dated statement that these lists, as published on those dates, contained no match under the matching rules described in the record. Homonymy is not resolved - a match is a name or an address that corresponds, never an identification of a person or of a wallet owner. Coverage is limited to the ingested lists (OFAC SDN, OFAC Consolidated, EU FSF, UN consolidated): national lists that are not ingested, politically exposed persons (PEP) and adverse media are not covered, and cryptocurrency addresses are matched only as the lists themselves publish them - no transaction analysis, no clustering, no derived addresses. No score, no rating and no recommendation to act is expressed or implied.","profile":"sanctions-screening","records":[{"data":{"blocks":{"lists_screened":[{"as_of":"2026-08-05","entities":6234,"list":"EU-FSF"},{"as_of":"2026-07-27","entities":481,"list":"OFAC-CONS"},{"as_of":"2026-08-07","entities":19199,"list":"OFAC-SDN"},{"as_of":"2026-08-15","entities":1011,"list":"UN"}],"screening":{"hits":[{"birth_dates":[],"id":"OFAC-SDN:25684","kind":"entity","list_source":"OFAC-SDN","listed_on":"2018-11-05","match_type":"exact","matched_name":"EUROPAISCH-IRANISCHE HANDELSBANK AG","nationalities":[],"programs":["IFSR","IRAN","NPWMD"]},{"birth_dates":[],"id":"EU:EU.13742.32","kind":"entity","list_source":"EU-FSF","listed_on":"2025-09-29","match_type":"exact_alias","matched_name":"Europäisch-Iranische Handelsbank","nationalities":[],"programs":["IRN"]}],"query":{"name":"Europäisch-Iranische Handelsbank","normalized":"europaisch iranische handelsbank"},"total_matches":2,"truncated":false,"verdict":"hit","verdict_basis":["exact","exact_alias"]}},"subject":{"filters":{"country":"DE","include_weak":false,"kind":"entity"},"index":0,"key":"name","ref":"invoice-2211","value":"Europäisch-Iranische Handelsbank"},"verdict":"hit","verdict_reasons":[{"code":"name_match_exact"},{"code":"name_match_exact_alias"}]},"fingerprint":"sha256:WOc78Pz2t8iceKh5Zhw6veGvPZYWSHkUjyK07ziuBX4","issue":"certified","provenance":{"fetched_at":"2026-08-17T19:03:54.617740535Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},{"data":{"blocks":{"lists_screened":[{"addresses":7,"as_of":"2026-08-05","list":"EU-FSF"},{"addresses":0,"as_of":"2026-07-27","list":"OFAC-CONS"},{"addresses":975,"as_of":"2026-08-07","list":"OFAC-SDN"},{"addresses":0,"as_of":"2026-08-15","list":"UN"}],"screening":{"hits":[{"address_published":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A","chain":"ETH","entity_id":"OFAC-SDN:57056","entity_name":"AMNOKGANG TECHNOLOGY DEVELOPMENT COMPANY","list_source":"OFAC-SDN","listed_on":"2026-03-12","programs":["DPRK4"]}],"query":{"address":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A","address_normalized":"0x0330070fd38ec3bb94f58fa55d40368271e9e54a","chain_family":"evm","chain_family_source":"inferred"},"verdict":"sanctioned"}},"subject":{"index":1,"key":"address","ref":"invoice-2212","value":"0x0330070FD38Ec3bB94F58FA55D40368271E9e54A"},"verdict":"sanctioned","verdict_reasons":[{"code":"address_designated","detail":"OFAC-SDN"}]},"fingerprint":"sha256:a_uc7N23hxgPxpMXYrfuXX3F-jbR55iHKlcOK8VWwRw","issue":"certified","provenance":{"fetched_at":"2026-08-17T19:03:54.617740535Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}}],"summary":{"by_issue":{"certified":2,"unresolved":0},"by_verdict":{"hit":1,"no_hit":0,"not_listed":0,"sanctioned":1,"weak_hit":0},"subjects":2}},"provenance":{"fetched_at":"2026-08-17T19:03:54.617740535Z","freshness":{"as_of":"2026-07-27T00:00:00Z","kind":"snapshot"},"source":"ofac-sdn+ofac-consolidated+eu-fsf+un-sc"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"certificate":{"type":"object","properties":{"alg":{"type":"string"},"certificate_version":{"type":"integer"},"issued_at":{"type":"string"},"key_id":{"type":"string"},"payload_hash":{"type":"string"},"profile":{"type":"string"},"signature":{"type":"string"},"subject_count":{"type":"integer"}},"required":["alg","certificate_version","issued_at","key_id","payload_hash","profile","signature","subject_count"],"description":"What makes the screening transferable. 'payload_hash' is the Merkle root of the record fingerprints, computed by the service (JCS RFC 8785 canonicalization, SHA-256, domain-separated tree); 'alg', 'key_id' and 'signature' are written by the gateway with a key the service never holds - it signs nothing. The signature never covers the field carrying it. Verify with the public key published at /.well-known/certificate-keys; the hashed scope of each record is exactly {subject, verdict, verdict_reasons, blocks} plus its provenance"},"limits":{"type":"string","description":"Fixed sentence served inside every batch: a 'no_hit' or 'not_listed' is NOT a certificate of non-membership but a dated statement about the lists named in each record, homonymy is not resolved, ingested lists only (no PEP, no adverse media), and crypto addresses are matched only as the lists publish them - no transaction analysis, no clustering, no derived addresses"},"profile":{"type":"string"},"records":{"type":"array","items":{"type":"object","properties":{"data":{"type":"object","properties":{"blocks":{"type":"object","properties":{"lists_screened":{"type":"array","items":{"type":"object","properties":{"as_of":{"type":"string"},"entities":{"type":"integer"},"list":{"type":"string"},"addresses":{"type":"integer"}},"required":["as_of","list"]},"description":"The lists actually confronted, their volume AND their publication date. This is the reason the piece exists: the regulatory question is not 'is it listed?' but 'what did you compare, and when?'. A store whose manifest carries no date per list certifies nothing at all - a 503 naming the refresh script, never a fallback date"},"screening":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"birth_dates":{"type":"array"},"id":{"type":"string"},"kind":{"type":"string"},"list_source":{"type":"string"},"listed_on":{"type":"string"},"match_type":{"type":"string"},"matched_name":{"type":"string"},"nationalities":{"type":"array"},"programs":{"type":"array","items":{"type":"string"}},"address_published":{"type":"string"},"chain":{"type":"string"},"entity_id":{"type":"string"},"entity_name":{"type":"string"},"identifications":{"type":"array"},"remarks":{"type":["string","null"]}},"required":["list_source","listed_on","programs"]}},"query":{"type":"object","properties":{"name":{"type":"string"},"normalized":{"type":"string"},"address":{"type":"string"},"address_normalized":{"type":"string"},"chain_family":{"type":"string"},"chain_family_source":{"type":"string"}},"required":[]},"total_matches":{"type":"integer"},"truncated":{"type":"boolean"},"verdict":{"type":"string"},"verdict_basis":{"type":"array","items":{"type":"string"}}},"required":["hits","query","verdict"]}},"required":["lists_screened","screening"],"description":"What was screened and against what, in the EXACT shape of the matching standalone endpoint (/screen/entity, /screen/address) - never flattened, so extracting a line needs no transformation"},"subject":{"type":"object","properties":{"filters":{"type":"object","properties":{"country":{"type":"string"},"include_weak":{"type":"boolean"},"kind":{"type":"string"}},"required":["country","include_weak","kind"]},"index":{"type":"integer"},"key":{"type":"string"},"ref":{"type":"string"},"value":{"type":"string"}},"required":["index","key","ref","value"]},"verdict":{"type":["string","null"],"description":"Closed enumeration, and it depends on the key: 'hit', 'weak_hit' or 'no_hit' for a name; 'sanctioned' or 'not_listed' for an address. Null - and only - on an 'unresolved' line, where the field stays present: a field of the hashed scope that disappears is an error, not a shorter scope"},"verdict_reasons":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"detail":{"type":"string"}},"required":["code"]}}},"required":["blocks","subject","verdict","verdict_reasons"]},"fingerprint":{"type":"string","description":"SHA-256 of this record's hashed scope, served so you can recompute the root - and any inclusion path - offline. It is the leaf of the tree; its position is the line's rank in your request"},"issue":{"type":"string","description":"'certified' (a verdict was rendered) or 'unresolved' (a well-formed key with nothing to compare - a generic form no list publishes). 'unresolved' is a served, billed answer with verdict null: it is the answer, not an error. 'rejected' never appears here; it lives in the 400"},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","fingerprint","issue","provenance"]},"description":"One record per submitted line, in the order of the request. A record IS a response - {data, provenance} plus its fingerprint - so the recipient of your file extracts one line, attaches the batch certificate to it and verifies it offline, without receiving the other 199 and without calling us"},"summary":{"type":"object","properties":{"by_issue":{"type":"object","properties":{"certified":{"type":"integer"},"unresolved":{"type":"integer"}},"required":["certified","unresolved"]},"by_verdict":{"type":"object","properties":{"hit":{"type":"integer"},"no_hit":{"type":"integer"},"not_listed":{"type":"integer"},"sanctioned":{"type":"integer"},"weak_hit":{"type":"integer"}},"required":["hit","no_hit","not_listed","sanctioned","weak_hit"]},"subjects":{"type":"integer"}},"required":["by_issue","by_verdict","subjects"],"description":"Counts, never a file score: by issue and by verdict, all keys served even at zero. No average, no grade, no recommendation to act"}},"required":["certificate","limits","profile","records","summary"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"include_weak":{"type":"boolean","description":"Optional policy of the WHOLE batch (default false): whether weak matches - token overlap without an exact match - are returned as 'weak_hit'. It is attested per line, because it is part of what was actually run"},"profile":{"type":"string","description":"Must be 'sanctions-screening' on this path: one profile, one path, so the body can only confirm the path, never change it. The profile is echoed inside the signed certificate - a batch can never claim a check it did not run"},"subjects":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","description":"Optional country filter of a name (ISO 3166-1 alpha-2), same rules as GET /screen/entity, and attested with the other filters"},"kind":{"type":"string","description":"Optional qualifier of a name (individual, entity, vessel, aircraft), same values and same validation as GET /screen/entity. It is part of what is attested: the same name screened under two different filters does not produce the same fingerprint"},"name":{"type":"string","description":"Optional on its own - the name to screen, when the line is not an address. Give EXACTLY ONE key per line, 'name' or 'address'. Unknown or misspelled fields are refused rather than ignored: on a certified batch, a silently dropped 'adress:' would become a billed line instead of a correctable typo. A malformed key rejects the WHOLE batch with a 400 naming every offending line by index and ref - nothing is billed, and a half-certified file would be worse than none"},"ref":{"type":"string","description":"Your own reference for this line (invoice number, row id), 128 characters at most - required, and CERTIFIED: it is what ties the proof back to your file. Together with the rank it makes two lines of the same batch non-interchangeable"},"address":{"type":"string"},"birth_year":{"type":"integer"},"chain":{"type":"string"}},"required":["ref"]},"description":"The lines of your file, 1 to 200 per call, names and crypto addresses freely mixed, and the array the price is counted on (base + N x unit) - N is the number of lines SUBMITTED, not the number found on a list: 'no list publishes this address' is exactly the answer you are buying. Order matters and is preserved: a line's rank indexes its leaf in the Merkle tree, hence its inclusion proof. An empty array or more than 200 lines is a 400"}},"required":["profile","subjects"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/certify-screening","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Certify a sanctions screening of a file","tags":["sanctions","crypto"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.05","unitUsd":"0.02","minUsd":"0.07","maxUnits":200,"unitField":"subjects"}}},{"resource":{"url":"https://api.invoket.com/medication/resolve","description":"Resolve a medication before your agent acts on a prescription or an order: official identity from the French BDPM registry (ANSM/HAS) by CIS code, exact name or DCI substance - authorization and marketing status, active substances normalized to INN (the FR-US bridge), pack-level price and reimbursement rate, generic group. Same endpoint resolves US drugs by NDC or name (openFDA/RxNorm). No account, no key, pay per call.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"cis":"60424338"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code. Provide exactly ONE key among: cis, ndc (US product NDC), dci (substance INN/DCI name, pure local computation), name (exact medication name, requires country=FR|US). Zero or several keys = 400; malformed key = 400; well-formed but unknown = 200 with found:false (billed - the absence is the answer)"}},"required":[]}},"output":{"type":"json","example":{"data":{"found":true,"medications":[{"authorization_date":"1998-12-10","country":"FR","dispensing":["liste I"],"enhanced_surveillance":false,"form":"gélule","generic_groups":[{"id":148,"label":"AMOXICILLINE 500 mg - CLAMOXYL 500 mg, gélule"}],"holder":"VIATRIS SANTE","identifiers":{"cis":"60424338"},"marketing_status":"Commercialisée","name":"AMOXICILLINE VIATRIS 500 mg, gélule","presentations":[{"cip13":"3400934913174","cip7":"3491317","collectivities_approved":true,"declared_at":"2014-07-04","dispensing_fee_cents":102,"label":"plaquette(s) thermoformée(s) PVC-aluminium PVDC de 12 gélule(s)","marketing":"Déclaration de commercialisation","price_cents":153,"price_with_dispensing_fee_cents":255,"reimbursement_rate":"65%"}],"routes":["orale"],"status":"Autorisation active","substances":[{"id":"amoxicillin","labels_en":["amoxicillin"],"labels_fr":["amoxicilline","amoxicilline trihydratée"],"mapped":true,"raw_label":"AMOXICILLINE TRIHYDRATÉE","source_code":"28165"}]}]},"provenance":{"fetched_at":"2026-08-01T08:36:36.878803525Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"BDPM"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"found":{"type":"boolean","description":"true when the key resolved in the referential. A well-formed unknown key is a successful found:false answer, never an error"},"medications":{"type":"array","items":{"type":"object","properties":{"authorization_date":{"type":"string"},"country":{"type":"string"},"dispensing":{"type":"array","items":{"type":"string"}},"enhanced_surveillance":{"type":"boolean"},"form":{"type":"string"},"generic_groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"label":{"type":"string"}},"required":["id","label"]}},"holder":{"type":"string"},"identifiers":{"type":"object","properties":{"cis":{"type":"string"},"ndc":{"type":"string"}},"required":[]},"marketing_status":{"type":"string"},"name":{"type":"string"},"presentations":{"type":"array","items":{"type":"object","properties":{"cip13":{"type":"string"},"cip7":{"type":"string"},"collectivities_approved":{"type":"boolean"},"declared_at":{"type":"string"},"dispensing_fee_cents":{"type":"integer"},"label":{"type":"string"},"marketing":{"type":"string"},"price_cents":{"type":"integer"},"price_with_dispensing_fee_cents":{"type":"integer"},"reimbursement_rate":{"type":"string"}},"required":["cip13","cip7","label"]}},"routes":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"substances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"labels_en":{"type":"array","items":{"type":"string"}},"labels_fr":{"type":"array","items":{"type":"string"}},"mapped":{"type":"boolean"},"raw_label":{"type":"string"},"source_code":{"type":"string"}},"required":["id","labels_en","labels_fr","mapped","raw_label","source_code"]}},"generic_name":{"type":"string"}},"required":["country","identifiers","substances"]},"description":"Resolved medications: official AMM identity (name, form, routes, holder, statuses as published - never rephrased), active substances normalized to INN via the committed DCI-INN table (the FR-US bridge: the same substance ids key /medication/interactions), pack-level presentations with public price in cents and reimbursement rate when published, BDPM generic groups"},"coverage":{"type":"object","properties":{"unmapped_substances":{"type":"array"}},"description":"Honest coverage: substance labels the DCI-INN table could not normalize are listed as-is in unmapped_substances, never guessed - and never a 5xx"},"substance":{"type":"object"}},"required":["found"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code. Provide exactly ONE key among: cis, ndc (US product NDC), dci (substance INN/DCI name, pure local computation), name (exact medication name, requires country=FR|US). Zero or several keys = 400; malformed key = 400; well-formed but unknown = 200 with found:false (billed - the absence is the answer)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/medication-resolve","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Resolve a medication (FR + US)","tags":["medication"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/medication/generics","description":"Find the French BDPM generic group of a medication before your agent substitutes or sources it: given a CIS code, exact name or DCI substance, returns the group's principle brand (princeps) and every equivalent generic, each with its role (princeps/generique), official name and pack-level public price and reimbursement rate when the BDPM publishes them. French (BDPM) scope: a US NDC key returns an honest FR-only coverage note. No account, no key, pay per call.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"cis":"60005856"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code. Provide exactly ONE key among: cis, name (exact medication name, French BDPM scope - no country here), dci (substance INN/DCI name), ndc (US product NDC - returns an honest FR-only coverage note). Zero or several keys = 400; malformed key = 400; well-formed but not genericized = 200 with found:false (billed - the absence of a group is the answer)"}},"required":[]}},"output":{"type":"json","example":{"data":{"coverage":{"members_without_identity":1,"note":"1 group member(s) have no name or presentations: the BDPM generic-groups file references CIS codes absent from the BDPM specialities file (marketing authorisation withdrawn); nothing is inferred"},"found":true,"groups":[{"id":12,"label":"FAMOTIDINE 20 mg - PEPDINE 20 mg, comprimé pelliculé","members":[{"cis":"67942333","identity":"withdrawn_from_bdpm_specialities","is_query":false,"type":"princeps"},{"cis":"60005856","is_query":true,"name":"FAMOTIDINE EG 20 mg, comprimé pelliculé","presentations":[{"cip13":"3400935510259","cip7":"3551025","collectivities_approved":true,"declared_at":"2004-03-25","dispensing_fee_cents":102,"label":"plaquette(s) PVC-Aluminium PVDC de 30 comprimé(s)","marketing":"Déclaration de commercialisation","price_cents":782,"price_with_dispensing_fee_cents":884,"reimbursement_rate":"15%"}],"type":"generique"}]}]},"provenance":{"fetched_at":"2026-08-01T08:36:36.945302920Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"BDPM"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"members_without_identity":{"type":"integer"},"note":{"type":"string"},"scope":{"type":"string"}},"required":["note"]},"found":{"type":"boolean","description":"true when the key belongs to at least one BDPM generic group. A well-formed key with no group (non-genericized medication, unknown CIS) is a successful found:false answer with groups:[], never an error"},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"label":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"cis":{"type":"string"},"identity":{"type":"string"},"is_query":{"type":"boolean"},"type":{"type":"string"},"name":{"type":"string"},"presentations":{"type":"array"}},"required":["cis","is_query","type"]}}},"required":["id","label","members"]},"description":"BDPM generic groups the key belongs to: each with its official label, and every member with its BDPM role (princeps/generique/complement_posologique/substituable), official name when in the specialities referential, is_query flag on the queried member(s), and pack-level presentations with public price in cents and reimbursement rate when published. An ndc= key returns groups:[] with an honest FR-only coverage note (generic groups are a French BDPM notion, no US equivalent in v1) - a successful 200, never an error"}},"required":["found"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code. Provide exactly ONE key among: cis, name (exact medication name, French BDPM scope - no country here), dci (substance INN/DCI name), ndc (US product NDC - returns an honest FR-only coverage note). Zero or several keys = 400; malformed key = 400; well-formed but not genericized = 200 with found:false (billed - the absence of a group is the answer)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/medication-generics","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Find a medication's generic group (FR)","tags":["medication"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/medication/availability","description":"Check a medication's availability before your agent orders or substitutes it: shortage reports from the French ANSM (data.ANSM) by CIS code or substance (INN/DCI) - status (rupture, risque_rupture, tension, remise_a_disposition, arret_commercialisation, or no_known_shortage), report dates, expected return and the official ANSM report URL. Honest by design: ANSM only records reported shortages, so the absence of a report is never a stock guarantee. French market scope: a US NDC key returns an honest FR-only coverage note. No account, no key, pay per call.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"cis":"65806466"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code. Provide exactly ONE key among: cis, substance (INN/DCI name; dci= is a synonym), ndc (US product NDC - returns an honest FR-only coverage note). Zero or several keys = 400; malformed key = 400; well-formed CIS with no report = 200 with status no_known_shortage (billed - the absence of a report is the answer, never a stock guarantee)"}},"required":[]}},"output":{"type":"json","example":{"data":{"coverage":{"note":"ANSM publishes product labels, not CIS codes; unlinked_signals reports in this snapshot could not be linked to a CIS and are invisible to this key — query ?substance= to check them","scope":"FR","unlinked_signals":60},"note":"ANSM only records reported shortages; the absence of a report does not guarantee pharmacy stock","signals":[{"cis":"65806466","domain":"Cardiologie","match_kind":"exact","name":"Alprostadil Intsel Chimos 0,5 mg/ml, solution injectable","source_ref":"https://ansm.sante.fr/disponibilites-des-produits-de-sante/medicaments/alprostadil-intsel-chimos-0-5-mg-ml-solution-injectable-alprostadil","status":"rupture","updated_at":"2022-11-23"}],"status":"rupture"},"provenance":{"fetched_at":"2026-08-01T08:36:36.973070427Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"ANSM — disponibilité des médicaments (ansm.sante.fr)"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"note":{"type":"string"},"scope":{"type":"string"},"unlinked_signals":{"type":"integer"}},"required":["note","scope"],"description":"Truthfulness bound served on EVERY cis= answer: ANSM publishes product labels, not CIS codes, so unlinked_signals reports of this snapshot could not be linked to any CIS and are invisible to a cis= key - query ?substance= to check them. An ndc= key gets the same block reduced to scope=FR (data.ANSM covers the French market only) - a successful 200, never an error"},"note":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"cis":{"type":"string"},"domain":{"type":"string"},"match_kind":{"type":"string"},"name":{"type":"string"},"source_ref":{"type":"string"},"status":{"type":"string"},"updated_at":{"type":"string"},"restock_date":{"type":"string"}},"required":["name","status"]},"description":"ANSM reports for the queried CIS, as published: speciality name, status, report update date (updated_at, the only tracking date the source publishes - NOT a shortage start date), observed or expected restock date (restock_date, absent when unannounced), medical domain, the official ANSM report URL (source_ref) and how the report was linked to a CIS (match_kind: exact or label_prefix - absent when the label could not be linked at all, never a guessed CIS). The note field restates the veracity caveat in every FR answer"},"status":{"type":"string","description":"Synthesis for a CIS key: status of the most recent ANSM report (rupture, risque_rupture, tension, remise_a_disposition, arret_commercialisation) or no_known_shortage when none exists - never an affirmative 'in stock' (ANSM only records reported shortages). A substance key returns found + items (every reported speciality containing it) instead of status + signals"},"found":{"type":"boolean"},"items":{"type":"array"}},"required":[]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code. Provide exactly ONE key among: cis, substance (INN/DCI name; dci= is a synonym), ndc (US product NDC - returns an honest FR-only coverage note). Zero or several keys = 400; malformed key = 400; well-formed CIS with no report = 200 with status no_known_shortage (billed - the absence of a report is the answer, never a stock guarantee)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/medication-availability","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check a medication's shortage status (FR)","tags":["medication"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/medication/interactions","description":"Check drug-drug interactions against the authoritative French ANSM thesaurus before your agent acts on a prescription or an order: post 2+ medications (CIS code, US NDC, INN/DCI substance or ANSM class) and get every published interaction between them - constraint level (contre_indication, association_deconseillee, precaution_emploi, a_prendre_en_compte), management advice and mechanism exactly as published by ANSM, plus honest coverage of anything that could not be compared. US drugs join via the INN substance bridge. No account, no key, pay per call.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"items":[{"cis":"60177044"},{"dci":"simvastatine"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"cis":{"type":"string"}},"required":[]},"description":"2 to 50 items, each with EXACTLY one key: cis (8-digit French CIS), ndc (US product NDC, evaluated once resolved to INN substances - the FR-US bridge), dci (INN/DCI substance name), class (ANSM class label). Fewer than 2 items, more than 50 (every pair is evaluated, so the cost is quadratic - the 400 states the limit), several keys on one item or a malformed key = 400; a well-formed list with no interaction = 200 with interactions:[] (billed - no known interaction between the evaluated pairs IS the answer)"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"coverage":{"complete":true,"notes":"Absence of interactions is asserted only for the evaluated pairs; unresolved items and unevaluated substances were not compared.","unresolved_items":[]},"disclaimer":"Factual relay of the French ANSM interactions thesaurus (level and management as published); not personalized medical advice.","evaluated_pairs":1,"interactions":[{"a":{"ansm_protagonist":"AMIODARONE","item":0,"matched":"amiodarone"},"b":{"ansm_protagonist":"SIMVASTATINE","item":1,"matched":"simvastatin"},"level":"precaution_emploi","level_label":"precaution for use","management":"Ne pas dépasser la posologie de 20 mg/j de simvastatine ou utiliser une autre statine non concernée par ce type d’interaction.","mechanism":"Risque majoré d'effets indésirables (concentration-dépendants) à type de rhabdomyolyse (diminution du métabolisme hépatique de la simvastatine).","source":"Thésaurus ANSM"}]},"provenance":{"fetched_at":"2026-08-01T08:36:37.009713775Z","freshness":{"as_of":"2024-06-07T00:00:00Z","kind":"snapshot"},"source":"Thésaurus ANSM"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"notes":{"type":"string"},"unresolved_items":{"type":"array"},"unevaluated_substances":{"type":"array"}},"required":["complete","notes","unresolved_items"],"description":"Honest coverage: complete only when every item resolved and every substance was comparable; unresolved items (unknown_cis/unknown_ndc/unknown_class) and substances outside the thesaurus scope are named, never silently counted as interaction-free"},"disclaimer":{"type":"string"},"evaluated_pairs":{"type":"integer"},"interactions":{"type":"array","items":{"type":"object","properties":{"a":{"type":"object","properties":{"ansm_protagonist":{"type":"string"},"item":{"type":"integer"},"matched":{"type":"string"}},"required":["ansm_protagonist","item","matched"]},"b":{"type":"object","properties":{"ansm_protagonist":{"type":"string"},"item":{"type":"integer"},"matched":{"type":"string"}},"required":["ansm_protagonist","item","matched"]},"level":{"type":"string"},"level_label":{"type":"string"},"management":{"type":"string"},"mechanism":{"type":"string"},"source":{"type":"string"},"applies_to":{"type":"string"}},"required":["a","b","level","level_label","source"]},"description":"Published ANSM couples between the posted items, most severe first: level (contre_indication, association_deconseillee, precaution_emploi, a_prendre_en_compte), management and mechanism exactly as written by ANSM, and for each side the item index, the substance actually matched and the ANSM protagonist label (which may be a class the substance belongs to). ANSM publishes most couples in both directions; each interaction is returned ONCE, with ansm_protagonist naming the side your item matched"}},"required":["coverage","disclaimer","evaluated_pairs","interactions"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"cis":{"type":"string"}},"required":[]},"description":"2 to 50 items, each with EXACTLY one key: cis (8-digit French CIS), ndc (US product NDC, evaluated once resolved to INN substances - the FR-US bridge), dci (INN/DCI substance name), class (ANSM class label). Fewer than 2 items, more than 50 (every pair is evaluated, so the cost is quadratic - the 400 states the limit), several keys on one item or a malformed key = 400; a well-formed list with no interaction = 200 with interactions:[] (billed - no known interaction between the evaluated pairs IS the answer)"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/medication-interactions","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check drug-drug interactions (ANSM)","tags":["medication"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/medication/report","description":"One consolidated medication report before your agent acts on a prescription or an order, by French CIS code or US NDC: official BDPM identity with pack-level price and reimbursement, INN-normalized substances, BDPM generic group, ANSM shortage status, and ANSM-thesaurus drug-drug interactions between the subject and an optional co-medication list (with=, comma-separated CIS/NDC/DCI). Every section carries its own source and date; honest coverage. No account, no key, pay per call.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"100000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"100000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"cis":"60441622","with":"simvastatine"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code of the subject. Exactly ONE key among cis and ndc (US product NDC); zero or both = 400; well-formed but unknown = 200 with honest empty sections (billed); an NDC subject gets its FR-only sections flagged in coverage, never an error"},"with":{"type":"string","description":"Optional comma-separated co-medication list, at most 50 elements (beyond, a 400 stating the limit - same quadratic pairing cost as /medication/interactions), auto-typed by closed rules: 8 digits = CIS, digits+dash = NDC (malformed = 400, never requalified), else INN/DCI name. Pass the parameter ONCE: with=a,b - a repeated with=a&with=b is a 400 restating the comma form. Subject-centered: pairs within the with list are not assessed - use /medication/interactions"}},"required":[]}},"output":{"type":"json","example":{"data":{"availability":{"coverage":{"note":"ANSM publishes product labels, not CIS codes […]","scope":"FR","unlinked_signals":60},"evaluated":true,"note":"ANSM only records reported shortages […]","signals":[],"source":{"as_of":"2026-08-01","name":"ANSM — disponibilité des médicaments (ansm.sante.fr)"},"status":"no_known_shortage"},"coverage":{"not_evaluated":[],"note":"sections listed in not_evaluated were not assessed […]"},"generics":{"coverage":{"members_without_identity":3,"note":"3 group member(s) have no name or presentations […]"},"evaluated":true,"found":true,"groups":[{"id":43,"label":"AMIODARONE (CHLORHYDRATE D’) 200 mg - CORDARONE 200 mg, comprimé sécable","members":[{"cis":"64408662","is_query":false,"name":"CORDARONE 200 mg, comprimé sécable","type":"princeps"},{"cis":"60214247","identity":"withdrawn_from_bdpm_specialities","is_query":false,"type":"generique"},{"cis":"60441622","is_query":true,"name":"AMIODARONE VIATRIS 200 mg, comprimé sécable","type":"generique"}]}],"note":"member presentations are elided in the report; call /medication/generics for full detail","source":{"as_of":"2026-08-01","name":"BDPM"}},"interactions":{"coverage":{"complete":true,"notes":"Absence of interactions is asserted only for the evaluated pairs […]","unresolved_items":[]},"disclaimer":"Factual relay of the French ANSM interactions thesaurus (level and management as published); not personalized medical advice.","evaluated":true,"evaluated_pairs":1,"internal":[],"internal_evaluated_pairs":0,"note":"with_provided lists pairs involving the subject only (item 0 is the subject, item i is with[i-1]); internal lists pairs among the subject's own substances […]","source":{"as_of":"2024-06-07","name":"Thésaurus ANSM"},"with_provided":[{"a":{"ansm_protagonist":"AMIODARONE","item":0,"matched":"amiodarone"},"b":{"ansm_protagonist":"SIMVASTATINE","item":1,"matched":"simvastatin"},"level":"precaution_emploi","level_label":"precaution for use","management":"Ne pas dépasser la posologie de 20 mg/j de simvastatine […]","mechanism":"Risque majoré d'effets indésirables […] à type de rhabdomyolyse […]","source":"Thésaurus ANSM"}]},"medication":{"evaluated":true,"found":true,"medications":[{"authorization_date":"1997-12-05","country":"FR","enhanced_surveillance":false,"form":"comprimé sécable","holder":"VIATRIS SANTE","identifiers":{"cis":"60441622"},"marketing_status":"Commercialisée","name":"AMIODARONE VIATRIS 200 mg, comprimé sécable","presentations":[{"cip13":"3400934544408","dispensing_fee_cents":102,"label":"plaquette(s) thermoformée(s) PVC aluminium de 30 comprimé(s)","price_cents":720,"price_with_dispensing_fee_cents":822,"reimbursement_rate":"65%"}],"routes":["orale"],"status":"Autorisation active","substances":[{"id":"amiodarone","mapped":true,"raw_label":"CHLORHYDRATE D'AMIODARONE"}]}],"source":{"as_of":"2026-08-01","name":"BDPM"}},"subject":{"cis":"60441622"}},"provenance":{"fetched_at":"2026-08-01T08:36:37.062771408Z","freshness":{"as_of":"2024-06-07T00:00:00Z","kind":"snapshot"},"source":"BDPM + ANSM — disponibilité des médicaments (ansm.sante.fr) + Thésaurus ANSM"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"availability":{"type":"object","properties":{"coverage":{"type":"object","properties":{"note":{"type":"string"},"scope":{"type":"string"},"unlinked_signals":{"type":"integer"}},"required":["note","scope","unlinked_signals"]},"evaluated":{"type":"boolean"},"note":{"type":"string"},"signals":{"type":"array"},"source":{"type":"object","properties":{"as_of":{"type":"string"},"name":{"type":"string"}},"required":["as_of","name"]},"status":{"type":"string"}},"required":["coverage","evaluated","note","signals","source","status"],"description":"ANSM shortage section, shape of /medication/availability: reported shortages only - no_known_shortage is a dated fact, never a stock guarantee"},"coverage":{"type":"object","properties":{"not_evaluated":{"type":"array"},"note":{"type":"string"}},"required":["not_evaluated","note"],"description":"Global honest coverage: every section not assessed is named with a closed reason (fr_only_scope on an NDC subject, dataset_not_ingested)"},"generics":{"type":"object","properties":{"coverage":{"type":"object","properties":{"members_without_identity":{"type":"integer"},"note":{"type":"string"}},"required":["members_without_identity","note"]},"evaluated":{"type":"boolean"},"found":{"type":"boolean"},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"label":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"cis":{"type":"string"},"is_query":{"type":"boolean"},"name":{"type":"string"},"type":{"type":"string"},"identity":{"type":"string"}},"required":["cis","is_query","type"]}}},"required":["id","label","members"]}},"note":{"type":"string"},"source":{"type":"object","properties":{"as_of":{"type":"string"},"name":{"type":"string"}},"required":["as_of","name"]}},"required":["evaluated","found"],"description":"BDPM generic-group section, shape of /medication/generics, bounded: member presentations are elided - call /medication/generics for full detail"},"interactions":{"type":"object","properties":{"coverage":{"type":"object","properties":{"complete":{"type":"boolean"},"notes":{"type":"string"},"unresolved_items":{"type":"array"}},"required":["complete","notes","unresolved_items"]},"disclaimer":{"type":"string"},"evaluated":{"type":"boolean"},"evaluated_pairs":{"type":"integer"},"internal":{"type":"array"},"internal_evaluated_pairs":{"type":"integer"},"note":{"type":"string"},"source":{"type":"object","properties":{"as_of":{"type":"string"},"name":{"type":"string"}},"required":["as_of","name"]},"with_provided":{"type":"array","items":{"type":"object","properties":{"a":{"type":"object","properties":{"ansm_protagonist":{"type":"string"},"item":{"type":"integer"},"matched":{"type":"string"}},"required":["ansm_protagonist","item","matched"]},"b":{"type":"object","properties":{"ansm_protagonist":{"type":"string"},"item":{"type":"integer"},"matched":{"type":"string"}},"required":["ansm_protagonist","item","matched"]},"level":{"type":"string"},"level_label":{"type":"string"},"management":{"type":"string"},"mechanism":{"type":"string"},"source":{"type":"string"}},"required":["a","b","level","level_label","management","mechanism","source"]}}},"required":["coverage","disclaimer","evaluated","evaluated_pairs","internal","internal_evaluated_pairs","note","source","with_provided"],"description":"ANSM-thesaurus section, subject-centered: with_provided = published couples involving the subject (level, management, mechanism exactly as written by ANSM, each couple returned once even when ANSM publishes it in both directions); internal = couples among the subject's own substances; absence is asserted only for evaluated_pairs"},"medication":{"type":"object","properties":{"evaluated":{"type":"boolean"},"found":{"type":"boolean"},"medications":{"type":"array","items":{"type":"object","properties":{"authorization_date":{"type":"string"},"country":{"type":"string"},"enhanced_surveillance":{"type":"boolean"},"form":{"type":"string"},"holder":{"type":"string"},"identifiers":{"type":"object","properties":{"cis":{"type":"string"}},"required":["cis"]},"marketing_status":{"type":"string"},"name":{"type":"string"},"presentations":{"type":"array","items":{"type":"object","properties":{"cip13":{"type":"string"},"dispensing_fee_cents":{"type":"integer"},"label":{"type":"string"},"price_cents":{"type":"integer"},"price_with_dispensing_fee_cents":{"type":"integer"},"reimbursement_rate":{"type":"string"}},"required":["cip13","dispensing_fee_cents","label","price_cents","price_with_dispensing_fee_cents","reimbursement_rate"]}},"routes":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"substances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mapped":{"type":"boolean"},"raw_label":{"type":"string"}},"required":["id","mapped","raw_label"]}}},"required":["authorization_date","country","enhanced_surveillance","form","holder","identifiers","marketing_status","name","presentations","routes","status","substances"]}},"source":{"type":"object","properties":{"as_of":{"type":"string"},"name":{"type":"string"}},"required":["as_of","name"]},"note":{"type":"string"}},"required":["evaluated","found"],"description":"Identity section, shape of /medication/resolve: official BDPM (or openFDA) identity as published, INN-normalized substances (the FR-US bridge), the subject's presentations with public price and reimbursement rate"},"subject":{"type":"object","properties":{"cis":{"type":"string"},"ndc":{"type":"string"}},"required":["cis"]}},"required":["availability","coverage","generics","interactions","medication","subject"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"],"description":"Aggregated root provenance: consulted sources concatenated, as_of = the OLDEST snapshot consulted - never fresher than the data. Per-section source and as_of are authoritative"}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"cis":{"type":"string","description":"Optional on its own - 8-digit French CIS code of the subject. Exactly ONE key among cis and ndc (US product NDC); zero or both = 400; well-formed but unknown = 200 with honest empty sections (billed); an NDC subject gets its FR-only sections flagged in coverage, never an error"},"with":{"type":"string","description":"Optional comma-separated co-medication list, at most 50 elements (beyond, a 400 stating the limit - same quadratic pairing cost as /medication/interactions), auto-typed by closed rules: 8 digits = CIS, digits+dash = NDC (malformed = 400, never requalified), else INN/DCI name. Pass the parameter ONCE: with=a,b - a repeated with=a&with=b is a 400 restating the comma form. Subject-centered: pairs within the with list are not assessed - use /medication/interactions"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/medication-report","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a consolidated medication report","tags":["medication"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.10"}},{"resource":{"url":"https://api.invoket.com/medication/lookup","description":"Turn a medication name an agent actually holds - 'Doliprane 1000', 'Tylenol', 'paracetamol' - into the CIS code, product NDC or canonical active-substance identifier that /medication/resolve, /medication/interactions, /medication/generics and /medication/availability require. Sources: the French BDPM register and openFDA/RxNorm. Closed verdict: exact, ambiguous or none. One brand name covering several strengths and forms is the normal answer, and every candidate is returned - we never pick one for you.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"form":"comprimé","q":"Doliprane 1000"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"form":{"type":"string","description":"Optional - the published galenic form (comprimé, gélule, suppositoire, TABLET...). It matches on WORD BOUNDARIES, never mid-word, so 'comprimé' also retains 'comprimé effervescent(e) sécable'. It only REDUCES the candidate set. A substance candidate publishes no form, so it leaves the set as soon as this filter is set, and so does any candidate whose referential does not publish the field - we do not silently fall back on what we cannot attest"},"q":{"type":"string","description":"Required - the name as you hold it: a brand name, an active substance, a French or American designation, with or without a strength ('Doliprane 1000', 'Tylenol', 'paracetamol'), up to 1024 characters. Absent, empty or blank is a 400 and nothing is billed - a malformed request is not a 'none'. Matching is exact on the published label or on its leading words at a WORD BOUNDARY, so 'Tylenol' returns 'TYLENOL EXTRA STRENGTH' with the published label that carries it: the gap is visible, and a partial match is never served as 'exact' unless it is alone"}},"required":["q"]}},"output":{"type":"json","example":{"data":{"candidates":[{"country":"FR","form":"comprimé","holder":"OPELLA HEALTHCARE FRANCE","id":"60234100","id_kind":"cis","label":"DOLIPRANE 1000 mg, comprimé","marketing_status":"Commercialisée","source":"BDPM","strength":"1000 mg"},{"country":"FR","form":"comprimé effervescent(e) sécable","holder":"OPELLA HEALTHCARE FRANCE","id":"66567738","id_kind":"cis","label":"DOLIPRANE 1000 mg, comprimé effervescent sécable","marketing_status":"Commercialisée","source":"BDPM","strength":"1000 mg"}],"filters":{"form":"comprimé"},"limits":"A resolution names what the referential publishes for the text you sent, as of the date carried by the provenance; it does not certify that the entity resolved is the one you had in mind. A brand name routinely covers several strengths, forms and presentations, hence several CIS: choosing between them belongs to the caller, and no candidate served here is medical advice. Substance candidates fold salt and hydrate forms onto their base through a closed curated list (the fold is visible in normalization.substance_key): a form that list does not cover keeps its suffix and yields no substance candidate rather than a guessed one. Matching is exact on the published label or on its leading words, never fuzzy and never scored; candidates are ordered substance first, then by CIS, then by NDC - a reading order, not a relevance ranking.","normalization":{"name_key":"doliprane 1000","substance_key":"doliprane 1000"},"query":"Doliprane 1000","total":2,"truncated":false,"verdict":"ambiguous"},"provenance":{"fetched_at":"2026-08-17T20:24:56.154943530Z","freshness":{"as_of":"2026-08-08T00:00:00Z","kind":"snapshot"},"source":"BDPM + openFDA + RxNorm"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"candidates":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string"},"form":{"type":"string"},"holder":{"type":"string"},"id":{"type":"string","description":"The identifier downstream accepts AS IS - copy it into the next endpoint without reworking it. A 'cis' or 'ndc' goes into /medication/resolve, /medication/generics, /medication/availability and /medication/report; a 'substance' goes into a 'dci' item of /medication/interactions, which accepts nothing else"},"id_kind":{"type":"string","description":"The nature of the identifier: 'cis' (a French presentation), 'ndc' (an American product) or 'substance' (the canonical identity of an active substance, the FR/US bridge). One text routinely produces both a substance and its presentations - that is a normal 'ambiguous', not an anomaly"},"label":{"type":"string","description":"The label as the referential publishes it - never recased, never re-accented, never completed"},"marketing_status":{"type":"string","description":"Declared marketing status (FR): an authorisation in force does not mean the product is actually marketed, and you must be able to rule it out. Absent on US products and on substances"},"source":{"type":"string","description":"The referential that publishes this candidate, named exactly as the provenance names it: BDPM for France, openFDA or RxNorm for the United States"},"strength":{"type":"string","description":"Published strength of the active substances, joined by ' + ' for a combination - the first discriminant of this domain, since one brand name covers 500 mg, 1000 mg and more. Absent, not null, when the referential does not publish it"}},"required":["country","form","holder","id","id_kind","label","marketing_status","source","strength"]},"description":"Always served - one element on 'exact', EMPTY on 'none', never absent and never null. Capped at 50, with 'total' and 'truncated' saying the rest; there is no pagination, because a second page would be a second paid call for the same question. Narrow with a filter instead"},"filters":{"type":"object","properties":{"form":{"type":"string"},"country":{"type":"string"},"strength":{"type":"string"}},"required":["form"],"description":"The filters that were applied, echoed as you wrote them, so you can replay the request and understand what narrowed the list. Only the ones you set appear"},"limits":{"type":"string","description":"Fixed sentence served in every response. Its first half is common to the whole lookup family; the rest is this domain's, and it matters: a brand name covers several presentations and CHOOSING BETWEEN THEM BELONGS TO YOU - nothing served here is medical advice - and the curated salt fold is deliberately narrow, because a generic stripping of suffixes was shown to FABRICATE false interactions"},"normalization":{"type":"object","properties":{"name_key":{"type":"string"},"substance_key":{"type":"string"}},"required":["name_key","substance_key"],"description":"The TWO keys actually looked up, and they are what makes a 'none' explainable. 'name_key' folds case, French accents and all punctuation - hyphens included - to word boundaries; words are NOT glued back ('parace-tamol' is not 'paracetamol'), because the indexed column is not either. 'substance_key' additionally folds known salts and hydrates onto their base ('esomeprazole magnesium' becomes 'esomeprazole') through a CLOSED CURATED list: outside that list the suffix stays and no substance candidate is returned, rather than a guessed one"},"query":{"type":"string","description":"The text you sent, echoed as received (edge blanks removed) - what was actually resolved"},"total":{"type":"integer","description":"Candidates found BEFORE the 50-item cap. The verdict is derived from this number, never from the served slice, so a truncated list can never be 'exact'"},"truncated":{"type":"boolean","description":"Whether the served list is cut at the cap"},"verdict":{"type":"string","description":"Closed enumeration, and there is nothing else. 'exact': one single candidate answers. 'ambiguous': several do - the NORMAL case in this domain, because one brand name covers several strengths, forms and presentations - and they are ALL returned so you choose. 'none': the referentials publish nothing for this text, at the snapshot date. All three are 200 and all three are billed: 'none' is the answer that stops an agent inventing a CIS"}},"required":["candidates","filters","limits","normalization","query","total","truncated","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"form":{"type":"string","description":"Optional - the published galenic form (comprimé, gélule, suppositoire, TABLET...). It matches on WORD BOUNDARIES, never mid-word, so 'comprimé' also retains 'comprimé effervescent(e) sécable'. It only REDUCES the candidate set. A substance candidate publishes no form, so it leaves the set as soon as this filter is set, and so does any candidate whose referential does not publish the field - we do not silently fall back on what we cannot attest"},"q":{"type":"string","description":"Required - the name as you hold it: a brand name, an active substance, a French or American designation, with or without a strength ('Doliprane 1000', 'Tylenol', 'paracetamol'), up to 1024 characters. Absent, empty or blank is a 400 and nothing is billed - a malformed request is not a 'none'. Matching is exact on the published label or on its leading words at a WORD BOUNDARY, so 'Tylenol' returns 'TYLENOL EXTRA STRENGTH' with the published label that carries it: the gap is visible, and a partial match is never served as 'exact' unless it is alone"}},"required":["q"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/medication-lookup","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Resolve a medication name to its CIS, NDC or substance","tags":["medication","lookup"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/chem/classify","description":"Before your agent approves a substance for an EU label or safety data sheet: the harmonised classification and labelling from Annex VI of the CLP regulation (ECHA), by CAS, EC number or exact name - hazard classes with H statements, GHS pictograms, signal word, concentration limits, versioned by ATP: the entry in force at the queried date, plus the upcoming change when a published but not-yet-applicable ATP modifies it. Absence from Annex VI returns an explicit self-classification verdict.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"at":"2026-06-01","cas":"100-41-4"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"at":{"type":"string","description":"Optional date (YYYY-MM-DD, default today) the served classification must be in force at - useful around an ATP applicability switch"},"cas":{"type":"string","description":"Optional on its own - CAS number, checksum-validated. Provide exactly ONE key among: cas, ec (EC number, checksum-validated), name (exact Annex VI chemical name). Zero or several keys = 400; bad checksum = 400; valid but not listed = 200 not_harmonised (billed - absence does not mean not hazardous, the verdict says so explicitly)"}},"required":[]}},"output":{"type":"json","example":{"data":{"entries":[{"atp":{"applicable_from":"2026-05-01","celex":"32014R0605","eurlex_url":"https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32014R0605","regulation":"Annex VI to CLP — entry version ATP06 (CELEX 32014R0605)"},"cas_numbers":["100-41-4"],"cmr_1a_1b":false,"ec_numbers":["202-849-4"],"hazard_classes":[{"category":"2","class":"Flam. Liq.","h_statement":"H225"},{"category":"4","class":"Acute Tox.","h_statement":"H332","note_marker":"*"},{"category":"1","class":"Asp. Tox.","h_statement":"H304"},{"category":"2","class":"STOT RE","h_statement":"H373 (hearing organs)"}],"hazard_statements":["H225","H332","H304","H373 (hearing organs)"],"index_number":"601-023-00-4","label_hazard_statements":["H225","H332","H304","H373 (hearing organs)"],"name":"ethylbenzene","pictograms":["GHS02","GHS07","GHS08"],"signal_word":"Dgr","suppl_hazard_statements":[]}],"verdict":"harmonised"},"provenance":{"fetched_at":"2026-08-01T17:35:18Z","freshness":{"as_of":"2026-05-01T00:00:00Z","kind":"snapshot"},"source":"ECHA Annex VI (CLP), harmonised classification and labelling"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"atp":{"type":"object","properties":{"applicable_from":{"type":"string"},"celex":{"type":"string","description":"CELEX number of the act that enacted THIS entry version (e.g. 32014R0605), copied from the ECHA workbook - the reference to trace the verdict back to its legal text on EUR-Lex. Absent when the source publishes none: never guessed"},"eurlex_url":{"type":"string","description":"EUR-Lex link to that same act, as published by the source; absent when unpublished"},"regulation":{"type":"string"}},"required":["applicable_from","celex","eurlex_url","regulation"],"description":"The adaptation this version of the entry comes from, plus `applicable_from` = the date the SERVED SNAPSHOT (latest adaptation in application) applies from - not the date of that act, which is often much older. A sibling `upcoming` field {change: added|modified|removed, regulation, applicable_from} flags a published but not-yet-applicable ATP touching the entry - the freshness differentiator"},"cas_numbers":{"type":"array","items":{"type":"string"}},"cmr_1a_1b":{"type":"boolean"},"ec_numbers":{"type":"array","items":{"type":"string"}},"hazard_classes":{"type":"array","items":{"type":"object","properties":{"category":{"type":["string","null"]},"class":{"type":"string"},"h_statement":{"type":["string","null"]},"note_marker":{"type":"string"}},"required":["category","class","h_statement"]},"description":"One entry per hazard class as published: `class` is the class alone (never the category, never a footnote marker), `category` its category ('2', '1B', '1.1', or a letter A-G for organic peroxides and self-reactive substances) or null when the class has none (Press. Gas, Lact., Unst. Expl.), `note_marker` the Annex VI footnote marker (*, ****) when the published class carries one - relayed verbatim, never interpreted - and `h_statement` the H statement paired only when the source columns align"},"hazard_statements":{"type":"array","items":{"type":"string"}},"index_number":{"type":"string"},"label_hazard_statements":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"pictograms":{"type":"array","items":{"type":"string"}},"signal_word":{"type":["string","null"]},"suppl_hazard_statements":{"type":"array"},"concentration_limits":{"type":["string","null"]},"m_factors":{"type":["string","null"]},"notes":{"type":["string","null"]},"upcoming":{"type":"object"}},"required":["atp","cas_numbers","cmr_1a_1b","ec_numbers","hazard_classes","hazard_statements","index_number","label_hazard_statements","name","pictograms","signal_word","suppl_hazard_statements"]},"description":"Annex VI content as published, never rephrased: hazard classes paired with their H statement only when the source columns align, GHS pictograms, signal word, specific concentration limits, M factors, notes; cmr_1a_1b is mechanically derived from the served classes; an ambiguous exact name returns every matching entry"},"verdict":{"type":"string","description":"harmonised (at least one Annex VI entry in force at the date) or not_harmonised (valid key absent from Annex VI - explicit self-classification note, and the upcoming ATP when a published one will ADD the substance)"},"note":{"type":"string","description":"Self-classification note served with a not_harmonised verdict: the substance has no harmonised entry in Annex VI, which is not an absence of hazard — the supplier must self-classify. Absent on a harmonised verdict"},"upcoming":{"type":"object"}},"required":["entries","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"at":{"type":"string","description":"Optional date (YYYY-MM-DD, default today) the served classification must be in force at - useful around an ATP applicability switch"},"cas":{"type":"string","description":"Optional on its own - CAS number, checksum-validated. Provide exactly ONE key among: cas, ec (EC number, checksum-validated), name (exact Annex VI chemical name). Zero or several keys = 400; bad checksum = 400; valid but not listed = 200 not_harmonised (billed - absence does not mean not hazardous, the verdict says so explicitly)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/label-chem-classify","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get a substance's harmonised CLP classification (EU)","tags":["label"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/chem/classify/batch","description":"Before your agent clears a BOM or a formulation for the EU market: screen up to 200 substances in one call against Annex VI of the CLP regulation (ECHA) - one harmonised-classification verdict per item (CAS, EC number or exact name) with H statements, GHS pictograms, signal word, and the ATP version in force plus upcoming ATP changes; a malformed item is flagged at its position instead of failing the batch, and an unlisted substance gets an explicit self-classification verdict.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"at":"2026-06-01","items":[{"cas":"100-41-4"},{"cas":"7732-18-5"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"at":{"type":"string","description":"Optional date (YYYY-MM-DD, default today) the whole batch is evaluated at - a BOM is assessed at a single date"},"items":{"type":"array","items":{"type":"object","properties":{"cas":{"type":"string"}},"required":[]},"description":"Array of substance keys screened in one settlement. Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch = 400. Each item takes exactly ONE key among cas, ec, name (checksum-validated for cas/ec); a malformed item yields an INVALID_INPUT error at its position without failing the batch"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"entries":[{"atp":{"applicable_from":"2026-05-01","celex":"32014R0605","eurlex_url":"https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32014R0605","regulation":"Annex VI to CLP — entry version ATP06 (CELEX 32014R0605)"},"cas_numbers":["100-41-4"],"cmr_1a_1b":false,"ec_numbers":["202-849-4"],"hazard_classes":[{"category":"2","class":"Flam. Liq.","h_statement":"H225"},{"category":"4","class":"Acute Tox.","h_statement":"H332","note_marker":"*"}],"hazard_statements":["H225","H332"],"index_number":"601-023-00-4","label_hazard_statements":["H225","H332"],"name":"ethylbenzene","pictograms":["GHS02","GHS07","GHS08"],"signal_word":"Dgr","suppl_hazard_statements":[]}],"verdict":"harmonised"},{"entries":[],"note":"Not listed in the harmonised classification (Annex VI CLP) in force at this date. Absence does not mean the substance is not hazardous: self-classification under CLP remains the responsibility of the entity placing it on the market.","verdict":"not_harmonised"}]},"provenance":{"fetched_at":"2026-08-01T17:35:18Z","freshness":{"as_of":"2026-05-01T00:00:00Z","kind":"snapshot"},"source":"ECHA Annex VI (CLP), harmonised classification and labelling"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"atp":{"type":"object","properties":{"applicable_from":{"type":"string"},"celex":{"type":"string"},"eurlex_url":{"type":"string"},"regulation":{"type":"string"}},"required":["applicable_from","celex","eurlex_url","regulation"],"description":"Same shape as /label/chem/classify: the adaptation THIS entry version comes from, with its CELEX and EUR-Lex link when the source publishes them (absent otherwise, never guessed), plus `applicable_from` = the date the served snapshot applies from"},"cas_numbers":{"type":"array","items":{"type":"string"}},"cmr_1a_1b":{"type":"boolean"},"ec_numbers":{"type":"array","items":{"type":"string"}},"hazard_classes":{"type":"array","items":{"type":"object","properties":{"category":{"type":["string","null"]},"class":{"type":"string"},"h_statement":{"type":["string","null"]},"note_marker":{"type":"string"}},"required":["category","class","h_statement"]},"description":"Same shape as /label/chem/classify: `class` alone, `category` (or null when the class has none), `note_marker` for the Annex VI footnote marker (*, ****) carried by the published class, `h_statement` paired only when the source columns align"},"hazard_statements":{"type":"array","items":{"type":"string"}},"index_number":{"type":"string"},"label_hazard_statements":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"pictograms":{"type":"array","items":{"type":"string"}},"signal_word":{"type":["string","null"]},"suppl_hazard_statements":{"type":"array"},"concentration_limits":{"type":["string","null"]},"m_factors":{"type":["string","null"]},"notes":{"type":["string","null"]},"upcoming":{"type":"object"}},"required":["atp","cas_numbers","cmr_1a_1b","ec_numbers","hazard_classes","hazard_statements","index_number","label_hazard_statements","name","pictograms","signal_word","suppl_hazard_statements"]}},"verdict":{"type":"string"},"code":{"type":"string"},"error":{"type":"string"},"note":{"type":"string"},"upcoming":{"type":"object"}},"required":[]},"description":"One verdict per submitted item, at its position, same shape as /label/chem/classify (harmonised entries with ATP version and upcoming changes, or an explicit not_harmonised self-classification verdict); a malformed item appears as {error, code} at its position"}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"at":{"type":"string","description":"Optional date (YYYY-MM-DD, default today) the whole batch is evaluated at - a BOM is assessed at a single date"},"items":{"type":"array","items":{"type":"object","properties":{"cas":{"type":"string"}},"required":[]},"description":"Array of substance keys screened in one settlement. Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch = 400. Each item takes exactly ONE key among cas, ec, name (checksum-validated for cas/ec); a malformed item yields an INVALID_INPUT error at its position without failing the batch"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/label-chem-classify-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a BOM against Annex VI CLP (EU)","tags":["label"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":200,"unitField":"items"}}},{"resource":{"url":"https://api.invoket.com/label/chem/svhc","description":"Before your agent clears a substance, an article or a supply-chain declaration for the EU market: is it on the ECHA Candidate List of substances of very high concern (SVHC, REACH)? By CAS, EC number or exact name - the published entry with its Article 57 inclusion reasons (CMR, PBT, vPvB, equivalent concern), inclusion date and the ECHA inclusion decisions as published, plus the generic obligations it triggers (REACH Article 33 information duty, SCIP notification above 0.1 % w/w). A not-listed verdict is dated to the served list, never an all-clear.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"cas":"84-74-2"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"cas":{"type":"string","description":"Optional on its own - CAS number, checksum-validated. Provide exactly ONE key among: cas, ec (EC number, checksum-validated), name (exact Candidate List name - the only key for UVCB entries published without CAS/EC). Zero or several keys = 400; bad checksum = 400; valid but not listed = 200 not_listed (billed - the verdict is dated to the served list and absence does not mean no concern)"}},"required":[]}},"output":{"type":"json","example":{"data":{"entries":[{"decisions":["https://echa.europa.eu/documents/10162/d33fd29e-5170-440f-8c16-10ecd87cf472","https://echa.europa.eu/documents/10162/2f10864f-e748-0e86-9bc4-2b3964fbdace","https://echa.europa.eu/documents/10162/326a8103-bc47-fb36-0871-22b46ec9d66f","https://echa.europa.eu/documents/10162/94f8f2db-076b-b817-31ae-c14f487642e9"],"identifiers":[{"ec":"201-557-4"},{"cas":"84-74-2"}],"included_at":"2008-10-28","name":"Dibutyl phthalate (DBP)","obligations":{"article_33":"REACH Article 33: a supplier of an article containing this substance in a concentration above 0.1 % weight by weight (w/w) must provide the recipient with sufficient information, available to the supplier, to allow safe use of the article, including as a minimum the name of the substance; on request, the same information must be provided to a consumer within 45 days, free of charge.","scip":"SCIP notification (Waste Framework Directive 2008/98/EC, Article 9(1)(i)): suppliers of articles containing this substance in a concentration above 0.1 % weight by weight (w/w) placed on the EU market must submit information on those articles to the ECHA SCIP database."},"reasons":["Toxic for reproduction (Article 57c)","Endocrine disrupting properties (Article 57(f) - environment)","Endocrine disrupting properties (Article 57(f) - human health)"]}],"verdict":"listed"},"provenance":{"fetched_at":"2026-08-01T14:20:24Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"ECHA Candidate List of SVHC (REACH Art. 59(10))"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"decisions":{"type":"array","items":{"type":"string"}},"identifiers":{"type":"array","items":{"type":"object","properties":{"ec":{"type":"string"}},"required":["ec"]}},"included_at":{"type":["string","null"]},"name":{"type":"string"},"obligations":{"type":"object","properties":{"article_33":{"type":"string"},"scip":{"type":"string"}},"required":["article_33","scip"],"description":"The generic obligations inclusion triggers, as fixed sourced regulatory texts: REACH Article 33 information duty in the supply chain, and SCIP database notification above 0.1 % w/w - stated rules, never advice applied to the caller's article"},"reasons":{"type":"array","items":{"type":"string"}}},"required":["decisions","identifiers","included_at","name","obligations","reasons"]},"description":"Candidate List content as published, never rephrased: substance name, published identifiers relayed individually (EC and CAS are not paired by the source), cumulative Article 57 inclusion reasons, inclusion date, and decisions[] - the ECHA inclusion decisions as published, one document URL per Article 57 reason added, already split into a list (absent when none is published, never [] or null); an ambiguous exact name returns every matching entry"},"verdict":{"type":"string","description":"listed (at least one Candidate List entry matches the key) or not_listed (valid key absent from the list as published on the served as_of date - a dated fact, never 'never listed', never an all-clear)"},"note":{"type":"string"}},"required":["entries","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"cas":{"type":"string","description":"Optional on its own - CAS number, checksum-validated. Provide exactly ONE key among: cas, ec (EC number, checksum-validated), name (exact Candidate List name - the only key for UVCB entries published without CAS/EC). Zero or several keys = 400; bad checksum = 400; valid but not listed = 200 not_listed (billed - the verdict is dated to the served list and absence does not mean no concern)"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/label-chem-svhc","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check a substance against the SVHC Candidate List (EU)","tags":["label"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/chem/svhc/batch","description":"Before your agent clears a BOM, a formulation or a supplier declaration for the EU market: screen up to 200 substances in one call against the ECHA Candidate List of SVHC (REACH) - one verdict per item (CAS, EC number or exact name) with the published Article 57 inclusion reasons, inclusion date and the triggered obligations (REACH Article 33, SCIP notification); a malformed item is flagged at its position instead of failing the batch, and a not-listed substance gets an explicit verdict dated to the served list.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"items":[{"cas":"84-74-2"},{"cas":"7732-18-5"}]},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"cas":{"type":"string"}},"required":[]},"description":"Array of substance keys screened in one settlement. Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch = 400. Each item takes exactly ONE key among cas, ec, name (checksum-validated for cas/ec); a malformed item yields an INVALID_INPUT error at its position without failing the batch"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"count":2,"results":[{"entries":[{"decisions":["https://echa.europa.eu/documents/10162/d33fd29e-5170-440f-8c16-10ecd87cf472","https://echa.europa.eu/documents/10162/2f10864f-e748-0e86-9bc4-2b3964fbdace","https://echa.europa.eu/documents/10162/326a8103-bc47-fb36-0871-22b46ec9d66f","https://echa.europa.eu/documents/10162/94f8f2db-076b-b817-31ae-c14f487642e9"],"identifiers":[{"ec":"201-557-4"},{"cas":"84-74-2"}],"included_at":"2008-10-28","name":"Dibutyl phthalate (DBP)","obligations":{"article_33":"REACH Article 33: a supplier of an article containing this substance above 0.1 % w/w must provide the recipient with sufficient information […]","scip":"SCIP notification (Waste Framework Directive 2008/98/EC, Article 9(1)(i)): […]"},"reasons":["Toxic for reproduction (Article 57c)","Endocrine disrupting properties (Article 57(f) - environment)","Endocrine disrupting properties (Article 57(f) - human health)"]}],"verdict":"listed"},{"entries":[],"note":"Not on the ECHA Candidate List of SVHC as published on 2026-08-01. This verdict is dated: it means the substance was not listed at that date, not that it never will be. Absence from the Candidate List does not mean the substance is of no concern.","verdict":"not_listed"}]},"provenance":{"fetched_at":"2026-08-01T14:20:39Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"ECHA Candidate List of SVHC (REACH Art. 59(10))"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"decisions":{"type":"array","items":{"type":"string"}},"identifiers":{"type":"array","items":{"type":"object","properties":{"ec":{"type":"string"}},"required":["ec"]}},"included_at":{"type":["string","null"]},"name":{"type":"string"},"obligations":{"type":"object","properties":{"article_33":{"type":"string"},"scip":{"type":"string"}},"required":["article_33","scip"]},"reasons":{"type":"array","items":{"type":"string"}}},"required":["decisions","identifiers","included_at","name","obligations","reasons"]}},"verdict":{"type":"string"},"code":{"type":"string"},"error":{"type":"string"},"note":{"type":"string"}},"required":[]},"description":"One verdict per submitted item, at its position, same shape as /label/chem/svhc (listed entries with Article 57 reasons, inclusion date, decisions[] - the published ECHA inclusion decisions as document URLs, already split into a list and absent when none is published - and the triggered obligations, or an explicit not_listed verdict dated to the served list); a malformed item appears as {error, code} at its position"}},"required":["count","results"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"cas":{"type":"string"}},"required":[]},"description":"Array of substance keys screened in one settlement. Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch = 400. Each item takes exactly ONE key among cas, ec, name (checksum-validated for cas/ec); a malformed item yields an INVALID_INPUT error at its position without failing the batch"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/label-chem-svhc-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a BOM against the SVHC Candidate List (EU)","tags":["label"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":200,"unitField":"items"}}},{"resource":{"url":"https://api.invoket.com/label/claims/check","description":"Before your agent puts a nutrition or health claim on an EU food label: is the proposed wording an authorised claim (exact legal wording + conditions of use), a non-authorised one (official rejection reason + EFSA opinion), or absent from the EU Register (Regulation (EC) 1924/2006)? Post the label wording (and optionally the nutrient); matching is strict-normalised (case, punctuation, spacing), exact or containment, never fuzzy - zero false positives. The Register carries the REJECTED claims a plain LLM validates by mistake. An absent wording returns the authorised claims for the nutrient plus a limit note (absence is neither authorisation nor prohibition - 'on hold' botanicals are not in the Register).","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"nutrient":"Isomaltulose","wording":"Isomaltulose contributes to normal energy-yielding metabolism"},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"nutrient":{"type":"string"},"wording":{"type":"string","description":"The proposed label wording, required (an empty or punctuation-only wording = 400). Matched after strict normalisation (case, punctuation, HTML, spacing) - exact or containment, never fuzzy. Optional nutrient bounds the search to that nutrient's claims (a provided but empty nutrient = 400); omit it to scan the whole Register"}},"required":["wording"]}},"output":{"type":"json","example":{"data":{"claims":[{"code":"POL-HC-11221","efsa":{"question":"Q-2021-00073","url":"https://efsa.onlinelibrary.wiley.com/doi/epdf/10.2903/j.efsa.2021.6849"},"legislation":"1945255","nutrient":"Isomaltulose","rejections":[{"code":"HC_RR_166","reason":"The use of such a health claim would convey a conflicting and confusing message to consumers, because it would encourage consumption of sugars for which, on the basis of generally accepted scientific advice, national and international authorities inform the consumer that their intake should be reduced."}],"status":"non_authorised","type":"Art. 13.5","wording":"Isomaltulose contributes to normal energy-yielding metabolism"}],"match_kind":"exact","verdict":"non_authorised"},"provenance":{"fetched_at":"2026-08-01T13:12:16Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"EU Register on nutrition and health claims"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"claims":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"efsa":{"type":"object","properties":{"question":{"type":"string"},"url":{"type":["string","null"]}},"required":["question","url"]},"legislation":{"type":"string"},"nutrient":{"type":"string"},"rejections":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"reason":{"type":["string","null"]}},"required":["code","reason"]}},"status":{"type":"string"},"type":{"type":"string"},"wording":{"type":"string"},"conditions_of_use":{"type":"string"},"eurlex_url":{"type":"string"},"restrictions":{"type":"string"}},"required":["code","legislation","nutrient","status","type","wording"]},"description":"Present on a FIRM match (authorised/non_authorised): the Register entry as published - claim code, article type, the exact LEGAL wording (not the submitted text), nutrient, plus conditions_of_use (the binding half of an authorisation, verbatim), restrictions (usage warnings, when published) and eurlex_url (the CELEX reference of the authorising act) when the Register states them, or the full official rejection reason and EFSA opinion (question, url) when non_authorised. Note legislation is the Register's own INTERNAL id, relayed as-is - cite eurlex_url instead. An ambiguous wording returns every matching entry"},"match_kind":{"type":"string"},"verdict":{"type":"string","description":"authorised (wording is a claim allowed under 1924/2006), non_authorised (wording matches a claim the Register rejected), partial_match (the wording is only a FRAGMENT of a registered claim - never a firm verdict, use the exact legal wording), or not_in_register (no match). All four are billed 200s - absence is a verdict, not a 404. A partial_match carries registered_claims (the full registered claim(s), verbatim status, never a green light) plus a note; a not_in_register carries authorised_for_nutrient (the authorised claims for the nutrient as an honest fallback, empty when no nutrient was given) and a note: absence is neither an authorisation nor a prohibition (transitional 'on hold' Article 13(1) botanical claims are not ingested in v1)"},"authorised_for_nutrient":{"type":"array"},"note":{"type":"string"},"registered_claims":{"type":"array"},"truncated":{"type":"boolean"}},"required":["verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"nutrient":{"type":"string"},"wording":{"type":"string","description":"The proposed label wording, required (an empty or punctuation-only wording = 400). Matched after strict normalisation (case, punctuation, HTML, spacing) - exact or containment, never fuzzy. Optional nutrient bounds the search to that nutrient's claims (a provided but empty nutrient = 400); omit it to scan the whole Register"}},"required":["wording"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/label-claims-check","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check an EU nutrition or health claim wording","tags":["label"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/claims/permitted","description":"List the authorised EU nutrition and health claims for a given nutrient or substance (Regulation (EC) 1924/2006): what your agent may legally write on a food label. Pass the nutrient; get every authorised claim as published - exact legal wording, conditions of use, EFSA opinion and legislation. A known nutrient whose claims are all rejected returns an explicit empty list with the rejected count (not a silent gap); a nutrient absent from the Register returns an empty list with a limit note (absence is neither authorisation nor prohibition - 'on hold' botanical claims are not in the Register). The counterpart of /label/claims/check: check starts from a wording, permitted starts from the nutrient.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"nutrient":"Vitamin K"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"nutrient":{"type":"string","description":"The nutrient or substance to list authorised claims for, required (absent or empty = 400). Queried after strict normalisation (case, punctuation, spacing); the response echoes the normalised key. This is the entry key - no fuzzy search"}},"required":["nutrient"]}},"output":{"type":"json","example":{"data":{"authorised":[{"code":"POL-HC-6523","conditions_of_use":"The claim may be used only for food which is at least a source of vitamin K as referred to in the claim SOURCE OF [NAME OF VITAMIN/S] AND/OR [NAME OF MINERAL/S] as listed in the Annex to Regulation (EC) No 1924/2006.","efsa":{"question":"2009;7(9):1228","url":"http://www.efsa.europa.eu/en/efsajournal/doc/1228.pdf"},"eurlex_url":"http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32012R0432:EN:NOT","legislation":"749652","nutrient":"Vitamin K","status":"authorised","type":"Art. 13.1","wording":"Vitamin K contributes to normal blood clotting"},{"code":"POL-HC-6524","conditions_of_use":"The claim may be used only for food which is at least a source of vitamin K as referred to in the claim SOURCE OF [NAME OF VITAMIN/S] AND/OR [NAME OF MINERAL/S] as listed in the Annex to Regulation (EC) No 1924/2006.","efsa":{"question":"2009;7(9):1228","url":"http://www.efsa.europa.eu/en/efsajournal/doc/1228.pdf"},"eurlex_url":"http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32012R0432:EN:NOT","legislation":"749652","nutrient":"Vitamin K","status":"authorised","type":"Art. 13.1","wording":"Vitamin K contributes to the maintenance of normal bones"}],"non_authorised_count":0,"nutrient":"vitamin k","verdict":"found"},"provenance":{"fetched_at":"2026-08-01T13:12:40Z","freshness":{"as_of":"2026-08-01T00:00:00Z","kind":"snapshot"},"source":"EU Register on nutrition and health claims"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"authorised":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"conditions_of_use":{"type":"string"},"efsa":{"type":"object","properties":{"question":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["question","url"]},"eurlex_url":{"type":"string"},"legislation":{"type":"string"},"nutrient":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"wording":{"type":"string"},"restrictions":{"type":"string"}},"required":["code","nutrient","status","type","wording"]},"description":"The authorised claims for the nutrient as published: claim code, article type, exact LEGAL wording (never rephrased), nutrient, conditions_of_use verbatim (the binding half of the authorisation - brackets, imposed casing and all), restrictions (usage warnings) when published, eurlex_url (CELEX reference of the authorising act) and legislation - the latter being the Register's own INTERNAL id, relayed as-is, so cite eurlex_url - plus the EFSA opinion (question, url) when referenced. Always serialised - empty on none_authorised and unknown_nutrient. On unknown_nutrient a sibling note explains that absence is neither an authorisation nor a prohibition (transitional 'on hold' Article 13(1) botanical claims are not ingested in v1)"},"non_authorised_count":{"type":"integer"},"nutrient":{"type":"string"},"verdict":{"type":"string","description":"found (nutrient in the Register with at least one authorised claim), none_authorised (nutrient in the Register but every claim was rejected - authorised is empty, non_authorised_count says how many), or unknown_nutrient (nutrient absent from the Register - authorised empty, plus a note). All three are billed 200s - an empty list is a verdict, not a 404"},"note":{"type":"string"}},"required":["authorised","non_authorised_count","nutrient","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"nutrient":{"type":"string","description":"The nutrient or substance to list authorised claims for, required (absent or empty = 400). Queried after strict normalisation (case, punctuation, spacing); the response echoes the normalised key. This is the entry key - no fuzzy search"}},"required":["nutrient"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/label-claims-permitted","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"List a nutrient's authorised EU health claims","tags":["label"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/cosmetic/ingredient","description":"Before your agent clears an ingredient for an EU cosmetic label: is it prohibited (Annex II), restricted (Annex III), or authorised as a colorant (IV), preservative (V) or UV filter (VI) under Regulation (EC) No 1223/2009? By CAS, EC number, INCI name or exact chemical name - every published entry with its maximum concentration, conditions of use and the MANDATORY LABEL WORDING served word for word, versioned by amending regulation: the consolidated version in force at the queried date plus the upcoming change when a published but not-yet-applicable one modifies the entry. CosIng is a legally non-binding information tool: only the Annexes are authoritative, and any divergence is reported, never silently resolved. Absence from the Annexes is not an authorisation - the verdict says so explicitly.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"cas":"69-72-7","date":"2026-06-01","product_type":"Rinse-off hair products"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"cas":{"type":"string","description":"Optional on its own - CAS number, checksum-validated. Provide exactly ONE key among: cas, ec (EC number, checksum-validated), inci (exact INCI name), name (exact chemical name). Zero or several keys = 400; bad checksum = 400. Identity resolved but absent from the Annexes = 200 not_listed (billed - absence is not an authorisation); identity NOT resolved (unknown to the Annexes and to CosIng) = 404, not billed"},"date":{"type":"string","description":"Optional date (YYYY-MM-DD, default today): serves the consolidated version in force at that date, not the latest. A date earlier than the oldest ingested version = 400 naming the bound (extrapolating a verdict would be factually wrong)"},"product_type":{"type":"string","description":"Optional: keeps only the conditions whose published scope covers that product type, PLUS the conditions not bounded by product type. Each entry reports conditions_omitted_by_product_type - nothing is hidden. Provided empty = 400"}},"required":[]}},"output":{"type":"json","example":{"data":{"divergences":[{"annex_in_cosing":"III","annex_in_regulation":"V","detail":"…","kind":"annex_mismatch"}],"entries":[{"amending_act":"Commission Regulation (EU) 2022/1176","annex":"III","applicable_from":"2026-05-16","conditions":[{"max_concentration":"3,0 %","product_type_or_body_part":"Rinse-off hair products","required_label_wording":"Not to be used for children under 3 years of age."},{"other_conditions":"Not to be used in oral products"}],"conditions_omitted_by_product_type":1,"entry_number":"98","status":"restricted","upcoming":{"applicable_from":"2027-03-01","change":"modified","consolidated_ref":"CELEX:02009R1223-20270301"}}],"limits":["Absence from Annexes II to VI … is not an authorisation …","This is not a safety assessment …","Maximum concentrations, conditions of use and label wording are served exactly as published …","CosIng is a legally non-binding information tool …"],"note":"This substance is covered by 2 entries (III/98, V/3). The top-level verdict reflects the most restrictive one; each entry carries its own status and conditions, which all apply cumulatively.","source_divergence":true,"substance":{"cas_numbers":["69-72-7"],"chemical_name":"2-Hydroxybenzoic acid","ec_numbers":["200-712-3"],"inci_name":"SALICYLIC ACID","resolved_from":"annexes"},"verdict":"restricted","version":{"applicable_from":"2026-05-16","applicable_to":"2027-03-01","consolidated_ref":"CELEX:02009R1223-20260516"}},"provenance":{"fetched_at":"2026-07-28T22:05:59Z","freshness":{"as_of":"2026-05-16T00:00:00Z","kind":"snapshot"},"source":"Regulation (EC) No 1223/2009 on cosmetic products — consolidated text (EUR-Lex), Annexes II to VI"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"divergences":{"type":"array","items":{"type":"object","properties":{"annex_in_cosing":{"type":"string"},"annex_in_regulation":{"type":"string"},"detail":{"type":"string"},"kind":{"type":"string"}},"required":["annex_in_cosing","annex_in_regulation","detail","kind"]}},"entries":{"type":"array","items":{"type":"object","properties":{"amending_act":{"type":"string"},"annex":{"type":"string"},"applicable_from":{"type":"string"},"conditions":{"type":"array","items":{"type":"object","properties":{"max_concentration":{"type":"string"},"product_type_or_body_part":{"type":"string"},"required_label_wording":{"type":"string"}},"required":["max_concentration","product_type_or_body_part","required_label_wording"]}},"conditions_omitted_by_product_type":{"type":"integer"},"entry_number":{"type":"string"},"status":{"type":"string"},"upcoming":{"type":"object","properties":{"applicable_from":{"type":"string"},"change":{"type":"string"},"consolidated_ref":{"type":"string"}},"required":["applicable_from","change","consolidated_ref"]}},"required":["amending_act","annex","applicable_from","conditions","conditions_omitted_by_product_type","entry_number","status","upcoming"]},"description":"One entry PER ANNEX covering the substance, as published and never rephrased: reference number, own status, conditions (product type or body part, maximum concentration, other conditions, colour, and the MANDATORY label wording served word for word - no unit conversion, no translation), the amending regulation, applicability date, and `upcoming` when a published but not-yet-applicable consolidated version adds/modifies/removes it"},"limits":{"type":"array","items":{"type":"string"},"description":"The four fixed caveats carried by every response: absence from the Annexes is not an authorisation (the safety assessment stays with the responsible person); this is not a safety assessment; values are served exactly as published; CosIng is informative only"},"note":{"type":"string"},"source_divergence":{"type":"boolean","description":"true when a CosIng/Annex divergence recorded at ingestion applies to this substance; divergences[] then details it. CosIng is legally non-binding: the Annex always prevails, and the gap is reported rather than silently resolved"},"substance":{"type":"object","properties":{"cas_numbers":{"type":"array","items":{"type":"string"}},"chemical_name":{"type":"string"},"ec_numbers":{"type":"array","items":{"type":"string"}},"inci_name":{"type":"string"},"resolved_from":{"type":"string"}},"required":["cas_numbers","chemical_name","ec_numbers","inci_name","resolved_from"],"description":"The resolved identity (INCI name, chemical name, CAS, EC) with resolved_from: 'annexes' (authoritative source) or 'cosing_index' (CosIng recognised the substance, which turns an unknown into an honest not_listed verdict)"},"verdict":{"type":"string","description":"Closed enumeration: prohibited (Annex II), restricted (III), authorised_colorant (IV), authorised_preservative (V), authorised_uv_filter (VI), not_listed. A substance can fall under several Annexes: the top-level verdict is the most restrictive, every entry keeps its own status and all apply cumulatively"},"version":{"type":"object","properties":{"applicable_from":{"type":"string"},"applicable_to":{"type":"string"},"consolidated_ref":{"type":"string"}},"required":["applicable_from","applicable_to","consolidated_ref"]}},"required":["divergences","entries","limits","note","source_divergence","substance","verdict","version"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"cas":{"type":"string","description":"Optional on its own - CAS number, checksum-validated. Provide exactly ONE key among: cas, ec (EC number, checksum-validated), inci (exact INCI name), name (exact chemical name). Zero or several keys = 400; bad checksum = 400. Identity resolved but absent from the Annexes = 200 not_listed (billed - absence is not an authorisation); identity NOT resolved (unknown to the Annexes and to CosIng) = 404, not billed"},"date":{"type":"string","description":"Optional date (YYYY-MM-DD, default today): serves the consolidated version in force at that date, not the latest. A date earlier than the oldest ingested version = 400 naming the bound (extrapolating a verdict would be factually wrong)"},"product_type":{"type":"string","description":"Optional: keeps only the conditions whose published scope covers that product type, PLUS the conditions not bounded by product type. Each entry reports conditions_omitted_by_product_type - nothing is hidden. Provided empty = 400"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/label-cosmetic-ingredient","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Get an EU cosmetic ingredient's regulatory verdict","tags":["label"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/cosmetic/ingredient/batch","description":"Before your agent clears a cosmetic formulation for the EU market: screen a whole INCI list - up to 200 ingredients in one call - against Annexes II to VI of Regulation (EC) No 1223/2009. One verdict per item (prohibited, restricted, authorised colorant/preservative/UV filter, or not listed) with the published entries, maximum concentrations, conditions and MANDATORY label wording served word for word, plus a summary count per verdict. A malformed item or an unresolved identity is flagged at its position instead of failing the batch; the input order is preserved but no conclusion is drawn from it (an INCI list's descending-concentration order is not exploited). This is not a formulation compliance verdict: no concentration in the finished product is computed.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"date":"2026-06-01","items":[{"inci":"SALICYLIC ACID"},{"cas":"56-81-5"}],"product_type":"Rinse-off hair products"},"headers":{"accept":"application/json","content-type":"application/json"},"schema":{"type":"object","properties":{"date":{"type":"string","description":"Optional date (YYYY-MM-DD, default today) the whole batch is evaluated at - a formulation is assessed at a single date. Earlier than the oldest ingested consolidated version = 400"},"items":{"type":"array","items":{"type":"object","properties":{"inci":{"type":"string"}},"required":[]},"description":"Array of ingredient keys screened in one settlement (an INCI list). Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch = 400. Each item takes exactly ONE key among cas, ec, inci, name (checksum-validated for cas/ec). Order is preserved but never interpreted; no de-duplication"},"product_type":{"type":"string","description":"Optional, common to the batch: keeps only the conditions published for that product type plus the unbounded ones. Provided empty = 400"}},"required":["items"]}},"output":{"type":"json","example":{"data":{"count":3,"limits":["Absence from Annexes II to VI … is not an authorisation …","This is not a safety assessment …","Maximum concentrations, conditions of use and label wording are served exactly as published …","CosIng is a legally non-binding information tool …"],"results":[{"entries":[{"annex":"III","applicable_from":"2026-05-16","conditions":[{"max_concentration":"3,0 %","product_type_or_body_part":"Rinse-off hair products","required_label_wording":"Not to be used for children under 3 years of age."}],"conditions_omitted_by_product_type":1,"entry_number":"98","status":"restricted"},{"annex":"V","applicable_from":"2026-05-16","conditions":[{"max_concentration":"0,5 %","required_label_wording":"Not to be used in preparations for children under 3 years of age, except for shampoos."}],"entry_number":"3","status":"authorised_preservative"}],"note":"This substance is covered by 2 entries (III/98, V/3). …","source_divergence":true,"substance":{"cas_numbers":["69-72-7"],"chemical_name":"2-Hydroxybenzoic acid","ec_numbers":["200-712-3"],"inci_name":"SALICYLIC ACID","resolved_from":"annexes"},"verdict":"restricted"},{"entries":[],"note":"Not listed in Annexes II to VI … as in force on 2026-07-28 … This verdict is dated and is not an authorisation …","source_divergence":false,"substance":{"cas_numbers":["56-81-5"],"ec_numbers":["200-289-5"],"inci_name":"GLYCERIN","resolved_from":"cosing_index"},"verdict":"not_listed"},{"code":"NOT_FOUND","error":"cosmetic ingredient identity not resolved: unknown to Annexes II to VI of Regulation (EC) No 1223/2009 and to the CosIng index"}],"summary":{"authorised_colorant":0,"authorised_preservative":0,"authorised_uv_filter":0,"error":1,"not_listed":1,"prohibited":0,"restricted":1},"version":{"applicable_from":"2026-05-16","applicable_to":"2027-03-01","consolidated_ref":"CELEX:02009R1223-20260516"}},"provenance":{"fetched_at":"2026-07-28T22:06:17Z","freshness":{"as_of":"2026-05-16T00:00:00Z","kind":"snapshot"},"source":"Regulation (EC) No 1223/2009 on cosmetic products — consolidated text (EUR-Lex), Annexes II to VI"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer"},"limits":{"type":"array","items":{"type":"string"},"description":"The four fixed caveats, served ONCE at batch level (identical for every item): absence is not an authorisation, this is not a safety assessment, values are served exactly as published, CosIng is informative only"},"results":{"type":"array","items":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"annex":{"type":"string"},"applicable_from":{"type":"string"},"conditions":{"type":"array","items":{"type":"object","properties":{"max_concentration":{"type":"string"},"product_type_or_body_part":{"type":"string"},"required_label_wording":{"type":"string"}},"required":["max_concentration","product_type_or_body_part","required_label_wording"]}},"conditions_omitted_by_product_type":{"type":"integer"},"entry_number":{"type":"string"},"status":{"type":"string"}},"required":["annex","applicable_from","conditions","conditions_omitted_by_product_type","entry_number","status"]}},"note":{"type":"string"},"source_divergence":{"type":"boolean"},"substance":{"type":"object","properties":{"cas_numbers":{"type":"array","items":{"type":"string"}},"chemical_name":{"type":"string"},"ec_numbers":{"type":"array","items":{"type":"string"}},"inci_name":{"type":"string"},"resolved_from":{"type":"string"}},"required":["cas_numbers","chemical_name","ec_numbers","inci_name","resolved_from"]},"verdict":{"type":"string"}},"required":["entries","note","source_divergence","substance","verdict"]},"description":"One verdict per submitted item, at its position, same shape as /label/cosmetic/ingredient (entries per Annex with conditions and mandatory label wording), minus version and limits which are factored at batch level. A malformed item appears as {error, code: INVALID_INPUT} and an unresolved identity as {error, code: NOT_FOUND} - the counterpart of the unit 404, without failing the batch"},"summary":{"type":"object","properties":{"authorised_colorant":{"type":"integer"},"authorised_preservative":{"type":"integer"},"authorised_uv_filter":{"type":"integer"},"error":{"type":"integer"},"not_listed":{"type":"integer"},"prohibited":{"type":"integer"},"restricted":{"type":"integer"}},"required":["authorised_colorant","authorised_preservative","authorised_uv_filter","error","not_listed","prohibited","restricted"],"description":"Count per verdict (prohibited, restricted, authorised_colorant, authorised_preservative, authorised_uv_filter, not_listed) plus error. Always fully serialised: a zero is information ('no prohibited substance in this formulation')"},"version":{"type":"object","properties":{"applicable_from":{"type":"string"},"applicable_to":{"type":"string"},"consolidated_ref":{"type":"string"}},"required":["applicable_from","applicable_to","consolidated_ref"]}},"required":["count","limits","results","summary","version"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"date":{"type":"string","description":"Optional date (YYYY-MM-DD, default today) the whole batch is evaluated at - a formulation is assessed at a single date. Earlier than the oldest ingested consolidated version = 400"},"items":{"type":"array","items":{"type":"object","properties":{"inci":{"type":"string"}},"required":[]},"description":"Array of ingredient keys screened in one settlement (an INCI list). Its length is priced per unit (base + N x unit), capped at 200; an empty or oversized batch = 400. Each item takes exactly ONE key among cas, ec, inci, name (checksum-validated for cas/ec). Order is preserved but never interpreted; no de-duplication"},"product_type":{"type":"string","description":"Optional, common to the batch: keeps only the conditions published for that product type plus the unbounded ones. Provided empty = 400"}},"required":["items"]},"schema":{"type":"object"},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"POST","docUrl":"https://invoket.com/docs/api/label-cosmetic-ingredient-batch","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Screen a cosmetic formulation against EU Annexes II-VI","tags":["label"],"pricing":{"mode":"per_unit","currency":"USD","baseUsd":"0.005","unitUsd":"0.005","minUsd":"0.01","maxUnits":200,"unitField":"items"}}},{"resource":{"url":"https://api.invoket.com/label/food/additive","description":"Before your agent validates a recipe, a food label or an import: is this additive authorised in this food category, at what maximum level and under which conditions (Union list, Regulation (EC) No 1333/2008, Annexes II and III)? By E number or exact published name, WITH a food category code - you get an authorised/not_authorised verdict with the maximum level, restrictions and footnotes served word for word ('quantum satis' as published, never converted), and via_group when the authorisation comes from a published group such as 'E 249 - 250'. WITHOUT a food category you get the inventory of categories where it is authorised and NO verdict: an additive has no status in the abstract. A not_authorised verdict is dated - the Union list is positive. Where the text bounds a line by a 'Period of application', the lines that apply at your date come first and each one carries in_force_at_date: an expired line is flagged, never dropped.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"date":"2026-06-01","e_number":"E250","food_category":"08.3.2"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"date":{"type":"string","description":"Optional date (YYYY-MM-DD, default today): serves the consolidated version in force at that date. Earlier than the oldest ingested version = 400 naming the bound"},"e_number":{"type":"string","description":"Optional on its own - E number, template E + 3 or 4 digits + optional letter and roman numeral ('E 160a(i)'). Provide exactly ONE key among e_number and name (exact published name); zero or both = 400, off-template = 400 before any lookup. An E number unknown to the Union list = 404, not billed"},"food_category":{"type":"string","description":"Optional - Food category code AS PUBLISHED ('08.3.2'; Annex III parts are exposed as 'III.1' to 'III.5'). It changes the shape of the answer: WITH it you get a verdict plus authorisations[]; WITHOUT it you get NO verdict field at all and instead data.authorised_in {total, truncated, categories[] (code, name, via_group), capped at 100} - an inventory, never an 'authorised' claim in the abstract, since an additive has no status without a food category. A code outside the referential = 400 not billed; provided empty = 400"}},"required":[]}},"output":{"type":"json","example":{"data":{"additive":{"e_number":"E250","e_number_published":"E 250","functional_classes":["other than colours and sweeteners"],"groups":["E 249–250"],"name":"Sodium nitrite"},"authorisations":[{"amending_act":"COMMISSION REGULATION (EU) 2023/2108 of 6 October 2023","amending_celex":"32023R2108","amending_oj_date":"2023-10-09","annex":"II","footnotes":[{"number":"58","text":"(58): Fo-value 3 is equivalent to 3 minutes heating at 121 °C …"}],"in_force_at_date":true,"max_level":"55","part":"E","period_from":"2025-10-09","published_as":"Nitrites","restrictions":"only sterilised meat products (Fo > 3,00)\nPeriod of application: from 9 October 2025","via_group":{"group_key":"E249-250","group_name":"E 249-250"}},{"amending_act":"COMMISSION REGULATION (EU) 2023/2108 of 6 October 2023","amending_celex":"32023R2108","amending_oj_date":"2023-10-09","annex":"II","footnotes":[{"number":"7","text":"(7): Maximum amount that may be added during the manufacturing, expressed as NaNO2 or NaNO3"}],"in_force_at_date":false,"max_level":"100","part":"E","period_to":"2025-10-09","published_as":"Nitrites","restrictions":"only sterilised meat products (Fo > 3,00)\nPeriod of application: until 9 October 2025","via_group":{"group_key":"E249-250","group_name":"E 249-250"}}],"food_category":{"annex":"II","code":"08.3.2","name":"Heat-treated meat products","parent_code":"08.3"},"limits":["A food additive has no status in the abstract: an authorisation is published for a couple (additive, food category) …","The Union list is positive: a couple with no published authorisation is 'not_authorised' at the queried date …","Maximum levels, restrictions and footnotes are served exactly as published …","Group authorisations … are stored as published and resolved at read time, with 'via_group' reporting the resolution …","Out of scope: flavourings, food enzymes, novel foods, allergen labelling, nutrition declaration, acceptable daily intakes …"],"note":"E 250 is not authorised by name in food category 08.3.2: the authorisation is published for the group(s) E 249-250, of which it is a published member. The group reference is kept as published and resolved at read time.","verdict":"authorised","version":{"applicable_from":"2026-02-18","applicable_to":"2026-08-18","consolidated_ref":"02008R1333 — EN — 18.02.2026"}},"provenance":{"fetched_at":"2026-08-01T17:06:48Z","freshness":{"as_of":"2026-02-18T00:00:00Z","kind":"snapshot"},"source":"Regulation (EC) No 1333/2008 on food additives — consolidated text (EUR-Lex), Annex II (Union list by food category) and Annex III"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"additive":{"type":"object","properties":{"e_number":{"type":"string"},"e_number_published":{"type":"string"},"functional_classes":{"type":"array","items":{"type":"string"}},"groups":{"type":"array","items":{"type":"string"}},"name":{"type":"string"}},"required":["e_number","e_number_published","functional_classes","groups","name"]},"authorisations":{"type":"array","items":{"type":"object","properties":{"amending_act":{"type":"string"},"amending_celex":{"type":"string"},"amending_oj_date":{"type":"string"},"annex":{"type":"string"},"footnotes":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string"},"text":{"type":"string"}},"required":["number","text"]}},"in_force_at_date":{"type":"boolean","description":"Always present. Does this line apply at the queried date? Mechanically derived from period_from/period_to (bounds included), never a judgement: a line with no published period is true. Expired lines are NEVER dropped - they are served as published and flagged false, because the text publishes them"},"max_level":{"type":"string"},"part":{"type":"string"},"period_from":{"type":["string","null"],"description":"Start of the 'Period of application' published INSIDE restrictions, copied out as YYYY-MM-DD; absent when the line publishes none. The restrictions text itself keeps the period word for word - nothing is rewritten. A period reserved to part of the line's scope ('as regards bananas, mangoes...') is deliberately NOT copied out: it would state something the text does not"},"published_as":{"type":"string"},"restrictions":{"type":"string"},"via_group":{"type":"object","properties":{"group_key":{"type":"string"},"group_name":{"type":"string"}},"required":["group_key","group_name"]},"period_to":{"type":["string","null"],"description":"End of that same period, same rules. Two lines of one couple commonly hand over on the same date ('until 9 October 2025' / 'from 9 October 2025'); the text does not say which one lapses that day, so both are flagged applicable on it"}},"required":["amending_act","amending_celex","amending_oj_date","annex","footnotes","in_force_at_date","max_level","part","period_from","published_as","restrictions","via_group"]},"description":"One per published line covering the couple: annex, part, max_level (word for word - 'quantum satis' is served as published, never converted to a number), restrictions, target/carrier (Annex III), footnotes (number + text verbatim), the amending regulation, and via_group when the authorisation is published for a group (Group I to IV, ranges such as 'E 249 - 250') rather than for the additive by name. Empty on not_authorised. A couple often publishes SEVERAL lines, some of them time-bounded: lines applicable at the queried date come first, source order kept within each group"},"food_category":{"type":"object","properties":{"annex":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"parent_code":{"type":"string"}},"required":["annex","code","name","parent_code"]},"limits":{"type":"array","items":{"type":"string"},"description":"The fixed caveats carried by every response: an additive has no status without a food category; the Union list is positive so not_authorised is dated and is not a safety assessment; levels and footnotes are served exactly as published; group authorisations are resolved at read time with via_group (an unpublished composition is not expanded); flavourings, enzymes, novel foods, allergen labelling and ADIs are out of scope. One more is appended when EVERY served line is out of its period of application at the queried date: the verdict stays authorised because the Union list does publish authorisations for the couple, not because one applies that day"},"note":{"type":"string"},"verdict":{"type":"string","description":"Closed enumeration, present ONLY when food_category was provided: authorised or not_authorised. Both are billed 200s - under the positive Union list, 'no published authorisation for this couple at this date' is the information, and the verdict is dated"},"version":{"type":"object","properties":{"applicable_from":{"type":"string"},"applicable_to":{"type":"string"},"consolidated_ref":{"type":"string"}},"required":["applicable_from","applicable_to","consolidated_ref"]}},"required":["additive","authorisations","food_category","limits","note","verdict","version"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"date":{"type":"string","description":"Optional date (YYYY-MM-DD, default today): serves the consolidated version in force at that date. Earlier than the oldest ingested version = 400 naming the bound"},"e_number":{"type":"string","description":"Optional on its own - E number, template E + 3 or 4 digits + optional letter and roman numeral ('E 160a(i)'). Provide exactly ONE key among e_number and name (exact published name); zero or both = 400, off-template = 400 before any lookup. An E number unknown to the Union list = 404, not billed"},"food_category":{"type":"string","description":"Optional - Food category code AS PUBLISHED ('08.3.2'; Annex III parts are exposed as 'III.1' to 'III.5'). It changes the shape of the answer: WITH it you get a verdict plus authorisations[]; WITHOUT it you get NO verdict field at all and instead data.authorised_in {total, truncated, categories[] (code, name, via_group), capped at 100} - an inventory, never an 'authorised' claim in the abstract, since an additive has no status without a food category. A code outside the referential = 400 not billed; provided empty = 400"}},"required":[]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/label-food-additive","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Check a food additive in an EU food category","tags":["label"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}},{"resource":{"url":"https://api.invoket.com/label/lookup","description":"Turn an ingredient name read off a label - 'sodium nitrite', 'titanium dioxide', an INCI name - into the exact CAS, EC, INCI or E number that /label/chem/classify, /label/chem/svhc, /label/cosmetic/ingredient and /label/food/additive require. Sources: ECHA Annex VI and Candidate List, the consolidated Cosmetics and Food Additives Regulations, and the Commission CosIng index. Closed verdict: exact, ambiguous or none, and every candidate names the endpoints it opens.","mimeType":"application/json"},"type":"http","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0x4465825B0ac713aA2Fa07Ea29023020804A128ee","maxTimeoutSeconds":60,"extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"10000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"Ae1uowYSjbH47uCiZMmc51Aqxf964b1Fs4d1bjaPmMN6","maxTimeoutSeconds":60,"extra":{"domain":"invoket.com","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}}],"lastUpdated":"2026-08-17T20:33:46Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET","queryParams":{"q":"sodium nitrite"},"headers":{"accept":"application/json"},"schema":{"type":"object","properties":{"q":{"type":"string","description":"Required - the ingredient designation as it appears on the label: a common name, an INCI name, a chemical denomination or an additive name. Absent or carrying no significant character is a 400 and nothing is billed - a malformed request is not a 'none'. Matching is exact on the shared normalisation of the designations the referentials themselves publish: punctuation becomes word separation, while stereochemical and positional prefixes and multipliers are KEPT, because dropping them would make distinct substances converge"}},"required":["q"]}},"output":{"type":"json","example":{"data":{"candidates":[{"endpoints":["/label/chem/classify","/label/cosmetic/ingredient"],"id":"7632-00-0","id_kind":"cas","label":"sodium nitrite","sources":["annex_vi","cosmetics","cosing_index"]},{"endpoints":["/label/chem/classify","/label/cosmetic/ingredient"],"id":"231-555-9","id_kind":"ec","label":"sodium nitrite","sources":["annex_vi","cosmetics","cosing_index"]},{"endpoints":["/label/cosmetic/ingredient"],"id":"Sodium nitrite","id_kind":"inci","label":"Sodium nitrite","sources":["cosmetics","cosing_index"]},{"endpoints":["/label/food/additive"],"id":"E250","id_kind":"e_number","label":"Sodium nitrite","sources":["food_additives"]}],"limits":"A resolution names what the referential publishes for the text you sent, as of the date carried by the provenance; it does not certify that the entity resolved is the one you had in mind. A common name may designate a group of substances rather than a single one, and this resolution never chooses for you: every candidate found is listed. Matching is exact on the shared normalisation of the designations published by the referentials themselves - no fuzzy matching and no synonym dictionary of our own - so 'none' means the text is absent from the ingested referentials at that date, never that the substance is unregulated.","query":"sodium nitrite","referentials":[{"as_of":"2026-05-01","authority":"binding","referential":"annex_vi","searched":true,"source":"ECHA Annex VI (CLP), harmonised classification and labelling","version":"Annex VI to CLP — harmonised entries in application (latest adaptation: ATP22)"},{"as_of":"2026-08-12","authority":"binding","referential":"candidate_list","searched":true,"source":"ECHA Candidate List of SVHC (REACH Art. 59(10))"},{"as_of":"2026-05-01","authority":"binding","referential":"cosmetics","searched":true,"source":"Regulation (EC) No 1223/2009 on cosmetic products — consolidated text (EUR-Lex), Annexes II to VI","version":"02009R1223 — EN — 01.05.2026"},{"as_of":"2026-05-01","authority":"information_only","referential":"cosing_index","searched":true,"source":"CosIng (European Commission) via public EU Search API"},{"as_of":"2026-02-18","authority":"binding","referential":"food_additives","searched":true,"source":"Regulation (EC) No 1333/2008 on food additives — consolidated text (EUR-Lex), Annex II (Union list by food category) and Annex III","version":"02008R1333 — EN — 18.02.2026"}],"total":4,"truncated":false,"verdict":"ambiguous"},"provenance":{"fetched_at":"2026-08-17T20:25:02.992148591Z","freshness":{"as_of":"2026-02-18T00:00:00Z","kind":"snapshot"},"source":"ECHA Annex VI (CLP), harmonised classification and labelling; ECHA Candidate List of SVHC (REACH Art. 59(10)); Regulation (EC) No 1223/2009 on cosmetic products — consolidated text (EUR-Lex), Annexes II to VI; CosIng (European Commission) via public EU Search API; Regulation (EC) No 1333/2008 on food additives — consolidated text (EUR-Lex), Annex II (Union list by food category) and Annex III"}},"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"candidates":{"type":"array","items":{"type":"object","properties":{"endpoints":{"type":"array","items":{"type":"string"},"description":"Which endpoints of this service that identifier opens - those of the referentials that actually returned it, never a theoretical list. A candidate no endpoint would resolve is never served"},"id":{"type":"string","description":"The identifier downstream accepts AS IS - copy it into the endpoints listed alongside it without reworking it. Identifier cells that the sources publish WITHOUT them being an identifier are never served here: a placeholder ('-') or a composite cell listing several ('13463-67-7/1317-70-0/1317-80-2', the form the Cosmetics Annex actually publishes for titanium dioxide). They are not split - that would be rewriting the source - they are COUNTED in 'source_identifiers_not_usable', and the entry is still reachable through the denomination the referential indexes"},"id_kind":{"type":"string","description":"The nature of the identifier: 'cas', 'ec', 'inci', 'e_number' or 'name'. One text producing several natures is the normal 'ambiguous' of this domain, and it is the point: one call opens the chemical, the cosmetic and the food route at once"},"label":{"type":"string","description":"The designation as the source publishes it - never recased, never re-accented, never completed. When several referentials publish the same identifier under different labels, this is the one from the first referential in the fixed query order, which is also the first entry of 'sources'"},"sources":{"type":"array","items":{"type":"string"},"description":"Which referentials publish THIS identifier for the text you sent, in the fixed query order. The same identifier published by several referentials is ONE candidate whose sources merge, never a duplicate. Their dating and their authority live in 'referentials'"}},"required":["endpoints","id","id_kind","label","sources"]},"description":"Always served - one element on 'exact', EMPTY on 'none', never absent and never null. Capped at 25, with 'total' and 'truncated' saying the rest; there is no pagination, because a second page would be a second paid call for the same question. Narrow with 'domain' instead"},"limits":{"type":"string","description":"Fixed sentence served in every response. Its first half is common to the whole lookup family; the rest is this domain's, and the sentence that matters is the last one: matching uses ONLY the designations the referentials themselves publish - there is no synonym dictionary of ours, because inventing one would mean selling a referential of our own as if it were official. So a 'none' means the text is absent from the ingested referentials at that date, never that the substance is unregulated"},"query":{"type":"string","description":"The text you sent, echoed as received - what was actually resolved"},"referentials":{"type":"array","items":{"type":"object","properties":{"as_of":{"type":"string","description":"The date of the state queried: the applicability date of the version served (the ATP in force, the consolidated text in force) or the extraction date. The root provenance carries the OLDEST of them - a 'none' without a date is worth nothing, because you must be able to say 'absent from the 1 May stock', not 'absent'"},"authority":{"type":"string"},"referential":{"type":"string"},"searched":{"type":"boolean","description":"false means the referential is not yet ingested (or the CosIng index was not captured on the last run): it was not queried, and saying so is the minimum. A 'none' whose scope has an unsearched referential is a narrower statement than it looks"},"source":{"type":"string"},"version":{"type":"string"}},"required":["as_of","authority","referential","searched","source","version"]},"description":"Every referential in the requested scope with its authority, whether it could be queried, its date and its regulatory version. 'authority' is 'binding' for a regulatory publication (a CLP or Cosmetics annex, the REACH legal list) and 'information_only' for the CosIng index, which resolves an IDENTITY and renders no verdict - only the annexes carry legal force"},"total":{"type":"integer","description":"Candidates found BEFORE the 25-item cap. The verdict is derived from this number, never from the served slice, so a truncated list can never be 'exact'. A real truncation case on the production store: 'petroleum gas' returns 182"},"truncated":{"type":"boolean","description":"Whether the served list is cut at the cap"},"verdict":{"type":"string","description":"Closed enumeration, and there is nothing else. 'exact': one single candidate answers. 'ambiguous': several do - common here, because one text carries several NATURES of identifier (a CAS, an EC number, an INCI name, an E number) - and they are ALL returned. 'none': the ingested referentials publish nothing for this text at that date, which is NOT a statement that the substance is unregulated. All three are 200 and all three are billed: 'none' is the answer that stops an agent inventing a CAS number"},"source_identifiers_not_usable":{"type":"integer"}},"required":["candidates","limits","query","referentials","total","truncated","verdict"]},"provenance":{"type":"object","properties":{"fetched_at":{"type":"string"},"freshness":{"type":"object","properties":{"as_of":{"type":"string"},"kind":{"type":"string"}},"required":["as_of","kind"]},"source":{"type":"string"}},"required":["fetched_at","freshness","source"]}},"required":["data","provenance"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"schema":{"type":"object"},"queryParams":{"type":"object","properties":{"q":{"type":"string","description":"Required - the ingredient designation as it appears on the label: a common name, an INCI name, a chemical denomination or an additive name. Absent or carrying no significant character is a 400 and nothing is billed - a malformed request is not a 'none'. Matching is exact on the shared normalisation of the designations the referentials themselves publish: punctuation becomes word separation, while stereochemical and positional prefixes and multipliers are KEPT, because dropping them would make distinct substances converge"}},"required":["q"]},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}},"metadata":{"method":"GET","docUrl":"https://invoket.com/docs/api/label-lookup","feedback":"Found a gap, a bug, or a missing case? Send structured feedback (no payment required) via POST /review.","title":"Resolve an ingredient name to its regulatory identifier","tags":["label","lookup"],"trial":{"enabled":true,"limit":"1 free call per day per payer address"},"priceUsd":"0.01"}}],"pagination":{"limit":75,"offset":0,"total":75}}