Preview a pay-by-link message
Renders the request-to-pay message for an already-known payment URL without minting anything — pure channel-select + render so the dashboard can show the exact SMS/RCS/WhatsApp/email/voice body before any checkout link is created. Read-only: no money moves, no link is minted, and billing role is not required. Returns 422 when no preferred channel is reachable.
Authorizations
Dashboard JWT token from Clerk
Headers
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
1 - 255Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
true, false Body
The payment URL rendered into the message.
Charge amount in minor units (same minimum as the mint endpoint).
Three-letter ISO 4217 currency code.
What the payment is for.
Delivery channels in descending priority order.
sms, rcs, whatsapp, email, voice Channels the contact is currently reachable on.
sms, rcs, whatsapp, email, voice Optional merchant name rendered into the message.
Optional BCP-47 locale for the rendered message.
Response
Successful response.