PUT request returns EIP-712 typed data to sign, then a POST request submits the signature to broadcast the transaction.
All payment endpoints here require
Authorization: Bearer <jwt> — see Authentication.rise_id/payee/recipient/payee_riseid accept a V1 RiseID, V2 RiseID, RiseAccount address, or nanoid interchangeably — see Identifier formats.Prepare an instant payment
PUT/v1/payments/pay
Wallet address of the payer.
V1/V2 RiseID, RiseAccount address, or nanoid of the paying team.
V1/V2 RiseID, RiseAccount address, or nanoid of the payee.
Payment amount in micro-USD (
1,000,000 = $1.00) — e.g. 100000000 for $100.00.Unique salt for this payment. Combined with
rise_id/payee/amount to derive the on-chain payment id — reusing a salt for the same payer+payee+amount collides with the existing payment and fails with 409. Use a new, never-before-used salt (e.g. a counter or random value) per payment.domain, types, and message are the three arguments EIP-712 signing needs — see Creating the signature below. descriptor is always an empty object — a V1 response-shape placeholder with no V2 equivalent.
If this payee already received a very similar payment recently (same team, similar amount, within a lookback window), the response also includes a
duplicates field — this doesn’t block the payment, it’s an early warning so you can confirm before signing:duplicates is omitted entirely when none are found.Execute an instant payment
POST/v1/payments/pay
Same body as the prepare step, plus the signed request and signature:
The typed-data request object returned by the prepare step.
Signature over the typed data.
Optional payment title (max 60 chars).
Optional payment description (max 1000 chars).
Optional caller-supplied external reference id. Not length-checked at request time — values over 500 chars are silently truncated, not rejected. (
/v1/payments/batch-pay/intents is stricter: it hard-validates a 1000-char max instead.)Creating the signature
domain, types, and message from the prepare response feed directly into EIP-712 signing. This same pattern signs both instant and batch payments — just swap the endpoint.
Using the SDK (recommended)
client.v1Legacy.pay() runs prepare → sign → execute in a single call, using the client’s configured key (or a per-call privateKey override):
preparePay/executePay directly, mirroring the same three steps:
client.v1Legacy.batchPay() / prepareBatchPay() / executeBatchPay() follow the identical pattern for /v1/payments/batch-pay.Manual HTTP (no SDK)
The same
domain/types/message → wallet.signTypedData() → submit-as-request pattern applies to /v1/payments/batch-pay and /v1/payments/batch-pay/intents as well.Prepare a batch payment
PUT/v1/payments/batch-pay
Wallet address of the payer.
V1/V2 RiseID, RiseAccount address, or nanoid of the paying team.
Micro-USD. Must equal the sum of all
payments[].amount.Array of
{ recipient, amount, salt } — 1 to 1000 items. Each salt must be unique per recipient + amount (across this batch and any prior payment) — reused salts fail with 409.wallet.signTypedData(domain, types, message) — see Creating the signature above. Unlike instant-pay, there’s no descriptor field here — but duplicates can still appear, in the same shape documented above.
Execute a batch payment
POST/v1/payments/batch-pay
Same body as the prepare step, with each payment item optionally carrying title (≤60 chars), description (≤1000 chars), and external_id (silently truncated over 500 chars, not rejected), plus request and signature. Returns the same ethers-v5 receipt shape as the instant-payment execute step.
Create batch payment intents
POST/v1/payments/batch-pay/intents
Creates draft (unscheduled) payments — useful for scheduling future payroll without signing immediately.
Legacy numeric id, V1/V2 RiseID, RiseAccount address, or nanoid of the paying company/team.
Array of intents, 1 to 1000 items, each:
{ payee_riseid, amount, salt, timestamp, title?, description?, external_id? }. amount is micro-USD and must be greater than 0 (the only payment endpoint that rejects 0, where every other one only requires non-negative). title ≤60 chars, description ≤1000 chars, external_id ≤1000 chars.List payments
GET/v1/payments
Legacy numeric id, V1/V2 RiseID, RiseAccount address, or nanoid of the paying company/team.
Filter by one or more caller-supplied external ids.
Filter by one or more payees — V1/V2 RiseID, RiseAccount address, or nanoid.
1-indexed page number (default 1).
Page size, 1–1000 (default 100). Values above 1000 are silently capped, not rejected.
all, a V2 state name (intent/ready, scheduled, complete, removed), or a V1 status (draft, pending, ready, scheduled, submitted, complete, failed, attempted_and_failed, removed, rejected, cancelled).Errors
Still stuck? See Troubleshooting.
