Check an invoice before approving it.
Reconcile invoice fields and line items against expected purchase details. Recalculate totals and receive a structured match, discrepancy, or needs_review decision with evidence. A match is a reconciliation result; it does not authorize a payment or accounting entry.
Connect your agent
Use an x402-capable MCP client with the Streamable HTTP endpoint below. Discovering tools and choosing a tier are free.
https://mcp.dropenginehq.com/api/invoice-mcp- Call
invoice_preflight_quotewith the document type and PDF page count. - Call the returned invoice tool with exactly one document source and expected purchase details.
- The client approves the exact Base USDC charge and retries with the signed x402 authorization.
- Use the decision and evidence to apply your own approval policy. Missing expected purchase details produce
needs_review.
Tools and prices
invoice_preflight_quote: free; document metadata only.invoice_preflight: $0.065 USDC; UBL XML, PDF/image up to 3 pages.invoice_preflight_10_pages: $0.13 USDC; PDF/image up to 10 pages.invoice_preflight_50_pages: $0.475 USDC; PDF/image up to 50 pages.
UBL XML limit: 1 MB. PDF/image limit: 10 MB. PDF/image processing uses Mistral OCR; documents are sent to that provider. Raw invoice content is not persisted by this service. Failed processing does not produce a successful settlement receipt.
Executable UBL example
These synthetic arguments return match when passed to invoice_preflight.
{
"document_xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n <cbc:ID>INV-8821</cbc:ID>\n <cbc:DocumentCurrencyCode>USD</cbc:DocumentCurrencyCode>\n <cac:OrderReference><cbc:ID>PO-8841</cbc:ID></cac:OrderReference>\n <cac:AccountingSupplierParty><cac:Party><cac:PartyLegalEntity><cbc:RegistrationName>Example Ltd</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingSupplierParty>\n <cac:TaxTotal><cbc:TaxAmount currencyID=\"USD\">24.00</cbc:TaxAmount></cac:TaxTotal>\n <cac:LegalMonetaryTotal><cbc:TaxExclusiveAmount currencyID=\"USD\">100.00</cbc:TaxExclusiveAmount><cbc:PayableAmount currencyID=\"USD\">124.00</cbc:PayableAmount></cac:LegalMonetaryTotal>\n <cac:InvoiceLine><cbc:ID>1</cbc:ID><cbc:LineExtensionAmount currencyID=\"USD\">60.00</cbc:LineExtensionAmount><cac:Item><cbc:Name>Service A</cbc:Name></cac:Item></cac:InvoiceLine>\n <cac:InvoiceLine><cbc:ID>2</cbc:ID><cbc:LineExtensionAmount currencyID=\"USD\">40.00</cbc:LineExtensionAmount><cac:Item><cbc:Name>Service B</cbc:Name></cac:Item></cac:InvoiceLine>\n</Invoice>",
"expected": {
"supplier_name": "Example Ltd",
"purchase_order": "PO-8841",
"currency": "USD",
"total": "124.00"
}
}HTTP clients and catalogs
POST https://mcp.dropenginehq.com/api/invoice-preflightSend the same JSON arguments. An unpaid request returns HTTP 402 with a base64 JSON PAYMENT-REQUIRED header containing pricing and the Bazaar input/output schema. An x402 client retries with PAYMENT-SIGNATURE; a successful response contains the result and PAYMENT-RESPONSE receipt. GET and HEAD provide the challenge for discovery and never execute a paid invoice check. This HTTP route supports the 3-page tier; use MCP for larger invoices.