Skip to main content
POST
Exchange a signed purchase intent for a token

Authorizations

x-juno-jwt
string
header
required

JWT issued by Dynamic Labs or Privy. Sent in the x-juno-jwt header on every authenticated request.

Headers

x-juno-orgid
string | null

Tenant org ID for multi-tenant auth

x-sumvin-token
string | null
x-sumvin-pat
string | null
x-juno-jwt
string | null
X-Timestamp-Format
string

Controls how timestamp fields are serialized in JSON response bodies.

Default (header omitted or any other value): epoch milliseconds as integers. iso8601: UTC ISO 8601 strings of the form YYYY-MM-DDTHH:MM:SSZ.

Example: with X-Timestamp-Format: iso8601, the field value 1704067200000 becomes "2024-01-01T00:00:00Z".

Affected fields (recursively, in dicts and arrays): any field whose name ends in _at, plus the literal field names timestamp, period_start, and period_end. All other fields are passed through unchanged.

Only iso8601 is recognized. Any other value (or omitting the header) yields the default epoch-ms representation; the server does not reject unknown values, so this is documented as an example rather than an enum to keep generated clients permissive.

Example:

"iso8601"

Query Parameters

agent
boolean
default:false

Set to true to have the server sign the purchase intent with your own agent signer. In this mode the signature must be omitted, the wallet must be your primary smart wallet, and the token is always addressed to you — an audience naming anyone else is not honoured here. When false (the default), you supply the signature and choose the audience yourself.

Body

application/json
pint
PurchaseIntentPayload · object
required
signature
string | null

The wallet's EIP-712 signature over the purchase intent, 65 bytes hex with a 0x prefix. Required for direct minting. Omit it when minting with agent=true, where the server signs on the caller's behalf.

audience
string | null

Who the minted token is addressed to. Omit it to address the token to yourself, which the server resolves to your own identity — naming your own account explicitly is refused, omit the field instead. To address a party outside Sumvin, give their bare domain in lowercase, such as example.com: no scheme, port, path or trailing dot. A token addressed to a domain may only carry the identity attestations (proof of personhood, KYC status, age over 18); any other scope is refused.

Example:

"example.com"

source_chat_message_id
integer | null

Optional chat message ID correlating this PINT back to the conversation that generated it. When provided, the message must belong to a chat session owned by the authenticated user.

Example:

12345

parent_pint_uri
string | null

Optional URI of an existing PINT this one is allocated against, recording the lineage between them. The parent must belong to the same wallet as this PINT and must itself authorise a purchase that is still open to further spending — an allocation against a purchase that has finished, expired or been cancelled is refused. A PINT allocated against a parent must stay within what the parent authorises: its scopes must be exactly those the parent permits for the requested amount — the same currency and card, with the amount within the parent's limit — its top-level max_amount and max_amount_token must be zero (the spending ceiling is carried by its checkout scope), and it may not expire after the parent. A request that does not match is refused.

Maximum string length: 512
Example:

"sr:us:pint:9f2c1e7a4b8d"

Response

Successful Response

HAL-style hypermedia links for navigation and available actions.

sig
string
required

JWT token issued for the PINT

id
string
required

PINT URI

audience
string
required
scopes
string[]
required
expires_at
integer
required
sri
string | null

Sumvin Resource Identifier for the signer