Skip to content

API reference

Everything below is rendered from openapi.yaml at build time, not written by hand. If an endpoint changes in the specification, this page changes with it.

Generated from openapi.yaml, Jorvi API, version 0.1.0.30 operations across 15 groups.

/merchants

MethodPathAuthSummary
POST/v1/merchantspublicCreate a merchant account (signup)

/mandates

MethodPathAuthSummary
POST/v1/mandatessecret keyCreate a subscription mandate
GET/v1/mandates/{id}secret keyRetrieve a mandate
GET/v1/mandates/{id}/chargessecret keyList a mandate's charges
GET/v1/mandates/{id}/refundssecret keyList a mandate's refunds
POST/v1/mandates/{id}/revokesecret keyCancel a subscription (merchant-side; stops future pulls)

/charges

MethodPathAuthSummary
POST/v1/charges/{id}/refundsecret keyRefund a settled charge (full or partial)

/webhook_endpoints

MethodPathAuthSummary
GET/v1/webhook_endpointssecret keyList webhook endpoints (secrets masked)
POST/v1/webhook_endpointssecret keyRegister a webhook endpoint

/events

MethodPathAuthSummary
GET/v1/eventssecret keyList delivered events (newest first)

/checkout

MethodPathAuthSummary
GET/v1/checkout/mandates/{id}public[Browser] Checkout view of a mandate
POST/v1/checkout/mandates/{id}/instructionpublic[Browser] Get the wallet authorization instruction
POST/v1/checkout/mandates/{id}/refreshpublic[Browser] Re-check on-chain authorization; activates + settles first charge

/tokens

MethodPathAuthSummary
GET/v1/tokenssecret keyList the tokens this merchant accepts
POST/v1/tokenssecret keyAccept or decline a curated token

/platform

MethodPathAuthSummary
GET/v1/platform/tokenssecret keyThe platform token registry

/token_requests

MethodPathAuthSummary
POST/v1/token_requestssecret keyAsk for a token to be curated
MethodPathAuthSummary
GET/v1/payment_linkssecret keyList payment links
POST/v1/payment_linkssecret keyCreate a payment link

/products

MethodPathAuthSummary
GET/v1/productssecret keyList products
POST/v1/productssecret keyCreate a product
GET/v1/products/{id}secret keyRetrieve a product
PATCH/v1/products/{id}secret keyUpdate a product

/customers

MethodPathAuthSummary
GET/v1/customerssecret keyList subscribers

/metrics

MethodPathAuthSummary
GET/v1/metricssecret keyWindowed merchant metrics

/payout_wallet

MethodPathAuthSummary
POST/v1/payout_walletsecret keySet the payout wallet by signature
GET/v1/payout_wallet/challengesecret keyGet a message for the wallet to sign
GET/v1/payout_wallet/link_txsecret keyBuild an unsigned transaction proving wallet control
POST/v1/payout_wallet/linksecret keySet the payout wallet by signed transaction

/wallet

MethodPathAuthSummary
GET/v1/wallet/balancepublicRead a wallet's token balance

Status values

Objectstatus
Mandatepending active revoked expired completed
Chargescheduled processing succeeded retrying abandoned skipped
Refundpending succeeded failed

Requests carry your secret key as a bearer token:

Authorization: Bearer sk_test_...

Keys are prefixed by mode. sk_test_ never touches mainnet. The secret key is a server-side credential and must never reach a browser. The browser gets a client_secret scoped to a single mandate instead.

Errors are returned in a structured envelope, never as a bare string:

{
"error": {
"type": "invalid_request_error",
"code": "parameter_missing",
"message": "Human-readable explanation.",
"param": "mint"
}
}

param is present only when the problem is attributable to one field.

These are the codes verified against the server source. This list is not exhaustive. The specification has no error schema yet, so treat error.code as the value to branch on, and expect codes that are not listed here.

HTTP type code Meaning
400 invalid_request_error parameter_missing A required field was absent. param names it.
400 invalid_request_error parameter_invalid A field was present but unusable. param names it.
400 invalid_request_error mint_not_allowed The token is not on the platform registry.
400 invalid_request_error mint_not_enabled The token is allowed platform-wide but not enabled for your account.

Branch on error.code, never on error.message. Messages are written for humans and will change.

Mandate creation and refunds accept an idempotency key so a retried request cannot double-charge or double-refund:

await jorvi.mandates.create(input, { idempotencyKey: 'order-1234' });
await jorvi.charges.refund(chargeId, { idempotencyKey: 'refund-1234' });

Use a key derived from your own order identifier, not a random value, or a retry after a network timeout will create a second object.