Recurring payments
How stored-credential (MIT) payments on this API relate to recurring billing — subscriptions, invoices and off-session collection — which lives on the Billing API.
Important
Two surfaces, two jobs. This Payments API can mark the first card payment as the start of a stored-credential relationship (the
subscriptionblock onPOST /initialize-payment), but it has no call that charges a stored card by reference and no subscription object. Subscriptions, recurring invoices and off-session charging of a saved card are the Billing API at/billing-api/v1— same seller secret key, its own reference at/billing-api/v1/docs. Do not rely on any/api/v1/checkout/*endpoints; they are the dashboard's internal path, not part of either public API.
Which one you need
| You want to | Use |
|---|---|
| Take one card payment now and tell the processor it may be followed by merchant-initiated charges (stored-credential / COF flagging) | This API: POST /initialize-payment with subscription.enabled and subscription.allowSubsequentMerchantInitiated — see Server-to-Server. |
| Bill a customer on a schedule: trials, renewals, plan changes, pauses, cancellations | Billing API: POST /billing-api/v1/contracts/{contractId}/subscriptions to create, then POST /billing-api/v1/subscriptions/{subscriptionId}/cancel · /pause · /resume · /change-plan · /end-trial. |
| Issue and collect an invoice — hosted payment link, bank transfer, or stored credit | Billing API: POST /billing-api/v1/invoices and POST /invoices/{invoiceId}/send. |
| Charge a returning customer's saved card without them present | Billing API off-session collection: a sent or overdue invoice is charged against the customer's saved card by a background loop, where the deployment has billing.invoice.auto_charge switched on (a platform flag operated by Fynex, not a per-account setting). There is no public "charge this card" call on either API. |
| Know that a renewal was paid, failed or went past due | Billing API webhooks: InvoicePaid, InvoiceOverdue, BillingSubscriptionPastDue and the rest of the lifecycle catalogue, on the same signed pipe as PaymentCompleted. |
How the two connect
The customer is shared. A card payment on this API that carries a customer e-mail (hosted checkout collects it; merchantCustomerId is stored as your reference for the same record) resolves to the seller customer that the Billing API's POST /billing-api/v1/customers returns for that e-mail. That id is the sellerCustomerId every contract, subscription and invoice refers to.
The saved card comes from hosted checkout, not from the subscription block. A card is stored on Fynex only when the buyer ticks save card on the hosted checkout page, gives an e-mail, and the payment succeeds with a billing address. The subscription block by itself creates a stored-credential anchor at the card processor — enough for the processor to accept later merchant-initiated charges — but does not store a card that Billing's collection loop can use. If you rely on off-session collection, your customers must have saved a card on hosted checkout; a server-to-server first payment alone is not enough.
The rail is the same. An invoice collected off-session is finalized by the same payment engine as a hosted-checkout payment, so it fires the same PaymentCompleted webhook, and the invoice reads paidVia: payment_link either way. The payment is stamped with what it settled — its payment link's metadata carries billingInvoiceId, invoiceNumber, contractId, agreementNumber and sellerCustomerId — so you join the two from the payment side without reconstructing anything from an order reference. See the Billing Workflows guide.
Stored-credential flagging on this API
| Field | What it does |
|---|---|
subscription.enabled |
Marks the payment as the initial transaction of a stored-credential relationship at the processor. Card-only. |
subscription.allowSubsequentMerchantInitiated |
With enabled, tells the processor later charges may be merchant-initiated (cardholder absent). Send false for one-tap re-purchase where the cardholder is always present. |
merchantCustomerId |
Your stable customer reference; stored on the payment and on the seller customer record. |
skip3DS |
Only for payments that qualify for an SCA exemption (merchant-initiated, recurring with stored credentials). See 3DS. |
Note
PCI scope. Raw card data stays on Fynex's infrastructure, but instructing Fynex to store credentials and relying on merchant-initiated charges moves your integration into a higher-scrutiny PCI DSS category (SAQ D / Merchant Level 2). Consult your QSA before going live with recurring billing.
What is not available
- No public endpoint on either API to charge a previously stored card by reference on demand. Off-session charging happens only through Billing's collection loop against a sent or overdue invoice.
- No subscription object on this Payments API. Subscription state lives on the Billing API only.
- Off-session collection retries a declined charge up to 3 attempts in total, at least 20 minutes apart, and only when that budget is spent does the subscription go
past_due. Do not build your own retry on top of it — you would double-charge. Apast_duesubscription recovers on its own when an invoice on the contract is paid. See the Billing Subscriptions and Workflows guides.
See also
- Billing API reference —
/billing-api/v1/docs: Concepts, Subscriptions, Invoices, Workflows, Webhooks. - Server-to-Server — The
subscriptionblock onPOST /initialize-payment. - Hosted Checkout — Where the buyer saves the card that Billing collects against.
- Webhooks — One receiver for
PaymentCompletedand every Billing event.