Documentation
MCPTool reference

Subscriptions tools

Arguments, results, errors, and access, confirmation, and retry policy for each Subscriptions tool in FloPay MCP, from the reviewed API contract.

Subscriptions tools

Generated from the FloPay MCP contract version 1, revision 764b41d5c7205d6df7eeaeac832fafe882247f5526b1d4d6bc6f98e3eaca7784.

SubscriptionChange_changePreview

Preview Subscription Plan Change

Previews a subscription plan change before it is applied. Use the same payload as the change endpoint to inspect proration and invoice impact.

PolicyValue
OperationPOST /v1/subscriptions/{id}/change/preview
Classread-only
Riskmedium
Confirmationnot-required
Retrysafe
Rate-limit tierrestricted
Rolesowner, admin, member
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
idpathstring (uuid)YesThe Flopay subscription UUID to preview.

Result

Returns 200 with a JSON body. A preview of the updated plan and any generated invoice calculations.

FieldTypeRequiredDescription
dataobjectYes
data.activatedAtstring (date-time)Yes
data.idstringYes
data.invoiceCollectionobjectYes
data.invoiceCollection.chargeInvoiceobject or nullYes
data.invoiceCollection.chargeInvoice.currencyobjectYes
data.invoiceCollection.chargeInvoice.currency.codestringYesThe ISO 4217 currency code.
data.invoiceCollection.chargeInvoice.currency.symbolstring or nullYesThe display symbol for the currency when available.
data.invoiceCollection.chargeInvoice.discountnumberYes
data.invoiceCollection.chargeInvoice.idstringYes
data.invoiceCollection.chargeInvoice.refundableAmountnumber or nullYes
data.invoiceCollection.chargeInvoice.subtotalnumberYes
data.invoiceCollection.chargeInvoice.subtotalAfterDiscountnumberYes
data.invoiceCollection.chargeInvoice.taxnumberYes
data.invoiceCollection.chargeInvoice.totalnumberYes
data.invoiceCollection.chargeInvoice.typestringYesAllowed values: charge, credit, legacy.
data.invoiceCollection.creditInvoicesarray of object or nullYes
data.invoiceCollection.creditInvoices[].currencyobjectYes
data.invoiceCollection.creditInvoices[].currency.codestringYesThe ISO 4217 currency code.
data.invoiceCollection.creditInvoices[].currency.symbolstring or nullYesThe display symbol for the currency when available.
data.invoiceCollection.creditInvoices[].discountnumberYes
data.invoiceCollection.creditInvoices[].idstringYes
data.invoiceCollection.creditInvoices[].refundableAmountnumber or nullYes
data.invoiceCollection.creditInvoices[].subtotalnumberYes
data.invoiceCollection.creditInvoices[].subtotalAfterDiscountnumberYes
data.invoiceCollection.creditInvoices[].taxnumberYes
data.invoiceCollection.creditInvoices[].totalnumberYes
data.invoiceCollection.creditInvoices[].typestringYesAllowed values: charge, credit, legacy.
data.planobjectYes
data.plan.codestringYes
data.plan.idstringYes
data.plan.namestringYes
data.quantitynumberYes
data.unitAmountnumberYes

Errors

StatusDescription
400The subscription id or request body was invalid.
401Client Basic authentication or OAuth2 bearer authentication is required. For Basic, use client.uuid as the username and client.api_key as the password; for bearer, send a valid OAuth2 access token with the required scope.
424The stored subscription could not be resolved or the billing provider could not preview or apply the requested change.

SubscriptionPlan_getAll

List Subscription Plans

List all active subscription plans available for the authenticated client and resolved product provider credentials.

PolicyValue
OperationGET /v1/subscriptions/plans
Classread-only
Risklow
Confirmationnot-required
Retrysafe
Rate-limit tierread
Rolesowner, admin, member
Scopesmcp:read

Arguments

This tool takes no arguments.

Result

Returns 200 with a JSON body. The active subscription plans available for the authenticated client.

FieldTypeRequiredDescription
dataarray of objectYes
data[].codestringYes
data[].currenciesarray of objectYes
data[].currencies[].amountnumberYes
data[].currencies[].codestringYesThe ISO 4217 currency code.
data[].currencies[].setupFeenumberYes
data[].currencies[].symbolstring or nullYesThe display symbol for the currency when available.
data[].descriptionstringYes
data[].idstringYes
data[].intervalLengthnumberYes
data[].intervalUnitstringYesAllowed values: day, month, week.
data[].namestringYes
data[].totalBillingCyclesnumberYes
data[].trialLengthnumberYes
data[].trialUnitstringYesAllowed values: day, month, week.

Errors

StatusDescription
400The request was invalid or the product provider credentials could not be resolved.
401Client Basic authentication or OAuth2 bearer authentication is required. For Basic, use client.uuid as the username and client.api_key as the password; for bearer, send a valid OAuth2 access token with the required scope.
424Throws in cases where Billing service cannot get data from billing provider.

SubscriptionPreview_getAllActiveV2

List Active Stored Subscriptions

Get all active subscriptions stored in the local Flopay subscription table for a user email. The email lookup is scoped to the authenticated client.

PolicyValue
OperationGET /v2/subscriptions/active
Classread-only
Risklow
Confirmationnot-required
Retrysafe
Rate-limit tierread
Rolesowner, admin, member
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
emailquerystringYesUser email used to find stored subscriptions for the authenticated client.

Result

Returns 200 with a JSON body. The active subscription rows stored in Flopay for the requested user email.

FieldTypeRequiredDescription
dataarray of objectYesSubscription rows stored for the requested user.
data[].amountnumber or nullYesThe stored single-unit amount.
data[].cancelAtstring (date-time) or nullYesWhen the subscription is scheduled to cancel.
data[].canceledAtstring (date-time) or nullYesWhen the subscription was canceled.
data[].checkoutMetadataobjectNoImmutable non-sensitive client context inherited from the originating checkout.
data[].checkoutSessionIdstring or nullYesThe originating checkout session UUID when available.
data[].clientIdstring or nullYesThe authenticated client UUID associated with the subscription row.
data[].createdAtstring (date-time)YesWhen the row was created.
data[].currencystring or nullYesThe ISO 4217 currency code recorded for the subscription.
data[].endDatestring (date-time) or nullYesWhen the current subscription term ends.
data[].gatewayobject or nullNoOwning gateway (non-secret fields). Present only when the gateway relation is requested.
data[].gateway.codestringYesGateway account identifier (e.g. the Stripe connected account acct_…).
data[].gateway.currencystringYes3-letter ISO default currency code (e.g. "USD") used by this gateway account.
data[].gateway.environmentstringYesAllowed values: stage, production.
data[].gateway.idstringYesGateway UUID.
data[].gateway.namestringYesHuman-readable name of the gateway account.
data[].gateway.providerTypestringYesAllowed values: stripe, paypal, worldpay_corporate_gateway.
data[].gateway.publishableKeystringNoPublic API key used by frontend clients to identify the gateway account. Not a secret.
data[].gatewayIdstring or nullYesThe gateway configuration UUID used for this subscription when available.
data[].gatewaySubscriptionIdstringYesThe subscription identifier stored from the billing gateway. Flo-owned subscriptions hold no gateway-side subscription object, so this is a synthesized flo_<uuid> identifier that exists in the response only: it is not stored, and cannot be looked up at the gateway.
data[].gatewayTypestringYesThe payment gateway that processes charges for the subscription. This describes the payment rails only: it does NOT say who owns the billing schedule. A Flo-owned subscription still reports the gateway its charges run through; read ownership to tell the two apart. Allowed values: stripe, paypal, worldpay_corporate_gateway.
data[].gatewayUserIdstring or nullYesThe billing gateway customer identifier when one is known.
data[].metadataobject or nullYesArbitrary metadata captured with the subscription row.
data[].ownershipstringYesWho owns the billing schedule. provider means the gateway holds the subscription object and drives renewals; flo means Flopay holds the schedule and drives renewals itself, charging through the gateway named by gatewayType. Allowed values: flo, provider.
data[].pauseStatestring or nullYesDistinguishes a pause that is in effect ('active') from one recorded to start at a future date ('scheduled'). Null when no pause is recorded. Allowed values: scheduled, active.
data[].pausedAtstring (date-time) or nullYesWhen the subscription was paused.
data[].planDescriptionstring or nullYesThe stored plan description when available.
data[].planIdstringYesThe stored plan identifier.
data[].planNamestringYesThe stored plan name.
data[].quantitynumberYesThe subscribed quantity.
data[].rebillCountinteger (int32)YesThe number of successful renewal charges recorded for the subscription. Minimum: 0.
data[].resumeAtstring (date-time) or nullYesWhen the subscription will resume.
data[].startDatestring (date-time) or nullYesWhen the subscription started.
data[].statestringYesThe current subscription state stored in Flopay. Allowed values: active, canceled, expired, failed, future, paused, past_due.
data[].totalnumber or nullYesThe stored total amount.
data[].trialEndstring (date-time) or nullYesWhen the trial ends.
data[].updatedAtstring (date-time)YesWhen the row was last updated.
data[].userFirstNamestring or nullNoCustomer first name when the user relation is loaded.
data[].userGatewayIdstring or nullYesThe linked internal user gateway row UUID when available.
data[].userLastNamestring or nullNoCustomer last name when the user relation is loaded.
data[].userUuidstring or nullYesThe Flopay user UUID associated with the subscription.
data[].uuidstringYesInternal Flopay subscription UUID.

Errors

StatusDescription
400The email query parameter was missing or invalid.
401Client Basic authentication or OAuth2 bearer authentication is required. For Basic, use client.uuid as the username and client.api_key as the password; for bearer, send a valid OAuth2 access token with the required scope.
424Throws in cases where Billing service cannot get data from billing provider.

SubscriptionRead_exportSubscriptions

Export subscriptions

Exports the resource-owned list as a point-in-time framed stream. Reuses this endpoint's list query filters and sort. current_page preserves page/limit; all_matching ignores page/limit while preserving filters and sort. Client routes require an OAuth client_user owner/admin token; admin routes require a single valid clientId selector; partner routes require an authenticated partner seat and are scoped to that partner. Ordinary members, client Basic auth, and cross-tenant requests are rejected.

PolicyValue
OperationPOST /v1/subscriptions/exports
Classread-only
Riskmedium
Confirmationnot-required
Retrysafe
Rate-limit tieraggregate
Rolesowner, admin
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
pagequeryintegerNo1-based page number for paginated list endpoints. Default: 1. Minimum: 1.
limitqueryintegerNoMaximum number of records to return per page. Default: 20. Minimum: 1. Maximum: 100.
sortquerystringNoSort by one allowed field. Use exactly one of sort[asc] or sort[desc]. Allowed fields: createdAt, endDate, rebillCount, startDate, state, updatedAt, gateway.id, gateway.code, gateway.name, gateway.providerType, gateway.environment, gateway.currency. Default: createdAt DESC. Allowed values: createdAt, endDate, rebillCount, startDate, state, updatedAt, gateway.id, gateway.code, gateway.name, gateway.providerType, gateway.environment, gateway.currency.
relationquerystringNoComma-separated relation aliases to include. Allowed aliases: gateway. Unknown aliases return 400.
createdAtquerystring (date) or string (date-time)NoSubscription creation timestamp. Date-only range bounds use UTC calendar dates: [gte] starts at 00:00 UTC on the selected date and [lte] includes the complete selected date. Full timestamps compare as exact instants. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
emailquerystringNoEmail address of the user that owns the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [search]. [search] is case-insensitive text contains matching.
endDatequerystring (date-time)NoCurrent subscription term end timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
gatewayTypequerystringNoThe billing provider that recorded this subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: stripe, paypal, worldpay_corporate_gateway.
ownershipquerystringNoWho drives the renewals: provider (the gateway holds the subscription object) or flo (Flopay holds the schedule and charges through gatewayType). Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: flo, provider.
planCodequerystringNoThe plan identifier recorded on the subscription (alias for planId). Equality filter. Pass without operator for exact match or pass any of the following operators: [in] [search]. [in] accepts comma-separated values; blank entries return 400. [search] is case-insensitive text contains matching.
planIdquerystringNoThe plan identifier recorded on the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [in] [search]. [in] accepts comma-separated values; blank entries return 400. [search] is case-insensitive text contains matching.
planNamequerystringNoThe plan name recorded on the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [search]. [search] is case-insensitive text contains matching.
rebillCountquerynumberNoNumber of successful renewal charges recorded for the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
startDatequerystring (date-time)NoSubscription start timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
statequerystringNoSubscription state. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: active, canceled, expired, failed, future, paused, past_due.
updatedAtquerystring (date-time)NoSubscription update timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
userUuidquerystringNoLinked Flopay user UUID. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400.
uuidquerystringNoFlopay subscription UUID. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400.
fieldsbodyarray of stringNoStable export field keys in output order.
formatbodystringYesAllowed values: csv, json.
scopebodystringYesAllowed values: current_page, all_matching.

Result

Returns 200 as application/vnd.flopay.export-stream.v1. Versioned length-prefixed export stream containing started/progress/completed_file/file_chunk/complete frames.

Errors

StatusDescription
400Invalid scope, format, field key, query parameter, client selector, row cap, or plaintext byte cap.
401Authentication is missing or invalid.
403The actor is not allowed to export this resource.
429Export capacity exhausted. Retry-After is set to 60 seconds.
503Exports disabled or export storage unavailable.

SubscriptionRead_findOne

Get Subscription

Returns a single stored subscription for the authenticated client.

PolicyValue
OperationGET /v1/subscriptions/{id}
Classread-only
Risklow
Confirmationnot-required
Retrysafe
Rate-limit tierread
Rolesowner, admin, member
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
idpathstringYes
relationquerystringNoComma-separated relation aliases to include. Allowed aliases: gateway. Unknown aliases return 400.

Result

Returns 200 with a JSON body.

FieldTypeRequiredDescription
amountnumber or nullYesThe stored single-unit amount.
cancelAtstring (date-time) or nullYesWhen the subscription is scheduled to cancel.
canceledAtstring (date-time) or nullYesWhen the subscription was canceled.
checkoutMetadataobjectNoImmutable non-sensitive client context inherited from the originating checkout.
checkoutSessionIdstring or nullYesThe originating checkout session UUID when available.
clientIdstring or nullYesThe authenticated client UUID associated with the subscription row.
createdAtstring (date-time)YesWhen the row was created.
currencystring or nullYesThe ISO 4217 currency code recorded for the subscription.
endDatestring (date-time) or nullYesWhen the current subscription term ends.
gatewayobject or nullNoOwning gateway (non-secret fields). Present only when the gateway relation is requested.
gateway.codestringYesGateway account identifier (e.g. the Stripe connected account acct_…).
gateway.currencystringYes3-letter ISO default currency code (e.g. "USD") used by this gateway account.
gateway.environmentstringYesAllowed values: stage, production.
gateway.idstringYesGateway UUID.
gateway.namestringYesHuman-readable name of the gateway account.
gateway.providerTypestringYesAllowed values: stripe, paypal, worldpay_corporate_gateway.
gateway.publishableKeystringNoPublic API key used by frontend clients to identify the gateway account. Not a secret.
gatewayIdstring or nullYesThe gateway configuration UUID used for this subscription when available.
gatewaySubscriptionIdstringYesThe subscription identifier stored from the billing gateway. Flo-owned subscriptions hold no gateway-side subscription object, so this is a synthesized flo_<uuid> identifier that exists in the response only: it is not stored, and cannot be looked up at the gateway.
gatewayTypestringYesThe payment gateway that processes charges for the subscription. This describes the payment rails only: it does NOT say who owns the billing schedule. A Flo-owned subscription still reports the gateway its charges run through; read ownership to tell the two apart. Allowed values: stripe, paypal, worldpay_corporate_gateway.
gatewayUserIdstring or nullYesThe billing gateway customer identifier when one is known.
metadataobject or nullYesArbitrary metadata captured with the subscription row.
ownershipstringYesWho owns the billing schedule. provider means the gateway holds the subscription object and drives renewals; flo means Flopay holds the schedule and drives renewals itself, charging through the gateway named by gatewayType. Allowed values: flo, provider.
pauseStatestring or nullYesDistinguishes a pause that is in effect ('active') from one recorded to start at a future date ('scheduled'). Null when no pause is recorded. Allowed values: scheduled, active.
pausedAtstring (date-time) or nullYesWhen the subscription was paused.
planDescriptionstring or nullYesThe stored plan description when available.
planIdstringYesThe stored plan identifier.
planNamestringYesThe stored plan name.
quantitynumberYesThe subscribed quantity.
rebillCountinteger (int32)YesThe number of successful renewal charges recorded for the subscription. Minimum: 0.
resumeAtstring (date-time) or nullYesWhen the subscription will resume.
startDatestring (date-time) or nullYesWhen the subscription started.
statestringYesThe current subscription state stored in Flopay. Allowed values: active, canceled, expired, failed, future, paused, past_due.
totalnumber or nullYesThe stored total amount.
trialEndstring (date-time) or nullYesWhen the trial ends.
updatedAtstring (date-time)YesWhen the row was last updated.
userFirstNamestring or nullNoCustomer first name when the user relation is loaded.
userGatewayIdstring or nullYesThe linked internal user gateway row UUID when available.
userLastNamestring or nullNoCustomer last name when the user relation is loaded.
userUuidstring or nullYesThe Flopay user UUID associated with the subscription.
uuidstringYesInternal Flopay subscription UUID.

Errors

StatusDescription
400The supplied path, query, or filter values were invalid.
401Client Basic authentication or OAuth2 bearer authentication is required. For Basic, use client.uuid as the username and client.api_key as the password; for bearer, send a valid OAuth2 access token with the required scope.
404No subscription with the requested id exists for this client.

SubscriptionRead_list

List Subscriptions

Returns paginated subscriptions for the authenticated client. Supports page, limit, sort[asc|desc], optional email, and whitelisted filters for uuid, state, gatewayType, planCode/planId, planName, rebillCount, startDate, endDate, createdAt, and updatedAt.

PolicyValue
OperationGET /v1/subscriptions
Classread-only
Risklow
Confirmationnot-required
Retrysafe
Rate-limit tierread
Rolesowner, admin, member
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
pagequeryintegerNo1-based page number for paginated list endpoints. Default: 1. Minimum: 1.
limitqueryintegerNoMaximum number of records to return per page. Default: 20. Minimum: 1. Maximum: 100.
sortquerystringNoSort by one allowed field. Use exactly one of sort[asc] or sort[desc]. Allowed fields: createdAt, endDate, rebillCount, startDate, state, updatedAt, gateway.id, gateway.code, gateway.name, gateway.providerType, gateway.environment, gateway.currency. Default: createdAt DESC. Allowed values: createdAt, endDate, rebillCount, startDate, state, updatedAt, gateway.id, gateway.code, gateway.name, gateway.providerType, gateway.environment, gateway.currency.
relationquerystringNoComma-separated relation aliases to include. Allowed aliases: gateway. Unknown aliases return 400.
createdAtquerystring (date) or string (date-time)NoSubscription creation timestamp. Date-only range bounds use UTC calendar dates: [gte] starts at 00:00 UTC on the selected date and [lte] includes the complete selected date. Full timestamps compare as exact instants. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
emailquerystringNoEmail address of the user that owns the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [search]. [search] is case-insensitive text contains matching.
endDatequerystring (date-time)NoCurrent subscription term end timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
gatewayTypequerystringNoThe billing provider that recorded this subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: stripe, paypal, worldpay_corporate_gateway.
ownershipquerystringNoWho drives the renewals: provider (the gateway holds the subscription object) or flo (Flopay holds the schedule and charges through gatewayType). Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: flo, provider.
planCodequerystringNoThe plan identifier recorded on the subscription (alias for planId). Equality filter. Pass without operator for exact match or pass any of the following operators: [in] [search]. [in] accepts comma-separated values; blank entries return 400. [search] is case-insensitive text contains matching.
planIdquerystringNoThe plan identifier recorded on the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [in] [search]. [in] accepts comma-separated values; blank entries return 400. [search] is case-insensitive text contains matching.
planNamequerystringNoThe plan name recorded on the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [search]. [search] is case-insensitive text contains matching.
rebillCountquerynumberNoNumber of successful renewal charges recorded for the subscription. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
startDatequerystring (date-time)NoSubscription start timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
statequerystringNoSubscription state. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: active, canceled, expired, failed, future, paused, past_due.
updatedAtquerystring (date-time)NoSubscription update timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
userUuidquerystringNoLinked Flopay user UUID. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400.
uuidquerystringNoFlopay subscription UUID. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400.

Result

Returns 200 with a JSON body.

FieldTypeRequiredDescription
dataarray of objectYes
data[].amountnumber or nullYesThe stored single-unit amount.
data[].cancelAtstring (date-time) or nullYesWhen the subscription is scheduled to cancel.
data[].canceledAtstring (date-time) or nullYesWhen the subscription was canceled.
data[].checkoutMetadataobjectNoImmutable non-sensitive client context inherited from the originating checkout.
data[].checkoutSessionIdstring or nullYesThe originating checkout session UUID when available.
data[].clientIdstring or nullYesThe authenticated client UUID associated with the subscription row.
data[].createdAtstring (date-time)YesWhen the row was created.
data[].currencystring or nullYesThe ISO 4217 currency code recorded for the subscription.
data[].endDatestring (date-time) or nullYesWhen the current subscription term ends.
data[].gatewayobject or nullNoOwning gateway (non-secret fields). Present only when the gateway relation is requested.
data[].gateway.codestringYesGateway account identifier (e.g. the Stripe connected account acct_…).
data[].gateway.currencystringYes3-letter ISO default currency code (e.g. "USD") used by this gateway account.
data[].gateway.environmentstringYesAllowed values: stage, production.
data[].gateway.idstringYesGateway UUID.
data[].gateway.namestringYesHuman-readable name of the gateway account.
data[].gateway.providerTypestringYesAllowed values: stripe, paypal, worldpay_corporate_gateway.
data[].gateway.publishableKeystringNoPublic API key used by frontend clients to identify the gateway account. Not a secret.
data[].gatewayIdstring or nullYesThe gateway configuration UUID used for this subscription when available.
data[].gatewaySubscriptionIdstringYesThe subscription identifier stored from the billing gateway. Flo-owned subscriptions hold no gateway-side subscription object, so this is a synthesized flo_<uuid> identifier that exists in the response only: it is not stored, and cannot be looked up at the gateway.
data[].gatewayTypestringYesThe payment gateway that processes charges for the subscription. This describes the payment rails only: it does NOT say who owns the billing schedule. A Flo-owned subscription still reports the gateway its charges run through; read ownership to tell the two apart. Allowed values: stripe, paypal, worldpay_corporate_gateway.
data[].gatewayUserIdstring or nullYesThe billing gateway customer identifier when one is known.
data[].metadataobject or nullYesArbitrary metadata captured with the subscription row.
data[].ownershipstringYesWho owns the billing schedule. provider means the gateway holds the subscription object and drives renewals; flo means Flopay holds the schedule and drives renewals itself, charging through the gateway named by gatewayType. Allowed values: flo, provider.
data[].pauseStatestring or nullYesDistinguishes a pause that is in effect ('active') from one recorded to start at a future date ('scheduled'). Null when no pause is recorded. Allowed values: scheduled, active.
data[].pausedAtstring (date-time) or nullYesWhen the subscription was paused.
data[].planDescriptionstring or nullYesThe stored plan description when available.
data[].planIdstringYesThe stored plan identifier.
data[].planNamestringYesThe stored plan name.
data[].quantitynumberYesThe subscribed quantity.
data[].rebillCountinteger (int32)YesThe number of successful renewal charges recorded for the subscription. Minimum: 0.
data[].resumeAtstring (date-time) or nullYesWhen the subscription will resume.
data[].startDatestring (date-time) or nullYesWhen the subscription started.
data[].statestringYesThe current subscription state stored in Flopay. Allowed values: active, canceled, expired, failed, future, paused, past_due.
data[].totalnumber or nullYesThe stored total amount.
data[].trialEndstring (date-time) or nullYesWhen the trial ends.
data[].updatedAtstring (date-time)YesWhen the row was last updated.
data[].userFirstNamestring or nullNoCustomer first name when the user relation is loaded.
data[].userGatewayIdstring or nullYesThe linked internal user gateway row UUID when available.
data[].userLastNamestring or nullNoCustomer last name when the user relation is loaded.
data[].userUuidstring or nullYesThe Flopay user UUID associated with the subscription.
data[].uuidstringYesInternal Flopay subscription UUID.
limitnumberYes
pagenumberYes
pagesnumberYes
totalnumberYes

Errors

StatusDescription
400The supplied path, query, or filter values were invalid.
401Client Basic authentication or OAuth2 bearer authentication is required. For Basic, use client.uuid as the username and client.api_key as the password; for bearer, send a valid OAuth2 access token with the required scope.

SubscriptionRecovery_list

List Subscription Recovery Campaigns

Returns the authenticated client subscription recovery campaigns most recent first, including every persisted recovery round. The response uses the shared paginated list contract.

PolicyValue
OperationGET /v1/subscriptions/{id}/recovery
Classread-only
Risklow
Confirmationnot-required
Retrysafe
Rate-limit tierread
Rolesowner, admin, member
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
idpathstringYes
pagequeryintegerNo1-based page number for paginated list endpoints. Default: 1. Minimum: 1.
limitqueryintegerNoMaximum number of records to return per page. Default: 20. Minimum: 1. Maximum: 100.
sortquerystringNoSort by one allowed field. Use exactly one of sort[asc] or sort[desc]. Allowed fields: billingCycleAt, createdAt, nextRetryAt, status. Default: billingCycleAt DESC. Allowed values: billingCycleAt, createdAt, nextRetryAt, status.
relationquerystringNoThis endpoint does not support relation aliases. Supplying relation returns 400.
billingCycleAtquerystring (date-time)NoOriginal billing-cycle timestamp for the recovery campaign. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
createdAtquerystring (date-time)NoRecovery campaign creation timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
nextRetryAtquerystring (date-time)NoNext persisted recovery retry timestamp. Equality filter. Pass without operator for exact match or pass any of the following operators: [gt] [gte] [lt] [lte].
policyVersionquerystringNoFrozen policy version used by the campaign. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400.
statusquerystringNoRecovery campaign lifecycle status. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400. Allowed values: active, operational_retry, recovered, exhausted, non_retryable, manual_review, stopped.
uuidquerystringNoRecovery campaign UUID. Equality filter. Pass without operator for exact match or pass any of the following operators: [in]. [in] accepts comma-separated values; blank entries return 400.

Result

Returns 200 with a JSON body.

FieldTypeRequiredDescription
dataarray of objectYes
data[].billingCycleAtstring (date-time)YesOriginal failed billing-cycle timestamp.
data[].createdAtstring (date-time)Yes
data[].exhaustedAtstring (date-time) or nullYes
data[].intervalstringYesFrozen subscription billing cadence. Allowed values: day, week, month, year.
data[].intervalCountnumberYesFrozen number of cadence units per billing cycle.
data[].manualReviewAtstring (date-time) or nullYes
data[].nextRetryAtstring (date-time) or nullYesNext persisted recovery retry, when one remains.
data[].originalAmountnumberYesOriginal invoice amount in major currency units.
data[].originalCurrencystringYesOriginal ISO-4217 invoice currency.
data[].policyVersionstringYesFrozen policy version used for this campaign.
data[].recoveredAtstring (date-time) or nullYes
data[].roundsarray of objectYes
data[].rounds[].attemptCountnumberYesNumber of provider attempts recorded within this round.
data[].rounds[].completedAtstring (date-time) or nullYes
data[].rounds[].normalizedDeclineReasonstring or nullYesAllowed values: INSUFFICIENT_FUNDS, DO_NOT_HONOUR, TOO_MANY_ATTEMPTS, PARTIAL_APPROVAL, PAYMENT_GATEWAY_ERROR, TECHNICAL_ERROR, RETRYABLE_DECLINE, UNSUPPORTED_CARD_PURCHASE, USER_ERROR, CVV_INVALID, AVS_FAIL, POSTCODE_INVALID, 3DS_FAIL, EXCEEDS_CARD_LIMIT, CLIENT_ERROR, UNKNOWN_DECLINE_REASON.
data[].rounds[].roundNumbernumberYesZero-based original attempt or positive scheduled recovery-round number.
data[].rounds[].scheduledAtstring (date-time)YesPersisted timestamp committed for this round.
data[].rounds[].startedAtstring (date-time) or nullYes
data[].rounds[].statusstringYesAllowed values: scheduled, processing, retryable, non_retryable, operationally_uncertain, succeeded, canceled.
data[].statusstringYesAllowed values: active, operational_retry, recovered, exhausted, non_retryable, manual_review, stopped.
data[].stoppedAtstring (date-time) or nullYes
data[].uuidstring (uuid)Yes
limitnumberYes
pagenumberYes
pagesnumberYes
totalnumberYes

Errors

StatusDescription
400The subscription id or list query parameters were invalid.
401Client Basic authentication or OAuth2 bearer authentication with the required scope is required.
404No subscription with the requested id exists for this client.

SubscriptionStats_get

Subscription rebill stats

Returns successful rebill count, gross revenue, period-end average rebill length, terminal churn, and gross-rebill lifetime value for one half-open period.

PolicyValue
OperationGET /v1/subscriptions/stats
Classread-only
Riskmedium
Confirmationnot-required
Retrysafe
Rate-limit tieraggregate
Rolesowner, admin, member
Scopesmcp:read

Arguments

ArgumentInTypeRequiredDescription
toquerystringYesExclusive reporting-period end as an offset ISO-8601 instant.
fromquerystringYesInclusive reporting-period start as an offset ISO-8601 instant.
ownershipquerystringNoLimit the complete snapshot to canonical Flo-managed renewals. Omit to preserve the provider-neutral historical population. Allowed values: flo.

Result

Returns 200 with a JSON body. One coherent subscription rebill snapshot.

FieldTypeRequiredDescription
averageLifetimeValueobject or nullYes
averageLifetimeValue.amountnumberNoMinimum: 0.
averageLifetimeValue.currencystringNoMinimum length: 3. Maximum length: 3.
averageRebillLengthnumber or nullYesMinimum: 0.
contextobjectYes
context.appliedFiltersarray of objectYesAdditional filters applied after the authoritative tenant boundary. Empty for merchant calls.
context.appliedFilters[].fieldstringYes
context.appliedFilters[].operatorstringYesAllowed values: eq.
context.appliedFilters[].valuestringYes
context.authoritativeLinksarray of objectYesRelative authenticated Flo API links for verifying authoritative source records.
context.authoritativeLinks[].hrefstringYes
context.authoritativeLinks[].relstringYes
context.consistencyobjectYesThe consistency model and its operator-facing freshness caveat.
context.consistency.modelstringYesAllowed values: eventual.
context.consistency.notestringYes
context.currencyobjectYesReporting-currency basis and immutable daily FX snapshots for home/platform totals. Source amounts remain separately segmented.
context.currency.fxobjectYes
context.currency.fx.appliedbooleanYesWhether this aggregate contains monetary values that were FX-valued.
context.currency.fx.effectiveDateTimezonestringYesAllowed values: UTC.
context.currency.fx.methodstringYesAllowed values: daily-exact-or-prior.
context.currency.fx.provisionalbooleanYes
context.currency.fx.snapshotsarray of objectYes
context.currency.fx.snapshots[].provisionalbooleanYes
context.currency.fx.snapshots[].valuationDatestring (date)Yes
context.currency.fx.snapshots[].versionintegerYesMinimum: 1.
context.currency.homeCurrencystring or nullYesMinimum length: 3. Maximum length: 3.
context.currency.reportingCurrencystringYesMinimum length: 3. Maximum length: 3.
context.currency.reportingCurrencyBasisstringYesAllowed values: client-home, platform-usd.
context.dataAsOfstring (date-time)YesThe persisted-data observation boundary for this response.
context.generatedAtstring (date-time)YesWhen the API generated this response.
context.statusSemanticsarray of objectYesCanonical definitions and time bases for statuses and outcomes used in the response.
context.statusSemantics[].appliesToarray of stringYes
context.statusSemantics[].codestringYes
context.statusSemantics[].descriptionstringYes
context.statusSemantics[].timeBasisstringYesAllowed values: created-at, financial-effective-at, billing-cycle-at, attempt-outcome-at.
context.tenantScopeobjectYesThe explicit client-selection mode used by the authenticated backend query.
context.tenantScope.clientIdstring or nullYes
context.tenantScope.kindstringYesAllowed values: authenticated-client, selected-client, all-clients.
context.timeRangeobjectYesThe explicit half-open UTC reporting window applied to the aggregate.
context.timeRange.boundsstringYesAllowed values: [from,to).
context.timeRange.fromstring (date-time)Yes
context.timeRange.timezonestringYesAllowed values: UTC.
context.timeRange.tostring (date-time)Yes
dunningRecoveryobjectYesGross successful rebills recovered by Flo-owned dunning retry rounds. This is an additive subset of rebillCount and rebillRevenue; ordinary first-attempt rebills and provider-managed retries are excluded.
dunningRecovery.recoveredRebillCountintegerYesMinimum: 0.
dunningRecovery.recoveredRebillRevenueobjectYes
dunningRecovery.recoveredRebillRevenue.amountnumberYesMinimum: 0.
dunningRecovery.recoveredRebillRevenue.currencystringYesMinimum length: 3. Maximum length: 3.
dunningTimingPerformanceobjectYesClient-scoped comparison of default and evidence-optimized dunning campaigns whose original billing-cycle due instant falls in the requested half-open period.
dunningTimingPerformance.baselineobjectYes
dunningTimingPerformance.baseline.attemptsintegerYesMinimum: 0.
dunningTimingPerformance.baseline.averageTimeToRecoveryHoursnumber or nullYesMinimum: 0.
dunningTimingPerformance.baseline.campaignCountintegerYesMinimum: 0.
dunningTimingPerformance.baseline.isProvisionalbooleanYesWhether this cohort revenue used provisional FX. This does not change the existing top-level isProvisional semantics.
dunningTimingPerformance.baseline.recoveredRevenueobjectYes
dunningTimingPerformance.baseline.recoveredRevenue.amountnumberYesMinimum: 0.
dunningTimingPerformance.baseline.recoveredRevenue.currencystringYesMinimum length: 3. Maximum length: 3.
dunningTimingPerformance.baseline.successfulRecoveriesintegerYesMinimum: 0.
dunningTimingPerformance.cohortBasisstringYesAllowed values: billing_cycle_at.
dunningTimingPerformance.optimizedobjectYes
dunningTimingPerformance.optimized.attemptsintegerYesMinimum: 0.
dunningTimingPerformance.optimized.averageTimeToRecoveryHoursnumber or nullYesMinimum: 0.
dunningTimingPerformance.optimized.campaignCountintegerYesMinimum: 0.
dunningTimingPerformance.optimized.isProvisionalbooleanYesWhether this cohort revenue used provisional FX. This does not change the existing top-level isProvisional semantics.
dunningTimingPerformance.optimized.recoveredRevenueobjectYes
dunningTimingPerformance.optimized.recoveredRevenue.amountnumberYesMinimum: 0.
dunningTimingPerformance.optimized.recoveredRevenue.currencystringYesMinimum length: 3. Maximum length: 3.
dunningTimingPerformance.optimized.successfulRecoveriesintegerYesMinimum: 0.
fromstring (date-time)Yes
isProvisionalbooleanYes
rebillChargebacksobjectYesDeprecated compatibility alias for rebillDisputes. Same values as rebillDisputes. Removal is tracked separately.
rebillChargebacks.amountnumberNoFX-valued charged-back amount in the same reporting currency as rebillRevenue, each chargeback money movement valued at its own effective date.
rebillChargebacks.countintegerNoChargeback events reversing rebills in this period. Minimum: 0.
rebillChargebacks.percentageOfRebillRevenuenumber or nullNoCharged-back amount divided by gross rebill revenue from exact unrounded totals, HALF_UP to two places; null when gross rebill revenue is zero and not clamped above 100%.
rebillChargebacks.percentageOfRebillsnumber or nullNoChargeback count divided by the gross rebill count, HALF_UP to two places; null when the gross rebill count is zero and not clamped above 100%.
rebillChurnCoverageobject or nullYes
rebillChurnCoverage.coveredintegerNoMinimum: 0.
rebillChurnCoverage.representedintegerNoMinimum: 0.
rebillChurnRatenumber or nullYesMinimum: 0. Maximum: 100.
rebillChurnUnavailableReasonstring or nullYesAllowed values: insufficient_lifecycle_coverage.
rebillCountnumberYesMinimum: 0.
rebillDisputesobjectYesDisputes (actual Stripe and PayPal chargebacks) attributed to subscription renewal charges by their own money-movement effective date (issued-period / occurrence basis). A dispute against the first charge of a subscription is a checkout sale and is reported on the checkout figures, not here. Each dispute money movement is counted once. Network warnings are Pre-Dispute Alerts and are not included.
rebillDisputes.amountnumberNoFX-valued disputed amount in the same reporting currency as rebillRevenue, each Dispute money movement valued at its own effective date.
rebillDisputes.countintegerNoDispute events reversing rebills in this period. Minimum: 0.
rebillDisputes.percentageOfRebillRevenuenumber or nullNoDisputed amount divided by gross rebill revenue from exact unrounded totals, HALF_UP to two places; null when gross rebill revenue is zero and not clamped above 100%.
rebillDisputes.percentageOfRebillsnumber or nullNoDispute count divided by the gross rebill count, HALF_UP to two places; null when the gross rebill count is zero and not clamped above 100%.
rebillRefundsobjectYesRefunds attributed to subscription renewal charges by their own financial effective date (issued-period / occurrence basis). A refund against the first charge of a subscription (including a trial conversion) is a checkout sale and is reported on the checkout figures, not here. Each refund is counted once.
rebillRefunds.amountnumberNoFX-valued refunded amount in the same reporting currency as rebillRevenue, each refund valued at its own financial effective date.
rebillRefunds.countintegerNoRefund events reversing rebills in this period. Minimum: 0.
rebillRefunds.percentageOfRebillRevenuenumber or nullNoRefunded amount divided by gross rebill revenue from exact unrounded totals, HALF_UP to two places; null when gross rebill revenue is zero and not clamped above 100%.
rebillRefunds.percentageOfRebillsnumber or nullNoRefund count divided by the gross rebill count, HALF_UP to two places; null when the gross rebill count is zero and not clamped above 100%.
rebillRevenueobjectYes
rebillRevenue.amountnumberNoMinimum: 0.
rebillRevenue.currencystringNoMinimum length: 3. Maximum length: 3.
renewalOutcomesobjectYesAuthoritative current outcomes for distinct reportable renewal billing cycles whose immutable scheduled due instant is in the requested half-open period. Opening charges, trial conversions, and retries are excluded as separate cycles.
renewalOutcomes.overdueCycleCountintegerYesMinimum: 0.
renewalOutcomes.overduePercentagenumber or nullYesOverdue cycles divided by all reportable renewal cycles, as a percentage rounded HALF_UP to two decimal places; null when there are no reportable cycles. Minimum: 0. Maximum: 100.
renewalOutcomes.rebilledPercentagenumber or nullYesSuccessful cycles divided by successful plus terminally failed cycles, as a percentage rounded HALF_UP to two decimal places; null when there are no settled cycles. Minimum: 0. Maximum: 100.
renewalOutcomes.successfulCycleCountintegerYesMinimum: 0.
renewalOutcomes.terminallyFailedCycleCountintegerYesMinimum: 0.
renewalOutcomes.totalCycleCountintegerYesMinimum: 0.
sourceCurrencySegmentsarray of objectYesGross source amounts grouped by uppercase ISO currency. Amounts are summed exactly then rounded once to that source currency minor unit; no counts are repeated here.
sourceCurrencySegments[].currencystringYesMinimum length: 3. Maximum length: 3.
sourceCurrencySegments[].disputeAmountnumberYes
sourceCurrencySegments[].dunningTimingRecoveredAmountsobjectNo
sourceCurrencySegments[].dunningTimingRecoveredAmounts.baselinenumberYes
sourceCurrencySegments[].dunningTimingRecoveredAmounts.optimizednumberYes
sourceCurrencySegments[].rebillAmountnumberYes
sourceCurrencySegments[].recoveredRebillAmountnumberYes
sourceCurrencySegments[].refundAmountnumberYes
tostring (date-time)Yes

Errors

StatusDescription
401Client Basic authentication or OAuth2 bearer authentication is required.

On this page