---
title: "Verify a JP-Verify signed record offline-style"
method: POST
path: "/v1/verify-record"
tags: ["Evidence"]
---

# Verify a JP-Verify signed record offline-style

`POST /v1/verify-record`

## Request

- Base URL: `https://jp-verify.obolpay.xyz`
- URL: `https://jp-verify.obolpay.xyz/v1/verify-record`
- Auth: none declared

## Request body

- object: ``POST /v1/verify-record`` body — a JP-Verify ``signed_record`` object (as returned by ``sign=1`` / ``sign:true``), checked offline-style against the service's published Ed25519 key. Loosely typed on purpose: the ``payload`` shape mirrors whichever endpoint produced the record, so this model only pins down the envelope field every signed record shares.
  - `signature` string, required: base64 Ed25519 signature over the canonical payload — verify independently against GET /pubkey

## Response `200`

Verification result. `kind` (1.6.1): the record type its signature binds (`verify`, `transition_report`, `invoice_check`, `invoice_check_batch`, `shareholders` — open-ended); null for a record issued before 1.6.1 (it has none) or when `valid` is false.

- unknown

## Other responses

- `400`: Not a signed record.
- `413`: Request body over this route's own size cap (VERIFY_RECORD_MAX_BYTES; it holds a single-number record ≈ 5.9 KB, a JP PINT report 68–72 KB and a signed /v1/verify batch of up to ≈ 104–174 numbers — measured 2026-09-30; a larger signed batch record is verified offline: `signature` against GET /pubkey, or the `jws` sibling against /.well-known/jwks.json) — refused before it was buffered or parsed; the route is free.

---

[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)
