Skip to content

Playground

What the answers actually look like.

Example data — no live source was queried. The shapes below are exactly what the server returns. The values are synthetic and say nothing about any real company.

validate_vat_number

Structure and checksum only — no network, no register.

Request

{
  "vatNumber": "BE0123456749"
}

Response

{
  "valid": true,
  "issue": "ok",
  "countryCode": "BE",
  "number": "0123456749",
  "normalized": "BE0123456749",
  "message": "Structurally valid Belgium VAT number."
}

Charged The tool ran and answered.

Example data — no live source was queried.

verify_vat_vies

Live status against the official EU VIES register, with provenance.

Request

{
  "vatNumber": "BE0123456749"
}

Response

{
  "vatNumber": "BE0123456749",
  "countryCode": "BE",
  "state": "valid",
  "provenance": {
    "source": "EU VIES",
    "checkedAt": "2026-07-27T12:00:00.000Z",
    "expiresAt": "2026-07-28T12:00:00.000Z"
  }
}

Charged The tool ran and answered.

Example data — no live source was queried.

verify_vat_vies

The same call when the source cannot answer. The state is unavailable — not invalid, and not a hidden no.

Request

{
  "vatNumber": "BE0123456749"
}

Response

{
  "vatNumber": "BE0123456749",
  "countryCode": "BE",
  "state": "unavailable",
  "provenance": {
    "source": "EU VIES",
    "checkedAt": "2026-07-27T12:00:00.000Z"
  },
  "note": "The source could not answer. No claim is made about this VAT number."
}

Not charged A provider outage is never charged — the tool could not run.

Example data — no live source was queried.

lookup_peppol_participant

Whether a receiver is reachable on the Peppol network.

Request

{
  "vatId": "BE0123456749",
  "countryCode": "BE"
}

Response

{
  "identifier": "BE0123456749",
  "scheme": "0208",
  "status": "registered",
  "registered": true,
  "supportsBis30Invoice": true,
  "source": "Peppol SML/SMP",
  "checkedAt": "2026-07-27T12:00:00.000Z"
}

Charged The tool ran and answered.

Example data — no live source was queried.

validate_invoice

Full structural report with computed totals — never fails fast.

Request

{
  "invoice": {
    "invoiceNumber": "INV-2026-0001",
    "issueDate": "2026-07-27",
    "dueDate": "2026-08-26",
    "currency": "EUR",
    "supplier": {
      "name": "Example Seller BV",
      "countryCode": "BE",
      "vatId": "BE0123456749",
      "street": "Teststraat 1",
      "city": "Gent",
      "postalZone": "9000"
    },
    "customer": {
      "name": "Example Buyer NV",
      "countryCode": "BE",
      "vatId": "BE0123456749",
      "street": "Proefweg 2",
      "city": "Antwerpen",
      "postalZone": "2000"
    },
    "lines": [
      {
        "description": "Consulting",
        "quantity": 2,
        "unitPrice": 500,
        "vatPercent": 21
      }
    ]
  }
}

Response

{
  "valid": true,
  "issues": [],
  "totals": {
    "currency": "EUR",
    "taxExclusiveAmount": "1000.00",
    "taxAmount": "210.00",
    "payableAmount": "1210.00"
  }
}

Charged The tool ran and answered.

Example data — no live source was queried.

get_einvoice_readiness

Your OWN workspace configuration. It takes no company or VAT number and says nothing about a counterparty.

Request

{
  "verifyWithProvider": false
}

Response

{
  "state": "sandbox_ready",
  "environment": "sandbox",
  "ready": [
    "Provider connection configured.",
    "Sender identifier registered."
  ],
  "missing": [],
  "nextAction": "Run a sandbox invoice to confirm the end-to-end path.",
  "availability": {
    "outgoingSend": false,
    "inboundReceive": false
  }
}

Charged The tool ran and answered.

Example data — no live source was queried.

The receipt

Every accepted call returns one of these. This is the real envelope shape.

{
  "version": "2",
  "keyId": "canary-ed25519-demo-not-a-published-key",
  "alg": "Ed25519",
  "kind": "execution",
  "receiptId": "rcpt_example_0001",
  "subject": "dev:example",
  "clientId": "client_example",
  "tool": "verify_vat_vies",
  "requestId": "req_example_0001",
  "idempotencyKey": "idem_example_0001",
  "policyVersion": "2026-07-27.1",
  "scopeDecision": "granted",
  "budgetDecision": "charged",
  "paymentRail": "none",
  "entitlementRef": "ent_example",
  "provider": "EU VIES",
  "providerStatus": "valid",
  "requestHash": "0000000000000000000000000000000000000000000000000000000000000000",
  "resultHash": "1111111111111111111111111111111111111111111111111111111111111111",
  "createdAt": "2026-07-27T12:00:00.000Z",
  "completion": "succeeded",
  "retryStatus": "first_attempt",
  "signature": "EXAMPLE-SIGNATURE-THIS-RECEIPT-IS-NOT-SIGNED-AND-WILL-NOT-VERIFY"
}
This is an example receipt in the real envelope shape. It is NOT signed, its key id is not published, and it will not verify — deliberately. A real receipt is signed by the key at /receipts/public-key.pem and verifies offline, without asking us anything.

How you verify a real one

  1. 1. Fetch the public key from https://mcp.jithox.com/receipts/public-key.pem.
  2. 2. Rebuild the signing input: the receipt's canonical fields, sorted, with the signature excluded.
  3. 3. Verify the Ed25519 signature against that input.
  4. 4. The key is published, so this works offline and forever — including after a key rotation, because retired public keys stay published.

What this page is not

  • · No live source was queried for any example on this page.
  • · The values are synthetic. They are not a statement about any real company.
  • · The example receipt is unsigned and will not verify.
  • · Nothing here creates an account, a credential or a charge.

Run it against the real sources

25 live calls over 14 days, no card.

Start the free trial