Tinplate 42 Edge APIs

Compliance & Business Tier 1 Ready POST /v1/invoice-validator

Invoice Math & EU EN 16931 / Peppol Validator API — Verify Totals & VAT Rules

Audit extracted invoices for line-item math errors, VAT mismatches, and Peppol compliance. Validate extracted invoice JSON for line-item arithmetic, VAT rate compliance, reverse-charge rules, IBAN/VAT syntax, and EU EN 16931 / Peppol conformance.

Try It Live in Your Browser · No API Key Required

1. Interactive Sandbox & Sample JSON Output

200 OK · Ready

Editable Request JSON (POST /v1/invoice-validator)

Live 200 OK Response Envelope

{
  "ok": true,
  "data": {
    "valid": true,
    "verdict": "valid",
    "math_valid": true,
    "en16931_conformant": true,
    "computed_totals": {
      "subtotal_net": 100,
      "total_vat": 0,
      "total_gross": 100,
      "vat_breakdown": [
        {
          "vat_rate": 0,
          "taxable_net": 100,
          "vat_amount": 0,
          "gross_amount": 100
        }
      ]
    },
    "issues": []
  },
  "meta": {
    "request_id": "req_inv_01",
    "ms": 1
  }
}

2. Quickstart Code Examples

Full TypeScript & Python SDK →
curl -X POST "https://api.tinplate.dev/v1/invoice-validator" \
  -H "Content-Type: application/json" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -d '{"invoice":{"invoice_number":"INV-2026-0412","issue_date":"2026-11-14","currency":"EUR","seller":{"name":"Acme GmbH","vat_number":"DE123456789","country_code":"DE"},"buyer":{"name":"Client BV","vat_number":"NL123456782B01","country_code":"NL"},"line_items":[{"description":"Cloud API Pro","quantity":2,"unit_price":50,"net_amount":100,"vat_rate":0,"vat_amount":0,"gross_amount":100}],"subtotal_net":100,"total_vat":0,"total_gross":100,"reverse_charge":true},"check_en16931":true}'
import { TinplateClient } from "@tinplate/sdk"; // npm install @tinplate/sdk

const tinplate = new TinplateClient({
  rapidApiKey: process.env.RAPIDAPI_KEY!,
});

const { data, meta } = await tinplate.call("/v1/invoice-validator", {
  "invoice": {
    "invoice_number": "INV-2026-0412",
    "issue_date": "2026-11-14",
    "currency": "EUR",
    "seller": {
      "name": "Acme GmbH",
      "vat_number": "DE123456789",
      "country_code": "DE"
    },
    "buyer": {
      "name": "Client BV",
      "vat_number": "NL123456782B01",
      "country_code": "NL"
    },
    "line_items": [
      {
        "description": "Cloud API Pro",
        "quantity": 2,
        "unit_price": 50,
        "net_amount": 100,
        "vat_rate": 0,
        "vat_amount": 0,
        "gross_amount": 100
      }
    ],
    "subtotal_net": 100,
    "total_vat": 0,
    "total_gross": 100,
    "reverse_charge": true
  },
  "check_en16931": true
});
console.log(`[${meta.ms} ms]`, data);
import requests

response = requests.post(
    "https://api.tinplate.dev/v1/invoice-validator",
    headers={
        "Content-Type": "application/json",
        "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    },
    json={
  "invoice": {
    "invoice_number": "INV-2026-0412",
    "issue_date": "2026-11-14",
    "currency": "EUR",
    "seller": {
      "name": "Acme GmbH",
      "vat_number": "DE123456789",
      "country_code": "DE"
    },
    "buyer": {
      "name": "Client BV",
      "vat_number": "NL123456782B01",
      "country_code": "NL"
    },
    "line_items": [
      {
        "description": "Cloud API Pro",
        "quantity": 2,
        "unit_price": 50,
        "net_amount": 100,
        "vat_rate": 0,
        "vat_amount": 0,
        "gross_amount": 100
      }
    ],
    "subtotal_net": 100,
    "total_vat": 0,
    "total_gross": 100,
    "reverse_charge": true
  },
  "check_en16931": true
}
)
print(response.json())
const response = await fetch("https://api.tinplate.dev/v1/invoice-validator", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
  },
  body: JSON.stringify({
  "invoice": {
    "invoice_number": "INV-2026-0412",
    "issue_date": "2026-11-14",
    "currency": "EUR",
    "seller": {
      "name": "Acme GmbH",
      "vat_number": "DE123456789",
      "country_code": "DE"
    },
    "buyer": {
      "name": "Client BV",
      "vat_number": "NL123456782B01",
      "country_code": "NL"
    },
    "line_items": [
      {
        "description": "Cloud API Pro",
        "quantity": 2,
        "unit_price": 50,
        "net_amount": 100,
        "vat_rate": 0,
        "vat_amount": 0,
        "gross_amount": 100
      }
    ],
    "subtotal_net": 100,
    "total_vat": 0,
    "total_gross": 100,
    "reverse_charge": true
  },
  "check_en16931": true
}),
});
const result = await response.json();
console.log(result);
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tinplate_invoice_validator",
    "arguments": {
      "invoice": {
        "invoice_number": "INV-2026-0412",
        "issue_date": "2026-11-14",
        "currency": "EUR",
        "seller": {
          "name": "Acme GmbH",
          "vat_number": "DE123456789",
          "country_code": "DE"
        },
        "buyer": {
          "name": "Client BV",
          "vat_number": "NL123456782B01",
          "country_code": "NL"
        },
        "line_items": [
          {
            "description": "Cloud API Pro",
            "quantity": 2,
            "unit_price": 50,
            "net_amount": 100,
            "vat_rate": 0,
            "vat_amount": 0,
            "gross_amount": 100
          }
        ],
        "subtotal_net": 100,
        "total_vat": 0,
        "total_gross": 100,
        "reverse_charge": true
      },
      "check_en16931": true
    }
  }
}
OpenAPI 3.0.3 Schema Contract

Request Parameters & Response Schema Reference

Request Body Parameters (POST /v1/invoice-validator)

Parameter Type & Constraints Description
invoicerequired object Field 'invoice'
rounding_toleranceoptional number
min: 0, max: 1, default: 0.02
Allowed rounding difference per line or total in currency units (default 0.02).
check_en16931optional boolean
default: true
Verify mandatory EN 16931 / Peppol BIS Billing 3.0 fields (BT-1..BT-115).

Response data Object Fields (200 OK)

Field Type Description
valid boolean Field 'valid'
verdict "valid" | "warnings_only" | "invalid" Field 'verdict'
math_valid boolean Field 'math_valid'
en16931_conformant boolean Field 'en16931_conformant'
computed_totals object Field 'computed_totals'
issues object[] Field 'issues'

3. What Invoice & EU EN 16931 / Peppol Validator API Detects & Validates

Honest Engineering Boundaries

4. Known Limitations & Test Verification

Release Version: v1.0.7 · Last Verified / Benchmarked: 14 November 2026 · Latency Note: Sub-millisecond figures measure in-Worker V8 compute time (typical client HTTPS network RTT to the nearest Cloudflare PoP is 15–65 ms) · See Full Portfolio Benchmarks & Corpora →

5. Marketplace Plans & Payload Quotas

Plan Monthly Price Included Requests Rate Limit Max Request Payload Best For
BASIC $0.00 / month 500 / month (hard limit) 10 req / min 64 KB Evaluation, local development & CI smoke tests
PRO $9.99 / month 15,000 / month 60 req / min 128 KB Solo developers & production apps
ULTRA $29.99 / month 100,000 / month 300 req / min 256 KB Growing SaaS & multi-agent pipelines
MEGA $79.99 / month 500,000 / month 1,000 req / min 256 KB High-volume enterprise workloads

6. Frequently Asked Questions

Why validate invoices after LLM / Document AI extraction?

Vision LLMs and OCR models frequently misread a digit or hallucinate totals. Running deterministic math and EN 16931 checks catches extraction errors before ERP import.

Does it handle penny-rounding differences?

Yes, you can configure rounding tolerance (default ±0.02) to distinguish rounding conventions from real arithmetic errors.

Does it check supplier IBAN and EU VAT IDs?

Yes, it validates supplier and customer VAT IDs and payment IBANs automatically.

Zero Payload Logging

7. Data Handling, Privacy & Marketplace Proxy Disclosure

Stateless in-memory invoice verification. Zero financial data is logged or retained.

Worker Zero-Logging Guarantee: Cloudflare Workers Observability and invocation logging are disabled in configuration (observability.enabled = false, head_sampling_rate = 0, invocation_logs = false). Payloads are processed strictly in volatile V8 memory and never logged or stored by Tinplate.

Marketplace Proxies vs. Direct Bearer Key: Requests sent via RapidAPI or Zyla API Hub pass through those marketplaces' proxy infrastructure (subject to their respective privacy policies). Security-sensitive workloads requiring end-to-end zero-intermediary processing can connect directly to https://api.tinplate.dev using a Direct Bearer Key (Authorization: Bearer <API_KEY>). Read our full Privacy Notice and OpenAPI 3.0.3 JSON Schema.

Related Tinplate APIs

🏦 POST /v1/eu-vat-iban/iban Live on Hub

EU VAT & IBAN/BIC Validator API

Validate IBANs, BIC/SWIFT codes, and EU/UK VAT numbers with live EU VIES lookup.

🇭🇺 POST /v1/hu-business-validator Compliance & Business

Hungarian Business Document & NAV Validator API

Validate Hungarian adószám, cégjegyzékszám, GIRO bank accounts, and NAV invoice rules.

🔢 POST /v1/locale-value-parser AI Data Prep

Text-to-Structured Date, Money & Unit Parser API

Normalize messy EU/US prices, dates, percentages, and measurements into structured JSON.