Charge the saved card to top up prepaid balance
Charges the org's default saved card off-session for amountCents and returns the PaymentIntent id and status, which tells the client what to do next. The balance credit is applied by the payment_intent.succeeded webhook (the authoritative money signal), not this response: poll the balance after success.
Required permission
Requires the billing.manage permission. See Permissions for the roles and API key permissions that include it.
Command line
The orl CLI wraps this endpoint:
orl billing deposit create --amount-cents <amount-cents>apiKeyAuthorizationBearer <token>OpenRelay API key. Send it as Authorization: Bearer or_… (legacy vl_… keys still work).
orgId*stringapplication/json- body
amountCents*integerAmount to charge the saved card, in cents. The flat floor is $25 and the default per-deposit cap is $500 (raised to an approved monthly spend limit). While the org has usage running the endpoint requires at least one hour of the current burn; read the exact figure from Balance.minDepositCents rather than re-deriving it.
2500 <= valueidempotencyKey?stringClient-generated id for this logical deposit; reused verbatim on retry so a network/client retry can't double-charge. Optional: the server generates one if absent (then retries won't dedupe).
deviceFingerprint?stringOptional Fingerprint visitor id (see DeviceSignals). Recorded and clustered. A device that puts the account on a verification hold gets 403 ACCOUNT_PENDING_VERIFICATION, or 403 VERIFICATION_UNAVAILABLE when the hold could not be recorded; every other verdict is observe-only.
length <= 128deviceEventId?stringOptional Fingerprint event id (see DeviceSignals).
length <= 128Charge outcome (status drives the dashboard's next step)
application/json- response
paymentIntentId*stringstatus*stringStripe PaymentIntent status. "succeeded" → credit lands via webhook; "requires_action" → complete SCA on-session with clientSecret; "requires_payment_method" → the card was declined.
declineCode?stringWhy the card was declined, set when status is requires_payment_method and Stripe gave a reason: a Stripe decline code (https://docs.stripe.com/declines/codes) such as insufficient_funds, expired_card, incorrect_cvc or card_velocity_exceeded. A decline Stripe asks merchants not to explain (fraudulent, lost_card, stolen_card, merchant_blacklist) is reported as generic_decline. New codes can appear, so treat an unknown one as a generic decline.
clientSecret?stringSet only when status is requires_action (on-session SCA).
publishableKey?stringSet with clientSecret: the Stripe publishable key Stripe.js needs to confirm the PaymentIntent on-session.
curl -X POST 'https://api.openrelay.inc/v1/orgs/string/billing/deposit' \ -H 'Content-Type: application/json' \ -d '{ "amountCents": 5000, "idempotencyKey": "dep-2026-07-02-a1b2c3"}'{ "paymentIntentId": "string", "status": "string", "declineCode": "string", "clientSecret": "string", "publishableKey": "string"}Settle a saved card POST
Called right after stripe.confirmSetup succeeds. Settles the card the SetupIntent saved and reports whether it was saved, refused, or held. Settlement runs once: a card tied to fraud, or a second card the bank did not verify when it was asked to, puts the account on hold (held, ACCOUNT_PENDING_VERIFICATION); a card the bank did not verify is removed (refused, CARD_NOT_VERIFIED); any other card becomes the account's default (saved). Calling it again, or after the Stripe webhook settled the card, answers the same outcome and changes nothing.
Read the org's auto-recharge policy GET
Returns the org's auto-recharge settings: whether it is on, the available-balance threshold that triggers a charge, and the amount charged, in cents.