---
title: "JP-Verify Invoice Facts — the same facts read from a JP PINT UBL Invoice (XML)"
method: POST
path: "/v1/invoice/check/pint"
tags: ["Compliance"]
---

# JP-Verify Invoice Facts — the same facts read from a JP PINT UBL Invoice (XML)

`POST /v1/invoice/check/pint`

## Request

- Base URL: `https://jp-verify.obolpay.xyz`
- URL: `https://jp-verify.obolpay.xyz/v1/invoice/check/pint`
- Auth: one of:
  - none
  - API key in header `X-API-Key`

The same check as ``POST /v1/invoice/check``, with the facts read from a JP PINT UBL
``Invoice`` (``Content-Type: application/xml`` or ``text/xml``): the seller's VAT
``CompanyID`` (ibt-031) is the 登録番号, ``ActualDeliveryDate`` (ibt-072) or the
``InvoicePeriod`` (ibg-14) is the evaluation date, the document-currency ``TaxTotal``'s
subtotals are the per-rate lines, and the PINT-01..15 structural rules are added (checks
against the published JP PINT 1.1.3 rule ids — NOT a Schematron validation; no OpenPeppol
files are redistributed). The ``document.digest`` is sha256 over the exact bytes received.

**NOT tax advice**: register facts, document checks and the published schedule only; no
determination of any deduction, credit or entitlement — the buyer's consumption-tax
treatment is for the taxpayer and their 税理士.

Free refusal, nothing charged: 413 over ``INVOICE_XML_MAX_BYTES`` (1 MiB by default); 415
for a media type other than XML; 400 for a document that cannot be read (not UTF-8 — NUL
bytes, i.e. a BOM-less UTF-16/UTF-32 document, included; a DOCTYPE / entity declaration;
an entity reference other than the five predefined / numeric ones, or a bare ``&`` anywhere
in the document, CDATA sections and comments included — encode it as ``&amp;``; not
well-formed; element or depth caps; a root other than ``Invoice`` — a UBL ``CreditNote``
is not a JP PINT document: JP PINT models a 適格返還請求書 as a negative ``Invoice`` 380,
checked with ``?document_type=return_invoice``; a JP BIS Self Billing Invoice (389); a
missing ``IssueDate`` / ``DocumentCurrencyCode``; more than 10 tax subtotals) or a malformed
``?transaction_date=`` / ``?document_type=`` / ``?sign=``. A missing or malformed 登録番号
in the document is a metered finding, reported WITHOUT its text. Metered 1 unit per
document; ``?sign=1`` (or ``true``; ``0`` / ``false`` / empty = unsigned, any other value
a free 400) as on the JSON route; opt-in ``Idempotency-Key`` (fingerprint = method + path + the
effective ``transaction_date`` / ``document_type`` / ``sign`` query parameters + the
document bytes — the same key with a different query is refused, 422). The media type is
checked before the body is read and an invalid / exhausted key is refused before the
document is parsed. Nothing from the document is stored, logged or echoed beyond dates,
counts, the well-formed T-number, and identifiers / codes that match a bounded identifier
shape (otherwise null, presence in ``extraction.fields_found``).

## Query parameters

- `sign` string: 1 or true = return an Ed25519-signed record (Growth+); 0, false or empty (default) = unsigned; any other value is a free 400
- `transaction_date` string: 'YYYY-MM-DD' — overrides the document's own Delivery/ActualDeliveryDate (ibt-072) / InvoicePeriod (ibg-14) as the evaluation date
- `document_type` string: qualified_invoice (default) | simplified_qualified_invoice | return_invoice (適格返還請求書 — a negative JP PINT Invoice 380; the original supply date comes only from ?transaction_date=) — as claimed by the caller; ignored, with a note, for a JP BIS Invoice for Non-tax Registered Businesses document (document_type is derived as non_tax_invoice)

## Headers

- `X-API-Key` string

## Response `200`

One document's register facts, document checks, published schedule tier and limitations — every rule with a status and a source; never a verdict. Two real responses on the sample register: a registered issuer, and a malformed 登録番号 reported as a finding whose `register` record is `invalid` with every key present (null) and the printed text never echoed.

- unknown

## Other responses

- `400`: Malformed input — refused before metering; nothing was charged.
- `401`: Unknown, inactive, or expired API key.
- `413`: Request body over the size cap — refused before it was buffered or parsed; nothing was charged.
- `415`: The XML route needs a JP PINT UBL document sent as application/xml or text/xml; nothing was charged.
- `422`: Validation Error
- `429`: Quota exceeded for the caller's tier.
- `503`: The register, or an optional feature, is unavailable or not configured on this deployment. A register 503 (since 1.4.1) also carries the mirror's `data_as_of` with the source fields — `source_latest_diff_date` (the newest 差分 the NTA 公表サイト listed when the sync last read it), `source_checked_at`, `source_gap_business_days` and `freshness.rule` (`stale` here) — so a caller can tell a mirror that is behind its source (`data_date` older than `source_latest_diff_date`) from a source that has not published (equal, but `source_checked_at` older than `freshness.source_check_max_hours`); `data_as_of` is null when the mirror is absent. Nothing was charged.

---

[API](https://skmtc.dev/obolpay/apis/jp-verify.md) · [All operations](https://skmtc.dev/obolpay/apis/jp-verify/llms.txt) · [OpenAPI document](https://skmtc.dev/obolpay/apis/jp-verify/revisions/bf8851690df0?raw)
