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
string
required
Wallet address of the payer.
string
required
V1/V2 RiseID, RiseAccount address, or nanoid of the paying team.
string
required
V1/V2 RiseID, RiseAccount address, or nanoid of the payee.
number | string
required
Payment amount in micro-USD (
1,000,000 = $1.00) — e.g. 100000000 for $100.00.number | string
required
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:
object
required
The typed-data request object returned by the prepare step.
string
required
Signature over the typed data.
string
Optional payment title (max 60 chars).
string
Optional payment description (max 1000 chars).
string
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
string
required
Wallet address of the payer.
string
required
V1/V2 RiseID, RiseAccount address, or nanoid of the paying team.
number | string
required
Micro-USD. Must equal the sum of all
payments[].amount.array
required
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.
number | string
required
Legacy numeric id, V1/V2 RiseID, RiseAccount address, or nanoid of the paying company/team.
array
required
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
number | string
required
Legacy numeric id, V1/V2 RiseID, RiseAccount address, or nanoid of the paying company/team.
string | string[]
Filter by one or more caller-supplied external ids.
string | string[]
Filter by one or more payees — V1/V2 RiseID, RiseAccount address, or nanoid.
number
1-indexed page number (default 1).
number
Page size, 1–1000 (default 100). Values above 1000 are silently capped, not rejected.
string
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.
