Skip to main content
Private preview: this is rolling out and may not be available on your account yet.
This page is the reference for the verifier quickstart. An agent presents a Stamped Mandate as a token in the x-sumvin-pint-token request header, with no Bearer prefix, addressed to your site’s hostname. You check it offline, on your own server, with no key. The exchange and the online check are only for a service that already holds the signed request a person approved, for example for the service’s own app. An agent never sends a site the signed request. Both calls authenticate with your API key as Authorization: Bearer <key>.

Offline check

Verify the token with any standard JWT library against: Pin the algorithm to ES256, the only one Sumvin signs with, so a token signed any other way is refused rather than trusted. Pick the key by the identifier in the token’s header, and let the library refresh the key set: keys rotate, so never copy one into your code. A token that fails any part of the check is a refusal.
Coming soon: an online check for tokens addressed to a website. Until then, the offline check is the whole check: it tells you the token is genuine, addressed to you and unexpired, but not whether the person has revoked it since.

From the CLI

The CLI runs the same check:
With --offline it makes no Sumvin API calls, so the revocation check reports as unverified. An unverified check never counts as a pass, so the overall answer is no and the command exits 2; read the signature, issuer, expiry and audience lines individually. The CLI’s own revocation check only answers for mandates you own. The CLI is itself in Private preview.

Exchange

For a service that already holds the person’s signed request. Send the signed request the person approved, unchanged, with audience set to your Organisation ID. Any other audience is refused. During the preview, some mandates can’t be exchanged yet; those return PINT-403-009. The body carries sig (the token), id (the mandate identifier), scopes and expires_at (epoch milliseconds). One signed request can be exchanged by up to ten parties, each getting its own token addressed to itself. When the mandate expires or the person revokes it, every token issued against it stops working together. The person’s verification is checked again at every exchange. A request signed while they were verified yields nothing new if their verification has lapsed since.

Online check

For a token from the exchange, addressed to your organisation.
URL-encode the mandate identifier: it contains colons.
Rules of the online check:
  • It answers only for mandates addressed to you. A mandate with no token addressed to your organisation returns 404, whether or not it exists. This is how one verifier is kept from probing another’s mandates.
  • Answers can be up to 30 seconds old. The answer for each mandate is cached per organisation for 30 seconds.
  • valid is this mandate’s own state. The fuller stands answer in What a verifier checks also accounts for any larger mandate this one was narrowed from. That answer is available through the connector’s mandate_verify tool; see Check a mandate.
To read the mandate’s scopes, status and expiry, call GET https://sis.sumvin.com/v0/sis/pint/{id} with the same key. It follows the same rule: 404 unless a token for the mandate is addressed to your organisation.

Errors

Errors come back as a problem document with an error code, except a missing Authorization header, which returns 401 with {"detail": "Not authenticated"}. More codes are listed in Errors.