Revolut Subscriptions API
The Subscriptions API provides a complete solution for creating and managing recurring billing for your customers. You can automatically charge customers on flexible billing cycles, manage sophisticated subscription plans, and track the entire billing history for every subscriber. ## How it works? A subscription's billing structure is defined by a **Subscription plan**. This model gives you granular control: - **Plans** contain one or more **variations** (e.g., a "Gold" plan could have "Monthly" and "Yearly" variations). - **Variations** can have multiple **phases** (e.g., a 7-day free trial followed by a regular billing phase). This powerful structure allows you to build complex pricing models, including free trials, introductory offers, and tiered pricing. ## Key features - **Flexible pricing models:** Create plans with multiple variations and phases to support any billing scenario. - **Automated charging:** Automatically charge a customer's saved payment method at the start of each billing cycle. - **Hosted onboarding:** For new customers, generate a setup order with a redirect URL to Revolut's Hosted Payment Page, allowing them to securely add a payment method. - **Lifecycle tracking:** Monitor each billing cycle's state, view all associated orders, and access complete payment histories. - **Full subscription management:** Easily update customer payment methods, cancel subscriptions, and view a complete billing history.
POST
/api/subscription-plans
Create a subscription plan
#
GET
/api/subscription-plans
Retrieve a subscription plan list
#
GET
/api/subscription-plans/{subscription_plan_id}
Retrieve a subscription plan
#
POST
/api/subscriptions
Create a subscription
#
GET
/api/subscriptions
Retrieve a subscription list
#
GET
/api/subscriptions/{subscription_id}
Retrieve a subscription
#
PATCH
/api/subscriptions/{subscription_id}
Update a subscription
#
POST
/api/subscriptions/{subscription_id}/change-plan
Change a subscription plan
#
POST
/api/subscriptions/{subscription_id}/change-renewal-date
Update a subscription renewal date
#
POST
/api/subscriptions/{subscription_id}/cancel
Cancel a subscription
#
GET
/api/subscriptions/{subscription_id}/cycles
Retrieve a subscription cycle list
#
GET
/api/subscriptions/{subscription_id}/cycles/{cycle_id}
Retrieve a subscription cycle
#
POST
/api/subscription-usages
Create a subscription usage
#
GET
/api/subscription-usages
Retrieve a subscription usage list
#
GET
/api/subscription-usages/{usage_id}
Retrieve a subscription usage
#
PATCH
/api/subscription-usages/{usage_id}
Update a subscription usage
#
DELETE
/api/subscription-usages/{usage_id}
Delete a subscription usage
#
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/revolut-subscriptions-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Merchant Subscriptions API
version: '2026-04-20'
description: 'Welcome to the Revolut Merchant API - your solution to managing the core aspects of e-commerce and accepting online payments. Whether you''re a startup, a growing business, or an established enterprise in the e-commerce industry, our API helps you streamline your operations.
As a Revolut Business customer with a Merchant Account, you can use the
Merchant API to leverage the following features:
- [Order management](https://developer.revolut.com/docs/api/merchant#tag-orders)
- [Customer management](https://developer.revolut.com/docs/api/merchant#tag-customers)
- [Payment management](https://developer.revolut.com/docs/api/merchant#tag-payments)
- [Subscription management](https://developer.revolut.com/docs/api/merchant#tag-subscriptions)
- [Payout management](https://developer.revolut.com/docs/api/merchant#tag-payouts)
- [Dispute management](https://developer.revolut.com/docs/api/merchant#tag-disputes)
- [Reporting analytics](https://developer.revolut.com/docs/api/merchant#tag-report-runs)
- [Webhook management](https://developer.revolut.com/docs/api/merchant#tag-webhooks)
- [Location management](https://developer.revolut.com/docs/api/merchant#tag-locations)
... and more.
### API versions
:::warning
We highly recommend using versioning in your API calls. If you don''t provide a version header on the operations where it''s required, you will receive an error response.
:::
The Merchant API uses request header versioning. Where it is required you need to use the `Revolut-Api-Version` header parameter to specify an API version. Each request, where it is indicated in the API specification, must contain a version header in the following format:
```
''Revolut-Api-Version: 2026-04-20''
```
:::info
For more information, see: [API versions](https://developer.revolut.com/docs/guides/merchant/reference/versioning/api-versions)
:::
### Test the Merchant API
You can test the Merchant API in Postman by forking this collection:
[](https://www.postman.com/revolut-api/workspace/revolut-developers/overview)'
contact: {}
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
- description: Sandbox server (uses test data)
url: https://sandbox-merchant.revolut.com
security:
- Api-Key: []
tags:
- name: Subscriptions
description: 'The Subscriptions API provides a complete solution for creating and managing recurring billing for your customers.
You can automatically charge customers on flexible billing cycles, manage sophisticated subscription plans, and track the entire billing history for every subscriber.
## How it works?
A subscription''s billing structure is defined by a **Subscription plan**. This model gives you granular control:
- **Plans** contain one or more **variations** (e.g., a "Gold" plan could have "Monthly" and "Yearly" variations).
- **Variations** can have multiple **phases** (e.g., a 7-day free trial followed by a regular billing phase).
This powerful structure allows you to build complex pricing models, including free trials, introductory offers, and tiered pricing.
## Key features
- **Flexible pricing models:** Create plans with multiple variations and phases to support any billing scenario.
- **Automated charging:** Automatically charge a customer''s saved payment method at the start of each billing cycle.
- **Hosted onboarding:** For new customers, generate a setup order with a redirect URL to Revolut''s Hosted Payment Page, allowing them to securely add a payment method.
- **Lifecycle tracking:** Monitor each billing cycle''s state, view all associated orders, and access complete payment histories.
- **Full subscription management:** Easily update customer payment methods, cancel subscriptions, and view a complete billing history.'
paths:
/api/subscription-plans:
parameters:
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/Revolut-Api-Version'
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
post:
summary: Create a subscription plan
operationId: createSubscriptionPlan
description: 'Create a new subscription plan with one or more pricing variations.
A subscription plan defines the billing structure for subscriptions. Each plan can have multiple variations (e.g., monthly vs. yearly), and each variation can have multiple billing phases (e.g., trial period followed by regular billing). These plans are designed for flexibility, allowing you to combine fixed recurring fees with unit-based or usage-based charges into a single, unified subscription.
## How subscription plans work
A subscription plan consists of four hierarchical levels:
1. **Plan**: The top-level container (e.g., "Standard Plan")
1. **Variations**: Different pricing options (e.g., monthly vs. yearly)
1. **Phases**: Sequential billing stages within each variation
1. **Subscription items**: Individual line items within a phase that define **how** to charge (e.g., a base fee plus per-unit charges)
### Phases and billing items
If a `trial_duration` is defined at the variation level, billing phases begin immediately after the trial ends. Phases execute in sequence based on their `ordinal` value (1, 2, 3, etc.):
| Concept | Behaviour |
| ------- | --------- |
| **Cycle control** | Each phase has a `cycle_duration` (e.g., `P1M` for monthly). Use `cycle_count` to limit how many cycles occur; if `null` or omitted, the phase runs indefinitely. |
| **Sequential transition** | When a phase completes its cycles, the subscription advances to the next `ordinal`. If no next phase exists, the subscription stops automatically. |
| **Item composition** | Each phase contains one or more `subscription_items` defining how charges are calculated: **flat** items apply a fixed cost multiplied by `quantity`; **usage** items are metered at the end of the cycle based on reported consumption. |
:::tip [Example: Multi-item billing]
A plan combining a **base platform fee** and **monthly user licenses**:
**Variation:** `Monthly Team`
**Phase 1** — `ordinal: 1`, `cycle_duration: P1M`
| Item | Type | `amount` | `quantity` |
| ---- | ---- | -------- | ---------- |
| **Base platform fee** | `flat` | `4900` (£49.00) | `1` |
| **User licenses** | `flat` | `1000` (£10.00 per unit) | `5` |
The customer is billed a fixed platform fee plus £10.00 for each of their 5 active licenses every month.
:::'
tags:
- Subscriptions
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Plan-Creation'
examples:
simple_plan:
$ref: '#/components/examples/Req-Subscription-Plan-Simple'
trial_plan_with_duration:
$ref: '#/components/examples/Req-Subscription-Plan-With-Trial-Duration'
limited_plan:
$ref: '#/components/examples/Req-Subscription-Plan-Limited'
usage_base_plan:
$ref: '#/components/examples/Req-Subscription-Plan-Usage-Base'
hybrid_plan:
$ref: '#/components/examples/Req-Subscription-Plan-Hybrid'
package_plan:
$ref: '#/components/examples/Req-Subscription-Plan-Package'
items_plan:
$ref: '#/components/examples/Req-Subscription-Plan-With-Items'
responses:
'201':
description: Subscription plan created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Plan'
examples:
simple_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Simple'
trial_plan_with_duration:
$ref: '#/components/examples/Res-Subscription-Plan-With-Trial-Duration'
limited_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Limited'
usage_base_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Usage-Base'
hybrid_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Hybrid'
package_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Package'
items_plan:
$ref: '#/components/examples/Res-Subscription-Plan-With-Items'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
get:
summary: Retrieve a subscription plan list
operationId: retrieveSubscriptionPlanList
description: "Retrieve all subscription plans configured for your merchant account. You can use the query parameters for:\n\n | Filtering | Pagination |\n | --------- | ---------- |\n | Filter the subscription plans that you want to retrieve, for example, only retrieve plans created within a specific date range. <br/><br/>Parameters used for filtering:<br/><ul><li>`from`</li><li>`to`</li></ul> | View the subscription plans without loading all of them at once, for example, return a specified number of plans per page. <br/><br/>Parameters used for pagination: <br/><ul><li>`limit`</li><li>`page_token`</li></ul> |"
tags:
- Subscriptions
parameters:
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/From'
- $ref: '#/components/parameters/To'
- $ref: '#/components/parameters/Page-Token'
responses:
'200':
description: List of subscription plans retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Plans'
examples:
plans_list:
$ref: '#/components/examples/Res-Subscription-Plans-List'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
/api/subscription-plans/{subscription_plan_id}:
parameters:
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/Revolut-Api-Version'
- $ref: '#/components/parameters/Subscription-Plan-Id'
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
get:
summary: Retrieve a subscription plan
operationId: retrieveSubscriptionPlan
description: 'Retrieve a specific subscription plan by its unique identifier.
A subscription plan contains **variations** (different pricing options like monthly vs. yearly), and each variation contains **phases** (sequential billing stages).
Phases execute based on their `ordinal` value. When a phase completes its `cycle_count`, the subscription moves to the next phase. If `cycle_count` is `null` or omitted, the phase continues indefinitely.
:::note
If a `trial_duration` is defined, phases begin immediately after the trial ends.
:::'
tags:
- Subscriptions
responses:
'200':
description: Subscription plan retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Plan'
examples:
simple_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Simple'
trial_plan_with_duration:
$ref: '#/components/examples/Res-Subscription-Plan-With-Trial-Duration'
limited_plan:
$ref: '#/components/examples/Res-Subscription-Plan-Limited'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'404':
description: Subscription plan not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
/api/subscriptions:
parameters:
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/Revolut-Api-Version'
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
post:
summary: Create a subscription
operationId: createSubscription
description: "Create a new subscription for a customer using a subscription plan variation.\n\nThere are several supported flows for creating and activating subscriptions, depending on your integration needs.\n\n:::note\nThe customer must already exist in the API. The `customer_id` is required for all subscription flows.\n:::\n\n<details>\n<summary>\n\n#### Flow 1: Hosted Payment Page (HPP)\n\n</summary>\n\nUse this flow to redirect the customer to Revolut's Hosted Payment Page to complete the first payment and save their payment method.\n\n**Backend flow:**\n1. Create a subscription with optional `setup_order_redirect_url`:\n\n | `setup_order_redirect_url` | Behaviour |\n | -------------------------- | --------- |\n | **Provided** | The setup order's `redirect_url` field is set to this value. |\n | **Omitted** | The setup order uses Revolut's default redirect behaviour. |\n\n1. The subscription is created in a `pending` state with a `setup_order_id` in the response.\n1. [Retrieve the order](https://developer.revolut.com/docs/api/merchant/2024-09-01#retrieve-order) using `setup_order_id` as the `order_id` in the path to get the `checkout_url`.\n1. Redirect the customer to the `checkout_url` for the Hosted Payment Page.\n\n**Customer flow:**\n1. Customer is redirected to Revolut's Hosted Payment Page.\n1. Customer completes payment on the HPP, and their payment method is saved.\n1. Customer redirect after payment depends on your setup:\n\n | `setup_order_redirect_url` | Customer redirect |\n | -------------------------- | ----------------- |\n | **Provided** | Customer is redirected to your custom URL. |\n | **Omitted** | Customer sees the default Revolut completion screen. |\n\n**Key characteristics:**\n- Customer completes payment on Revolut's hosted page\n- Payment method is automatically saved for future billing cycles\n- Optional custom redirect after payment\n- Best for web-based integrations\n\n</details>\n\n<details>\n\n<summary>\n\n#### Flow 2: Widget or card-not-present (CNP) payment\n\n</summary>\n\nUse this flow when you want to embed the payment experience directly on your website using one of Revolut's payment widgets or handle card-not-present payments.\n\n**Backend flow:**\n1. Create a subscription with minimal required parameters.\n1. The subscription is created in a `pending` state with a `setup_order_id` in the response.\n1. [Retrieve the order](https://developer.revolut.com/docs/api/merchant/2024-09-01#retrieve-order) using `setup_order_id` as the `order_id` in the path to get order details for your integration.\n1. Integrate your payment solution (widget, SDK, or CNP method) on your frontend, ensuring it's configured to save the customer's payment method for recurring billing.\n\n**Customer flow:**\n1. Customer stays on your website/application.\n1. Customer completes payment, and their payment method is saved for future billing cycles.\n\n**Key characteristics:**\n- Payment experience embedded directly in your application\n- Customer never leaves your website\n- Payment method is saved for future billing cycles\n- Best for native mobile apps or fully custom web experiences\n\n</details>"
tags:
- Subscriptions
parameters:
- $ref: '#/components/parameters/Idempotency-Key'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Creation'
examples:
with_setup_order:
$ref: '#/components/examples/Req-Subscription-Setup-Order'
with_setup_order_no_url:
$ref: '#/components/examples/Req-Subscription-Setup-Order-No-URL'
with_trial:
$ref: '#/components/examples/Req-Subscription-With-Trial'
skip_trial:
$ref: '#/components/examples/Req-Subscription-Skip-Trial'
responses:
'201':
description: Subscription created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription'
examples:
with_setup_order:
$ref: '#/components/examples/Res-Subscription-Setup-Order'
with_setup_order_no_url:
$ref: '#/components/examples/Res-Subscription-Setup-Order-No-URL'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
get:
summary: Retrieve a subscription list
operationId: retrieveSubscriptionList
description: "Retrieve all subscriptions for the merchant account. You can use the query parameters for:\n\n | Filtering | Pagination |\n | --------- | ---------- |\n | Filter the subscriptions that you want to retrieve, for example, only retrieve subscriptions created within a specific date range or with a specific external reference. <br/><br/>Parameters used for filtering:<br/><ul><li>`from`</li><li>`to`</li><li>`external_reference`</li></ul> | View the subscriptions without loading all of them at once, for example, return a specified number of subscriptions per page. <br/><br/>Parameters used for pagination: <br/><ul><li>`limit`</li><li>`page_token`</li></ul> |"
tags:
- Subscriptions
parameters:
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/From'
- $ref: '#/components/parameters/To'
- name: external_reference
in: query
schema:
type: string
description: Return subscriptions with a specific `external_reference`. Used for **filtering**.
required: false
- $ref: '#/components/parameters/Page-Token'
responses:
'200':
description: List of subscriptions retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscriptions'
examples:
subscriptions_list:
$ref: '#/components/examples/Res-Subscriptions-List'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
/api/subscriptions/{subscription_id}:
parameters:
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/Revolut-Api-Version'
- $ref: '#/components/parameters/Subscription-Id'
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
get:
summary: Retrieve a subscription
operationId: retrieveSubscription
description: 'Retrieve a subscription by its unique identifier.
Use this endpoint to get the current state and details of a specific subscription.'
tags:
- Subscriptions
responses:
'200':
description: Subscription retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription'
examples:
active_subscription:
$ref: '#/components/examples/Res-Subscription-Active'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'404':
description: Subscription not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
patch:
summary: Update a subscription
operationId: updateSubscription
description: 'Update a subscription''s details.
You can update a subscription and specific parameters based on the value of the `state` parameter:
| State parameter value | Modifiable parameters |
| --------------------- | --------------------- |
| `pending`, `active`, `overdue`, `paused` | You can modify all listed parameters. |
| `cancelled`, `finished` | You cannot modify parameters. These are final states. |
**Common use cases:**
- **Update external reference**: When you need to sync with updated customer records in your system, correct an initial reference value, or re-map the subscription to a different internal tracking ID to maintain consistency with your database.'
tags:
- Subscriptions
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Update'
examples:
update_subscription:
$ref: '#/components/examples/Req-Subscription-Update'
responses:
'200':
description: Subscription updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription'
examples:
updated_subscription:
$ref: '#/components/examples/Res-Subscription-Active'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'404':
description: Subscription not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
/api/subscriptions/{subscription_id}/change-plan:
parameters:
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/Revolut-Api-Version'
- $ref: '#/components/parameters/Subscription-Id'
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
post:
summary: Change a subscription plan
operationId: changeSubscriptionPlan
description: 'Schedule a plan change for a subscription. The change is applied at the end of the current billing cycle.
### Use cases
- **Plan upgrades:** Moving a customer to a higher-tier plan with more features or capacity.
- **Plan downgrades:** Moving a customer to a lower-tier plan that better fits their usage and budget.
- **Customer requests:** Accommodating a customer''s request to switch to a different plan variation.
### How it works
When you schedule a plan change, the subscription continues operating under its current plan variation until the current billing cycle ends. At that point, the next cycle is created under the new plan variation.
- **Scheduled change:** The plan change is scheduled to take effect `at_cycle_end`. The current cycle completes normally, and the new plan variation applies starting from the next cycle.
- **Plan variation phases:** Some plan variations are divided into phases - distinct pricing or duration periods within a single variation. If the target plan variation has multiple phases, use `plan_variation_phase_id` to specify which phase to start from. If omitted, the change starts from the first phase.
- **Trial periods:** If the target plan variation includes a trial period, it is skipped when changing plans. Trial periods only apply when a subscription is first created.
- **Subsequent cycles:** After the transition, future cycles follow the cadence and pricing defined by the new plan variation.'
tags:
- Subscriptions
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Change-Plan'
examples:
change_plan:
$ref: '#/components/examples/Req-Subscription-Change-Plan'
change_plan_with_reason:
$ref: '#/components/examples/Req-Subscription-Change-Plan-With-Reason'
change_plan_with_phase:
$ref: '#/components/examples/Req-Subscription-Change-Plan-With-Phase'
responses:
'204':
description: Plan change scheduled successfully
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
examples:
immediate_not_supported:
summary: Immediate plan change not supported
value:
code: bad_request
message: Immediate plan change is not supported. Please provide 'scheduled' field (e.g. 'at_cycle_end')
timestamp: 1601296792533
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'404':
description: Subscription not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
'422':
description: Unprocessable entity
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
examples:
subscription_finished:
summary: Subscription is finished
value:
code: subscription_finished
message: The subscription is finished
timestamp: 1601296792533
next_cycle_exists:
summary: Next cycle already exists with a different plan variation
value:
code: subscription_cycle_next_cycle_exists
message: Next cycle already exists with a different plan variation
timestamp: 1601296792533
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error-v2'
security:
- Api-Key: []
/api/subscriptions/{subscription_id}/change-renewal-date:
parameters:
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/Revolut-Api-Version'
- $ref: '#/components/parameters/Subscription-Id'
servers:
- description: Production server (uses live data)
url: https://merchant.revolut.com
post:
summary: Update a subscription renewal date
operationId: updateSubscriptionRenewalDate
description: "Reschedule the upcoming payment date for an active subscription cycle. This is a command endpoint — the renewal date is not a direct field on the Subscription resource, but is derived from the current active cycle's `end_date`.\n\n### Use cases\n\n- **Payment extensions:** Granting a customer more time to pay.\n- **Service delays:** Adjusting the billing date if service delivery is delayed.\n- **Billing alignment:** Moving a payment date to better suit a customer's financial schedule.\n\n### How it works\n\nExtending the current cycle's `end_date` naturally postpones the start of the next cycle and its associated payment trigger, providing flexibility for both the merchant and the customer.\n\nThe relationship between the cycle end and the billing execution depends on the plan type:\n\n- **Non-usage plans:** The next cycle's start date is the same as the billing date. The moment the current cycle ends, the next cycle begins and the payment is attempted.\n- **Usage-based plans (buffer & overlap):** To allow merchants time to finalize usage data, the billing date is scheduled after the cycle `end_date`.\n - Usage continues to be aggregated until the updated `end_date`.\n - When the current cycle (Cycle 1) reaches its updated `end_date`, **Cycle 2 starts immediately** to ensure no service interruption.\n - The billing for Cycle 1 occurs a few hours later (12-hour buffer). This window allows you to upload or edit usages for the period that just ended while the customer is already technically in their next cycle.\n - Rescheduling the `renewal_date` pushes this entire sequence—the end of Cycle 1, the start of Cycle 2, and the delayed billing trigger—further into the future.\n\nSubsequent cycles resume the original plan cadence (e.g., monthly) from the new date."
tags:
- Subscriptions
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Subscription-Update-Renewal-Date'
examples:
simple_plan:
$ref: '#/components/examples/Req-Subscription-Update-Renewal-Date'
responses:
'204':
description: Renewal date updated successfully
'400':
description: Bad Request
content:
# --- truncated at 32 KB (121 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/revolut/refs/heads/main/openapi/revolut-subscriptions-api-openapi.yml