openapi: 3.0.1 info: version: '1.0' title: Business API description: |- As a Revolut Business customer with a Business Account, you can use the Business API to automate your own business processes. Save time, reduce your costs, and avoid errors by using the Business API. :::tip[Before you get started] To learn more about the Business API and its features, check the [**user guides**](https://developer.revolut.com/docs/guides/manage-accounts/introduction). You can reach them at any time from the main navigation bar **→ Guides → Business**. ::: You can view accounts, manage counterparties, make payments or currency exchanges without manual effort in the Web UI: - Accounting: [Account management](https://developer.revolut.com/docs/api/business#get-account), [Accounting settings](https://developer.revolut.com/docs/api/business#tag-accounting), [Expense management](https://developer.revolut.com/docs/api/business#get-expense), [Transactions](https://developer.revolut.com/docs/api/business#get-transactions) - Payments: - [Counterparty management](https://developer.revolut.com/docs/api/business#get-counterparties) - Payment management: [Payment drafts](https://developer.revolut.com/docs/api/business#delete-payment-draft), [Payout links](https://developer.revolut.com/docs/api/business#get-payout-link), [Transfers](https://developer.revolut.com/docs/api/business#tag-transfers) - [Foreign exchange](https://developer.revolut.com/docs/api/business#tag-foreign-exchange) - Business team: [Card management](https://developer.revolut.com/docs/api/business#delete-card), [Card invitation management](https://developer.revolut.com/docs/api/business#update-card-invitation), [Team member management](https://developer.revolut.com/docs/api/business#delete-team-member) - Developer tools: [Sandbox simulations](https://developer.revolut.com/docs/api/business#tag-simulations), [Webhook management](https://developer.revolut.com/docs/api/business#tag-webhooks-v2) To see the reference for the specific endpoints and operations of this API, browse the menu on the left. ### Test the Business API You can test the Business API in Postman by forking this collection: [![View in Postman](https://run.pstmn.io/button.svg)](https://www.postman.com/revolut-api/workspace/revolut-developers/overview) contact: {} servers: - url: https://b2b.revolut.com/api/1.0 description: Production server (uses live data) - url: https://sandbox-b2b.revolut.com/api/1.0 description: Sandbox server (uses test data) paths: /accounting-categories: post: summary: Create an accounting category operationId: createAccountingCategory description: |- Add a new accounting category to the list of accounting categories that can be assigned to your financial records, such as expenses. :::note This operation is not supported for [externally managed accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories#externally-managed-settings). ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories). security: - AccessToken: - WRITE requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateAccountingCategoryRequest' examples: category_with_default_tax_rate: summary: Accounting category with default tax rate value: name: Transportation code: '400' default_tax_rate_id: e6b84ddb-a127-466b-9a0a-501bda07773f category_without_default_tax_rate: summary: Accounting category without default tax rate value: name: Office supplies code: '410' responses: '201': description: |- Resource created On successful creation, the response returns only the ID of the new resource (i.e. the accounting category), even if the resource has more properties. To get all the details of the accounting category, use the returned resource ID with a [GET request](https://developer.revolut.com/docs/api/business#get-accounting-category). $ref: '#/components/responses/ResourceCreatedResponse' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Required parameter(s) missing value: error_id: fa12f45e-0ebf-4f7c-88e0-ebb7a1441a18 code: 2101 message: '''code'' is required, ''name'' is required' bad_param_type: summary: Incorrect parameter type value: error_id: 29146977-8042-446f-b362-675e2921d71c code: 2101 message: '''code'' must be a string, ''name'' must be a string' invalid_json: summary: Invalid JSON value: error_id: df7b76b2-1313-42f0-8c0b-3673c665f135 code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 7acc6073-5290-45f8-8956-c79d487ef1e5 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: '''name'' must be at most 60 characters' bad_param_format: summary: Incorrect parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: '''default_tax_rate_id'' must be a valid UUID' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when an accounting category with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: category_with_name_exists: summary: Name must be unique value: error_id: 8c08b656-ab6e-4768-4e57-f281da25aa2b code: 3503 message: Category with name My Unique Accounting Category already exists category_with_code_exists: summary: Code must be unique value: error_id: 8c08b656-ab6e-4768-4e57-f281da25aa2b code: 3504 message: Category with code MUAC already exists '422': description: |- Unprocessable entity - accounting category cannot be created due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and accounting categories are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_modify_externally_managed_resource: summary: Accounting categories are managed by integration, cannot be created manually value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Accounting categories are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Accounting categories get: summary: Retrieve a list of accounting categories operationId: getAccountingCategories description: |- Get available accounting categories based on the provided query criteria. :::note The API returns a maximum of 500 accounting categories per request. The default page size is 100. ::: The accounting categories are sorted by the `created_at` date in reverse chronological order, and they're **paginated**. The page size, that is, the maximum number of accounting categories returned per page is specified by the `limit` parameter. - If the number of results exceeds the page size, the response also returns a cursor for the next page under `next_page_token`. To get the next page of results, make a new request using that `next_page_token` value in `page_token`. - If the number of results is smaller than the page size, `next_page_token` is not returned. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories). security: - AccessToken: - READ parameters: - name: limit in: query required: false description: |- The page size, that is, the maximum number of accounting categories to return per page. To get the next page of results, use `page_token`. schema: type: integer minimum: 1 maximum: 500 default: 100 example: 10 - $ref: '#/components/parameters/PageToken' responses: '200': description: List of accounting categories and the next page token if the number of results exceeds the page size content: application/json: schema: type: object properties: next_page_token: $ref: '#/components/schemas/PageToken' accounting_categories: type: array description: The list of accounting categories. items: $ref: '#/components/schemas/AccountingCategoryResponse' required: - accounting_categories examples: results_with_next_page: summary: Results exceed page size (when limit=5) & next page available value: next_page_token: MjAyNi0wMS0wMVQwOToxMzoxNS40MDZaN2RhNTFjZGY0LTZiYjctNDRkNi04OWU1LTc2OWEzZGYxZDc5ZA accounting_categories: - id: 8d831292-f950-4c5a-83f9-030df8cacd3f name: Transportation code: '400' created_at: '2026-03-11T17:03:25.570942Z' updated_at: '2026-03-11T17:03:25.570942Z' default_tax_rate_id: d8f6bf6c-5b70-4c16-9549-5943e67ab009 - id: 8d749b93-4a2e-4f28-8b5b-9d64fe2e1d62 name: Office Supplies code: '410' created_at: '2026-03-11T17:03:25.570940Z' updated_at: '2026-03-11T17:03:25.570940Z' default_tax_rate_id: 2a3520af-e6f7-416c-821e-0e83ffac1dfa - id: 3726661e-0e93-4822-8bda-4d1a4c6e7dff name: Software & Subscriptions code: '420' created_at: '2026-03-11T17:03:25.570937Z' updated_at: '2026-03-11T17:03:25.570937Z' default_tax_rate_id: 6a83d8d8-f5a5-405d-aafd-729786569c2d - id: b37c42c8-1d42-4ee1-aa7e-348dd06ea69f name: General Expenses code: '429' created_at: '2026-03-11T17:03:25.570927Z' updated_at: '2026-03-11T17:03:25.570927Z' default_tax_rate_id: 5781063b-d140-4c72-bde9-b8b21e64e3e0 - id: c729ea95-3ae7-4d21-91f7-1a69844175f2 name: Travel & Lodging code: '460' created_at: '2026-03-11T17:03:25.570924Z' updated_at: '2026-03-11T17:03:25.570924Z' default_tax_rate_id: f2519604-b04a-4a82-9b01-68235c4ad000 results_single_page: summary: Results fit within page size, no more pages available value: accounting_categories: - id: 8d831292-f950-4c5a-83f9-030df8cacd3f name: Transportation code: '400' created_at: '2026-03-11T17:03:25.570942Z' updated_at: '2026-03-11T17:03:25.570942Z' default_tax_rate_id: d8f6bf6c-5b70-4c16-9549-5943e67ab009 - id: 8d749b93-4a2e-4f28-8b5b-9d64fe2e1d62 name: Office Supplies code: '410' created_at: '2026-03-11T17:03:25.570940Z' updated_at: '2026-03-11T17:03:25.570940Z' default_tax_rate_id: 2a3520af-e6f7-416c-821e-0e83ffac1dfa - id: 3726661e-0e93-4822-8bda-4d1a4c6e7dff name: Software & Subscriptions code: '420' created_at: '2026-03-11T17:03:25.570937Z' updated_at: '2026-03-11T17:03:25.570937Z' default_tax_rate_id: 6a83d8d8-f5a5-405d-aafd-729786569c2d - id: b37c42c8-1d42-4ee1-aa7e-348dd06ea69f name: General Expenses code: '429' created_at: '2026-03-11T17:03:25.570927Z' updated_at: '2026-03-11T17:03:25.570927Z' default_tax_rate_id: 5781063b-d140-4c72-bde9-b8b21e64e3e0 - id: c729ea95-3ae7-4d21-91f7-1a69844175f2 name: Travel & Lodging code: '460' created_at: '2026-03-11T17:03:25.570924Z' updated_at: '2026-03-11T17:03:25.570924Z' default_tax_rate_id: f2519604-b04a-4a82-9b01-68235c4ad000 - id: 846b4cad-462d-4b4e-b96c-fc4e14de564d name: Utilities code: '499' created_at: '2026-03-11T17:03:25.570919Z' updated_at: '2026-03-11T17:03:25.570919Z' default_tax_rate_id: fa95a4ae-a7d2-4ea6-bf42-2af1aead8ca4 - id: 2f76152a-2b14-4390-aa32-bbab02a1e98c name: Meals & Entertainment code: '500' created_at: '2026-03-11T17:03:25.570919Z' updated_at: 2026-03-11T17:03:25.570919Zs '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_type: summary: Incorrect query parameter type value: error_id: 29146977-8042-0ebf-b362-af224b14c830 code: 2101 message: Query parameter 'limit' must be an integer param_value_too_low: summary: Query parameter value too low value: error_id: b5a51cd1-4f78-4074-adae-675e2921d71c code: 2101 message: Query parameter 'limit' must be at least 1 param_value_too_high: summary: Query parameter value too high value: error_id: fa12f45e-4633-446f-8d40-42dadc380511 code: 2101 message: Query parameter 'limit' must be at most 500 multiple_values_not_allowed: summary: Multiple values provided for a single-value query parameter value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: Query parameter 'limit' must have a single value param_cannot_be_empty: summary: Query parameter provided without a value value: error_id: fa12f45e-0ebf-4f7c-88e0-3673c665f135 code: 2101 message: Query parameter 'limit' must not be empty, Query parameter 'page_token' must not be empty bad_page_token: summary: Incorrect page token value: error_id: 69772914-8042-0ebf-b362-14c830af224b code: 2101 message: Query parameter 'page_token' is invalid. Use a value from a previous response's next_page_token field. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Accounting categories /accounting-categories/{accounting_category_id}: get: summary: Retrieve accounting category details operationId: getAccountingCategory description: |- Get the details of a specific accounting category based on its ID. The details include the accounting category name, code, and default tax rate, as well as when the accounting category was added to your settings, and when it was last updated. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories). security: - AccessToken: - READ parameters: - name: accounting_category_id in: path required: true description: The ID of the accounting category to retrieve. schema: type: string format: uuid example: 64a2d310-e2a0-43c2-872f-969098141ebb responses: '200': description: Accounting category details content: application/json: schema: $ref: '#/components/schemas/AccountingCategoryResponse' examples: category_with_default_tax_rate: summary: Accounting category with default tax rate value: id: 8d831292-f950-4c5a-83f9-030df8cacd3f name: Transportation code: '400' created_at: '2026-03-11T17:03:25.570942Z' updated_at: '2026-03-11T17:03:25.570942Z' default_tax_rate_id: e6b84ddb-a127-466b-9a0a-501bda07773f category_without_default_tax_rate: summary: Accounting category without default tax rate value: id: 6a37383e-cfd3-4a2f-aa81-e3a6e6939efa name: Office supplies code: '410' created_at: '2026-03-11T17:03:25.570942Z' updated_at: '2026-03-11T17:03:25.570942Z' '400': description: |- Bad Request Returned, for example, when the required path parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 36e1a581-b05e-4018-b202-6b371092a19a code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the accounting category that you're trying to retrieve cannot be found. This can happen, for example, when the accounting category doesn't exist, or the provided accounting category ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: cbb15721-5f51-4588-a959-7494bb7ba827 code: 3006 message: Accounting category with id 8945879d-6854-4e10-88d6-ce92c5f010ac not found '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Accounting categories patch: summary: Update accounting category settings operationId: updateAccountingCategory description: |- Update settings for a specific accounting category, based on its ID. :::note This operation is not supported for [externally managed accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories#externally-managed-settings). ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories). security: - AccessToken: - WRITE parameters: - name: accounting_category_id in: path required: true description: The ID of the accounting category to update. schema: type: string format: uuid example: 64a2d310-e2a0-43c2-872f-969098141ebb requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateAccountingCategoryRequest' examples: update_all_props: summary: Update all properties value: name: Custom with tax rate code: '998' default_tax_rate_id: e6b84ddb-a127-466b-9a0a-501bda07773f update_category_name: summary: Update accounting category name value: name: Marketing update_category_code: summary: Update accounting category code value: code: '998' update_default_tax_rate: summary: Update default tax rate value: default_tax_rate_id: 6a6399c3-4a3b-4b21-b710-57aa03aae58f responses: '204': description: Accounting category updated '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Body is empty value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 2101 message: Request body must not be empty bad_param_type: summary: Incorrect parameter format value: error_id: a79a73ea-7dk4-41f8-a106-1656ab5f1234 code: 2101 message: '''name'' must be a string' bad_param_format: summary: Incorrect parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID invalid_json: summary: Invalid JSON value: error_id: 36f3cec5-b4b9-431f-9c28-afd3899bc64f code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 32fd0697-2f3f-4308-b25d-c9230f99c589 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: d8d919b5-d667-4058-9bb3-17b6f7bcd6c8 code: 2101 message: '''name'' must be at most 60 characters' param_value_too_long2: summary: Parameter value too long value: error_id: b4d919b5-d667-4058-9bb3-17b6f7bcdd03 code: 2101 message: '''code'' must be at most 50 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the accounting category that you're trying to modify cannot be found. This can happen, for example, when the accounting category doesn't exist, or the provided category ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: be6c9d90-df25-458a-b559-be61896c94b8 code: 3006 message: Accounting category with id b656d8a4-a5cb-4f03-9a95-f281da25aa2b not found '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when an accounting category with the provided name and/or code already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: category_with_name_exists: summary: Name must be unique value: error_id: 8c08b656-ab6e-4768-4e57-f281da25aa2b code: 3503 message: Category with name My Unique Accounting Category already exists category_with_code_exists: summary: Code must be unique value: error_id: d8a48c08-4e57-4768-ab6e-4d53aa1731b0 code: 3504 message: Category with code MUAC already exists '422': description: |- Unprocessable entity - accounting category cannot be updated due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and accounting categories are managed by that integration. May also be returned if you try to modify a category that has already been deleted, or when you try to clear `name` and/or `code` values using `null`. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_update_externally_managed_resource: summary: Accounting category managed by integration, cannot be updated value: error_id: 9c4be950c-cfd6-4e04-bd79-bd433ab33c15 code: 3514 message: Accounting categories are managed by your connected accounting integration and cannot be modified manually state_mismatch: summary: Accounting category is no longer available value: error_id: 41ef105-4278-cfd6-a17f-2d57a3951774 code: 3100 message: Invalid request null_name: summary: Name cannot be null value: error_id: 41ef105-4278-cfd6-a17f-2d57a3951774 code: 3100 message: Invalid request null_code: summary: Code cannot be null value: error_id: 41ef105-4278-cfd6-a17f-2d57a3951774 code: 3100 message: Invalid request null_name_and_code: summary: Name or code cannot be null value: error_id: 41ef105-4278-cfd6-a17f-2d57a3951774 code: 3100 message: Invalid request '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Accounting categories delete: summary: Delete an accounting category operationId: deleteAccountingCategory description: |- Delete a specific accounting category, based on its ID. :::note This operation is not supported for [externally managed accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories#externally-managed-settings). ::: Once the accounting category is deleted, it will not be returned by the API or in the Revolut Business app, and: - You will not be able to assign it to new financial records (e.g. expenses). - Existing records assigned to this category that have not been completed will be marked as invalid, and you'll need to reassign them to another category. - Completed records will not be affected by the change. A successful response does not get any content in return. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories). security: - AccessToken: - WRITE parameters: - name: accounting_category_id in: path required: true description: The ID of the accounting category to delete. schema: type: string format: uuid example: 64a2d310-e2a0-43c2-872f-969098141ebb responses: '204': description: Accounting category deleted '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_format: summary: Incorrect path parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the accounting category that you're trying to delete doesn't exist. This can happen when, for example, the accounting category has already been deleted, or the provided category ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 69bca351a-22a7-ac4d-af05-21032f9080ec code: 3006 message: Accounting category with id d6c034a8-b302-4741-b66f-cc0f0a19642e not found '422': description: |- Unprocessable entity - accounting category cannot be deleted due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and accounting category are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_delete_externally_managed_resource: summary: Accounting categories managed by integration, cannot be deleted value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Accounting categories are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Accounting categories /account-name-validation: post: summary: Validate an account name (CoP/VoP) operationId: validateAccountName description: |- Validate a counterparty's account name against their account details when [adding a counterparty](https://developer.revolut.com/docs/api/business#add-counterparty) or [making a transfer](https://developer.revolut.com/docs/api/business#create-payment) to a new or existing counterparty. :::warning The CoP check is **not** a complete fraud-prevention tool, and it does **not** guarantee the person is who they claim to be. It only confirms that the name and account details your provide match the bank's records. Even if the counterparty's details match, you should still exercise due caution when transferring funds. ::: :::note[Availability & Sandbox behaviour] - This feature is only available to businesses in the [supported regions](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services). Additionally, to get access to CoP in the UK, eligible businesses must contact [Revolut API Support](mailto:api-requests@revolut.com). - In Sandbox, this feature is only available for **testing**. While **incomplete or invalid requests** will return production-like error responses, **complete and valid requests** in Sandbox do **not** undergo real validation and will always return `cannot_be_checked`. ::: The validation relies on different underlying services, depending on the recipient's payment scheme (region and currency). These factors determine which fields you must provide and what response you get. - For examples, refer to the request body samples. - For more information, see the guides: [Validate an account name (CoP/VoP)](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee). security: - AccessToken: - WRITE requestBody: description: Counterparty account details required: true content: application/json: schema: $ref: '#/components/schemas/ValidateAccountNameRequest' examples: uk_individual: summary: UK individual counterparty (personal account) value: sort_code: 54-01-05 account_no: '12345678' individual_name: first_name: John last_name: Smith uk_company: summary: UK company (business account) value: sort_code: 54-01-05 account_no: '12345678' company_name: John Smith Co. eu_individual: summary: EUR individual counterparty (personal account) value: iban: LT479258808892168739 recipient_country: LT recipient_currency: EUR individual_name: first_name: Petras last_name: Petrauskas eu_company: summary: EUR company (business account) value: iban: LT479258808892168739 recipient_country: LT recipient_currency: EUR company_name: Petras Petrauskas UAB ro_individual: summary: RO individual counterparty (personal account) value: iban: RO1598536106002528374911 recipient_country: RO recipient_currency: RON individual_name: first_name: Alexandru last_name: Ionescu ro_company: summary: RO company (business account) value: iban: RO1598536106002528374911 recipient_country: RO recipient_currency: RON company_name: Alexandru Ionescu SRL au_individual: summary: AU individual counterparty (personal account) value: account_no: '486196918' bsb: '159517' individual_name: first_name: Joseph last_name: Bloggs au_company: summary: AU company (business account) value: account_no: '486196918' bsb: '159517' company_name: Joseph Bloggs Pty Ltd responses: '200': description: |- Account name validation result :::note - The actual results returned in the response come from the CoP services, not from Revolut. The Business API passes them on as received. Because of this, the descriptions below should be treated as an approximation rather than complete documentation. - The responses differ depending on the CoP service, even when the schema appears the same. Make sure that you refer to the appropriate response variant. ::: content: application/json: schema: $ref: '#/components/schemas/ValidateAccountNameResponse' examples: match_individual_uk: summary: (UK) Individual account name and number match value: result_code: matched individual_name: first_name: John last_name: Smith match_company_uk: summary: (UK) Company account name and number match value: result_code: matched company_name: John Smith Co. match_but_individual_account_type_uk: summary: (UK) Names match but counterparty is an individual, not a company value: result_code: close_match reason: type: uk_cop code: individual_account_name_matched individual_name: first_name: John last_name: Smith match_but_company_account_type_uk: summary: (UK) Names match but counterparty is a company, not an individual value: result_code: close_match reason: type: uk_cop code: company_account_name_matched company_name: John Smith Co. close_match_individual_name_uk: summary: (UK) Individual account name is a close match value: result_code: close_match reason: type: uk_cop code: close_match individual_name: first_name: Joan last_name: Smith close_match_company_name_uk: summary: (UK) Company account name is a close match value: result_code: close_match reason: type: uk_cop code: close_match company_name: Joan Smith Co. close_match_individual_name_and_account_type_uk: summary: (UK) Names are similar and counterparty is an individual, not a company value: result_code: close_match reason: type: uk_cop code: individual_account_close_match individual_name: first_name: Joan last_name: Smith close_match_company_name_and_account_type_uk: summary: (UK) Names are similar and counterparty is a company, not an individual value: result_code: close_match reason: type: uk_cop code: company_account_close_match company_name: Joan Smith Co. account_does_not_match_individual_uk: summary: (UK) Provided details for individual do not match account details value: result_code: not_matched reason: type: uk_cop code: not_matched individual_name: first_name: John last_name: Smith account_does_not_match_company_uk: summary: (UK) Provided details for company do not match account details value: result_code: not_matched reason: type: uk_cop code: not_matched company_name: John Smith Co. account_does_not_exist_uk: summary: (UK) Account does not exist value: result_code: not_matched reason: type: uk_cop code: account_does_not_exist account_switched_uk: summary: (UK) Account switched value: result_code: cannot_be_checked reason: type: uk_cop code: account_switched cannot_be_checked_uk: summary: (UK) Account cannot be checked value: result_code: cannot_be_checked reason: type: uk_cop code: cannot_be_checked individual_name: first_name: Jane last_name: Doe match_individual_au: summary: (AU) Individual account name and number match value: result_code: matched individual_name: first_name: Joseph last_name: Bloggs match_company_au: summary: (AU) Company account name and number match value: result_code: matched company_name: Joseph Bloggs Pty Ltd match_but_individual_account_type_au: summary: (AU) Names match but counterparty is an individual, not a company value: result_code: matched individual_name: first_name: Joseph last_name: Bloggs match_but_company_account_type_au: summary: (AU) Names match but counterparty is a company, not an individual value: result_code: matched company_name: Joseph Bloggs Pty Ltd close_match_company_name_au: summary: (AU) Company account name is a close match value: result_code: close_match reason: type: au_cop code: close_match company_name: Josef Bloggs Pty Ltd account_does_not_match_individual_au: summary: (AU) Provided details for individual do not match account details value: result_code: not_matched reason: type: au_cop code: not_matched individual_name: first_name: Jane last_name: Bloggs account_does_not_match_company_au: summary: (AU) Provided details for company do not match account details value: result_code: not_matched reason: type: uk_cop code: not_matched company_name: Jane Bloggs Pty Ltd match_individual_eur: summary: (EUR) Individual account name and number match value: result_code: matched individual_name: first_name: Petras last_name: Petrauskas match_company_eur: summary: (EUR) Company account name and number match value: result_code: matched company_name: Petras Petrauskas UAB match_but_individual_account_type_eur: summary: (EUR) Names match, though counterparty is an individual, not a company value: result_code: matched company_name: Petras Petrauskas match_but_company_account_type_eur: summary: (EUR) Names match, though counterparty is a company, not an individual value: result_code: matched individual_name: first_name: Petras last_name: Petrauskas UAB close_match_individual_name_eur: summary: (EUR) Individual account name is a close match value: result_code: close_match reason: type: eu_cop code: close_match individual_name: first_name: Petras last_name: Petrauskas close_match_company_name_eur: summary: (EUR) Company account name is a close match value: result_code: close_match reason: type: eu_cop code: close_match company_name: Petras Petrauskas UAB account_does_not_match_individual_eur: summary: (EUR) Provided details for individual do not match account details value: result_code: not_matched reason: type: au_cop code: not_matched individual_name: first_name: Piter last_name: Petrauskas account_does_not_match_company_eur: summary: (EUR) Provided details for company do not match account details value: result_code: not_matched reason: type: uk_cop code: not_matched company_name: Piter Petrauskas Ltd match_individual_ro: summary: (RO) Account found, partial name returned for individual value: result_code: matched name_validation_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 individual_name: first_name: Alexandru last_name: I. match_company_ro: summary: (RO) Account found, partial name returned for company value: result_code: matched name_validation_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 company_name: Rodri**** SA cannot_be_checked_not_supported: summary: The specified currency+country combination is invalid or not supported for your region value: result_code: cannot_be_checked reason: code: not_supported unavailable: summary: Temporarily unavailable value: result_code: temporarily_unavailable '400': description: | Bad request Returned, for example, when the data you provided is invalid or required data is missing. content: application/json: schema: type: object properties: code: type: integer description: The error code. message: type: string description: The description of the error. required: - code - message examples: invalid_sort_code_uk: summary: Invalid sort code (UK) value: message: 'Invalid sort code: 54-01-050' code: 3000 invalid_iban_ro: summary: Invalid IBAN (RO) value: message: RO49AAAA1B31007593840000 is not a valid IBAN code: 3000 country_missing: summary: Country prefix is missing in IBAN value: message: Required 'country' is missing code: 3000 name_missing_eur: summary: Recipient's name is missing value: message: company_name or individual_name should be provided code: 3000 last_name_is_empty_ro: summary: Last name is required but was not provided value: message: last_name is empty code: 3000 '401': description: |- Unauthorized Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. content: application/json: schema: type: object properties: message: type: string description: The description of the error. status: type: string description: The HTTP error code. required: - message example: message: The request should be authorized. status: 401 '404': description: |- Not found Returned, for example, when your account does not have access to CoP. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Resource not found code: 3006 '429': description: |- Too many requests Returned when you've exceeded the rate limit for CoP checks. In Romania, for example, making more than 3 CoP queries without initiating a payment within a 24-hour period will temporarily restrict access to the service for 24 hours. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Rate limit exceeded code: 3162 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Counterparties /accounts: get: summary: Retrieve all accounts operationId: getAccounts description: |- Get a list of all your accounts. For more information, see the guides: [Get your account details](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/manage-your-accounts). security: - AccessToken: - READ responses: '200': description: List of business accounts content: application/json: schema: $ref: '#/components/schemas/Accounts' example: - id: b7ec67d3-5af1-42c8-bece-3d28nlmo894d name: International account balance: 3171.89 currency: GBP state: active public: false created_at: '2022-08-05T14:29:22.215785Z' updated_at: '2022-08-05T14:29:22.215785Z' account_type: current - id: bssc67d3-5afd-42c2-bece-3d28nlmo894d name: International account 2 balance: 411561.89 currency: EUR state: active public: true created_at: '2022-08-25T14:29:22.215785Z' updated_at: '2022-08-30T14:29:22.215785Z' account_type: current default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Accounts /accounts/{account_id}: get: summary: Retrieve an account operationId: getAccount description: |- Get the information about one of your accounts. Specify the account by its ID. For more information, see the guides: [Get your account details](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/manage-your-accounts). security: - AccessToken: - READ tags: - Accounts parameters: - name: account_id in: path required: true description: The ID of the account to retrieve. schema: type: string format: uuid responses: '200': description: The information about a specific account content: application/json: schema: $ref: '#/components/schemas/Account' example: id: b7ec67d3-5af1-42c8-bece-3d28nlmo894d name: International account balance: 3171.89 currency: GBP state: active public: false created_at: '2022-08-05T14:29:22.215785Z' updated_at: '2022-08-05T14:29:22.215785Z' account_type: current default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /accounts/{account_id}/bank-details: get: summary: Retrieve account's full bank details operationId: getAccountDetails description: |- Get all the bank details of one of your accounts. Specify the account by its ID. For more information, see the guides: [Get your account details](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/manage-your-accounts). security: - AccessToken: - READ tags: - Accounts parameters: - name: account_id in: path required: true description: The ID of the account to retrieve all bank details. schema: type: string format: uuid responses: '200': description: The bank details of a specific account content: application/json: schema: $ref: '#/components/schemas/AccountBankDetailsItems' example: - iban: GB66REVO00996995908888 bic: REVOGB21 beneficiary: International account beneficiary_address: street_line1: Revolut LTD street_line2: 1 Canada Square city: London country: GB postcode: E14 5AB bank_country: GB pooled: false schemes: - swift estimated_time: unit: days min: 1 max: 3 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /card-invitations: post: summary: Create a card invitation operationId: createCardInvitation description: |- Create an invitation for a virtual [team member card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) for a new, not-yet-onboarded team member. When the team member completes onboarding before the invitation's expiry date, the invitation will automatically be claimed, and the card will then be issued for the team member immediately. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage card invitations](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations). security: - AccessToken: - WRITE tags: - Card invitations requestBody: description: Card to create an invitation for required: true content: application/json: schema: type: object properties: request_id: type: string description: |- A unique ID of the request that you provide. There is no strict requirement on the format of this ID, but we suggest using v4 UUIDs. :::warning This ID is used to prevent duplicate card creation requests in case of a lost connection or client error, so make sure you use the same `request_id` for requests related to the same card invitation. The deduplication is limited to 24 hours counting from the first request using a given ID. ::: For more information, see the guides: [Manage card invitations - Idempotency](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations#idempotency). maxLength: 40 expiry_period: type: string description: |- The period after which the card invitation expires if it hasn't been claimed or cancelled. Must be specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) duration format. The duration is counted from the card invitation creation. - **Minimum duration:** 1 day (`P1D`) - **Maximum duration:** 90 days (`P90D`) - **Default duration:** 90 days (`P90D`) pattern: ^P\d+D$ default: P90D example: P3D holder_id: type: string format: uuid description: |- The ID of the team member who will be assigned as the holder of the card after the invitation is claimed. :::tip To retrieve a team member's ID, use the [`GET /team-members` operation](https://developer.revolut.com/docs/api/business#get-team-members). ::: virtual: type: boolean enum: - true description: |- Specifies the type of the card. Must be set to `true`, as with the API, you can create only virtual cards. :::tip To create physical cards, use the [Revolut Business app](https://business.revolut.com). ::: label: type: string description: |- The label for the card to be issued, displayed in the UI to help distinguish between cards. If not specified, the default label will be set according to the card's type. For card invitations created via API, it's always `Virtual`. minLength: 1 maxLength: 30 default: Virtual spending_limits: description: |- All spending limits set for the card. You can have at most 1 periodic (day/week/month/quarter/all-time) and 1 non-periodic (single transaction) limit at a time. If you try to specify 2 periodic limits at a time, it will result in an error. type: object $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: description: |- The controls for the card's spending period. They let you set the dates when the card becomes available or unavailable for spending, and define what happens after the end date. If specified, you must provide at least one of these: - `start_date` - `end_date` together with `end_date_action` The dates provided must be in the future. type: object allOf: - $ref: '#/components/schemas/SpendingPeriodSchema' categories: type: array description: |- The list of merchant categories to be available for card spending. If not specified, all categories will be allowed. items: $ref: '#/components/schemas/BusinessMerchantCategory' merchant_controls: description: |- The merchant-level controls for card spending. They let you block or allow the card to only transact with specific merchants. type: object $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: description: |- Restricts card spending to merchants with the specified [ISO 18245](https://en.wikipedia.org/wiki/ISO_18245) merchant category codes (MCCs). :::tip MCCs are 4-digit codes used by payment card networks to classify businesses by the type of goods or services they provide — for example, `5411` for grocery stores or `7011` for hotels. ::: type: object allOf: - $ref: '#/components/schemas/MccControlsSchema' countries: description: Restricts card use to specified countries, provided as 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) codes. type: array items: type: string pattern: ^[A-Z]{2}$ example: GB accounts: type: array description: |- The list of accounts to link to the card. If not specified, all accounts will be linked. To retrieve account IDs, use the [`GET /accounts` operation](https://developer.revolut.com/docs/api/business#get-accounts). items: type: string format: uuid required: - request_id - holder_id - virtual examples: card_invitation_minimal_example: $ref: '#/components/examples/cardInvitationMinCreate' card_invitation_full_example: $ref: '#/components/examples/cardInvitationMaxCreate' card_invitation_with_mcc_controls: $ref: '#/components/examples/cardInvitationWithMccControlsCreate' responses: '200': description: Successfully created card invitation content: application/json: schema: $ref: '#/components/schemas/CardInvitationCreatedResponse' examples: card_invitation_response: $ref: '#/components/examples/cardInvitationCreatedDetails' '400': description: |- Bad Request Returned, for example, when your request is malformed, missing required fields, or when it contains fields that cannot co-exist or unsupported values. If the invalid value is an array item, the error might indicate the array index of this faulty item, counting from `0`. For example, if you provide the list of countries, such as `"countries": ["GB", "USA", ...]`, the first item (`GB`) has index `0`, the second item (`USA`) has index `1`, and so on. In the example, `USA` is invalid, because it should be a 2-letter code. In such a case, the error will indicate that `countries[1]` is invalid, thus pointing to the second item in the array, i.e. `USA`. content: application/json: schema: $ref: '#/components/schemas/Error' examples: missing_required_field: summary: Merchant controls are missing merchant IDs value: code: 3000 message: merchant_ids is empty expiry_period_too_long: summary: Expiry period is too long (max.90 days) value: code: 3000 message: expiry_period must be between PT24H and PT2160H invalid_json: summary: Invalid request body value: code: 3000 message: 'Cannot parse request: invalid JSON' wrong_spending_period_date: summary: Wrong spending period date value: code: 2101 message: Spending period start_date must be in the future invalid_account_id: summary: Invalid account ID value: code: 2101 message: Invalid account ids provided=[0f187658-8c07-491f-9129-ae567b829137] invalid_country_code: $ref: '#/components/examples/cardErrorBadCountryCode' '401': description: |- Unauthorised Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. content: application/json: schema: $ref: '#/components/schemas/ErrorUnauthorized' examples: unauthorized: $ref: '#/components/examples/errorUnauthorized' '404': description: |- Team member not found Returned when the team member specified as cardholder in `holder_id` does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3042 message: Team member not found '422': description: |- Unprocessable Entity For example, you try to set more than one periodic limit at a time, create an invitation for a deleted team member, or an unexpected error occurred when the initial request with the same `request_id` was sent. content: application/json: schema: $ref: '#/components/schemas/ErrorUnprocessableEntity' examples: multiple_periodic_limits: summary: Only one periodic spending limit at a time is allowed value: code: 33000 message: Only one periodic limit can be set on a card inactive_team_member: summary: Team member not in supported state, e.g. team member was deleted value: message: Card invitations are only allowed for users in created state unexpected_error: summary: Unexpected error on initial request value: code: 33009 message: 'Idempotent replay failed: first execution was not successful' '429': description: Concurrent requests with the same idempotency key content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3162 message: Parallel requests conflict. Please synchronize your requests. request_id=5baa6989-ae59-4668-bb09-042fca180518 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' get: summary: Retrieve a list of card invitations operationId: getCardInvitations description: |- Get the list of all card invitations in your organisation. The results are paginated and sorted by the `created_at` date in reverse chronological order. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage card invitations](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations). security: - AccessToken: - READ tags: - Card invitations parameters: - name: created_before in: query required: false description: |- Retrieves only card invitations created before this timestamp (`created_at` < `created_before`). Used for pagination. The default value is the current date and time at which you are calling the endpoint. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. schema: type: string format: date-time default: the date-time at which the request is made example: '2025-10-15T14:30:00Z' - name: limit in: query required: false description: |- The maximum number of card invitations to return per page. To get to the next page, make a new request and use the `created_at` date of the last card invitation returned in the previous response as the value for `created_before`. schema: type: number format: integer minimum: 1 maximum: 100 default: 100 - name: state in: query required: false description: |- Retrieves card invitations filtered by the specified state(s). To specify multiple values, follow this pattern: `state={VALUE1}&state={VALUE2}`. If not provided, all states are returned. schema: type: array items: $ref: '#/components/schemas/CardInvitationState' style: form explode: false example: state=created&state=redeemed responses: '200': description: The list of card invitations for your business content: application/json: schema: type: array items: $ref: '#/components/schemas/CardInvitationsResponse' examples: list_of_card_invitations: $ref: '#/components/examples/cardInvitationsList' '400': description: |- Bad request Returned, for example, when you provide invalid query parameters. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_limit_parameter: summary: Invalid limit parameter value: code: 2101 message: 'Parameter limit must be a valid integer in range: [1, 100].' invalid_created_before_format: summary: Invalid created_before format value: code: 2101 message: Parameter created_before must be a valid timestamp invalid_state_parameter: summary: Invalid state parameter value: code: 2101 message: 'Invalid card invitation state: active' '401': description: |- Unauthorised Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. content: application/json: schema: $ref: '#/components/schemas/ErrorUnauthorized' examples: unauthorized: $ref: '#/components/examples/errorUnauthorized' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /card-invitations/{card_invitation_id}: get: summary: Retrieve card invitation details operationId: getCardInvitation description: |- Get the details of a specific card invitation, based on its ID. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage card invitations](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations). security: - AccessToken: - READ tags: - Card invitations parameters: - name: card_invitation_id in: path required: true description: The ID of the card invitation. schema: type: string format: uuid example: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd responses: '200': description: Information about the card invitation content: application/json: schema: $ref: '#/components/schemas/CardInvitationResponse' examples: invitation_created: $ref: '#/components/examples/cardInvitationCreatedDetails' invitation_redeemed: $ref: '#/components/examples/cardInvitationRedeemedDetails' invitation_expired: $ref: '#/components/examples/cardInvitationExpiredDetails' invitation_failed: $ref: '#/components/examples/cardInvitationFailedDetails' invitation_failed_team_member_deleted: $ref: '#/components/examples/cardInvitationFailedNoHolderDetails' '400': description: |- Bad request Returned, for example, when you provide an invalid card invitation ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '401': description: |- Unauthorised Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. content: application/json: schema: $ref: '#/components/schemas/ErrorUnauthorized' examples: unauthorized: $ref: '#/components/examples/errorUnauthorized' '404': description: Card invitation doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card invitation not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' patch: summary: Update card invitation settings operationId: updateCardInvitation description: |- Update settings for a specific card invitation, based on its ID. You can update successfully created invitations that have not been claimed yet (`state=created`). :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage card invitations](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations). security: - AccessToken: - WRITE tags: - Card invitations parameters: - name: card_invitation_id in: path required: true description: The ID of the card invitation. schema: type: string format: uuid example: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd requestBody: required: true content: application/json: schema: properties: label: type: string description: |- The label of the card. Cards without labels are not allowed. If set to `null`, the default label will be set according to the card's type. :::tip[Default labels] For virtual cards, the default label is `Virtual`. For physical cards, depending on the type, it can be, for example, `Standard` or `Metal`. As these values depend on available card types, they are subject to change over time. ::: minLength: 1 maxLength: 30 default: Default label according to card's type spending_limits: description: |- All spending limits to be set for the card. You can have at most 1 periodic (day/week/month/quarter/all-time) and 1 non-periodic (single transaction) limit at a time. If you try to specify 2 periodic limits at a time, it will result in an error. Use `null` as the value for a specific limit to erase that limit. Use `null` as the value for the `spending_limits` object to erase all limits. type: object $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: description: |- The controls for the card's spending period. They let you set or modify the dates when the card should become available or unavailable for spending, and define what happens after the end date. If specified, you must provide at least one of these: - `start_date` - `end_date` together with `end_date_action` The spending period dates must be in the future. The dates are inclusive. This means that: - If you set the `start_date` to `2026-03-31`, the card will become active on that day. - If you set the `end_date` to `2027-12-31`, the card will be active through that day, and will be locked/terminated starting on 1st Jan 2028. :::note You can update the spending period settings in a few ways, depending on your use case: - To remove the start date, but keep the end date settings, provide the current `spending_period` settings without the `start_date`. - To remove the start date when no end date is set, provide the `spending_period.start_date` set to `null`. - To remove **all** spending period settings, provide `spending_period` set to `null`. If you wish to erase a spending period end date, you can do this in a similar way, applying the steps to `spending_period.end_date` and `spending_period.end_date_action`. ::: type: object allOf: - $ref: '#/components/schemas/SpendingPeriodSchema' categories: type: array description: |- The list of merchant categories to be available for card spending. Use `null` to erase the value and reset to empty (all categories will be allowed). items: $ref: '#/components/schemas/BusinessMerchantCategory' merchant_controls: description: |- The merchant-level controls for card spending. They let you block or allow the card to only transact with specific merchants. type: object $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: nullable: true type: object description: |- The MCC controls for card spending. Set to `null` to remove MCC controls. :::tip MCCs are 4-digit codes used by payment card networks to classify businesses by the type of goods or services they provide — for example, `5411` for grocery stores or `7011` for hotels. ::: allOf: - $ref: '#/components/schemas/MccControlsSchema' countries: description: The list of countries where the card can be used, provided as 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) codes. type: array items: type: string pattern: ^[A-Z]{2}$ example: GB accounts: type: array description: |- The list of accounts to link to the card. If not specified, all accounts will be linked. To retrieve account IDs, use the [`GET /accounts` operation](https://developer.revolut.com/docs/api/business#get-accounts). items: type: string format: uuid examples: update_all_properties: summary: Update all properties value: label: New card label spending_limits: single: amount: 100 currency: GBP month: amount: 300 currency: GBP spending_period: start_date: '2025-12-20' end_date: '2027-12-20' end_date_action: lock categories: - services - shopping - furniture merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 - 3f09819f-63d1-473a-966c-54d8b9f43a93 countries: - GB - SG - ES accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 - 9ae4345a-5ee5-496b-b776-241fcc5a5ba4 erase_spending_period_start_date: summary: Erase spending period start date and update end date value: spending_period: start_date: null end_date: '2027-12-20' end_date_action: terminate erase_all_spending_limits: summary: Erase all spending limits value: spending_limits: null erase_single_transaction_limit: summary: Erase the single-transaction limit value: spending_limits: single: null allow_specific_merchants: summary: Allow only specific merchants value: categories: [] merchant_controls: control_type: allow merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 responses: '200': description: Information about the updated card invitation content: application/json: schema: $ref: '#/components/schemas/CardInvitationUpdatedResponse' examples: update_all_properties: $ref: '#/components/examples/cardInvitationUpdatedAllProperties' erase_spending_period_start_date: $ref: '#/components/examples/cardInvitationUpdatedEraseSpendingPeriodStartDate' erase_all_spending_limits: $ref: '#/components/examples/cardInvitationUpdatedEraseAllSpendingLimits' erase_single_transaction_limit: $ref: '#/components/examples/cardInvitationUpdatedEraseSingleTransactionLimit' allow_specific_merchants: $ref: '#/components/examples/cardInvitationUpdatedAllowSpecificMerchants' '400': description: |- Bad request Returned, for example, when there's nothing to update or the provided details are unsupported for this operation. If the invalid value is an array item, the error might indicate the array index of this faulty item, counting from `0`. For example, if you provide the list of countries, such as `"countries": ["GB", "USA", ...]`, the first item (`GB`) has index `0`, the second item (`USA`) has index `1`, and so on. In the example, `USA` is invalid, because it should be a 2-letter code. In such a case, the error will indicate that `countries[1]` is invalid, thus pointing to the second item in the array, i.e. `USA`. content: application/json: schema: $ref: '#/components/schemas/Error' examples: nothing_to_update: summary: Empty request body - nothing to update value: code: 1112 message: Specify at least one parameter for card update invalid_spending_period_date_settings: summary: Invalid spending period date settings value: code: 3000 message: At least one of start_date or end_date must be present invalid_spending_period_end_settings: summary: Invalid spending period end settings value: code: 3000 message: end_date and end_date_action must be either both present or both empty spending_period_end_date_before_start_date: summary: Spending period end date is sooner than start date value: code: 3000 message: end_date must be at or after 2025-12-28, but is 2024-12-20 past_spending_period_end_date: summary: Spending period start date is in the past value: code: 2102 message: Spending period start_date must be in the future multiple_periodic_limits: summary: Multiple periodic spending limits at a time value: code: 3000 message: Only one periodic limit can be specified label_too_long: summary: Card label too long value: code: 3000 message: Card label cannot contain more than 30 characters invalid_id: $ref: '#/components/examples/cardErrorBadId' invalid_country_code: $ref: '#/components/examples/cardErrorBadCountryCode' '401': description: |- Unauthorised Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. content: application/json: schema: $ref: '#/components/schemas/ErrorUnauthorized' examples: unauthorized: $ref: '#/components/examples/errorUnauthorized' '404': description: |- Card invitation doesn't exist The card invitation for which you wish to update details does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3088 message: Card invitation '3c059a42-24e1-4fd6-bfbe-f3c09234315f not found '422': description: |- Unprocessable Entity Returned, for example, when you try to update a card invitation that's not in state `created`. Such an invitation is no longer active and therefore cannot be modified. content: application/json: schema: $ref: '#/components/schemas/ErrorUnprocessableEntity' examples: unsupported_card_invitation_state: summary: Card invitation is not in state 'created' value: message: Unable to update card invitation with state=redeemed default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /card-invitations/{cardInvitationId}/cancel: post: summary: Cancel a card invitation operationId: cancelCardInvitation description: |- Cancel a specific card invitation, based on its ID. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: You can cancel successfully created invitations that have not been claimed yet (`state=created`). Once the card invitation is cancelled, it cannot be claimed or reactivated. A successful response does not get any content in return. For more information, see the guides: [Manage card invitations](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations). security: - AccessToken: - WRITE tags: - Card invitations parameters: - name: card_invitation_id in: path required: true description: The ID of the card invitation to cancel. schema: type: string format: uuid example: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd responses: '204': description: Card invitation successfully cancelled '400': description: |- Bad request Returned, for example, when the format of the invitation ID you provided is invalid. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '401': description: |- Unauthorised Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. content: application/json: schema: $ref: '#/components/schemas/ErrorUnauthorized' examples: unauthorized: $ref: '#/components/examples/errorUnauthorized' '404': description: |- Card invitation doesn't exist The card invitation you wish to cancel does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3088 message: Card invitation '10a2069f-fc11-4d5f-82b4-29c4ecc3a62e' not found '422': description: |- Unprocessable entity Returned, for example, when you try to cancel a card invitation that's not in state `created`. Such an invitation is no longer active and therefore cannot be cancelled. content: application/json: schema: $ref: '#/components/schemas/ErrorUnprocessableEntity' examples: unsupported_card_invitation_state: summary: Card invitation is not in state 'created' value: message: Unable to cancel card invitation with state=redeemed default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards: get: summary: Retrieve a list of cards operationId: getCards description: |- Get the list of all cards in your organisation. The results are paginated and sorted by the `created_at` date in reverse chronological order. Terminated cards are not included in the list. To check the status of a specific terminated card, [retrieve it by its ID](https://developer.revolut.com/docs/api/business#get-card). :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - READ tags: - Cards parameters: - in: query name: created_before schema: type: string format: date-time default: the date-time at which the request is made description: |- Retrieves cards with `created_at` < `created_before`. The default value is the current date and time at which you are calling the endpoint. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. - name: limit in: query required: false description: |- The maximum number of cards to return per page. To get to the next page, make a new request and use the `created_at` date of the last card returned in the previous response as the value for `created_before`. schema: type: number format: integer default: 100 maximum: 100 minimum: 1 responses: '200': description: List of cards of the business content: application/json: schema: $ref: '#/components/schemas/CardsResponse' examples: list_of_cards: $ref: '#/components/examples/cardsListSimple' '400': description: Bad pagination parameters content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 2101 message: 'Parameter limit must be a valid integer in range: [1, 100].' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' post: summary: Create a card operationId: createCard description: |- Create a new [team member card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards), [company card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards), or [auto-issued card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards). When using the API, you can create only virtual cards. To create a physical card, use the [Revolut Business app](https://business.revolut.com). :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards requestBody: description: Card to create required: true content: application/json: schema: type: object properties: request_id: type: string description: |- A unique ID of the request that you provide. There is no strict requirement on the format of this ID, but we suggest using v4 UUIDs. :::warning This ID is used to prevent duplicate card creation requests in case of a lost connection or client error, so make sure you use the same `request_id` for requests related to the same card. The deduplication is limited to 24 hours counting from the first request using a given ID. For more information, see the guides: [Manage cards - Idempotency](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#idempotency). ::: maxLength: 40 holder_id: type: string format: uuid description: |- The ID of the team member to assign as the holder of the card. :::tip To retrieve a team member's ID, use the [`GET /team-members` operation](https://developer.revolut.com/docs/api/business#get-team-members). ::: For virtual cards (`virtual=true`), this field is optional. If not provided, the type of the issued card depends on `contact_ids`: - `contact_ids` provided → [company card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) - `contact_ids` not specified → [auto-issued card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) contact_ids: description: |- The list of [contacts](https://help.revolut.com/business/help/cards/more-on-cards/company-cards/) for the card. Up to 5 team members sharing the card, much like co-holders. Can be [edited](https://developer.revolut.com/docs/api/business#update-card-contacts). Allowed only for [company cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (`virtual=true`, `holder_id` not specified). type: array minItems: 1 maxItems: 5 items: type: string format: uuid product: description: |- The card product offered by the card provider for this card. In other words, the program that the card is issued under. Provided only for virtual cards with no holder ID (`virtual=true`, and `holder_id` not specified): - **Required** for [auto-issued cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (`contact_ids` not specified) - Optional for [company cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (`contact_ids` specified) Not allowed for [team member cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (`holder_id` present). :::note This property is only available to travel intermediaries using our travel solution. To use it, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: type: object required: - code properties: code: type: string description: The code of the card product. example: MBJ virtual: type: boolean enum: - true description: |- Specifies the type of the card. Must be set to `true`, as with the API, you can create only virtual cards. :::tip To create a physical card, use the [Revolut Business app](https://business.revolut.com). ::: label: type: string description: |- The label for the issued card, displayed in the UI to help distinguish between cards. If not specified, no label will be added. maxLength: 30 references: description: |- References for the card. Up to 5 name-value pairs assigned to the card for tracking. :::info Each time the card is used, the references are recorded in the [transaction details](https://developer.revolut.com/docs/api/business#get-transaction#response) (`card.references`), helping track transactions made with this card. ::: The names must be unique. The references can be [amended](https://developer.revolut.com/docs/api/business#update-card-references) up to 10 times. References are only supported for cards owned by the business (i.e. [company](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) or [auto-issued cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards)). They are **not** supported for [team member cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (i.e. with `holder_id` present). :::note The references recorded on a transaction are those assigned to the card at the time the transaction took place. If the references are amended, they will only be applied to future transactions. Existing transaction are not affected. ::: $ref: '#/components/schemas/CardReferences' spending_limits: description: |- All spending limits set for the card. You can have at most 1 periodic (day/week/month/quarter/all-time) and 1 non-periodic (single transaction) limit at a time. If you try to specify 2 periodic limits at a time, it will result in an error. type: object $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: description: |- The controls for the card's spending period. They let you set the dates when the card becomes available or unavailable for spending, and define what happens after the end date. If specified, you must provide at least one of these: - `start_date` - `end_date` together with `end_date_action` The dates provided must be in the future. type: object allOf: - $ref: '#/components/schemas/SpendingPeriodSchema' categories: type: array description: |- The list of merchant categories to be available for card spending. If not specified, all categories will be allowed. items: $ref: '#/components/schemas/BusinessMerchantCategory' merchant_controls: description: |- The merchant-level controls for card spending. They let you block or allow the card to only transact with specific merchants. type: object $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: description: |- Restricts card spending to merchants with the specified [ISO 18245](https://en.wikipedia.org/wiki/ISO_18245) merchant category codes (MCCs). :::tip MCCs are 4-digit codes used by payment card networks to classify businesses by the type of goods or services they provide — for example, `5411` for grocery stores or `7011` for hotels. ::: type: object allOf: - $ref: '#/components/schemas/MccControlsSchema' countries: description: Restricts card use to specified countries, provided as 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) codes. type: array items: type: string pattern: ^[A-Z]{2}$ example: GB accounts: type: array description: |- The list of accounts to link to the card. If not specified, all accounts will be linked. To retrieve account IDs, use the [`GET /accounts` operation](https://developer.revolut.com/docs/api/business#get-accounts). items: type: string format: uuid required: - request_id - virtual examples: team_member_card: $ref: '#/components/examples/cardIndividualCreate' company_card: $ref: '#/components/examples/cardCompanyCreate' autogenerated_card: $ref: '#/components/examples/cardAutogeneratedCreate' card_with_spending_period_start_date: $ref: '#/components/examples/cardWithSpendingPeriodStartDateCreate' card_with_mcc_controls: $ref: '#/components/examples/cardWithMccControlsCreate' card_with_all_controls: $ref: '#/components/examples/cardWithAllControlsCreate' responses: '200': description: Information about the created card content: application/json: schema: $ref: '#/components/schemas/CardCreatedResponse' examples: team_member_card: $ref: '#/components/examples/cardIndividualDetails' company_card: $ref: '#/components/examples/cardCompanyDetails' autogenerated_card: $ref: '#/components/examples/cardAutogeneratedDetails' card_with_spending_period_start_date: $ref: '#/components/examples/cardWithSpendingPeriodStartDateDetails' '400': description: |- Bad Request Returned, for example, when your request is malformed, missing required fields, or when it contains fields that cannot co-exist or unsupported values. If the invalid value is an array item, the error might indicate the array index of this faulty item, counting from `0`. For example, if you provide the list of countries, such as `"countries": ["GB", "USA", ...]`, the first item (`GB`) has index `0`, the second item (`USA`) has index `1`, and so on. In the example, `USA` is invalid, because it should be a 2-letter code. In such a case, the error will indicate that `countries[1]` is invalid, thus pointing to the second item in the array, i.e. `USA`. content: application/json: schema: $ref: '#/components/schemas/Error' examples: missing_conditional_fields: summary: Contact IDs or product are required when holder ID not provided value: code: 3000 message: Either contact_ids or product must be present when holder_id is empty contact_ids_and_product_not_allowed_with_holder_id: summary: Contact IDs and product are not allowed when holder ID present value: code: 3000 message: Both contact_ids and product must be empty when holder_id is present references_not_allowed_with_holder_id: summary: References are not allowed when holder ID present value: code: 3000 message: references must be empty when holder_id is present missing_required_field: summary: Merchant controls are missing merchant IDs value: code: 3000 message: merchant_ids is empty invalid_json: summary: Invalid request body value: code: 3000 message: 'Cannot parse request: invalid JSON' product_not_found: summary: Card product not found value: code: 2101 message: Product MJB not found cannot_add_contact_ids: summary: Contact ID(s) not found value: code: 2101 message: Unable to attach contactIds wrong_spending_period_date: summary: Wrong spending period date value: code: 2101 message: Spending period start_date must be in the future invalid_account_id: summary: Invalid account ID value: code: 2101 message: Invalid account ids provided=[0f187658-8c07-491f-9129-ae567b829137] invalid_country_code: $ref: '#/components/examples/cardErrorBadCountryCode' '404': description: |- Team member not found Returned when the team member specified as cardholder in `holder_id` does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3042 message: Team member not found '422': description: |- Unprocessable entity For example, the team member exceeds the limit for virtual cards per account, or an unexpected error occurred when the initial request with the same `request_id` was sent. content: application/json: schema: $ref: '#/components/schemas/Error' examples: cards_limit_exceeded: summary: Virtual cards limit per account exceeded value: code: 3087 message: Active virtual cards limit is exceeded for the employee unexpected_error: summary: Unexpected error on initial request value: code: 33009 message: 'Idempotent replay failed: first execution was not successful' '429': description: Concurrent requests with the same idempotency key content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3162 message: Parallel requests conflict. Please synchronize your requests. request_id=5baa6989-ae59-4668-bb09-042fca180518 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}: get: summary: Retrieve card details operationId: getCard description: |- Get the details of a specific card, based on its ID. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - READ tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card. schema: type: string format: uuid responses: '200': description: Information about the card content: application/json: schema: $ref: '#/components/schemas/CardResponseWithTerminated' examples: virtual_card: $ref: '#/components/examples/cardVirtualDetails' physical_card: $ref: '#/components/examples/cardPhysicalDetails' card_with_spend_program: $ref: '#/components/examples/cardWithSpendProgramDetails' team_member_card: $ref: '#/components/examples/cardIndividualDetails' company_card: $ref: '#/components/examples/cardCompanyDetails' autogenerated_card: $ref: '#/components/examples/cardAutogeneratedDetails' card_with_spending_period_start_date: $ref: '#/components/examples/cardWithSpendingPeriodStartDateDetails' card_with_spend_limit_usage: $ref: '#/components/examples/cardWithSpendLimitUsage' terminated_card: $ref: '#/components/examples/cardTerminatedDetails' '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' patch: summary: Update card settings operationId: updateCard description: |- Update settings for a specific card, based on its ID. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card. schema: type: string format: uuid requestBody: required: true content: application/json: schema: properties: label: type: string description: The label of the card. maxLength: 30 spending_limits: description: |- All spending limits set for the card. You can have at most 1 periodic (day/week/month/quarter/all-time) and 1 non-periodic (single transaction) limit at a time. If you try to specify 2 periodic limits at a time, it will result in an error. Use `null` as the value for a specific limit to erase that limit. Use `null` as the value for the `spending_limits` object to erase all limits. :::note Updating a spending limit does not reset the spending counter. For more information, see the guides: [Manage cards - Update a card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#update-a-card). ::: type: object $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: description: |- The controls for the card's spending period. They let you set or modify the dates when the card becomes available or unavailable for spending, and define what happens after the end date. If specified, you must provide at least one of these: - `start_date` - `end_date` together with `end_date_action` The spending period dates must be in the future. The dates are inclusive. This means that: - If you set the `start_date` to `2025-12-31`, the card will become active on that day. - If you set the `end_date` to `2026-06-01`, the card will be active through that day, and will be locked/terminated starting on 2nd June 2026. :::note [] If you wish to unlock a card with a spending period starting in the future and make it available for spending right away, you can do it in a few ways, depending on your use case: - To remove the start date, but keep the end date settings, provide the current `spending_period` settings without the `start_date`. - To remove the start date when no end date is set, provide the `spending_period.start_date` set to `null`. - To remove **all** spending period settings, either provide `spending_period` set to `null`, or use the dedicated endpoint to [unlock](https://developer.revolut.com/docs/api/business#unlock-card) the card. If you wish to erase a spending period end date, you can do this in a similar way, applying the steps to `spending_period.end_date` and `spending_period.end_date_action`. ::: type: object allOf: - $ref: '#/components/schemas/SpendingPeriodSchema' categories: type: array description: |- The list of merchant categories that will be available for card spending. Use `null` to erase the value and reset to empty (all categories will be allowed). items: $ref: '#/components/schemas/BusinessMerchantCategory' merchant_controls: description: |- The merchant-level controls for card spending. They let you block or allow the card to only transact with specific merchants. type: object $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: nullable: true type: object description: |- The MCC controls for card spending. Set to `null` to remove MCC controls. :::tip MCCs are 4-digit codes used by payment card networks to classify businesses by the type of goods or services they provide — for example, `5411` for grocery stores or `7011` for hotels. ::: allOf: - $ref: '#/components/schemas/MccControlsSchema' countries: description: The list of countries where the card can be used, provided as 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) codes. type: array items: type: string pattern: ^[A-Z]{2}$ example: GB accounts: type: array description: |- The list of accounts to link to the card. If not specified, all accounts will be linked. To retrieve account IDs, use the [`GET /accounts` operation](https://developer.revolut.com/docs/api/business#get-accounts). items: type: string format: uuid examples: update_all_properties: summary: Update all properties value: label: New card label spending_limits: single: amount: 100 currency: GBP month: amount: 300 currency: GBP spending_period: start_date: '2025-09-18' end_date: '2026-12-20' end_date_action: lock categories: - services - shopping - furniture merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 - 3f09819f-63d1-473a-966c-54d8b9f43a93 countries: - GB - SG - ES accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 - 9ae4345a-5ee5-496b-b776-241fcc5a5ba4 erase_spending_period_start_date: summary: Erase spending period start date value: spending_period: start_date: null end_date: '2026-12-20' end_date_action: lock erase_all_spending_limits: summary: Erase all spending limits value: spending_limits: null erase_single_transaction_limit: summary: Erase the single-transaction limit value: spending_limits: single: null allow_specific_merchants: summary: Allow only specific merchants value: categories: [] merchant_controls: control_type: allow merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 responses: '200': description: |- Information about the updated card :::note If you modify the card's spending period in the request, the card's `state` returned in the response might not yet reflect those changes. This is because these spending period locks are applied to the card asynchronously, which might result in a slight delay in the card's state update. To re-check the state, [fetch the card's details](https://developer.revolut.com/docs/api/business#get-card). ::: content: application/json: schema: $ref: '#/components/schemas/CardResponse' examples: update_all_properties: $ref: '#/components/examples/cardUpdatedAllPropertiesDetails' erase_spending_period_start_date: $ref: '#/components/examples/cardUpdatedEraseSpendingPeriodStartDateDetails' erase_all_spending_limits: $ref: '#/components/examples/cardUpdatedEraseAllSpendingLimitsDetails' erase_single_transaction_limit: $ref: '#/components/examples/cardUpdatedEraseSingleTransactionLimitDetails' allow_specific_merchants: $ref: '#/components/examples/cardUpdatedAllowSpecificMerchantsDetails' '400': description: |- Nothing to update or the provided details are unsupported for this operation If the invalid value is an array item, the error might indicate the array index of this faulty item, counting from `0`. For example, if you provide the list of countries, such as `"countries": ["GB", "USA", ...]`, the first item (`GB`) has index `0`, the second item (`USA`) has index `1`, and so on. In the example, `USA` is invalid, because it should be a 2-letter code. In such a case, the error will indicate that `countries[1]` is invalid, thus pointing to the second item in the array, i.e. `USA`. content: application/json: schema: $ref: '#/components/schemas/Error' examples: nothing_to_update: summary: Nothing to update value: code: 1112 message: Specify at least one parameter for card update invalid_spending_period_date_settings: summary: Invalid spending period date settings value: code: 3000 message: At least one of start_date or end_date must be present invalid_spending_period_end_settings: summary: Invalid spending period end settings value: code: 3000 message: end_date and end_date_action must be either both present or both empty invalid_id: $ref: '#/components/examples/cardErrorBadId' invalid_country_code: $ref: '#/components/examples/cardErrorBadCountryCode' '404': description: |- Card doesn't exist The card for which you wish to update details does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found '422': description: |- Unprocessable entity For example, you try to provide a spending period end date that's in the past. content: application/json: schema: $ref: '#/components/schemas/Error' examples: past_spending_period_end_date: summary: Spending period end date is in the past value: code: 33003 message: Unable to update the card with state=active default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' delete: summary: Terminate a card operationId: deleteCard description: |- Terminate a specific card, based on its ID. Once the card is terminated, its state changes to `terminated`. Terminated cards are not returned when listing cards, but you can still retrieve a terminated card by its ID using the [`GET /cards/{card_id}` endpoint](https://developer.revolut.com/docs/api/business#get-card). A successful response does not get any content in return. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card. schema: type: string format: uuid responses: '204': description: Card successfully terminated '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/contacts: put: summary: Update card contacts operationId: updateCardContacts description: |- Update the list of card contacts (`contact_ids`) for a [company card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards). :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: You can only update cards with existing contacts. If a card does not have any contacts assigned, this operation is not allowed. On success, the updated list of contacts is returned. :::warning This operation **overrides** the existing contacts. This means that it removes the current list completely, and replaces it with the new one provided in this request. If you want to add new contacts for the card instead of replacing the existing ones, make sure that you [fetch](https://developer.revolut.com/docs/api/business#get-card) the existing contacts first, and include them in your request. ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card whose contacts should be updated. schema: type: string format: uuid requestBody: required: true description: |- New contacts for the card. :::warning This will **override** the existing list of contacts. ::: content: application/json: schema: $ref: '#/components/schemas/CardContacts' examples: list_of_contacts: $ref: '#/components/examples/CardContacts' responses: '200': description: Updated list of contacts content: application/json: schema: $ref: '#/components/schemas/CardContacts' examples: list_of_contacts: $ref: '#/components/examples/CardContacts' '400': description: |- Bad Request Returned, for example, when the provided list of contacts is empty or too many contacts are provided, or when it's malformed or contains incorrect values. content: application/json: schema: $ref: '#/components/schemas/Error' examples: wrong_size: summary: Wrong number of contacts value: code: 2101 message: Card contacts size must be between 1 and 5 incorrect_values: summary: Incorrect value(s) value: code: 3000 message: Value of field '[0]' is not in correct format invalid_json: summary: Incorrect request format value: code: 3000 message: 'Cannot parse request: invalid JSON' invalid_id: $ref: '#/components/examples/cardErrorBadId' '404': description: |- Card not found The card for which you wish to update contacts does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found '422': description: |- Unprocessable Content Returned, for example, when you try to update contacts for a card other than a [company card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards). content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 33011 message: Card contacts are not supported for the card=23a8befd-7b7b-4922-a00f-188b0153730b default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/references: put: summary: Update card references operationId: updateCardReferences description: |- Update the list of [references (`references`)](https://developer.revolut.com/docs/api/business#get-card#response) for a [company](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) or [auto-issued card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards). :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: References can be amended up to 10 times. Reference names must be unique. References are only supported for cards owned by the business (i.e. [company](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) or [auto-issued cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards)). They can't be added to [team member cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (i.e. with `holder_id` present). The references recorded on a transaction are those assigned to the card at the time the transaction took place. If the references are amended, they will only be applied to future transactions. Existing transaction are not affected. On success, the updated list of references is returned. :::warning This operation **overrides** the existing references. This means that it removes the current list completely, and replaces it with the new one provided in this request. If you want to add references to the card instead of replacing the existing ones, make sure that you [fetch](https://developer.revolut.com/docs/api/business#get-card) the existing references first, and include them in your request. To delete existing references without adding new ones, simply provide an empty list. ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card whose references should be amended. schema: type: string format: uuid requestBody: required: true description: |- References for the card. Up to 5 name-value pairs assigned to the card for tracking. :::warning This will **override** the existing references. ::: content: application/json: schema: $ref: '#/components/schemas/CardReferences' examples: list_of_references: $ref: '#/components/examples/CardReferences' responses: '200': description: |- Updated list of references. Up to 5 name-value pairs assigned to the card for tracking. content: application/json: schema: description: |- References for the card. Up to 5 name-value pairs assigned to the card for tracking. The names must be unique. The references can be amended up to 10 times. $ref: '#/components/schemas/CardReferences' examples: list_of_references: $ref: '#/components/examples/CardReferences' '400': description: |- Bad Request Returned, for example, when you provide duplicate reference names, too many references, the reference names or values are too long, or your request is malformed. content: application/json: schema: $ref: '#/components/schemas/Error' examples: duplicate_names: summary: Duplicate names value: code: 2101 message: Reference names must be unique too_long_names: summary: Too long reference name(s) value: code: 3000 message: name cannot be longer than 30 too_long_values: summary: Too long reference value(s) value: code: 3000 message: value cannot be longer than 30 wrong_size: summary: Too many references value: code: 3000 message: references size must be not greater than 5 invalid_json: summary: Incorrect request format value: code: 3000 message: 'Cannot parse request: invalid JSON' invalid_id: $ref: '#/components/examples/cardErrorBadId' '404': description: |- Card not found The card for which you wish to update references does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found '422': description: |- Unprocessable Content Returned, for example, when you try to amend references more than 10 times, or when you try to add them to a card that does not support references, like a card with a `holder_id` present. content: application/json: schema: $ref: '#/components/schemas/Error' examples: update_limit_exceeded: summary: References can be amended up to 10 times value: code: 3549 message: Card references update limit exceeded unsupported_card: summary: References can't be assigned to cards with holder_id value: code: 33012 message: Card references are not supported for the card=a5c697d1-84ae-40b2-879a-a17aab3362bb default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/freeze: post: summary: Freeze a card operationId: freezeCard description: |- Freeze a card to make it temporarily unavailable for spending. You can only freeze a card that is in the state `active`. A successful freeze changes the card's state to `frozen`, and no content is returned in the response. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card to freeze. schema: type: string format: uuid responses: '204': description: Card successfully frozen '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '403': description: State of the card doesn't allow to freeze it content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 9002 message: Card is locked '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/unfreeze: post: summary: Unfreeze a card description: |- Unfreeze a card to re-enable spending for that card. You can only unfreeze a card that is in the state `frozen`. A successful unfreeze changes the card's state back to `active`, and no content is returned in the response. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). operationId: unfreezeCard security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card to unfreeze. schema: type: string format: uuid responses: '204': description: Card successfully unfrozen '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '403': description: State of the card doesn't allow to unfreeze it content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 9002 message: Card is locked '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/lock: post: summary: Lock a card operationId: lockCard description: |- Apply an admin lock to a card to make it temporarily unavailable for spending. A successful lock changes the card's state to `locked`, and no content is returned in the response. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card to lock. schema: type: string format: uuid responses: '204': description: Card successfully locked '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '403': description: |- Action forbidden Returned, for example, when the request is valid, but the provided access token does not include the required scope for this action. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 9002 message: This action is forbidden '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/unlock: post: summary: Unlock a card operationId: unlockCard description: |- Unlock a card locked with an admin lock or spending period settings to make it available for spending again. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: :::warning If a card has a `spending_period` set and is locked due to being outside of that period, unlocking the card removes this spending period completely, including the end date. If you want to unlock such a card but keep its spending period end date: 1. [Fetch](https://developer.revolut.com/docs/api/business#get-card) the card's details. 2. Save the `spending_period.end_date` and `spending_period.end_date_action` settings. 3. [Unlock](https://developer.revolut.com/docs/api/business#unlock-card) the card. 4. [Update](https://developer.revolut.com/docs/api/business#update-card) the card's `spending_period` by re-adding the saved settings. :::tip If both start and end dates for the spending period are provided, and the card is locked due to those dates, to unlock such a card, [update](https://developer.revolut.com/docs/api/business#update-card) its `spending_period` settings instead. ::: A successful unlock changes the card's state to `active`, and no content is returned in the response. For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - WRITE tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card to unlock. schema: type: string format: uuid responses: '204': description: Card successfully unlocked '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '403': description: |- Action forbidden Returned, for example, when the request is valid, but the provided access token does not include the required scope for this action. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 9002 message: This action is forbidden '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /cards/{card_id}/sensitive-details: get: summary: Retrieve sensitive card details operationId: getSensitiveCardDetails description: |- Get sensitive details of a specific card, based on its ID. Requires the `READ_SENSITIVE_CARD_DATA` token scope. For more information, see the **Authorization** section. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). security: - AccessToken: - READ_SENSITIVE_CARD_DATA tags: - Cards parameters: - name: card_id in: path required: true description: The ID of the card for which to retrieve the sensitive details. schema: type: string format: uuid responses: '200': description: Sensitive details of the card content: application/json: schema: type: object properties: pan: type: string description: The PAN (Primary Account Number) of the card. cvv: type: string description: The CVV (Card Verification Value) of the card. expiry: type: string description: The card expiration date. format: DD/MMMM pattern: ^[0-9]{2}/[0-9]{4}$ required: - pan - cvv - expiry example: pan: '4111111111111111' cvv: '123' expiry: 06/2030 '400': description: |- Bad request Returned, for example, when you provide an invalid card ID in the path. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_id: $ref: '#/components/examples/cardErrorBadId' '403': description: Action forbidden content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 9002 message: This action is forbidden '404': description: Card doesn't exist content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 1214 message: Card not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /counterparties: get: summary: Retrieve a list of counterparties operationId: getCounterparties description: |- Get all the counterparties that you have created, or use the query parameters to filter the results. The counterparties are sorted by the `created_at` date in reverse chronological order. The returned counterparties are **paginated**. The maximum number of counterparties returned per page is specified by the `limit` parameter. To get to the next page, make a new request and use the `created_at` date of the last counterparty returned in the previous response. For more information, see the guides: [Retrieve counterparties](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/retrieve-counterparties). parameters: - in: query name: name schema: type: string description: |- The name of the counterparty to retrieve. It does not need to be an exact match, partial match is also supported. :::note Special characters must be properly URL-encoded. ::: - in: query name: account_no schema: type: string description: The exact account number of the counterparty to retrieve. - in: query name: sort_code schema: type: string description: |- The exact sort code of the counterparty to retrieve. Only allowed in combination with the `account_no` parameter. - in: query name: iban schema: type: string description: The exact IBAN of the counterparty to retrieve. - in: query name: bic schema: type: string description: |- The exact BIC of the counterparty to retrieve. Only allowed in combination with the `iban` parameter. - in: query name: created_before schema: type: string format: date-time default: the date-time at which the request is made description: |- Retrieves counterparties with `created_at` < `created_before`. The default value is the current date and time at which you are calling the endpoint. Provide it in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. - in: query name: limit schema: type: integer minimum: 1 maximum: 1000 default: 100 description: |- The maximum number of counterparties returned per page. To get to the next page, make a new request and use the `created_at` date of the last counterparty returned in the previous response as the value for `created_before`. security: - AccessToken: - READ responses: '200': description: List of your counterparties content: application/json: schema: $ref: '#/components/schemas/Counterparties' examples: all_counterparties: summary: A list of your counterparties value: - id: 239d6f1f-2222-4ae6-1111-5cc603341b4e name: Jane Doe Co. profile_type: business state: created created_at: '2022-09-14T14:47:12.273718Z' updated_at: '2022-09-14T14:47:12.273718Z' accounts: - iban: GB66REVO00996995908786 bic: REVOGB21 id: b209281b-aakk-9911-8d83-ac72469cef8f name: Jane Doe Co. bank_country: GB currency: EUR type: external address: street_line1: Revolut LTD street_line2: 1 Canada Square region: Greater London city: London country: GB postcode: E14 5AB - id: 8e0e9886-0af1-4b0c-acf4-111180d2892b name: John Smith revtag: johnsmith profile_type: personal country: GB state: created created_at: '2022-09-14T14:41:39.312017Z' updated_at: '2022-09-14T14:41:39.312017Z' - id: 11cae5ef-ec24-401d-98a3-e5baa0041671 name: John Smith Co. revtag: jsmithco1 profile_type: business country: GB state: created created_at: '2025-09-16T09:34:41.790401Z' updated_at: '2025-09-16T09:34:41.790401Z' accounts: - id: ad3c3b03-611e-461e-99b2-572f4785e44b name: Main GBP currency: GBP type: revolut - id: 67fe3eaa-c994-40c0-b3e0-7b6bfe0cedca name: Main EUR currency: EUR type: revolut - id: e7e36cce-2e9c-4e96-818e-1c2fed325852 name: John Doe Co. profile_type: business state: created created_at: '2022-08-14T14:34:11.168340Z' updated_at: '2022-08-14T14:34:11.168340Z' accounts: - account_no: '12345674' sort_code: '540107' id: e277b2bd-3a6d-423b-933d-3d425094bb13 name: John Doe Co. bank_country: GB currency: GBP type: external address: street_line1: 7 King's Road region: Greater London city: London country: GB postcode: SW3 4PQ - id: 239d6f1f-2222-4ae6-1111-5cc603341b4e name: Bleu Blanc Conseil SARL profile_type: business state: created created_at: '2022-09-14T14:47:12.273718Z' updated_at: '2022-09-14T14:47:12.273718Z' accounts: - iban: FR1420041010050500013M02606 bic: PSSTFRPPLIL id: b209281b-aakk-9911-8d83-ac72469cef8f name: Bleu Blanc Conseil SARL bank_country: FR currency: EUR type: external address: street_line1: 12 Rue de la Paix city: Paris country: FR postcode: '75002' - id: b8ce3922-d518-4ae6-9426-e8cc117e5332 name: Johann Meier Co. profile_type: business state: created created_at: '2023-08-10T12:43:20.273500Z' updated_at: '2026-01-30T12:43:20.273500Z' accounts: - iban: CH9300762011623852957 bic: UBSWCHZH80A id: d95bc455-f495-4f18-95fa-32f99479318c name: Johann Meier Co. bank_country: CH currency: EUR type: external address: street_line1: Bahnhofstrasse 10 city: Zurich country: CH postcode: '8001' - id: 173e6a6b-d955-465f-8f31-7f6f7c03927c name: Edelweiss Handel GmbH profile_type: business state: created created_at: '2023-08-10T12:43:20.273500Z' updated_at: '2026-01-32T10:54:03.350240Z' accounts: - iban: CH5604835012345678009 bic: UBSWCHZH80A id: b3cc43e8-f141-459b-9bd5-3505cf9797f8 name: Edelweiss Handel GmbH bank_country: CH currency: CHF type: external address: street_line1: Marktgasse 22 city: Bern country: CH postcode: '3011' - id: 1d9013c8-84bf-474c-b3d9-690f2ae2e65c name: Jane Doe state: created created_at: '2024-01-10T15:32:10.172300Z' updated_at: '2024-01-10T15:32:10.172300Z' cards: - id: 0130f363-eeaf-4aa8-b77f-a6a629c603f5 name: Jane Doe last_digits: 1234 scheme: visa country: GB currency: GBP - id: fa05f2e5-d253-4661-85cc-bcff98b136ac name: Jane Doe last_digits: 5678 scheme: mastercard country: GB currency: GBP no_search_results: summary: No matching search results value: [] '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' examples: bad_limit: summary: Bad limit value: message: limit must be between 1 and 1000 code: 2101 bic_only_allowed_with_iban: summary: BIC can be used only in combination with IBAN value: message: bic param can be used only combined with iban param code: 2101 sort_code_only_allowed_with_account_no: summary: Sort code can be used only in combination with account number value: message: sort_code param can be used only combined with account_no param code: 2101 invalid_timestamp: summary: Invalid timestamp value: message: Parameter created_before must be a valid timestamp code: 2101 '401': description: Anauthorized content: application/json: schema: $ref: '#/components/schemas/Error' example: message: The request should be authorized. default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Counterparties /counterparty: post: summary: Create a counterparty operationId: addCounterparty description: |- Create a new counterparty to transact with. ### Revtags in Sandbox In the Sandbox environment, you cannot add real people and businesses as Revolut counterparties. To help you simulate adding counterparties using Revtag, we created some test accounts of profile type `personal` that you can use.
Test accounts for Sandbox To add a counterparty via Revtag, use one of these pairs for the `name` and `revtag` fields respectively: - `Test User 1` & `john1pvki` - `Test User 2` & `john2pvki` - ... - `Test User 9` & `john9pvki`
### Address field recommendations Some payment rails may have stricter requirements regarding the `address` field – for example, by also requiring the `region` field. This is why we recommend that you use **all** available address fields (including `street_line1`, `region` and `city`) when creating a counterparty. This significantly reduces the risk of any disruption to payments made via the API. ### Multiple counterparties with the same details You cannot create multiple counterparties with the same Revtag. This restriction does not apply to other details. For example: - **Revtag**: If you've already added `johnsmith` as a Revolut counterparty, you can't add another counterparty with the `johnsmith` Revtag. If you try to do so, you'll get an error. - **Other details**: If you've added John Smith as an individual UK counterparty using GBP with `sort_code=54-01-05` and `account_no=12345678`, you can still use the same details to create another counterparty. ### Counterparty name When creating a counterparty, ensure that you use the correct field to define the counterparty's name.
Counterparty type Name field to use when added with:
Revtag Other details
Individual name (string) individual_name (object with string subfields for first and last name)
Company name (string) company_name (string)
--- For more information, see the guides: [Create a counterparty](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/create-a-counterparty). security: - AccessToken: - READ - WRITE tags: - Counterparties requestBody: description: Counterparty to add required: true content: application/json: schema: $ref: '#/components/schemas/CreateCounterpartyRequest' examples: revolut_counterparty_individual: summary: Revolut individual counterparty value: profile_type: personal name: John Smith revtag: johnsmith revolut_counterparty_business: summary: Revolut business counterparty value: profile_type: business name: John Smith Co. revtag: jsmithco1 uk_individual: summary: UK individual counterparty value: individual_name: first_name: John last_name: Smith bank_country: GB currency: GBP sort_code: 54-01-05 account_no: '12345678' uk_individual_with_address: summary: UK individual counterparty with address value: individual_name: first_name: John last_name: Smith bank_country: GB currency: GBP sort_code: 54-01-05 account_no: '12345678' address: city: London street_line1: 20 Upping St country: GB postcode: SW1A 2AB uk_business: summary: UK business counterparty value: company_name: John Smith Co. bank_country: GB currency: GBP sort_code: 54-01-05 account_no: '12345678' uk_business_with_address: summary: UK business counterparty with address value: company_name: John Smith Co. bank_country: GB currency: GBP sort_code: 54-01-05 account_no: '12345678' address: city: London street_line1: 20 Upping St country: GB postcode: SW1A 2AB international_business_eurozone: summary: International business counterparty (eurozone with EUR) value: company_name: Bleu Blanc Conseil SARL bank_country: FR currency: EUR iban: FR1420041010050500013M02606 international_business_ch_eur: summary: International business counterparty (outside eurozone, with EUR) value: company_name: Johann Meier Co. bank_country: CH currency: EUR iban: CH9300762011623852957 international_business_ch_chf: summary: International business counterparty (outside eurozone, non-EUR) value: company_name: Edelweiss Handel GmbH bank_country: CH currency: CHF iban: CH5604835012345678009 address: street_line1: Bahnhofstrasse 4a/8 city: Zurich country: CH postcode: '8001' responses: '200': description: Added counterparty content: application/json: schema: $ref: '#/components/schemas/Counterparty' examples: revolut_counterparty_individual: summary: Revolut individual counterparty value: id: 54ee57d7-1234-abcd-1234-0e1f79164d5e name: John Smith revtag: johnsmith profile_type: personal country: GB state: created created_at: '2023-07-26T09:34:41.790401Z' updated_at: '2023-07-26T09:34:41.790401Z' revolut_counterparty_business: summary: Revolut business counterparty value: id: 11cae5ef-ec24-401d-98a3-e5baa0041671 name: John Smith Co. revtag: jsmithco1 profile_type: business country: GB state: created created_at: '2025-09-16T09:34:41.790401Z' updated_at: '2025-09-16T09:34:41.790401Z' uk_individual: summary: UK individual counterparty value: id: 19dcf5a2-110f-43f7-9d5f-98aaf4b8f0d6 name: John Smith profile_type: personal state: created created_at: '2023-03-13T09:34:41.790401Z' updated_at: '2023-03-13T09:34:41.790401Z' accounts: - account_no: '12345678' sort_code: '540105' id: 6f45a49a-710c-4ef4-b42b-6c247c82af75 name: John Doe bank_country: GB currency: GBP type: external uk_business: summary: UK business counterparty value: id: b53fdd78-8d67-4f63-a103-eeeeef53cac8 name: John Smith Co. profile_type: business state: created created_at: '2022-09-14T14:34:11.168340Z' updated_at: '2022-09-14T14:34:11.168340Z' accounts: - account_no: '12345678' sort_code: '540105' id: 5c9e171c-7e23-4d6a-b768-aaaaaba535f3 name: John Smith Co. bank_country: GB currency: GBP type: external international_business_eurozone: summary: International business counterparty (eurozone with EUR) value: id: 239d6f1f-2222-4ae6-1111-5cc603341b4e name: Bleu Blanc Conseil SARL profile_type: business state: created created_at: '2022-09-14T14:47:12.273718Z' updated_at: '2022-09-14T14:47:12.273718Z' accounts: - iban: FR1420041010050500013M02606 bic: PSSTFRPPLIL id: b209281b-aakk-9911-8d83-ac72469cef8f name: Bleu Blanc Conseil SARL bank_country: FR currency: EUR type: external international_business_ch_eur: summary: International business counterparty (outside eurozone, with EUR) value: id: b8ce3922-d518-4ae6-9426-e8cc117e5332 name: Johann Meier Co. profile_type: business state: created created_at: '2026-01-30T12:43:20.273500Z' updated_at: '2026-01-30T12:43:20.273500Z' accounts: - iban: CH9300762011623852957 bic: UBSWCHZH80A id: d95bc455-f495-4f18-95fa-32f99479318c name: Johann Meier Co. bank_country: CH currency: EUR type: external international_business_ch_chf: summary: International business counterparty (outside eurozone, non-EUR) value: id: 173e6a6b-d955-465f-8f31-7f6f7c03927c name: Edelweiss Handel GmbH profile_type: business state: created created_at: '2023-08-10T12:43:20.273500Z' updated_at: '2023-08-10T12:43:20.273500Z' accounts: - iban: CH5604835012345678009 bic: UBSWCHZH80A id: b3cc43e8-f141-459b-9bd5-3505cf9797f8 name: Edelweiss Handel GmbH bank_country: CH currency: CHF type: external '400': description: |- Bad Request Returned, for example, when the provided IBAN is invalid. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3000 message: FR66995908786 is not a valid IBAN '404': description: |- Not Found Returned, for example, when the counterparty that you're trying to add doesn't exist, or when the name that you provide for the Revtag counterparty doesn't match the actual name on the account. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3006 message: Resource not found '422': description: |- Unprocessable Content Returned, for example, when the Revolut counterparty that you're trying to add using Revtag already exists, or when the counterparty cannot be added. content: application/json: schema: $ref: '#/components/schemas/CounterpartyError' examples: counterparty_exists: summary: Counterparty already exists value: message: This counterparty already exists code: 3012 params: counterparty_id: 878029d4-5972-4424-ae8c-80fe5f59407b counterparty_cannot_be_added: summary: Counterparty cannot be added value: message: Recipient can't be added code: 2101 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /counterparties/countries: get: summary: Check supported countries and currencies operationId: getCounterpartyCountries description: |- Retrieve all supported bank countries and their available currencies for counterparty creation. :::note [Note] This feature is not available in Sandbox. ::: Use this endpoint to discover which country and currency combinations are supported before checking field requirements with the [Check counterparty field requirements endpoint](https://developer.revolut.com/docs/api/business#get-counterparty-requirements). For more details, see the guide: **Check supported counterparty countries and currencies** section in [Create a counterparty](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/create-a-counterparty#check-supported-counterparty-countries-and-currencies). security: - AccessToken: - READ responses: '200': description: The list of supported bank countries and their available currencies content: application/json: schema: $ref: '#/components/schemas/CounterpartyCountriesResponse' example: countries: - country: GB currencies: - GBP - country: US currencies: - USD - country: DE currencies: - EUR default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Counterparties /counterparties/fields: get: summary: Check counterparty field requirements operationId: getCounterpartyRequirements description: |- Retrieve the list of conditionally required or applicable fields for creating a counterparty together with their constraints. :::note [Note] This feature is not available in Sandbox. ::: When creating a counterparty via the [Create a counterparty endpoint](https://developer.revolut.com/docs/api/business#add-counterparty), certain fields (such as `first_name`, `last_name`, `company_name`, `tax_id`, `route`, or `account_type`) become required depending on the counterparty's bank country, currency, and profile type. This read-only endpoint allows you to discover these contextual fields dynamically, along with their validation rules and available options. Only the fields relevant to the specific context are returned. The input parameters (`country`, `currency`, and `recipient_type`) are intentionally excluded from the response. For more details, see the guide: **Check counterparty field requirements** section in [Create a counterparty](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/create-a-counterparty#check-counterparty-field-requirements). security: - AccessToken: - READ parameters: - name: country in: query required: true description: The country where the counterparty's bank account is located. schema: $ref: '#/components/schemas/BankCountryCode' - name: currency in: query required: true description: The currency of the counterparty's bank account. schema: $ref: '#/components/schemas/Currency' - name: recipient_type in: query required: true description: |- The type of the counterparty profile. Indicates whether the counterparty is a personal or business account. schema: type: string enum: - personal - business - name: route in: query required: false description: |- The routing method for the corridor. When omitted, the response includes fields for the default route. For example, for USD to US, the default is `ach`. schema: type: string responses: '200': description: The applicable and conditionally required fields for creating the counterparty content: application/json: schema: $ref: '#/components/schemas/CounterpartyRequirementsResponse' examples: gb_counterparty: summary: GB personal counterparty value: fields: - name: first_name required: true regex: pattern: ^[-'\p{L} ]{1,40}$ description: Letters, hyphens and apostrophes only, up to 40 characters - name: last_name required: true regex: pattern: ^[-'\p{L} ]{1,40}$ description: Letters, hyphens and apostrophes only, up to 40 characters - name: sort_code required: true regex: pattern: ^\d{6}$ description: 6-digit number - name: account_no required: true regex: pattern: ^\d{8}$ description: 8-digit number - name: address required: true us_counterparty: summary: US business counterparty value: fields: - name: company_name required: true regex: pattern: ^.{1,140}$ description: Up to 140 characters - name: route required: true options: - value: ach default: true - value: fedwire - name: routing_number required: true regex: pattern: ^\d{9}$ description: 9-digit number - name: account_no required: true regex: pattern: ^\d{6,17}$ description: 6 to 17 digits - name: address required: true '400': description: |- Bad request For example: - missing or invalid query parameters - unsupported recipient type for country/currency combination content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: invalid_request: summary: Invalid request value: error_id: 40626b34-365b-43d0-b148-04dcbaeaf4df code: 2101 message: Invalid request (missing or invalid query parameters) unsupported_recipient: summary: Unsupported recipient type value: error_id: 015c2e86-30a5-404b-aa25-b68c25d97e69 code: 3081 message: Recipient type is not supported for the given country and currency '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: not_found: summary: Resource not found value: error_id: a29241ce-1f37-4ffb-8249-d09faec81aed code: 3006 message: Resource not found '422': description: |- Unprocessable entity For example: - currency not supported for the given country content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: unsupported_currency: summary: Unsupported currency value: error_id: 2cd5330c-c4a9-45ce-88d3-8cbdaeba887c code: 4030 message: Currency for country is not supported default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Counterparties /counterparty/{counterparty_id}: get: summary: Retrieve a counterparty operationId: getCounterparty description: Get the information about a specific counterparty by ID. security: - AccessToken: - READ parameters: - name: counterparty_id in: path required: true description: The ID of the counterparty to retrieve. schema: type: string format: uuid responses: '200': description: The information about a specific counterparty content: application/json: schema: $ref: '#/components/schemas/Counterparty' examples: revolut_counterparty_individual: summary: Revolut individual counterparty value: id: 8e0e9886-0af1-4b0c-acf4-111180d2892b name: John Smith revtag: johnsmith profile_type: personal country: GB state: created created_at: '2022-09-14T14:41:39.312017Z' updated_at: '2022-09-14T14:41:39.312017Z' revolut_counterparty_business: summary: Revolut business counterparty value: id: 11cae5ef-ec24-401d-98a3-e5baa0041671 name: John Smith Co. revtag: jsmithco1 profile_type: business country: GB state: created created_at: '2025-09-16T09:34:41.790401Z' updated_at: '2025-09-16T09:34:41.790401Z' uk_counterparty: summary: UK counterparty value: id: b53fdd78-8d67-4f63-a103-eeeeef53cac8 name: John Smith Co. profile_type: business state: created created_at: '2022-09-14T14:34:11.168340Z' updated_at: '2022-09-14T14:34:11.168340Z' accounts: - account_no: '12345678' sort_code: '540105' id: 5c9e171c-7e23-4d6a-b768-aaaaaba535f3 name: John Smith Co. bank_country: GB currency: GBP type: external address: street_line1: Revolut LTD street_line2: 1 Canada Square region: Greater London city: London country: GB postcode: E14 5AB international_business_eurozone: summary: International business counterparty (eurozone with EUR) value: id: 239d6f1f-2222-4ae6-1111-5cc603341b4e name: Bleu Blanc Conseil SARL profile_type: business state: created created_at: '2022-09-14T14:47:12.273718Z' updated_at: '2022-09-14T14:47:12.273718Z' accounts: - iban: FR1420041010050500013M02606 bic: PSSTFRPPLIL id: b209281b-aakk-9911-8d83-ac72469cef8f name: Bleu Blanc Conseil SARL bank_country: FR currency: EUR type: external address: street_line1: 12 Rue de la Paix city: Paris country: FR postcode: '75002' international_business_ch_eur: summary: International business counterparty (outside eurozone, with EUR) value: id: b8ce3922-d518-4ae6-9426-e8cc117e5332 name: Johann Meier Co. profile_type: business state: created created_at: '2023-08-10T12:43:20.273500Z' updated_at: '2026-01-30T12:43:20.273500Z' accounts: - iban: CH9300762011623852957 bic: UBSWCHZH80A id: d95bc455-f495-4f18-95fa-32f99479318c name: Johann Meier Co. bank_country: CH currency: EUR type: external address: street_line1: Bahnhofstrasse 10 city: Zurich country: CH postcode: '8001' international_business_ch_chf: summary: International business counterparty (outside eurozone, non-EUR) value: id: 173e6a6b-d955-465f-8f31-7f6f7c03927c name: Edelweiss Handel GmbH profile_type: business state: created created_at: '2023-08-10T12:43:20.273500Z' updated_at: '2026-01-32T10:54:03.350240Z' accounts: - iban: CH5604835012345678009 bic: UBSWCHZH80A id: b3cc43e8-f141-459b-9bd5-3505cf9797f8 name: Edelweiss Handel GmbH bank_country: CH currency: CHF type: external address: street_line1: Marktgasse 22 city: Bern country: CH postcode: '3011' card_counterparty: summary: Card counterparty value: id: 1d9013c8-84bf-474c-b3d9-690f2ae2e65c name: Jane Doe state: created created_at: '2024-01-10T15:32:10.172300Z' updated_at: '2024-01-10T15:32:10.172300Z' cards: - id: 0130f363-eeaf-4aa8-b77f-a6a629c603f5 name: Jane Doe last_digits: 1234 scheme: visa country: GB currency: GBP - id: fa05f2e5-d253-4661-85cc-bcff98b136ac name: Jane Doe last_digits: 5678 scheme: mastercard country: GB currency: GBP default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Counterparties delete: summary: Delete a counterparty operationId: deleteCounterparty description: Delete a counterparty with the given ID. When a counterparty is deleted, you cannot make any payments to the counterparty. security: - AccessToken: - READ - WRITE parameters: - name: counterparty_id in: path required: true description: The ID of the counterparty to delete. schema: type: string format: uuid responses: '204': description: The counterparty deleted default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Counterparties /counterparties/{counterparty_id}/payment-methods/{payment_method_id}: patch: summary: Update a counterparty's payment method operationId: updateCounterpartyPaymentMethod description: |- Update the **address** of a counterparty's payment method. :::tip [What is a payment method?] A payment method is an individual account or card linked to a counterparty. When you [retrieve a counterparty](https://developer.revolut.com/docs/api/business#get-counterparty), the response includes an `accounts` array and a `cards` array — each entry in these arrays is a payment method with its own `id`. ::: As only bank account payment methods have an address, you can use this endpoint to update the address of a counterparty's bank account. To get the `payment_method_id` for the bank account, [retrieve the counterparty](https://developer.revolut.com/docs/api/business#get-counterparty) and use the `id` from the `accounts` array in the response. You must provide the full address object — all required address fields must be present in the request. Omitted optional fields will retain their existing values. For more information, see the guide: [Update a counterparty's payment method](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/update-counterparty-payment-method). security: - AccessToken: - WRITE parameters: - name: counterparty_id in: path required: true description: The ID of the counterparty. schema: type: string format: uuid - name: payment_method_id in: path required: true description: The ID of the payment method to update. To get the `payment_method_id` for the bank account, [retrieve the counterparty](https://developer.revolut.com/docs/api/business#get-counterparty) and use the `id` from the `accounts` array in the response. schema: type: string format: uuid requestBody: description: The updated address details. required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCounterpartyPaymentMethodRequest' examples: update_address: summary: Update a counterparty's address value: address: country: GB street_line1: 7 Revolut Street street_line2: Floor 3 city: London postcode: EC2V 8PH responses: '204': description: The address was updated default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Counterparties /rate: get: summary: Get an exchange rate operationId: getRate description: |- Get the sell exchange rate between two currencies. You can check the [currencies supported in Production](https://help.revolut.com/business/help/receiving-payments/currency-exchanges/which-currencies-can-i-exchange-and-keep-in-my-account/) in the Revolut Help Centre. Some of these currencies might not be available in Sandbox. For more information, see the guides: [Exchange money](https://developer.revolut.com/docs/guides/manage-accounts/exchange-money). security: - AccessToken: - READ tags: - Foreign exchange parameters: - name: from in: query required: true description: The currency that you exchange from in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format. schema: $ref: '#/components/schemas/Currency' - name: amount in: query required: false description: The amount of the currency to exchange **from**. The default value is `1.00`. schema: type: number format: double default: '1.00' - name: to in: query required: true description: The currency that you exchange to in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format. schema: $ref: '#/components/schemas/Currency' responses: '200': description: The exchange rate information content: application/json: schema: $ref: '#/components/schemas/ExchangeRateResponse' example: from: amount: 1 currency: EUR to: amount: 1 currency: USD rate: 1.0044090351 fee: amount: 0 currency: EUR rate_date: '2022-08-31T17:30:34Z' '404': description: |- Not found Returned, for example, when the exchange rate is unknown content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Exchange rate unknown code: 3472 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /exchange: post: summary: Exchange money operationId: exchangeMoney description: |- Exchange money using one of these methods: - **Sell currency**: You know the amount of currency to sell. For example, you want to exchange 135.5 USD to some EUR. Specify the amount in the `from` object. - **Buy currency**: You know the amount of currency to buy. For example, you want to exchange some USD to 200 EUR. Specify the amount in the `to` object. :::note You must specify the `amount` field only once, either in the `from` object or in the `to` object. ::: You can check the [currencies supported in Production](https://help.revolut.com/business/help/receiving-payments/currency-exchanges/which-currencies-can-i-exchange-and-keep-in-my-account/) in the Revolut Help Centre. Some of these currencies might not be available in Sandbox. For more information, see the guides: [Exchange money](https://developer.revolut.com/docs/guides/manage-accounts/exchange-money). security: - AccessToken: - READ - PAY tags: - Foreign exchange requestBody: description: Specify the exchange information required: true content: application/json: schema: $ref: '#/components/schemas/ExchangeRequest' examples: sell: summary: Sell value: from: account_id: af98333c-ea53-482b-93c2-1fa5e4eae671 currency: USD amount: 135.5 to: account_id: b7ec67d3-5af1-42c8-bece-3d285774894d currency: EUR reference: exchange request_id: A1pH4num3ric2 buy: summary: Buy value: from: account_id: af98333c-ea53-482b-93c2-1fa5e4eae671 currency: USD to: account_id: b7ec67d3-5af1-42c8-bece-3d285774894d currency: EUR amount: 200 reference: exchange request_id: A1pH4num3ric2 responses: '200': description: Exchange operation details content: application/json: schema: $ref: '#/components/schemas/ExchangeResponse' example: id: 630f9c2e-2e74-a06d-ab61-deb7ggkkd6cb state: completed created_at: '2022-08-31T17:36:46.656876Z' completed_at: '2022-08-31T17:36:46.657239Z' '400': description: |- Bad request For example, the exchange reason is required. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: 3448 message: Exchange reason is required default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /exchange-reasons: get: summary: Get exchange reasons description: |- Depending on the country and the amount of funds to be exchanged, you might be required to provide an exchange reason. With this endpoint, you can retrieve all exchange reasons available to your business account. After you retrieve the results, use the appropriate reason code in the `exchange_reason_code` field when [exchanging money](https://developer.revolut.com/docs/api/business#exchange-money) or [making a payment](https://developer.revolut.com/docs/api/business#create-payment) that involves foreign currency exchange. operationId: getExchangeReasons security: - AccessToken: - READ tags: - Foreign exchange - Transfers responses: '200': description: List of exchange reasons content: application/json: schema: $ref: '#/components/schemas/ExchangeReasons' example: - code: business_expense_and_claims name: Business expense and claims - code: fees_and_charges name: Fees and charges - code: fund_transfer_and_intracompany_payment name: Fund transfer and intracompany payment - code: gifts_and_donations name: Gifts and donations - code: government_services_and_tax name: Government services and tax - code: insurance name: Insurance - code: inventory name: Inventory - code: investment_dividend_and_interest name: Investment, dividend and interest - code: loan_and_loan_repayment name: Loan and loan repayment - code: marketing name: Marketing - code: payment_for_goods_and_services name: Payment for goods and services - code: payroll name: Payroll - code: refund name: Refund - code: rental_and_property name: Rental and property - code: sales name: Sales - code: service_provider_and_software name: Service provider and software - code: travel_and_transportation name: Travel and transportation - code: utilities name: Utilities default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /expenses: servers: - url: https://b2b.revolut.com/api/1.0 description: Production server (uses live data) get: summary: Retrieve a list of expenses operationId: getExpenses description: |- Get all your expenses, or use the query parameters to filter the results. The expenses are sorted by the `expense_date` value in reverse chronological order, and they're **paginated**. The maximum number of expenses returned per page is specified by the `count` parameter. To get the next page of results, make a new request and use the `expense_date` value from the last item of the previous page as the value for the `to` parameter. The data enriched by the user, for example, VAT and cost centre, is returned under `splits[].tax_rate` and `splits[].labels`, respectively. :::note - The API returns a maximum of 500 expenses per request. - This feature is not available in Sandbox. ::: For more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses). security: - AccessToken: - READ tags: - Expenses parameters: - in: query name: from description: |- The date and time to retrieve the expenses from, including this date-time. Corresponds to the value of `expense_date`. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Used also for pagination. To get back to the previous page of results, make a new request and use the `expense_date` value from the first item of the current page as the value for the `from` parameter. schema: type: string format: date-time - in: query name: to description: |- The date and time to retrieve the expenses to, excluding this date-time. Corresponds to the value of `expense_date`. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. The default value is the date and time at which you're calling the endpoint. Used also for pagination. To get back to the next page of results, make a new request and use the `expense_date` value from the last item of the previous (current) page as the value for the `to` parameter. schema: type: string format: date-time - in: query name: count description: |- The maximum number of the expenses to retrieve per page. To get the next page of results, make a new request and use the `expense_date` value from the last item of the previous page as the value for the `to` parameter. schema: type: integer default: 100 maximum: 500 minimum: 1 - in: query name: state description: Retrieves the expenses in the specified state. schema: type: string enum: - missing_info - awaiting_review - reverted - pending_reimbursement - refund_requested - refunded - approved - rejected - in: query name: transaction_type description: |- The type of the transaction related to the expense. If provided, only expenses with transactions of this type are returned. schema: type: string enum: - atm - card_payment - fee - transfer - external - mileage_reimbursement - rev_payment responses: '200': description: List of expenses content: application/json: schema: $ref: '#/components/schemas/Expenses' example: - id: 8decf9f8-053e-46cb-92d8-a7b450fe5ae0 state: approved transaction_type: card_payment description: Printer paper submitted_at: '2024-09-13T20:48:40.912Z' completed_at: '2024-09-13T20:48:40.948Z' payer: Ray Trenfield merchant: Best Printers Company transaction_id: 163e0ef6-2414-4fcf-846f-1f871059d506 expense_date: '2024-09-13T18:47:01.782Z' splits: - amount: amount: 15.39 currency: GBP category: id: 71b9ec74-d5ff-4aa1-a489-f8dc39d4c9b7 name: Printing & Stationery code: '461' labels: Office supplies: - photocopying Department: - HR tax_rate: id: 5704fdd2-bac2-42ec-bab0-e075182260be name: VAT percentage: 20 - amount: amount: 8.99 currency: GBP category: id: a5532a5e-d859-4795-967b-14723f8920ea name: Electronics code: '573' labels: Office supplies: - photocopying Department: - HR tax_rate: id: d92efe31-fc26-4364-af4b-3630c1057ece name: No VAT percentage: 0 labels: Office supplies: - photocopying Department: - HR receipt_ids: - 84c0169a-37f9-4bfa-ab1e-f2c81dbc34cf spent_amount: amount: 24.38 currency: GBP - id: 8498b232-28ba-4baf-b33d-22fb464e83c8 state: missing_info transaction_type: fee description: Expenses app charges payer: Bingston Labs transaction_id: 91b56d41-7b42-40e8-8970-0082cf965e6e expense_date: '2024-09-04T13:39:18.606Z' splits: - amount: amount: 17.68 currency: EUR category: id: 95bf2a30-7284-4664-989a-1dcb51e2053a name: General Expenses code: '429' labels: {} tax_rate: id: 812f50e7-37b3-480b-a7c4-2ad08442f7cf name: 20% (VAT on Expenses) percentage: 20 labels: {} receipt_ids: - d97d062f-5aae-4a0c-b5f3-52ae134d384d spent_amount: amount: 17.68 currency: EUR - id: a0e0294e-0460-42f4-bd97-f969469f1afc state: missing_info transaction_type: mileage_reimbursement payer: John Smith expense_date: '2025-10-6T08:34:18.123Z' splits: - amount: amount: 25.99 currency: EUR category: id: dab86546-a442-464a-9bad-18a826542b03 name: Vehicle Operating Expenses labels: {} tax_rate: id: 728980d1-aa76-44f5-8902-53520160bfeb name: 20% Fuel bills percentage: 20 labels: {} receipt_ids: [] spent_amount: amount: 25.99 currency: EUR - id: b6f4e0c2-8a3d-4e61-9c50-2f7a9b1c4d8e state: approved transaction_type: card_payment description: Client visit - accommodation and dinner submitted_at: '2025-11-14T19:02:11.224Z' completed_at: '2025-11-14T19:02:33.901Z' payer: Amara Okafor merchant: Hotel do Cais transaction_id: 7f3a2c9e-4b5d-4f2a-8c31-2d6e9b1a7f05 expense_date: '2025-11-13T21:47:01.782Z' splits: - amount: amount: 45 currency: GBP category: id: 2f76152a-2b14-4390-aa32-bbab02a1e98c name: Meals & Entertainment code: '500' labels: Hospitality: - client visit tax_rate: id: 5704fdd2-bac2-42ec-bab0-e075182260be name: VAT percentage: 20 - amount: amount: 210 currency: GBP category: id: c729ea95-3ae7-4d21-91f7-1a69844175f2 name: Travel & Lodging code: '460' labels: Hospitality: - client visit tax_rate: id: d92efe31-fc26-4364-af4b-3630c1057ece name: No VAT percentage: 0 labels: Hospitality: - client visit receipt_ids: - 2d84c9fa-47b3-4a1e-b5f7-3c8a9d0e6f21 spent_amount: amount: 295.8 currency: EUR '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: |- Forbidden Returned, for example, when the Expenses API is disabled for the business that is trying to use it. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Expenses API for business is disabled code: 9002 '422': description: |- Unprocessable content Returned, for example, when the Expenses feature (not just the API) is disabled for the business. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Expenses feature is not enabled code: 3470 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /expenses/{expense_id}: servers: - url: https://b2b.revolut.com/api/1.0 description: Production server (uses live data) get: summary: Retrieve an expense operationId: getExpense description: |- Get the information about a specific expense by ID. The data enriched by the user, for example, VAT and cost centre, is returned under `splits[].tax_rate` and `splits[].labels`, respectively. :::note This feature is not available in Sandbox. ::: For more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses). security: - AccessToken: - READ tags: - Expenses parameters: - name: expense_id in: path required: true description: The ID of the expense to retrieve. schema: type: string format: uuid responses: '200': description: Expense content: application/json: schema: $ref: '#/components/schemas/Expense' examples: expense_approved: summary: Approved expense, with labels and multiple splits value: id: 8decf9f8-053e-46cb-92d8-a7b450fe5ae0 state: approved transaction_type: card_payment description: Printer paper submitted_at: '2024-09-13T20:48:40.912Z' completed_at: '2024-09-13T20:48:40.948Z' payer: Ray Trenfield merchant: Best Printers Company transaction_id: 163e0ef6-2414-4fcf-846f-1f871059d506 expense_date: '2024-09-13T18:47:01.782Z' splits: - amount: amount: 15.39 currency: GBP category: id: 71b9ec74-d5ff-4aa1-a489-f8dc39d4c9b7 name: Printing & Stationery code: '461' labels: Office supplies: - photocopying Department: - HR tax_rate: id: 5704fdd2-bac2-42ec-bab0-e075182260be name: VAT percentage: 20 - amount: amount: 8.99 currency: GBP category: id: a5532a5e-d859-4795-967b-14723f8920ea name: Electronics code: '573' labels: Office supplies: - photocopying Department: - HR tax_rate: id: d92efe31-fc26-4364-af4b-3630c1057ece name: No VAT percentage: 0 labels: Office supplies: - photocopying Department: - HR receipt_ids: - 84c0169a-37f9-4bfa-ab1e-f2c81dbc34cf spent_amount: amount: 24.38 currency: GBP expense_with_fx: summary: Approved expense with FX, split amounts in GBP and spent amount in EUR value: id: b6f4e0c2-8a3d-4e61-9c50-2f7a9b1c4d8e state: approved transaction_type: card_payment description: Client visit - accommodation and dinner submitted_at: '2025-11-14T19:02:11.224Z' completed_at: '2025-11-14T19:02:33.901Z' payer: Amara Okafor merchant: Hotel do Cais transaction_id: 7f3a2c9e-4b5d-4f2a-8c31-2d6e9b1a7f05 expense_date: '2025-11-13T21:47:01.782Z' splits: - amount: amount: 45 currency: GBP category: id: 2f76152a-2b14-4390-aa32-bbab02a1e98c name: Meals & Entertainment code: '500' labels: Hospitality: - client visit tax_rate: id: 5704fdd2-bac2-42ec-bab0-e075182260be name: VAT percentage: 20 - amount: amount: 210 currency: GBP category: id: c729ea95-3ae7-4d21-91f7-1a69844175f2 name: Travel & Lodging code: '460' labels: Hospitality: - client visit tax_rate: id: d92efe31-fc26-4364-af4b-3630c1057ece name: No VAT percentage: 0 labels: Hospitality: - client visit receipt_ids: - 2d84c9fa-47b3-4a1e-b5f7-3c8a9d0e6f21 spent_amount: amount: 295.8 currency: EUR expense_awaiting_review: summary: Expense awaiting review, with external transaction value: id: 7ff44b9f-556b-4dce-8e39-4a667246f49f state: awaiting_review transaction_type: external description: Snack submitted_at: '2024-09-11T13:19:24.659Z' payer: Chima Aragonye merchant: Go FroYo Co. expense_date: '2024-01-21T00:00:00Z' splits: - amount: amount: 5 currency: GBP category: id: 95bf2a30-7284-4664-989a-1dcb51e2053a name: General Expenses code: '429' labels: {} tax_rate: id: d92efe31-fc26-4364-af4b-3630c1057ece name: No VAT percentage: 0 labels: {} receipt_ids: [] spent_amount: amount: 5 currency: GBP expense_missing_info: summary: Expense missing information value: id: 8498b232-28ba-4baf-b33d-22fb464e83c8 state: missing_info transaction_type: fee description: Expenses app charges payer: Bingston Labs transaction_id: 91b56d41-7b42-40e8-8970-0082cf965e6e expense_date: '2024-09-04T13:39:18.606Z' splits: - amount: amount: 17.68 currency: EUR category: id: 95bf2a30-7284-4664-989a-1dcb51e2053a name: General Expenses code: '429' labels: {} tax_rate: id: 812f50e7-37b3-480b-a7c4-2ad08442f7cf name: 20% (VAT on Expenses) percentage: 20 labels: {} receipt_ids: - d97d062f-5aae-4a0c-b5f3-52ae134d384d spent_amount: amount: 17.68 currency: EUR expense_reverted: summary: Reverted expense value: id: 9b9cf87a-e17f-4854-8800-515a0475c4df state: reverted transaction_type: transfer payer: Mindy Carter transaction_id: 5581efb8-6b98-4c2b-bdcd-1270062a8d48 expense_date: '2024-09-16T12:48:39.960Z' splits: - amount: amount: 100 currency: EUR labels: {} labels: {} receipt_ids: [] spent_amount: amount: 100 currency: EUR '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: |- Forbidden Returned, for example, when the access token is missing the required [scope](https://developer.revolut.com/docs/api/business#access-token) or if the Expenses API is disabled for the business. content: application/json: schema: $ref: '#/components/schemas/Error' examples: forbidden: summary: Forbidden value: message: This action is forbidden code: 9002 api_disabled: summary: Feature disabled value: message: Expenses API for business is disabled code: 9002 '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Expense 'bd415411-6e3e-46e7-af07-42f9b790c44e' not found code: 3006 '422': description: |- Unprocessable content Returned, for example, when the Expenses feature (not just the API) is disabled for the business. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Expenses feature is not enabled code: 3470 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /expenses/{expense_id}/receipts/{receipt_id}/content: servers: - url: https://b2b.revolut.com/api/1.0 description: Production server (uses live data) get: summary: Retrieve a receipt related to an expense operationId: getExpenseReceipt description: |- Get the receipt related to an expense by providing the receipt's ID. :::note This feature is not available in Sandbox. ::: For more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses). security: - AccessToken: - READ tags: - Expenses parameters: - name: expense_id in: path required: true description: The ID of the [expense](https://developer.revolut.com/docs/api/business#get-expense) to which the receipt is related. schema: type: string format: uuid - name: receipt_id in: path required: true description: |- The ID of the receipt to retrieve. To find the ID of a receipt related to a specific expense, refer to the [expense's details](https://developer.revolut.com/docs/api/business#get-expense#response). The IDs of receipts related to that expense are returned under `receipt_ids`. schema: type: string format: uuid responses: '200': description: Receipt content. The exact format depends on the receipt. content: '*/*': schema: type: string format: binary examples: receipt_pdf: summary: A PDF receipt value: '@sample-receipt.pdf' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: |- Forbidden Returned, for example, when the access token is missing the required [scope](https://developer.revolut.com/docs/api/business#access-token) or if the Expenses API is disabled for the business. content: application/json: schema: $ref: '#/components/schemas/Error' examples: forbidden: summary: Forbidden value: message: This action is forbidden code: 9002 api_disabled: summary: Feature disabled value: message: Expenses API for business is disabled code: 9002 '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Receipt 'cea368fe-c757-44ce-b2cc-3da94b3d13a6' for expense '3e45f3d7-9919-46df-9793-300726c9fed1' not found code: 3006 '422': description: |- Unprocessable content Returned, for example, when the Expenses feature (not just the API) is disabled for the business. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Expenses feature is not enabled code: 3470 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /label-groups: post: summary: Create a new label group operationId: createLabelGroup description: |- Add a new group of labels that can be applied to your financial records, such as expenses. :::note - This operation is not supported for [externally managed label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups#externally-managed-settings). - You can have up to 5 label groups at a time per business. ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - WRITE requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateLabelGroupRequest' examples: department_labels: summary: Label group for Department value: name: Department labels: - name: Sales & Account Management - name: Product Management - name: Design & UX - name: Customer Success - name: Engineering - name: Research & Development - name: Operations - name: Quality Assurance - name: Data Science & Analytics - name: Executive & Leadership team_labels: summary: Label group for Team value: name: Team labels: - name: Brand Design & Creative Services - name: Enterprise Sales (Europe) - name: Cloud Infrastructure & DevOps - name: Growth & Performance Marketing - name: Mobile App Development responses: '201': description: |- Resource created On successful creation, the response returns only the ID of the new resource (i.e. the label group), even if the resource has more properties. To get all the details of the label group, use the returned resource ID with a [GET request](https://developer.revolut.com/docs/api/business#get-label-group). $ref: '#/components/responses/ResourceCreatedResponse' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Required parameter is missing value: error_id: 69bc43d4-0ebf-4f7c-88e0-ebb7a1441a18 code: 2101 message: '''labels'' is required' bad_param_type: summary: Incorrect parameter type value: error_id: 69bc4467-8042-446f-b362-675e2921d71c code: 2101 message: '''labels'' must be an array' invalid_json: summary: Invalid JSON value: error_id: 69bc1985-1313-42f0-8c0b-3673c665f135 code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 7acc6073-5290-45f8-8956-c79d487ef1e5 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: '''name'' must be at most 100 characters' param_value_missing: summary: Parameter value too long value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: '''labels'' must not be empty' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when a label group with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 69bc49bc-4e57-4768-ab6e-f281da25aa2b code: 3506 message: Label group with name 'My Unique Label Group' already exists '422': description: |- Unprocessable entity - label group cannot be created due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and labels are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_modify_externally_managed_resource: summary: Labels and label groups are managed by integration, cannot be created manually value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Labels are managed by your connected accounting integration and cannot be modified manually group_limit_exceeded: summary: Label groups limit exceeded value: error_id: 69bc3507-cfd6-4e04-bd79-2d57a3951774 code: 3591 message: Maximum of 5 label groups per business reached '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels get: summary: Retrieve a list of label groups operationId: getLabelGroups description: |- Get available label groups based on the provided query criteria. The label groups are sorted by the `created_at` date in reverse chronological order, and they're **paginated**. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - READ parameters: - name: limit in: query required: false description: |- The page size, that is, the maximum number of label groups to return per page. To get the next page of results, use `page_token`. schema: type: integer minimum: 1 maximum: 500 default: 100 example: 10 - $ref: '#/components/parameters/PageToken' responses: '200': description: List of label groups content: application/json: schema: type: object properties: next_page_token: $ref: '#/components/schemas/PageToken' label_groups: description: List of label groups. type: array items: $ref: '#/components/schemas/LabelGroupResponse' required: - label_groups examples: results_with_next_page: summary: Results exceed page size (when limit=5) & next page available value: next_page_token: MjAyNi0wMS0wMVQwOToxMzoxNS40MDZaN2RhNTFjZGY0LTZiYjctNDRkNi04OWU1LTc2OWEzZGYxZDc5ZA label_groups: - id: f0e1d2c3-b4a5-4678-9012-3456789abcde name: Department created_at: '2026-03-19T07:15:00.000000Z' updated_at: '2026-03-19T08:45:22.111444Z' - id: f09ad1ad3-a1c0-4c09-b8f8-24b439e72690 name: Employee created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' - id: a1b2c3d4-e5f6-4a5b-bc6d-7e8f9a0b1c2d name: Project created_at: '2026-02-01T08:00:00.000000Z' updated_at: '2026-02-01T08:00:00.000000Z' - id: 5f4e3d2c-1b0a-4987-8765-43210fedcba9 name: Location created_at: '2026-01-15T10:20:30.123456Z' updated_at: '2026-03-10T14:45:12.987654Z' - id: 98765432-abcd-ef01-2345-67890abcdef0 name: Task created_at: '2025-12-20T11:11:11.000Z' updated_at: '2026-03-15T09:30:00.555222Z' results_single_page: summary: Results fit within page size, no more pages available value: label_groups: - id: f0e1d2c3-b4a5-4678-9012-3456789abcde name: Department created_at: '2026-03-19T07:15:00.000000Z' updated_at: '2026-03-19T08:45:22.111444Z' - id: f09ad1ad3-a1c0-4c09-b8f8-24b439e72690 name: Employee created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' - id: a1b2c3d4-e5f6-4a5b-bc6d-7e8f9a0b1c2d name: Project created_at: '2026-02-01T08:00:00.000000Z' updated_at: '2026-02-01T08:00:00.000000Z' - id: 5f4e3d2c-1b0a-4987-8765-43210fedcba9 name: Location created_at: '2026-01-15T10:20:30.123456Z' updated_at: '2026-03-10T14:45:12.987654Z' - id: 98765432-abcd-ef01-2345-67890abcdef0 name: Task created_at: '2025-12-20T11:11:11.000Z' updated_at: '2026-03-15T09:30:00.555222Z' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_type: summary: Incorrect query parameter type value: error_id: 29146977-8042-446f-b362-af224b14c830 code: 2101 message: Query parameter 'limit' must be an integer param_value_too_low: summary: Query parameter value too low value: error_id: b5a51cd1-9d0f-4074-adae-675e2921d71c code: 2101 message: Query parameter 'limit' must be at least 1 param_value_too_high: summary: Query parameter value too high value: error_id: fa12f45e-4633-4f78-8d40-42dadc380511 code: 2101 message: Query parameter 'limit' must be at most 500 multiple_values_not_allowed: summary: Multiple values provided for a single-value query parameter value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: Query parameter 'limit' must have a single value param_cannot_be_empty: summary: Query parameter provided without a value value: error_id: fa12f45e-0ebf-4f7c-88e0-3673c665f135 code: 2101 message: Query parameter 'limit' must not be empty '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels /label-groups/{group_id}: get: summary: Retrieve label group details operationId: getLabelGroup description: |- Get the details of a specific label group based on the label group ID. The details include the label group name, as well as when the label group was added to your settings, and when it was last updated. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - READ parameters: - name: group_id in: path description: The ID of the label group to retrieve. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 responses: '200': description: Label group details content: application/json: schema: $ref: '#/components/schemas/LabelGroupResponse' example: id: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 name: Department created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_format: summary: Incorrect path parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the label group that you're trying to retrieve cannot be found. This can happen, for example, when the label group has been deleted, or the provided label group ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: cbb15721-5f51-4588-a959-7494bb7ba827 code: 3006 message: Label group with id 8945879d-6854-4e10-88d6-ce92c5f010ac not found '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels patch: summary: Update label group settings operationId: updateLabelGroup description: |- Update the name for a specific label group, based on its ID. :::note This operation is not supported for [externally managed label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups#externally-managed-settings). ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - WRITE parameters: - name: group_id in: path description: The ID of the label group to update. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateLabelGroupRequest' example: name: 20% VAT responses: '204': description: Label group updated '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Body is empty value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 2101 message: Request body must not be empty bad_param_format: summary: Incorrect parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID invalid_json: summary: Invalid JSON value: error_id: 36f3cec5-b4b9-431f-9c28-afd3899bc64f code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 32fd0697-2f3f-4308-b25d-c9230f99c589 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: d8d919b5-d667-4058-9bb3-17b6f7bcd6c8 code: 2101 message: '''name'' must be at most 20 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the label group that you're trying to update cannot be found. This can happen, for example, when the label group doesn't exist, or the provided label group ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ca73d8a4-a5cb-4f03-9a95-4d53aa1731b0 code: 3006 message: Label group with id be6c9d90-df25-458a-b559-be61896c94b8 not found '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when a label group with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 8c08b656-4e57-4768-ab6e-f281da25aa2b code: 3506 message: Label group with name 'My Unique Label Group' already exists '422': description: |- Unprocessable entity - label group cannot be updated due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and label groups are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_update_externally_managed_resource: summary: Labels and label groups are managed by integration, cannot be updated value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Labels are managed by your connected accounting integration and cannot be modified manually state_mismatch: summary: Label group is no longer available value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 3100 message: Invalid request '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels delete: summary: Delete a label group operationId: deleteLabelGroup description: |- Delete a specific label group, based on its ID. :::note This operation is not supported for [externally managed label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups#externally-managed-settings). ::: Once the label group is deleted, it will not be returned by the API or in the Revolut Business app, and: - You will not be able to apply labels from the group to new financial records (e.g. expenses). - Existing records that have not been completed and that contain labels from this group will be marked as invalid, and you'll need to update them to use different labels. - Completed records will not be affected by the change. A successful response does not get any content in return. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - WRITE parameters: - name: group_id description: The ID of the label group to delete. in: path required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 responses: '204': description: Label group deleted '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_format: summary: Incorrect path parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the label group that you're trying to delete cannot be found. This can happen, for example, when the label group doesn't exist, or the provided label group ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ca73d8a4-a5cb-4f03-9a95-4d53aa1731b0 code: 3006 message: Label group with id be6c9d90-df25-458a-b559-be61896c94b8 not found '422': description: |- Unprocessable entity - label group cannot be deleted due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and label groups are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_delete_externally_managed_resource: summary: Labels and label groups are managed by integration, cannot be deleted value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Labels are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels /label-groups/{group_id}/labels: post: summary: Create a new label operationId: createLabel description: |- Add a new label to a label group. :::note This operation is not supported for [externally managed labels](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups#externally-managed-settings). ::: The labels are used for accounting and can be applied to your financial records, such as expenses. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - WRITE parameters: - name: group_id in: path description: The ID of the label group to which to add the new label. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateLabelRequest' example: name: Communications responses: '201': description: |- Resource created On successful creation, the response returns only the ID of the new resource (i.e. the label), even if the resource has more properties. To get more details, use the ID of the parent label group to [get all the labels from the label group](https://developer.revolut.com/docs/api/business#get-labels). $ref: '#/components/responses/ResourceCreatedResponse' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Required parameter is missing value: error_id: fa12f45e-0ebf-4f7c-88e0-ebb7a1441a18 code: 2101 message: '''name'' is required' bad_param_type: summary: Incorrect parameter type value: error_id: 29146977-8042-446f-b362-675e2921d71c code: 2101 message: '''name'' must be a string' invalid_json: summary: Invalid JSON value: error_id: df7b76b2-1313-42f0-8c0b-3673c665f135 code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 7acc6073-5290-45f8-8956-c79d487ef1e5 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: '''name'' must be at most 100 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when a label with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 8c08b656-4e57-4768-ab6e-f281da25aa2b code: 3506 message: Label with name 'My Unique Label' already exists '422': description: |- Unprocessable entity - label cannot be created due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and labels are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_modify_externally_managed_resource: summary: Labels and label groups are managed by integration, cannot be created manually value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Labels are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels get: summary: Retrieve a list of labels from a label group operationId: getLabels description: |- Get labels from a specific label group based on the provided query criteria. :::note The API returns a maximum of 500 labels per request. The default page size is 100. ::: The labels are sorted by the `created_at` date in reverse chronological order, and they're **paginated**. The page size, that is, the maximum number of labels returned per page is specified by the `limit` parameter. - If the number of results exceeds the page size, the response also returns a cursor for the next page under `next_page_token`. To get the next page of results, make a new request using that `next_page_token` value in `page_token`. - If the number of results is smaller than the page size, `next_page_token` is not returned. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - READ parameters: - name: group_id in: path description: The ID of the label group from which to retrieve labels. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 - name: limit in: query required: false description: |- The page size, that is, the maximum number of labels to return per page. To get the next page of results, use `page_token`. schema: type: integer minimum: 1 maximum: 500 default: 100 example: 10 - $ref: '#/components/parameters/PageToken' responses: '200': description: List of labels content: application/json: schema: type: object properties: next_page_token: $ref: '#/components/schemas/PageToken' labels: description: List of labels in the specified group type: array items: $ref: '#/components/schemas/LabelResponse' required: - labels examples: results_with_next_page: summary: Results exceed page size (when limit=5) & next page available value: next_page_token: MjAyNi0wMS0wMVQwOToxMzoxNS40MDZaN2RhNTFjZGY0LTZiYjctNDRkNi04OWU1LTc2OWEzZGYxZDc5ZA labels: - id: f0e1d2c3-b4a5-4678-9012-3456789abcde name: Consultants created_at: '2026-03-19T07:15:00.000000Z' updated_at: '2026-03-19T08:45:22.111444Z' - id: f09ad1ad-a1c0-4c09-b8f8-24b439e72690 name: IT & Tech Support created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' - id: a1b2c3d4-e5f6-4a5b-bc6d-7e8f9a0b1c2d name: HR & Facility created_at: '2026-02-01T08:00:00.000000Z' updated_at: '2026-02-01T08:00:00.000000Z' - id: c3b2a1d0-e9f8-47a6-9d8c-7b6a5f4e3d2c name: Finance & Legal created_at: '2026-01-22T09:10:15.555000Z' updated_at: '2026-01-23T11:00:45.123456Z' - id: d9e8f7a6-b5c4-4321-8765-43210fedcba9 name: Sales & Marketing created_at: '2026-01-20T14:20:00.000000Z' updated_at: '2026-01-20T14:20:00.000000Z' results_single_page: summary: Results fit within page size, no more pages available value: labels: - id: f0e1d2c3-b4a5-4678-9012-3456789abcde name: Consultants created_at: '2026-03-19T07:15:00.000000Z' updated_at: '2026-03-19T08:45:22.111444Z' - id: f09ad1ad-a1c0-4c09-b8f8-24b439e72690 name: IT & Tech Support created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' - id: a1b2c3d4-e5f6-4a5b-bc6d-7e8f9a0b1c2d name: HR & Facility created_at: '2026-02-01T08:00:00.000000Z' updated_at: '2026-02-01T08:00:00.000000Z' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_type: summary: Incorrect query parameter type value: error_id: 29146977-8042-446f-b362-af224b14c830 code: 2101 message: Query parameter 'limit' must be an integer param_value_too_low: summary: Query parameter value too low value: error_id: b5a51cd1-9d0f-4074-adae-675e2921d71c code: 2101 message: Query parameter 'limit' must be at least 1 param_value_too_high: summary: Query parameter value too high value: error_id: fa12f45e-4633-4f78-8d40-42dadc380511 code: 2101 message: Query parameter 'limit' must be at most 500 multiple_values_not_allowed: summary: Multiple values provided for a single-value query parameter value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: Query parameter 'limit' must have a single value param_cannot_be_empty: summary: Query parameter provided without a value value: error_id: fa12f45e-0ebf-4f7c-88e0-3673c665f135 code: 2101 message: Query parameter 'limit' must not be empty '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels /label-groups/{group_id}/labels/{label_id}: patch: summary: Update a label operationId: updateLabel description: |- Update the name for a specific label, based on the IDs of the label and its label group. :::note This operation is not supported for [externally managed labels]/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups(#externally-managed-settings). ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - WRITE parameters: - name: group_id in: path description: The ID of the label group to which the label belongs. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 - name: label_id in: path description: The ID of the label to update. required: true schema: type: string format: uuid example: 33279b4f-97ac-4a6f-8932-c6a3b0974060 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateLabelRequest' example: name: 20% VAT responses: '204': description: Label updated '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Body is empty value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 2101 message: Request body must not be empty bad_param_format: summary: Incorrect parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID invalid_json: summary: Invalid JSON value: error_id: 36f3cec5-b4b9-431f-9c28-afd3899bc64f code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 32fd0697-2f3f-4308-b25d-c9230f99c589 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: d8d919b5-d667-4058-9bb3-17b6f7bcd6c8 code: 2101 message: '''name'' must be at most 100 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the label that you're trying to update cannot be found. This can happen, for example, when the label or corresponding label group doesn't exist, or the provided ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ca73d8a4-a5cb-4f03-9a95-4d53aa1731b0 code: 3006 message: Label with id be6c9d90-df25-458a-b559-be61896c94b8 not found '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when a label with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 8c08b656-4e57-4768-ab6e-f281da25aa2b code: 3506 message: Label with name 'My Unique Label' already exists '422': description: |- Unprocessable entity - label cannot be updated due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and labels are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_update_externally_managed_resource: summary: Labels and label groups are managed by integration, cannot be updated value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Labels are managed by your connected accounting integration and cannot be modified manually state_mismatch: summary: Label is no longer available value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 3100 message: Invalid request '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels delete: summary: Delete a label operationId: deleteLabel description: |- Delete a specific label, based on the IDs of the label and its label group. :::note This operation is not supported for [externally managed labels](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups#externally-managed-settings). ::: Once the label is deleted, it will not be returned by the API or in the Revolut Business app, and: - You will not be able to apply it to new financial records (e.g. expenses). - Existing records with this label that have not been completed will be marked as invalid, and you'll need to update them to use a different label. - Completed records will not be affected by the change. A successful response does not get any content in return. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). security: - AccessToken: - WRITE parameters: - name: group_id in: path description: The ID of the label group to which the label belongs. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 - name: label_id in: path description: The ID of the label to delete. required: true schema: type: string format: uuid example: 33279b4f-97ac-4a6f-8932-c6a3b0974060 responses: '204': description: Label deleted '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_format: summary: Incorrect path parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the label that you're trying to delete cannot be found. This can happen, for example, when the label doesn't exist, or the provided label ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ca73d8a4-a5cb-4f03-9a95-4d53aa1731b0 code: 3006 message: Label with id be6c9d90-df25-458a-b559-be61896c94b8 not found '422': description: |- Unprocessable entity - label cannot be deleted due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and labels are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_delete_externally_managed_resource: summary: Labels and label groups are managed by integration, cannot be deleted value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Labels are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Labels /payment-drafts: get: summary: Retrieve a list of payment drafts operationId: getPaymentDrafts description: |- Get the list of payment drafts that haven't been [sent for processing](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts#send-drafts-for-processing). By default, only payment drafts created with the API (including [Draft payment](https://developer.revolut.com/docs/api/open-banking#tag-draft-payment) endpoints) are returned. To retrieve drafts from other sources, use the `source` parameter. The response lists the drafts with their details, such as the number of payments included in the draft, but not the payment details. For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ parameters: - name: source in: query required: false description: |- Filter payment drafts by the source from which they were created. | Value | Description | | --- | --- | | **`api`** | Only drafts created with the API (excluding the [Draft payment](https://developer.revolut.com/docs/api/open-banking#tag-draft-payment) endpoints). | | **`integration`** | Drafts created via integrations (e.g., Xero) and [Draft payment](https://developer.revolut.com/docs/api/open-banking#tag-draft-payment) endpoints. | | **`email`** | Only drafts created via email. | | **`all`** | All payment drafts, **including drafts created in the Revolut Business app**. | schema: type: string enum: - api - integration - email - all responses: '200': description: List of payment drafts content: application/json: schema: $ref: '#/components/schemas/PaymentDraftsResponse' example: payment_orders: - id: e7e54cb2-861a-aaaa-80e9-3e6600f3db10 scheduled_for: '2026-06-24' title: Draft Payment through API payments_count: 1 source: api default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Payment drafts post: summary: Create a payment draft operationId: createPaymentDraft description: |- Create a payment draft. When you create a payment draft, it stays a draft until you [send it for processing as payment](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts#send-drafts-for-processing) in the [Revolut Business app](https://business.revolut.com/). Until then, you can [delete](https://developer.revolut.com/docs/api/business#delete-payment-draft) the draft if you no longer wish to proceed with it. :::note If you or the payment you're making is subject to an [approval process](https://help.revolut.com/business/help/managing-my-business/users-and-employees/how-can-i-set-payment-approval-rules/), when you send the draft for processing, the payment goes into the `Pending review` state. Before it can be processed, the business owner, administrator, or another team member designated as an approver must approve it in the Revolut Business app. ::: For more information on use cases and other details, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ - WRITE tags: - Payment drafts requestBody: description: The payment draft information required: true content: application/json: schema: $ref: '#/components/schemas/CreatePaymentDraftRequest' examples: simple_draft: summary: Payment draft for a simple payment value: title: Payment Draft Title payments: - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: a15bcac4-dd42-45ed-a828-6806ccc8bb7e account_id: 2bf609f4-9825-4401-b6f7-960c61f8bee0 amount: 10 currency: GBP reference: 'Payment #123' draft_with_charge_bearer: summary: Payment draft for a single payment with charge bearer specified value: title: Payment Draft Title payments: - account_id: 21cb9b68-0017-45cf-93f2-1a8954bcb120 receiver: counterparty_id: d4d52566-280b-47df-b34f-0da6da484c43 amount: 100 currency: USD reference: 'Transaction #456' charge_bearer: debtor bulk_payment_draft: summary: Payment draft for a bulk payment value: title: Payment Draft Title payments: - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: a15bcac4-dd42-45ed-a828-6806ccc8bb7e account_id: 2bf609f4-9825-4401-b6f7-960c61f8bee0 amount: 10 currency: GBP reference: 'Payment #123' - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: f3107ecc-d368-48f3-8120-92b7d612f949 amount: 120 currency: GBP reference: 'Transaction #654' - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: d4d52566-280b-47df-b34f-0da6da484c43 amount: 100 currency: EUR reference: 'Invoice #789' scheduled_payment_draft: summary: Payment draft for a scheduled payment value: title: Payment Draft Title schedule_for: '2026-06-24' payments: - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: a15bcac4-dd42-45ed-a828-6806ccc8bb7e account_id: 2bf609f4-9825-4401-b6f7-960c61f8bee0 amount: 10 currency: GBP reference: 'Payment #123' scheduled_bulk_payment_draft: summary: Payment draft for a scheduled bulk payment value: title: Payment Draft Title schedule_for: '2026-06-24' payments: - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: a15bcac4-dd42-45ed-a828-6806ccc8bb7e account_id: 2bf609f4-9825-4401-b6f7-960c61f8bee0 amount: 10 currency: GBP reference: 'Payment #123' - account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: d4d52566-280b-47df-b34f-0da6da484c43 amount: 100 currency: EUR reference: 'Invoice #789' responses: '201': description: The ID of the payment draft that was created content: application/json: schema: $ref: '#/components/schemas/CreatePaymentDraftResponse' example: id: e7e54cb2-861a-aaaa-80e9-3e6600f3db10 '204': description: No payments provided '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted, or when the request contains incompatible parameters. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: charge_bearer_bulk_payments: summary: Charge bearer cannot be used with bulk payments value: code: 2101 message: Charge bearer is not supported for bulk payments. charge_bearer_not_eligible: summary: Charge bearer not supported for the given recipient value: code: 3287 message: Recipient not eligible for SWIFT SHA/OUR currency_should_match: summary: Payment currency must match the recipient account currency value: code: 3452 message: Payment draft currency should match with recipient currency [USD] but is [EUR] default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /payment-drafts/{payment_draft_id}: get: summary: Retrieve a payment draft operationId: getPaymentDraft description: |- Get the information about a specific payment draft by ID. Returns drafts created with the API or via the [Revolut Business app](https://business.revolut.com/). The response lists the details of the payment(s) included in the draft, as well as the draft details. For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ tags: - Payment drafts parameters: - name: payment_draft_id in: path required: true description: The ID of the payment draft to retrieve. schema: type: string format: uuid responses: '200': description: The information about a specific payment draft content: application/json: schema: $ref: '#/components/schemas/PaymentDraftResponse' example: title: Draft Payment through API scheduled_for: '2026-06-24' payments: - id: 67b38771-3db0-4cf0-bdc0-aaaa1284ab81 amount: amount: 123 currency: GBP reference: Draft Payment through API account_id: 05018b0d-e67c-4fec-aaaa-415e9da9432c receiver: counterparty_id: c71af44d-aaaa-4e1a-84bb-17589c81f022 state: CREATED current_charge_options: from: amount: 123 currency: GBP to: amount: 123 currency: GBP rate: '1.0000' fee: amount: 0 currency: GBP default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' delete: summary: Delete a payment draft operationId: deletePaymentDraft description: |- Delete a payment draft with the given ID. You can delete a payment draft only if it hasn't been [sent for processing](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts#send-drafts-for-processing). For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ - WRITE tags: - Payment drafts parameters: - name: payment_draft_id in: path required: true description: The ID of the payment draft to delete. schema: type: string format: uuid responses: '204': description: The payment draft was successfully deleted default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' patch: summary: Update a payment draft operationId: updatePaymentDraft description: |- Update the metadata of a payment draft (`title` and/or `schedule_for`). :::note - You can update drafts created with the API or via the Revolut Business app. - The `schedule_for` date must be in the future. ::: All fields are optional — omitting a field leaves it unchanged. For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ - WRITE tags: - Payment drafts parameters: - name: payment_draft_id in: path required: true description: The ID of the payment draft to update. schema: type: string format: uuid requestBody: description: The fields to update on the payment draft. required: true content: application/json: schema: $ref: '#/components/schemas/UpdatePaymentDraftRequest' examples: update_title: summary: Update the draft title value: title: Updated Draft Title update_schedule: summary: Update the scheduled date value: schedule_for: '2026-07-01' update_both: summary: Update both title and scheduled date value: title: Updated Draft Title schedule_for: '2026-07-01' responses: '204': description: The payment draft was successfully updated '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' '404': description: The specified payment draft was not found. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: draft_not_found: summary: Payment draft not found value: code: 3006 message: The specified payment draft was not found '422': description: |- Unprocessable Entity Returned when the payment draft cannot be modified. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: created_by_other_source: summary: Draft created by other source cannot be modified value: code: 3100 message: Payment draft was created via Partner API and cannot be updated already_processed: summary: Draft is already processed value: code: 3417 message: Payment draft is already processed default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /payment-drafts/{payment_draft_id}/payments: post: summary: Add a payment to a payment draft operationId: addPaymentDraftPayment description: |- Add a new payment to an existing payment draft. :::note You can add payments to drafts created with the API or via the Revolut Business app. ::: The payment uses the same shape as the payments in the [create payment draft](#create-payment-draft) request. For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ - WRITE tags: - Payment drafts parameters: - name: payment_draft_id in: path required: true description: The ID of the payment draft to add the payment to. schema: type: string format: uuid requestBody: description: The payment to add to the draft. required: true content: application/json: schema: $ref: '#/components/schemas/PaymentRequest' examples: simple_payment: summary: Add a simple payment to a draft value: account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb receiver: counterparty_id: a15bcac4-dd42-45ed-a828-6806ccc8bb7e account_id: 2bf609f4-9825-4401-b6f7-960c61f8bee0 amount: 50 currency: GBP reference: 'Payment #456' responses: '201': description: The ID of the payment that was added to the draft content: application/json: schema: $ref: '#/components/schemas/CreatePaymentDraftPaymentResponse' example: id: a1b2c3d4-0000-0000-0000-000000000002 '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' '404': description: The specified payment draft was not found. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: draft_not_found: summary: Payment draft not found value: code: 3006 message: The specified payment draft was not found '422': description: |- Unprocessable Entity Returned when the payment draft cannot be modified. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: created_by_other_source: summary: Draft created by other source cannot be modified value: code: 3100 message: Payment draft was created via Partner API and cannot be updated already_processed: summary: Draft is already processed value: code: 3417 message: Payment draft is already processed default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /payment-drafts/{payment_draft_id}/payments/{payment_id}: patch: summary: Update a payment in a payment draft operationId: updatePaymentDraftPayment description: |- Update the fields of a single payment within a payment draft. :::note You can update payments in drafts created with the API or via the Revolut Business app. ::: All fields are optional — omit what should not change. Other payments in the draft are unaffected. For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ - WRITE tags: - Payment drafts parameters: - name: payment_draft_id in: path required: true description: The ID of the payment draft that contains the payment. schema: type: string format: uuid - name: payment_id in: path required: true description: The ID of the payment to update. schema: type: string format: uuid requestBody: description: The fields to update on the payment. required: true content: application/json: schema: $ref: '#/components/schemas/UpdateDraftPaymentRequest' examples: update_amount: summary: Update the payment amount value: amount: 200 update_reference: summary: Update the payment reference value: reference: Updated reference update_receiver: summary: Update the receiver value: receiver: counterparty_id: f3107ecc-d368-48f3-8120-92b7d612f949 responses: '204': description: The payment was successfully updated '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' '404': description: The specified payment draft or payment was not found. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: not_found: summary: Payment draft or payment not found value: code: 3006 message: The specified payment draft or payment was not found '422': description: |- Unprocessable Entity Returned when the payment draft cannot be modified. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: created_by_other_source: summary: Draft created by other source cannot be modified value: code: 3100 message: Payment draft was created via Partner API and cannot be updated already_processed: summary: Draft is already processed value: code: 3417 message: Payment draft is already processed default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' delete: summary: Delete a payment from a payment draft operationId: deletePaymentDraftPayment description: |- Delete a single payment from a payment draft. Other payments in the draft are unaffected. :::note You can delete payments from drafts created with the API or via the Revolut Business app. ::: For more information, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). security: - AccessToken: - READ - WRITE tags: - Payment drafts parameters: - name: payment_draft_id in: path required: true description: The ID of the payment draft that contains the payment. schema: type: string format: uuid - name: payment_id in: path required: true description: The ID of the payment to delete. schema: type: string format: uuid responses: '204': description: The payment was successfully removed from the draft '404': description: The specified payment draft or payment was not found. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: not_found: summary: Payment draft or payment not found value: code: 3006 message: The specified payment draft or payment was not found '422': description: |- Unprocessable Entity Returned when the payment draft cannot be modified. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: created_by_other_source: summary: Draft created by other source cannot be modified value: code: 3100 message: Payment draft was created via Partner API and cannot be updated already_processed: summary: Draft is already processed value: code: 3417 message: Payment draft is already processed default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /payout-links: post: summary: Create a payout link operationId: createPayoutLink description: |- Create a payout link to send money even when you don't have the full banking details of the counterparty. After you have created the link, send it to the recipient so that they can claim the payment. :::note This feature is available in the UK, the EEA, AU, and SG. ::: For more information, see the guides: [Send money via payout link](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payout-links). security: - AccessToken: - PAY - WRITE requestBody: description: Payout link to create required: true content: application/json: schema: $ref: '#/components/schemas/CreatePayoutLinkRequest' responses: '201': description: Created payout link details content: application/json: schema: $ref: '#/components/schemas/PayoutLinkInitialProps' example: id: 12dcd8c2-6408-458f-98a9-3f4abc180898 state: active created_at: '2023-07-11T13:55:54.834963Z' updated_at: '2023-07-11T13:55:55.082655Z' counterparty_name: John Smith request_id: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dd1 expiry_date: '2023-07-18T13:55:55.082280Z' payout_methods: - revolut - bank_account - card account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 105.6 currency: GBP url: https://business.revolut.com/p/uSJVAd5SnP1 reference: Rent transfer_reason_code: property_rental '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' examples: required_param_missing: summary: Required parameter missing value: message: Required 'account_id' is missing code: 3009 incorrect_param_format: summary: Incorrect parameter format value: message: Value '123' is not in correct format for field 'account_id' code: 3000 ivalid_json: summary: Invalid JSON value: message: 'Cannot parse request: invalid JSON' code: 3000 '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' example: message: This action is forbidden code: 9002 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Payout links get: summary: Retrieve a list of payout links description: |- Get all the links that you have created, or use the query parameters to filter the results. The links are sorted by the `created_at` date in reverse chronological order. The returned links are **paginated**. The maximum number of payout links returned per page is specified by the `limit` parameter. To get to the next page, make a new request and use the `created_at` date of the last payout link returned in the previous response. :::note This feature is available in the UK, the EEA, AU, and SG. ::: For more information, see the guides: [Send money via payout link](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payout-links). operationId: getPayoutLinks security: - AccessToken: - READ parameters: - name: state in: query description: |- Retrieves links in the specified state(s). Use for filtering. To specify multiple values, follow this pattern: `state={VALUE1}&state={VALUE2}`. schema: type: array items: $ref: '#/components/schemas/PayoutLinkState' explode: true uniqueItems: true - name: created_before in: query description: |- Retrieves links with `created_at` < `created_before`. The default value is the current date and time at which you are calling the endpoint. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. schema: type: string format: date-time default: the date-time at which the request is made - name: limit in: query description: |- The maximum number of links returned per page. To get to the next page, make a new request and use the `created_at` date of the last payout link returned in the previous response as the value for `created_before`. schema: type: integer minimum: 1 maximum: 1000 default: 100 responses: '200': description: List of your payout links content: application/json: schema: $ref: '#/components/schemas/PayoutLinks' example: - id: 8e32b08a-e012-4530-bd15-c4e9ebde953d state: processed created_at: '2024-01-11T14:02:53.472318Z' updated_at: '2024-01-11T14:05:02.962886Z' counterparty_name: Jane Doe request_id: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dMM expiry_date: '2023-07-18T14:02:53.717626Z' payout_methods: - revolut - bank_account - card account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 5.6 currency: GBP counterparty_id: 2ef4618a-f258-4ac5-a846-ca6e089214f6 transaction_id: 64ad618e-655a-a925-8425-2284c03f6c08 reference: Bus ticket transfer_reason_code: travel - id: 12dcd8c2-6408-458f-98a9-3f4abc180898 state: active created_at: '2023-07-11T13:55:54.834963Z' updated_at: '2023-07-11T14:02:12.868346Z' counterparty_name: John Doe request_id: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dd1 expiry_date: '2023-07-18T13:55:55.082280Z' payout_methods: - revolut - bank_account account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 105.6 currency: GBP url: https://business.revolut.com/p/uSJVAd5SnP1 reference: Rent transfer_reason_code: property_rental - id: d3b02315-044c-471f-ad41-59d9a4e3c538 state: active created_at: '2023-07-11T13:53:45.986248Z' updated_at: '2023-07-11T13:53:46.475470Z' counterparty_name: John Smith request_id: rev-001 expiry_date: '2023-07-18T13:53:46.474777Z' payout_methods: - revolut account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 15.6 currency: GBP url: https://business.revolut.com/p/DPYtd2BUUwP reference: meal delivery '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' examples: forbidden: summary: Action forbidden value: message: This action is forbidden code: 9002 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Payout links /payout-links/{payout_link_id}: get: summary: Retrieve a payout link description: |- Get the information about a specific link by its ID. :::note This feature is available in the UK, the EEA, AU, and SG. ::: For more information, see the guides: [Send money via payout link](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payout-links). operationId: getPayoutLink security: - AccessToken: - READ parameters: - name: payout_link_id in: path required: true description: The ID of the link to retrieve. schema: type: string format: uuid responses: '200': description: The information about a specific link content: application/json: schema: $ref: '#/components/schemas/PayoutLink' examples: active_payout_link: summary: Active payout link value: $ref: '#/components/examples/payoutLinkActive' processed_payout_link: summary: Processed payout link value: $ref: '#/components/examples/payoutLinkProcessed' cancelled_payout_link: summary: Cancelled payout link value: $ref: '#/components/examples/payoutLinkCancelled' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' examples: forbidden: summary: Action forbidden value: message: This action is forbidden code: 9002 '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Resource not found code: 3006 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Payout links /payout-links/{payout_link_id}/cancel: post: summary: Cancel a payout link operationId: cancelPayoutLink description: |- Cancel a payout link. You can only cancel a link that hasn't been claimed yet. A successful request does not get any content in response. :::note This feature is available in the UK, the EEA, AU, and SG. ::: For more information, see the guides: [Send money via payout link](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payout-links). security: - AccessToken: - READ - WRITE parameters: - name: payout_link_id in: path required: true description: The ID of the link to cancel. schema: type: string format: uuid responses: '204': description: Payout link has been cancelled '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' examples: forbidden: summary: Action forbidden value: message: This action is forbidden code: 9002 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Payout links /sandbox/transactions/{id}/{action}: servers: - url: https://sandbox-b2b.revolut.com/api/1.0 description: Sandbox server (uses test data) post: summary: Simulate a transfer state update (Sandbox only) operationId: simulateTransferStateUpdate description: |- Simulate a transfer state change in the Sandbox environment. For example, after you make a transfer in Sandbox, you can change its state to `completed`. The resulting state is final and cannot be changed. For more information, see the guides: [Test your flows with simulations (Sandbox only)](https://developer.revolut.com/docs/guides/manage-accounts/api-usage-and-testing/test-flows-with-simulations). parameters: - name: id in: path schema: type: string format: uuid description: The ID of the transfer whose state you want to update. required: true - name: action in: path schema: type: string enum: - complete - revert - decline - fail description: |- Indicates the transaction state update. Possible values: - `complete` - Transaction is successfully processed. - `revert` - Transaction is reverted by the system or company, but not the user. This can happen for a variety of reasons, for example, the receiver being inaccessible. - `decline` - Transaction is declined to the user for a good reason, such as insufficient account balance, wrong receiver information, etc. - `fail` - Transaction fails during initiation or completion. This can happen for a variety of reasons, for example, invalid API calls, blocked payments, etc. required: true security: - AccessToken: - WRITE responses: '200': description: Information about the updated transfer state content: application/json: schema: type: object properties: id: type: string format: uuid description: The ID of the transfer whose state was updated. state: type: string enum: - completed - reverted - declined - failed description: |- Indicates the simulated transaction state. Possible values: - `completed` - Transaction was successfully processed. - `reverted` - Transaction was reverted by the system or company, but not the user. This can happen for a variety of reasons, for example, the receiver being inaccessible. - `declined` - Transaction was declined to the user for a good reason, such as insufficient account balance, wrong receiver information, etc. - `failed` - Transaction failed during initiation or completion. This can happen for a variety of reasons, for example, invalid API calls, blocked payments, etc. created_at: type: string format: date-time description: The date and time the transfer was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. completed_at: type: string format: date-time description: The date and time the transfer was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. required: - id - state - created_at example: id: a6ea39d7-62c9-481c-8ba6-8a887a44c486 state: completed created_at: '2023-01-23T08:39:35.811005Z' completed_at: '2023-01-23T08:39:35.811005Z' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Simulations /sandbox/topup: servers: - url: https://sandbox-b2b.revolut.com/api/1.0 description: Sandbox server (uses test data) post: summary: Simulate an account top-up (Sandbox only) operationId: simulateTopUp description: |- Simulate a top-up of your account in the Sandbox environment. This is useful during testing, when you run out of money in your test account and need to add more. For more information, see the guides: [Test your flows with simulations (Sandbox only)](https://developer.revolut.com/docs/guides/manage-accounts/api-usage-and-testing/test-flows-with-simulations). requestBody: description: Top-up details required: true content: application/json: schema: type: object properties: account_id: type: string format: uuid description: The ID of the account that you want to top up. amount: type: number format: double description: The amount with which you want to top up the account. maximum: 10000 currency: $ref: '#/components/schemas/Currency' description: The currency of the account that you want to top up. reference: type: string description: A short description for your top up. default: Test Top-up state: type: string description: The state to which you want to set the top-up transaction. enum: - pending - completed - reverted - failed default: completed required: - account_id - amount - currency example: account_id: e042f1fe-f721-49cc-af82-db7a6c46944f amount: 100 currency: GBP reference: Test Top-up state: completed security: - AccessToken: - WRITE responses: '200': description: Information about the top-up state content: application/json: schema: type: object properties: id: type: string format: uuid description: The ID of the account that was topped up. state: type: string description: The state of the top-up transaction. enum: - pending - completed - reverted - failed created_at: type: string format: date-time description: The date and time the transaction was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. completed_at: type: string format: date-time description: The date and time the transaction was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. required: - id - state - created_at example: id: 330953b8-b089-4cfd-9f03-e88173d64248 state: completed created_at: '2023-01-23T08:39:35.811005Z' completed_at: '2023-01-23T08:39:35.811005Z' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Simulations /tax-rates: post: summary: Create a new tax rate operationId: createTaxRate description: |- Add a new tax rate to the list of tax rates that can be applied to your financial records, such as expenses. :::note This operation is not supported for [externally managed tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates#externally-managed-settings). ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates). security: - AccessToken: - WRITE requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateTaxRateRequest' example: name: 20% (VAT on Expenses) percentage: 20 responses: '201': description: |- Resource created On successful creation, the response returns only the ID of the new resource (i.e. the tax rate), even if the resource has more properties. To get all the details of the tax rate, use the returned resource ID with a [GET request](https://developer.revolut.com/docs/api/business#get-tax-rate). $ref: '#/components/responses/ResourceCreatedResponse' '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Required parameter is missing value: error_id: fa12f45e-0ebf-4f7c-88e0-ebb7a1441a18 code: 2101 message: '''percentage'' is required' bad_param_type: summary: Incorrect parameter type value: error_id: 29146977-8042-446f-b362-675e2921d71c code: 2101 message: '''percentage'' must be a number' param_value_too_low: summary: Parameter value too low value: error_id: b5a51cd1-9d0f-4074-adae-af224b14c830 code: 2101 message: '''percentage'' must be at least 0' param_value_too_high: summary: Parameter value too high value: error_id: 89ceb92e-4633-4f78-8d40-42dadc380511 code: 2101 message: '''percentage'' must be at most 100' invalid_json: summary: Invalid JSON value: error_id: df7b76b2-1313-42f0-8c0b-3673c665f135 code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 7acc6073-5290-45f8-8956-c79d487ef1e5 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: '''name'' must be at most 20 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when a tax rate with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 8c08b656-4e57-4768-ab6e-f281da25aa2b code: 3505 message: Tax rate with name My Unique Rate already exists '422': description: |- Unprocessable entity - tax rate cannot be created due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and tax rates are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_modify_externally_managed_resource: summary: Tax rates are managed by integration, cannot be created manually value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Tax rates are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Tax rates get: summary: Retrieve a list of tax rates operationId: getTaxRates description: |- Get available tax rates based on the provided query criteria. :::note The API returns a maximum of 500 tax rates per request. The default page size is 100. ::: The tax rates are sorted by the `created_at` date in reverse chronological order, and they're **paginated**. The page size, that is, the maximum number of tax rates returned per page is specified by the `limit` parameter. - If the number of results exceeds the page size, the response also returns a cursor for the next page under `next_page_token`. To get the next page of results, make a new request using that `next_page_token` value in `page_token`. - If the number of results is smaller than the page size, `next_page_token` is not returned. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates). security: - AccessToken: - READ parameters: - name: limit in: query required: false description: |- The page size, that is, the maximum number of tax rates to return per page. To get the next page of results, use `page_token`. schema: type: integer minimum: 1 maximum: 500 default: 100 example: 10 - $ref: '#/components/parameters/PageToken' responses: '200': description: List of tax rates content: application/json: schema: type: object properties: next_page_token: $ref: '#/components/schemas/PageToken' tax_rates: type: array items: $ref: '#/components/schemas/TaxRateResponse' required: - tax_rates examples: results_with_next_page: summary: Results exceed page size (when limit=5) & next page available value: next_page_token: MjAyNi0wMS0wMVQwOToxMzoxNS40MDZaN2RhNTFjZGY0LTZiYjctNDRkNi04OWU1LTc2OWEzZGYxZDc5ZA tax_rates: - id: f0e1d2c3-b4a5-4678-9012-3456789abcde name: Import Duty Surcharge created_at: '2026-03-19T07:15:00.000000Z' updated_at: '2026-03-19T08:45:22.111444Z' percentage: 12.75 - id: f09ad1ad3-a1c0-4c09-b8f8-24b439e72690 name: 20% (VAT on Expenses) created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' percentage: 20 - id: a1b2c3d4-e5f6-4a5b-bc6d-7e8f9a0b1c2d name: Reduced Rate Food & Beverage created_at: '2026-02-01T08:00:00.000000Z' updated_at: '2026-02-01T08:00:00.000000Z' percentage: 5.5 - id: 5f4e3d2c-1b0a-4987-8765-43210fedcba9 name: Standard Output Tax (High) created_at: '2026-01-15T10:20:30.123456Z' updated_at: '2026-03-10T14:45:12.987654Z' percentage: 20 - id: 98765432-abcd-ef01-2345-67890abcdef0 name: Exempt Financial Services created_at: '2025-12-20T11:11:11.000Z' updated_at: '2026-03-15T09:30:00.555222Z' percentage: 0 results_single_page: summary: Results fit within page size, no more pages available value: tax_rates: - id: 7e6d5c4b-3a2b-1c0d-9e8f-7a6b5c4d3e2f name: Luxury Goods Tax created_at: '2026-03-23T14:30:00.000000Z' updated_at: '2026-03-23T14:30:00.000000Z' percentage: 25 - id: 8a7b6c5d-4e3f-2g1h-0i9j-8k7l6m5n4o3p name: Environmental Levy created_at: '2026-03-22T09:15:22.000000Z' updated_at: '2026-03-22T10:00:00.000000Z' percentage: 3.5 - id: 1f2e3d4c-5b6a-7988-7766-554433221100 name: Digital Services Tax created_at: '2026-03-21T11:45:00.000000Z' updated_at: '2026-03-21T11:45:00.000000Z' percentage: 7 '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_type: summary: Incorrect query parameter type value: error_id: 29146977-8042-446f-b362-af224b14c830 code: 2101 message: Query parameter 'limit' must be an integer param_value_too_low: summary: Query parameter value too low value: error_id: b5a51cd1-9d0f-4074-adae-675e2921d71c code: 2101 message: Query parameter 'limit' must be at least 1 param_value_too_high: summary: Query parameter value too high value: error_id: fa12f45e-4633-4f78-8d40-42dadc380511 code: 2101 message: Query parameter 'limit' must be at most 500 multiple_values_not_allowed: summary: Multiple values provided for a single-value query parameter value: error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7 code: 2101 message: Query parameter 'limit' must have a single value param_cannot_be_empty: summary: Query parameter provided without a value value: error_id: fa12f45e-0ebf-4f7c-88e0-3673c665f135 code: 2101 message: Query parameter 'limit' must not be empty '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Tax rates /tax-rates/{tax_rate_id}: get: summary: Retrieve tax rate details operationId: getTaxRate description: |- Get the details of a specific tax rate based on the tax rate ID. The details include the tax rate name and percentage, as well as when the tax rate was added to your settings, and when it was last updated. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates). security: - AccessToken: - READ parameters: - name: tax_rate_id in: path description: The ID of the tax rate to retrieve. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 responses: '200': description: Tax rate details content: application/json: schema: $ref: '#/components/schemas/TaxRateResponse' example: id: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 name: 20% (VAT on Expenses) created_at: '2026-03-11T10:33:51.121090Z' updated_at: '2026-03-11T10:33:51.121090Z' percentage: 20 '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_format: summary: Incorrect path parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the tax rate that you're trying to retrieve cannot be found. This can happen, for example, when the tax rate has been deleted, or the provided tax rate ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: cbb15721-5f51-4588-a959-7494bb7ba827 code: 3006 message: Tax rate with id 8945879d-6854-4e10-88d6-ce92c5f010ac not found '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Tax rates patch: summary: Update tax rate settings operationId: updateTaxRate description: |- Update settings for a specific tax rate, based on its ID. :::note This operation is not supported for [externally managed tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates#externally-managed-settings). ::: For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates). security: - AccessToken: - WRITE parameters: - name: tax_rate_id in: path description: The ID of the tax rate to update. required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateTaxRateRequest' example: name: 20% VAT responses: '204': description: Tax rate updated '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: param_required: summary: Body is empty value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 2101 message: Request body must not be empty bad_param_format: summary: Incorrect parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID invalid_json: summary: Invalid JSON value: error_id: 36f3cec5-b4b9-431f-9c28-afd3899bc64f code: 2101 message: Request body is not valid JSON param_value_too_short: summary: Parameter value too short value: error_id: 32fd0697-2f3f-4308-b25d-c9230f99c589 code: 2101 message: '''name'' must be at least 1 character' param_value_too_long: summary: Parameter value too long value: error_id: d8d919b5-d667-4058-9bb3-17b6f7bcd6c8 code: 2101 message: '''name'' must be at most 20 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the tax rate that you're trying to update cannot be found. This can happen, for example, when the tax rate doesn't exist, or the provided tax rate ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ca73d8a4-a5cb-4f03-9a95-4d53aa1731b0 code: 3006 message: Tax rate with id be6c9d90-df25-458a-b559-be61896c94b8 not found '409': description: |- Conflict Request conflicts with the current state of the resource. Returned, for example, when a tax rate with the provided name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 8c08b656-4e57-4768-ab6e-f281da25aa2b code: 3505 message: Tax rate with name My Unique Rate already exists '422': description: |- Unprocessable entity - tax rate cannot be updated due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and tax rates are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_update_externally_managed_resource: summary: Tax rate managed by integration, cannot be updated value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Tax rates are managed by your connected accounting integration and cannot be modified manually state_mismatch: summary: Tax rate is no longer available value: error_id: f1059c4b-4278-45d3-a17f-bd433ab33c15 code: 3100 message: Invalid request '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Tax rates delete: summary: Delete a tax rate operationId: deleteTaxRate description: |- Delete a specific tax rate, based on its ID. :::note This operation is not supported for [externally managed tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates#externally-managed-settings). ::: Once the tax rate is deleted, it will not be returned by the API or in the Revolut Business app, and: - You will not be able to apply it to new financial records (e.g. expenses). - Existing records with this tax rate that have not been completed will be marked as invalid, and you'll need to update them to use a different tax rate. - Completed records will not be affected by the change. A successful response does not get any content in return. For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates). security: - AccessToken: - WRITE parameters: - name: tax_rate_id description: The ID of the tax rate to delete. in: path required: true schema: type: string format: uuid example: 09ad1ad3-a1c0-4c09-b8f8-24b439e72690 responses: '204': description: Tax rate deleted '400': description: |- Bad Request Returned, for example, when a required parameter is missing or malformatted. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: bad_param_format: summary: Incorrect path parameter format value: error_id: f70973ea-c939-41f8-a106-1656ab5fae2f code: 2101 message: Path parameter 'id' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the tax rate that you're trying to delete cannot be found. This can happen, for example, when the tax rate doesn't exist, or the provided tax rate ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ca73d8a4-a5cb-4f03-9a95-4d53aa1731b0 code: 3006 message: Tax rate with id be6c9d90-df25-458a-b559-be61896c94b8 not found '422': description: |- Unprocessable entity - tax rate cannot be deleted due to business rules Returned, for example, when you have an accounting software integration connected to your Revolut Business account, and tax rates are managed by that integration. The request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it. Retrying the same request won't succeed. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_delete_externally_managed_resource: summary: Tax rate managed by integration, cannot be deleted value: error_id: e950c41e-cfd6-4e04-bd79-2d57a3951774 code: 3514 message: Tax rates are managed by your connected accounting integration and cannot be modified manually '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' '503': $ref: '#/components/responses/ServiceUnavailable' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Accounting - Tax rates /team-members: get: summary: Retrieve a list of team members operationId: getTeamMembers description: |- Get information about all the team members of your business. The results are paginated and sorted by the `created_at` date in reverse chronological order. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - READ tags: - Teams parameters: - in: query name: created_before schema: type: string format: date-time default: the date-time at which the request is made description: |- Retrieves team members with `created_at` < `created_before`. The default value is the current date and time at which you are calling the endpoint. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. - name: limit in: query required: false description: |- The maximum number of team members returned per page. To get to the next page, make a new request and use the `created_at` date of the last team member returned in the previous response as the value for `created_before`. schema: type: number format: integer default: 100 maximum: 1000 minimum: 1 responses: '200': description: Information about team members of the business content: application/json: schema: type: array items: $ref: '#/components/schemas/TeamMember' example: - email: john.doe@example.com id: 76969b71-a123-42dc-b874-a34688d7bba4 role_id: owner state: active first_name: John last_name: Doe created_at: '2022-09-07T09:19:31.592368Z' updated_at: '2022-09-07T09:21:24.346670Z' - email: john.smith@example.com id: 168922e1-594f-4ca0-93b2-56b742f3936b role_id: 024abb3d-06da-4701-9254-dfcc3da38385 state: active created_at: '2022-09-07T09:19:32.592368Z' updated_at: '2022-09-07T09:21:25.346670Z' department_id: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c manager_id: 76969b71-a123-42dc-b874-a34688d7bba4 '400': description: Bad pagination parameters content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a code: 2101 message: 'Parameter limit must be a valid integer in range: [1, 1000]' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' post: summary: Invite a new member to your business operationId: inviteTeamMember description: |- Invite a new member to your business account. When you invite a new team member to your business account, an invitation is sent to their email address that you provided in this request. To join your business account, the new team member has to accept this invitation. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: The email address of the invited member. format: email role_id: type: string description: The ID of the [role](https://developer.revolut.com/docs/api/business#get-roles) to assign to the new member. required: - email - role_id example: email: john.smith@example.com role_id: 0098ac28-b92f-435e-a3a2-2829d3918dfb responses: '201': description: Information about the new member content: application/json: schema: type: object properties: email: type: string description: The email address of the invited member. format: email id: type: string description: The ID of the invited member. role_id: type: string description: The ID of the [role](https://developer.revolut.com/docs/api/business#get-roles) assigned to the member. created_at: type: string format: date-time description: The date and time when the member was created. updated_at: type: string format: date-time description: The date and time when the member was last updated. required: - email - id - role_id - created_at - updated_at example: email: john.smith@example.com id: 76969b71-a123-42dc-b874-a34688d7bba4 role_id: 0098ac28-b92f-435e-a3a2-2829d3918dfb created_at: '2022-09-07T09:19:31.592368Z' updated_at: '2022-09-07T09:21:24.346670Z' '400': description: Bad request, for example, invalid role ID or invalid email address provided content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: invalid_role_id_uuid: summary: Invalid role ID (UUID) value: error_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 code: 3053 message: Business role 0098ac28-b92f-435e-a3a2-2829d3918dfb not found invalid_role_id_default: summary: Invalid role ID (non-UUID) value: error_id: b2c3d4e5-f6a7-8901-bcde-f12345678901 code: 3402 message: 'Invalid role: nonexistent_role_id' invalid_email: summary: Invalid email address value: error_id: c3d4e5f6-a7b8-9012-cdef-123456789012 code: 3000 message: 'Invalid email address: (masked) ****.*******.*******.***' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '422': description: Team member with the given email cannot be invited content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: user_already_invited: summary: Team member already invited value: error_id: 6a577522-c02c-a59b-b43f-2169bf4feb21 code: 33005 message: Team member with given email has already been invited user_is_member_of_another_business: summary: Team member cannot be invited value: error_id: 7b688633-d13d-b6ac-c543-3270a050fc32 code: 33008 message: Team member with given email cannot be invited default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /team-members/{team_member_id}: get: summary: Retrieve a team member operationId: getTeamMemberById description: |- Get information about a specific team member by their ID. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - READ tags: - Teams parameters: - name: team_member_id description: The ID of the team member to retrieve. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 responses: '200': description: Team member details content: application/json: schema: $ref: '#/components/schemas/TeamMember' example: id: 76969b71-a123-42dc-b874-a34688d7bba4 email: dana.white@example.com role_id: admin state: active created_at: '2026-07-02T12:01:37.605141Z' updated_at: '2026-07-02T12:06:29.234986Z' first_name: Dana last_name: White '400': description: Invalid path parameter content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 6a5e4243-6a9c-a966-9800-06a73f092fc7 code: 2101 message: Path parameter 'teamMemberId' must be a valid UUID '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member doesn't exist. This can happen when, for example, the team member has been deleted, or the provided team member ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 2601eb7c-6569-42b0-8dc1-dac520229a19 code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' delete: summary: Delete a team member operationId: deleteTeamMember description: |- Delete a specific member of your team. :::note This action does not delete the person’s Revolut Business user account – it only removes them from your team. They will lose access to your Revolut Business account and team but can still log in to Revolut Business. Their user account will remain linked to any other teams and accounts it’s associated with. ::: For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to delete. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 responses: '204': description: Team member was deleted '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to delete doesn't exist. This can happen when, for example, the team member has already been deleted, or the provided team member ID is incorrect. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 2601eb7c-6569-42b0-8dc1-dac520229a19 code: 3006 message: 'User not found: 76969b71-a123-42dc-b874-a34688d7bba4' '422': description: Cannot modify owner content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 86d3f68c-2086-403f-8a73-cf6efb0cecd7 code: 3547 message: Cannot modify owner default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /team-members/{team_member_id}/department: put: summary: Assign a department to a team member operationId: assignDepartment description: |- Assign a department to a specific team member. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members) and [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to assign the department to. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 requestBody: required: true content: application/json: schema: type: object properties: department_id: type: string format: uuid description: The ID of the department to assign to the team member. required: - department_id example: department_id: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c responses: '204': description: Department was assigned to the team member. '400': description: |- Bad request Returned when the specified department does not exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: f3ef4ce5-9248-4918-97c3-df576a2bec1d code: 2101 message: Department with id 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c not found '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to update doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 2601eb7c-6569-42b0-8dc1-dac520229a19 code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' delete: summary: Remove department from a team member operationId: unassignDepartment description: |- Remove the department assignment from a specific team member. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to remove the department from. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 responses: '204': description: Department was unassigned from the team member. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to update doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 2601eb7c-6569-42b0-8dc1-dac520229a19 code: 3006 message: Team member with id d1199d76-572f-4837-8a0b-5d527a97934b not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /team-members/{team_member_id}/manager: put: summary: Assign a manager to a team member operationId: assignManager description: |- Assign a manager to a specific team member. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to assign the manager to. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 requestBody: required: true content: application/json: schema: type: object properties: manager_id: type: string format: uuid description: The ID of the manager to assign to the team member. required: - manager_id example: manager_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 responses: '204': description: Manager was assigned to the team member. '400': description: |- Bad request Returned when the specified manager does not exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: e353844c-cde2-4dd6-94a4-13fab4f0d2b7 code: 2101 message: Manager with id a1b2c3d4-e5f6-7890-abcd-ef1234567890 not found '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to update doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: dc32fe7f-4118-4f91-bbfc-7f756195b71d code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' delete: summary: Remove manager from a team member operationId: unassignManager description: |- Remove the manager assignment from a specific team member. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to remove the manager from. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 responses: '204': description: Manager was unassigned from the team member. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to update doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 816b404e-9ccb-456d-a087-68e060031d74 code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /team-members/{team_member_id}/role: put: summary: Update a team member's role operationId: updateTeamMemberRole description: |- Update the role assigned to a specific team member. :::note You cannot modify the business owner or assign the owner role to another team member. ::: For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member whose role to update. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 requestBody: required: true content: application/json: schema: type: object properties: role_id: type: string maxLength: 40 description: |- The ID of the role to assign to the team member. For default roles (such as `Owner`, `Admin`, `Member`), the ID is the same as the role name. For custom roles, use the UUID returned by the [`GET /roles` operation](#get-roles). required: - role_id example: role_id: a40b6121-350b-4d2e-9ba1-9dab61a18d46 responses: '204': description: Role was updated. '400': description: |- Bad request Returned when the specified role ID does not exist or does not belong to this business. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 87524a16-6cb3-4f76-9535-133ebfc68134 code: 2101 message: Role with id a40b6121-350b-4d2e-9ba1-9dab61a18d46 not found '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to update doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: f4df1fa0-9582-44f1-bd07-d63ef2cce9a7 code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found '422': description: |- Cannot modify owner Returned when you're trying to modify the business owner or assign the owner role to another team member. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 86d3f68c-2086-403f-8a73-cf6efb0cecd7 code: 3547 message: Cannot modify owner default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /team-members/{team_member_id}/suspend: post: summary: Suspend a team member operationId: suspendTeamMember description: |- Suspend a specific team member, preventing them from accessing the business. To restore access, use the [Unsuspend a team member](#unsuspend-a-team-member) operation. :::note You cannot suspend the business owner. ::: For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to suspend. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 responses: '204': description: Team member was suspended. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to suspend doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 0d493577-2918-4de0-8484-414d87ed7c17 code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found '422': description: |- Unprocessable entity Returned when: - You're trying to suspend the business owner. - The team member has a pending invitation (they haven't accepted it yet). content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_suspend_owner: summary: Cannot suspend owner value: error_id: 5e830574-32db-4854-b17d-7c3fbc2db11d code: 3547 message: Cannot modify owner member_pending_invitation: summary: Member has a pending invitation value: error_id: 7a1e2f3b-4c5d-6e7f-8a9b-0c1d2e3f4a5b code: 3100 message: Invalid request default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /team-members/{team_member_id}/unsuspend: post: summary: Unsuspend a team member operationId: unsuspendTeamMember description: |- Unsuspend a [suspended](#suspend-a-team-member) team member, restoring their access to the business. :::note You cannot unsuspend the business owner (the owner cannot be suspended). ::: For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - WRITE tags: - Teams parameters: - name: team_member_id description: The ID of the team member to unsuspend. in: path required: true schema: type: string format: uuid example: 76969b71-a123-42dc-b874-a34688d7bba4 responses: '204': description: Team member was unsuspended. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the team member that you're trying to unsuspend doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 4686c3a2-8b42-42a3-b6d8-23448696b36b code: 3006 message: Team member with id 76969b71-a123-42dc-b874-a34688d7bba4 not found '422': description: |- Unprocessable entity Returned when: - You're trying to unsuspend the business owner (the owner cannot be suspended). - The team member has a pending invitation (they haven't accepted it yet). content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: cannot_unsuspend_owner: summary: Cannot unsuspend owner value: error_id: 89030a00-0aaf-4f8e-b578-f1ca62062c08 code: 3547 message: Cannot modify owner member_pending_invitation: summary: Member has a pending invitation value: error_id: 9b2f3g4c-5d6e-7f8a-9b0c-1d2e3f4a5b6c code: 3100 message: Invalid request default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /roles: get: summary: Retrieve team roles operationId: getRoles description: |- Get the list of roles for your business. The results are paginated and sorted by the `created_at` date in reverse chronological order. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members). security: - AccessToken: - READ tags: - Teams parameters: - in: query name: created_before schema: type: string format: date-time default: the date-time at which the request is made description: |- Retrieves roles with `created_at` < `created_before`. The default value is the current date and time at which you are calling the endpoint. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. - name: limit in: query required: false description: |- The maximum number of roles returned per page. To get to the next page, make a new request and use the `created_at` date of the last role returned in the previous response as the value for `created_before`. schema: type: number format: integer default: 100 maximum: 1000 minimum: 1 responses: '200': description: Information about roles of the business content: application/json: schema: type: array items: $ref: '#/components/schemas/Role' example: - id: owner name: Owner created_at: '2023-09-07T09:21:12.962303Z' updated_at: '2023-09-07T09:21:12.962303Z' - id: member name: Member created_at: '2023-09-07T09:21:12.962303Z' updated_at: '2023-09-07T09:21:12.962303Z' - id: viewer name: Viewer created_at: '2023-09-07T09:21:12.962303Z' updated_at: '2023-09-07T09:21:12.962303Z' - id: a40b6121-350b-4d2e-9ba1-9dab61a18d46 name: Example custom role created_at: '2023-09-07T09:21:12.963143Z' updated_at: '2023-09-07T09:21:12.963143Z' '400': description: Bad pagination parameters content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: ec4bef87-0141-4b5e-aca8-724988661e0e code: 2101 message: Query parameter 'limit' must be at most 1000 '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /departments: post: summary: Create a department operationId: createDepartment description: |- Create a new department in your business. For more information, see the guides: [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). security: - AccessToken: - WRITE tags: - Teams requestBody: required: true content: application/json: schema: type: object properties: name: type: string maxLength: 100 description: The name of the department. required: - name example: name: Engineering responses: '201': description: Department created. content: application/json: schema: type: object properties: id: type: string format: uuid description: The ID of the created department. required: - id example: id: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c '400': description: |- Bad request Returned when the request body is invalid. For example, when the `name` field is missing or exceeds 100 characters. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: name_missing: summary: Name is required value: error_id: aa1c8231-f10a-4256-93b6-f540ef6eba01 code: 2101 message: '''name'' is required' name_too_long: summary: Name exceeds 100 characters value: error_id: b8f2a103-2c34-4d5e-9f6a-7b8c9d0e1f2a code: 2101 message: '''name'' must be at most 100 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '409': description: |- Conflict Returned when a department with the given name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 46a05085-ac3f-4a0c-bf37-204c0d645bde code: 3406 message: Department with this name already exists default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' get: summary: Retrieve a list of departments operationId: getDepartments description: |- Get a paginated list of all departments in your business. For more information, see the guides: [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). security: - AccessToken: - READ tags: - Teams parameters: - name: limit in: query required: false description: |- The maximum number of departments returned per page. To get to the next page, use the `next_page_token` from the previous response. schema: type: number format: integer default: 100 maximum: 500 minimum: 1 - $ref: '#/components/parameters/PageToken' responses: '200': description: A paginated list of departments. content: application/json: schema: type: object properties: departments: type: array items: $ref: '#/components/schemas/Department' next_page_token: type: string description: |- Token to fetch the next page. Omitted when there are no more results. required: - departments example: departments: - id: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c name: Engineering created_at: '2026-06-15T10:30:00.000000Z' updated_at: '2026-06-15T10:30:00.000000Z' - id: c4d5e6f7-8a9b-0c1d-2e3f-4a5b6c7d8e9f name: Finance created_at: '2026-06-15T10:31:00.000000Z' updated_at: '2026-06-15T10:31:00.000000Z' next_page_token: eyJwYWdlIjoyfQ '400': description: |- Bad pagination parameters Returned when the pagination parameters are invalid. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: limit_not_integer: summary: Limit is not an integer value: error_id: c2b74bf6-56b6-4d3d-92b3-0d2c5642be39 code: 2101 message: Query parameter 'limit' must be an integer limit_exceeds_max: summary: Limit exceeds maximum value: error_id: d3c85c07-67c7-5e4e-a3c4-1e3d67543cf5 code: 2101 message: Query parameter 'limit' must be at most 500 invalid_page_token: summary: Invalid page token value: error_id: e4d96d18-78d8-6f5f-b4d5-2f4e78654da6 code: 2101 message: Query parameter 'page_token' is invalid. Use a value from a previous response's next_page_token field. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /departments/{department_id}: get: summary: Retrieve a department operationId: getDepartment description: |- Get details of a specific department by its ID. For more information, see the guides: [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). security: - AccessToken: - READ tags: - Teams parameters: - name: department_id description: The ID of the department to retrieve. in: path required: true schema: type: string format: uuid example: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c responses: '200': description: Information about the department. content: application/json: schema: $ref: '#/components/schemas/Department' example: id: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c name: Engineering created_at: '2026-06-15T10:30:00.000000Z' updated_at: '2026-06-15T10:30:00.000000Z' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the department that you're trying to retrieve doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: d5d7a8a7-d967-4a69-8359-892b1ce22157 code: 3006 message: Department with id 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' patch: summary: Update a department operationId: updateDepartment description: |- Update the name of a specific department. For more information, see the guides: [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). security: - AccessToken: - WRITE tags: - Teams parameters: - name: department_id description: The ID of the department to update. in: path required: true schema: type: string format: uuid example: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c requestBody: required: true content: application/json: schema: type: object properties: name: type: string maxLength: 100 description: The new name for the department. required: - name example: name: Platform Engineering responses: '204': description: Department was updated. '400': description: |- Bad request Returned when the request body is invalid. For example, when the `name` field is missing or exceeds 100 characters. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: name_missing: summary: Name is required value: error_id: c9d3b204-3d45-4e6f-0a7b-8c9d0e1f2a3b code: 2101 message: '''name'' is required' name_too_long: summary: Name exceeds 100 characters value: error_id: d0e4c305-4e56-4f7a-1b8c-9d0e1f2a3b4c code: 2101 message: '''name'' must be at most 100 characters' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the department that you're trying to update doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 994fcef2-cb26-4c6a-8f2f-d784d9cf5097 code: 3006 message: Department with id 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c not found '409': description: |- Conflict Returned when a department with the given name already exists. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 0ce741cc-48e5-43ae-aada-44aa07f44e67 code: 3406 message: Department with this name already exists default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' delete: summary: Delete a department operationId: deleteDepartment description: |- Delete a specific department from your business. :::note Deleting a department does not delete the team members assigned to it. The department assignment is simply removed from the team members. ::: For more information, see the guides: [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). security: - AccessToken: - WRITE tags: - Teams parameters: - name: department_id description: The ID of the department to delete. in: path required: true schema: type: string format: uuid example: 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c responses: '204': description: Department was deleted. '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': description: |- Not found Returned when the department that you're trying to delete doesn't exist. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: f3b8f47d-2e34-4205-a5fb-64d219ba13d6 code: 3006 message: Department with id 9b3f7a2c-1d4e-4f5b-8a6c-7d8e9f0a1b2c not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' /transactions: get: summary: Retrieve a list of transactions operationId: getTransactions description: |- Retrieve the historical transactions based on the provided query criteria. The transactions are sorted by the `created_at` date in reverse chronological order, and they're **paginated**. The maximum number of transactions returned per page is specified by the `count` parameter. To get the next page of results, make a new request and use the `created_at` date from the last item of the previous page as the value for the `to` parameter. :::note The API returns a maximum of 1,000 transactions per request. ::: For more details, see the guides: [Retrieve transactions](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-transactions). security: - AccessToken: - READ parameters: - in: query name: from schema: type: string format: date-time or date description: |- The date and time you retrieve the historical transactions from, including this date-time. Corresponds to the `created_at` value of the transaction. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Used also for pagination. To get back to the previous page of results, make a new request and use the `created_at` date from the first item of the current page as the value for the `from` parameter. - in: query name: to schema: type: string format: date-time or date default: the date-time at which the request is made description: |- The date and time you retrieve the historical transactions to, excluding this date-time. Corresponds to the `created_at` value of the transaction. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. The default value is the date and time at which you're calling the endpoint. Used also for pagination. To get the next page of results, make a new request and use the `created_at` date from the last item of the previous (current) page as the value for the `to` parameter. - in: query name: account schema: type: string format: uuid description: The ID of the account - in: query name: count schema: type: integer default: 100 maximum: 1000 description: |- The maximum number of the historical transactions to retrieve per page. To get the next page of results, make a new request and use the `created_at` date from the last item of the previous page as the value for the `to` parameter. - in: query name: type schema: $ref: '#/components/schemas/TransactionType' description: The type of the historical transactions to retrieve. - in: query name: request_id schema: type: string example: invoice00912345 description: |- The request ID provided when the transaction was created. Lets you filter transactions related to that ID. When provided, the `from` query parameter is also required, and the search interval must not exceed 14 days. For older transactions, adjust the `to` parameter as well. - in: query name: state schema: type: array items: type: string enum: - created - pending - completed - declined - failed - reverted description: |- The transaction [state(s)](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-transactions#transaction-states) to filter by. To specify multiple values, follow this pattern: `state={VALUE1}&state={VALUE2}`. responses: '200': description: List of historical transactions retrieved content: application/json: schema: $ref: '#/components/schemas/Transactions' example: - id: 630f9890-95e3-add1-be4a-95f126988221 type: transfer state: pending request_id: invoice00912345 created_at: '2024-08-31T17:21:20.364171Z' updated_at: '2024-08-31T17:21:20.364171Z' reference: invoice00912345 legs: - leg_id: 630f9890-95e3-add1-0000-95f1269f0000 account_id: 812fff9a-3b0c-4ad1-b41a-cc60899d9900 counterparty: account_type: revolut account_id: e0af9f24-504c-4c5d-bd1d-07edf9f49876 amount: -1.16 currency: EUR bill_amount: -1 bill_currency: GBP description: To John Doe - id: 640c2b97-aaaa-1234-aaaa-c47a165c2e7e type: card_payment state: completed request_id: REVP:8988a9a0-aaaa-1234-aaaa-5bcc66d938bf created_at: '2024-03-11T07:19:51.302559Z' updated_at: '2024-03-12T02:13:36.842322Z' completed_at: '2024-03-12T02:13:36.836595Z' merchant: name: Acme Corp. full_name: ACME*1234MN1HA2 city: New York category_code: '7311' country: USA legs: - leg_id: 640c2b97-aaaa-1234-aaaa-c47a165c2e7e account_id: 92e43866-aaaa-1234-aaaa-6e31dd23f024 amount: -47.8 fee: 0.66 currency: AED bill_amount: -13 bill_currency: USD description: Acm *1234mn1ha2 balance: 7.74 card: id: 2b1a31bc-4795-4f95-b939-ae9cf911dc6e card_number: 516760******1234 first_name: John last_name: Smith phone: '+12412341234' auth_code: '224466' - id: 6886001b-c4a4-4920-912b-c9d7d2575bf7 type: card_payment state: completed request_id: REVP:5b3dc80d-f77b-4073-b245-d05f0acd348f created_at: '2025-09-11T07:19:51.302559Z' updated_at: '2025-09-12T02:13:36.842322Z' completed_at: '2025-03-12T02:13:36.836595Z' merchant: name: Alfa city: Paris category_code: '7311' country: FRA legs: - leg_id: 0e82681d-10db-40b7-b6c8-f99c595f1c82 account_id: 5e85a129-74c9-4714-bbd2-d762b42b15fb amount: -153.32 fee: 0 currency: EUR description: Al 1234abcxyz0 balance: 3210.43 card: id: 12d6d4c2-288b-4670-8297-444720bd811b card_number: 456230******1433 references: - name: PNR value: RT12345 - name: Traveller value: John Smith auth_code: '224466' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Transactions /transaction/{id}: get: summary: Retrieve a transaction operationId: getTransaction description: |- Retrieve the details of a specific transaction by the transaction's ID. The details can include, for example, cardholder details for card payments. :::tip [Retrieve by request_id instead] Alternatively, you can retrieve a transaction by the **request ID** that was provided for this transaction at the time of its creation, for example, when you [created a payment](https://developer.revolut.com/docs/api/business#create-payment). To do that, use the `GET /transactions` endpoint to [retrieve a list of transactions](https://developer.revolut.com/docs/api/business#get-transactions) and provide the `request_id` and appropriate `from`/`to` values as filters. ::: For more details, see the guides: [Retrieve transactions](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-transactions). security: - AccessToken: - READ parameters: - name: id in: path required: true description: |- The unique ID of the transaction. :::warning [Request ID deprecation] If `id_type=request_id` is provided, set this field to the request ID from payment creation instead of the transaction ID. This behavior is deprecated and will be removed in a future release. Use [`GET /transactions`](https://developer.revolut.com/docs/api/business#get-transactions) to retrieve transactions by request ID. ::: schema: type: string - name: id_type in: query required: false deprecated: true description: |- The type of ID to retrieve the transaction by. :::warning [Deprecated] This field is now deprecated and will be removed in a future release. To retrieve transactions by their unique transaction ID, use this endpoint. To retrieve transactions by request ID, use the [`GET /transactions`](https://developer.revolut.com/docs/api/business#get-transactions) endpoint instead. ::: schema: enum: - request_id type: string responses: '200': description: The information about a specific transaction content: application/json: schema: $ref: '#/components/schemas/Transaction' examples: exchange: summary: Exchange value: id: 640dc0b7-1234-aaaa-1234-92ac4de1dacd type: exchange state: completed request_id: d8f041ab-1234-aaaa-1234-78b6a0b2801f created_at: '2023-03-12T12:08:07.833414Z' updated_at: '2023-03-12T12:08:07.833414Z' completed_at: '2023-03-12T12:08:07.833705Z' legs: - leg_id: 640dc0a7-aaaa-a5b5-aaaa-92ac4de1dacd account_id: 0d1848dc-aaaa-4a9a-aaaa-cae53cbd4baf amount: -1 currency: GBP bill_amount: -8.39 bill_currency: DKK description: Exchanged to DKK balance: 8.74 - leg_id: 640dc0a7-aaaa-a5b5-aaaa-92ac4de1dacd account_id: 246bc9de-aaaa-4f86-aaaa-4d291a5d0390 amount: 8.39 fee: 0.08 currency: DKK description: Exchanged from GBP Main balance: 19.33 card_payment: summary: Card payment value: id: 640c2b97-aaaa-1234-aaaa-c47a165c2e7e type: card_payment state: completed request_id: REVP:8988a9a0-aaaa-1234-aaaa-5bcc66d938bf created_at: '2023-03-11T07:19:51.302559Z' updated_at: '2023-03-12T02:13:36.842322Z' completed_at: '2023-03-12T02:13:36.836595Z' merchant: name: Acme Corp. full_name: ACME*1234MN1HA2 city: New York category_code: '7311' country: USA legs: - leg_id: 640c2b97-aaaa-1234-aaaa-c47a165c2e7e account_id: 92e43866-aaaa-1234-aaaa-6e31dd23f024 amount: -47.8 fee: 0.66 currency: AED bill_amount: -13 bill_currency: USD description: Acm *1234mn1ha2 balance: 7.74 card: id: 2b1a31bc-4795-4f95-b939-ae9cf911dc6e card_number: 516760******1234 first_name: John last_name: Smith phone: '+12412341234' auth_code: '224466' company_card_payment: summary: Payment by card with no holder value: id: 6886001b-c4a4-4920-912b-c9d7d2575bf7 type: card_payment state: completed request_id: REVP:5b3dc80d-f77b-4073-b245-d05f0acd348f created_at: '2025-09-11T07:19:51.302559Z' updated_at: '2025-09-12T02:13:36.842322Z' completed_at: '2025-03-12T02:13:36.836595Z' merchant: name: Alfa city: Paris category_code: '7311' country: FRA legs: - leg_id: 0e82681d-10db-40b7-b6c8-f99c595f1c82 account_id: 5e85a129-74c9-4714-bbd2-d762b42b15fb amount: -153.32 fee: 0 currency: EUR description: Al 1234abcxyz0 balance: 3210.43 card: id: 12d6d4c2-288b-4670-8297-444720bd811b card_number: 456230******1433 references: - name: PNR value: RT12345 - name: Traveller value: John Smith auth_code: '224466' outbound_transfer: summary: Outbound transfer value: id: 640c1963-aaaa-1234-aaaa-a6b451197c6a type: transfer state: completed request_id: 8cc6f5db-aaaa-1234-aaaa-068a05af424e created_at: '2023-03-11T06:02:11.785704Z' updated_at: '2023-03-11T06:02:14.628964Z' completed_at: '2023-03-11T06:02:14.624946Z' reference: Reference example legs: - leg_id: 640c1963-aaaa-1234-aaaa-a6b451197c6a account_id: 0d1848dc-aaaa-1234-aaaa-cae53cbd4baf counterparty: id: f5a9a06b-aaaa-1234-aaaa-c51df843e30d account_type: external account_id: 25c9d813-aaaa-1234-aaaa-28334fc4d133 amount: -100 fee: 0.1 currency: GBP description: To John Smith balance: 9.74 inbound_transfer: summary: Inbound transfer value: id: 63f3a305-aaaa-1234-aaaa-54f06420ae58 type: transfer state: completed request_id: 7d3a3358-aaaa-1234-aaaa-c332c49b6431 created_at: '2023-02-20T16:42:45.897576Z' updated_at: '2023-02-20T16:42:45.897576Z' completed_at: '2023-02-20T16:42:45.897845Z' reference: Reference 1234 legs: - leg_id: 63f3a305-aaaa-1234-aaaa-54f06420ae58 account_id: 74d4d6cb-aaaa-1234-aaaa-9604b94e3019 counterparty: account_type: revolut amount: 10 currency: GBP description: From JOHN SMITH balance: 3.7 internal_transfer: summary: Internal transfer value: id: 640b4fbf-aaaa-1234-aaaa-17a2d10142af type: transfer state: completed request_id: f8bbea44-aaaa-1234-aaaa-113df56660f7 created_at: '2023-03-10T15:41:51.304765Z' updated_at: '2023-03-10T15:41:51.395348Z' completed_at: '2023-03-10T15:41:51.388279Z' legs: - leg_id: 640b4fbf-aaaa-1234-aaaa-17a2d10142af account_id: 0d1848dc-aaaa-1234-aaaa-cae53cbd4baf amount: 100 currency: GBP description: To GBP Deposit pocket balance: 100.84 - leg_id: 640b4fbf-aaaa-1234-aaaa-17a2d10142af account_id: 87f2f697-aaaa-1234-aaaa-a20c78c0d24f amount: 100 currency: GBP description: From GBP Regular pocket balance: 100.65 atm_withdrawal: summary: ATM withdrawal value: id: 62d5161d-aaaa-1234-aaaa-219f88258175 type: atm state: completed request_id: REVP:b46e51ca-aaaa-1234-aaaa-e54321796ff0 created_at: '2022-07-18T08:13:17.025950Z' updated_at: '2022-07-19T16:21:22.521625Z' completed_at: '2022-07-19T16:21:22.515565Z' merchant: name: Barclays full_name: BARCLAYS*ATM*CANARYWHARF city: Canary Wharf category_code: '6011' country: GBR legs: - leg_id: c84cec91-aaaa-1234-aaaa-62d1979dcf3a account_id: dbd3c68b-aaaa-1234-aaaa-5621a117ecbf amount: -21.22 fee: 0.48 currency: GBP bill_amount: -25 bill_currency: EUR description: Cash at Barclays balance: 9.9 card: id: 2b1a31bc-4795-4f95-b939-ae9cf911dc6e card_number: 516760******1234 first_name: John last_name: Smith phone: '+447712341234' top_up: summary: Top up value: id: 63c95e75-aaaa-1234-aaaa-4e7a7768c663 type: topup state: completed request_id: 9d4d90c5-aaaa-1234-aaaa-ac65bf589532 created_at: '2023-01-19T15:15:01.895737Z' updated_at: '2023-01-19T15:16:14.839234Z' completed_at: '2023-01-19T15:16:14.833964Z' reference: Top up Revolut account legs: - leg_id: 63c95e75-aaaa-1234-aaaa-4e7a7768c663 account_id: 6ce35350-aaaa-1234-aaaa-006d3f739b80 amount: 100 currency: EUR description: Payment from John Smith balance: 1 card_chargeback: summary: Card chargeback value: id: 6409e928-aaaa-1234-aaaa-872a41309af1 type: card_chargeback state: completed request_id: CARD_CHARGEBACK_eabeb099-aaaa-1234-aaaa-ce72583866bb_0 created_at: '2023-03-09T14:11:52.453528Z' updated_at: '2023-03-09T14:11:52.453528Z' completed_at: '2023-03-09T14:11:52.453740Z' legs: - leg_id: 6409e928-aaaa-1234-aaaa-872a41309af1 account_id: 0d1848dc-aaaa-1234-aaaa-cae53cbd4baf amount: 4.68 currency: GBP description: Card chargeback for Rev*www.revolut.com balance: 13.08 refund: summary: Refund value: id: 172884ea-a529-4d5f-8a81-8ebab9f23e33 type: refund state: completed request_id: 79fb7626-df83-46eb-b89a-b31b1e1ae2d7 created_at: '2024-03-17T06:05:10.575740Z' updated_at: '2024-03-17T06:05:10.575740Z' completed_at: '2024-03-17T06:05:10.575740Z' related_transaction_id: 640c1963-aaaa-1234-aaaa-a6b451197c6a legs: - leg_id: 172884ea-a529-4d5f-8a81-8ebab9f23e33 account_id: 74d4d6cb-aaaa-1234-aaaa-9604b94e3019 amount: 100 currency: GBP description: A sample refund description balance: 109.74 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Transactions /pay: post: summary: Create a transfer to another account or card operationId: createPayment description: |- Make a payment to a counterparty. You can choose either a bank transfer or a card transfer. The resulting transaction has the type `transfer`. If you make the payment to another Revolut account, either business or personal, the transaction is executed instantly. If the counterparty has multiple payment methods available, for example, 2 accounts, or 1 account and 1 card, you **must specify the account or card** to which you want to transfer the money (`receiver.account_id` or `receiver.card_id` respectively). For more details, see the guides: [Send money via bank transfer](https://developer.revolut.com/docs/guides/manage-accounts/transfers/bank-transfers) and [Card transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/card-transfers). security: - AccessToken: - READ - PAY requestBody: description: Create a transfer required: true content: application/json: schema: $ref: '#/components/schemas/TransactionPaymentRequest' examples: generic_transfer: summary: Bank transfer value: request_id: A1pH4num3ric account_id: af98333c-ea53-482b-93c2-1fa5e4eae671 receiver: counterparty_id: 49c6a48b-6b58-40a0-b974-0b8c4888c8a7 account_id: 9116f03a-c074-4585-b261-18a706b3768b amount: 10 charge_bearer: shared currency: EUR reference: To John Doe transfer_to_card_p2c: summary: Card transfer value: request_id: A1pH4num3ric account_id: af98333c-ea53-482b-93c2-1fa5e4eae671 receiver: counterparty_id: 1099791d-8980-401f-8417-b9d66eeb6d93 amount: 15 currency: EUR reference: To John Doe transfer_with_reason_code: summary: Transfer with reason code value: request_id: A1pH4num3ric account_id: f2efd687-1084-45a6-ace6-8abc1352f0d3 receiver: counterparty_id: 03153735-d49c-4f8b-ac42-1fe40aeb4167 account_id: 8b9eff51-2bd1-4ce2-9974-b87385092e3e amount: 2500 currency: INR charge_bearer: shared reference: To John Doe transfer_reason_code: advertising responses: '200': description: The information about the created transfer content: application/json: schema: $ref: '#/components/schemas/TransferResponse' examples: pending: summary: Pending transfer value: id: 630f9a62-e488-a9ce-a2d3-a30kkkke03f0 state: pending created_at: '2022-08-31T17:29:06.625613Z' completed: summary: Completed transfer value: id: 630f9a62-e488-a9ce-a2d3-a30kkkke03f0 state: completed created_at: '2022-08-31T17:29:06.625613Z' completed_at: '2022-09-01T17:29:06.625613Z' '400': description: |- Bad request For example: - a duplicate `request_id` is being used - the specified `charge_bearer` is not supported - the exchange reason is required and `exchange_reason_code` is missing - the transfer reason is required and `transfer_reason_code` is missing content: application/json: schema: $ref: '#/components/schemas/Error' examples: duplicate_request: summary: Duplicate request_id value: code: 3020 message: 'Duplicate request: 1f0f3850-9627-42de-8ad4-a2c497c37d0b' unsupported_charge_bearer: summary: Unsupported charge_bearer value: code: 3287 message: Specified 'charge_bearer' is not supported for this transaction. missing_exchange_reason_code: summary: Missing exchange_reason_code value: code: 3448 message: Exchange reason is required missing_transfer_reason_code: summary: Missing transfer_reason_code value: code: 4100 message: Please provide a reason for the transaction. default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Transfers /pay/indicative-quote: post: summary: Get an indicative quote for a transfer operationId: getIndicativeQuote description: |- Get a non-binding estimate of fees, the exchange rate, and the expected delivery time for a potential [transfer](https://developer.revolut.com/docs/api/business#create-payment). No money is moved and no resource is created. The request mirrors the [`/pay` endpoint](https://developer.revolut.com/docs/api/business#create-payment) that is used to initiate a transfer, but it excludes irrelevant fields that do not affect pricing or delivery time, such as the request ID or reference. If the counterparty has multiple payment methods available, for example, 2 accounts, or 1 account and 1 card, you **must specify the account or card** to which you want to transfer the money (`receiver.account_id` or `receiver.card_id` respectively). Note that in a single request, you can specify either an account or a card, but not both. :::note[Sandbox behaviour] In Sandbox, this feature is only available for testing. While **incomplete** or **invalid requests** will return production-like error responses, **complete and valid requests** in Sandbox do not return real values and `estimated_arrival` will always return `instant`. ::: For more details, see the guides: **Check costs and delivery time before paying** section in [Bank transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/bank-transfers#check-costs-and-delivery-time-before-paying) or [Card transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/card-transfers#check-costs-and-delivery-time-before-paying). security: - AccessToken: - READ - PAY requestBody: description: Request an indicative quote required: true content: application/json: schema: $ref: '#/components/schemas/IndicativeQuoteRequest' examples: cross_currency_swift: summary: Cross-currency SWIFT payment value: account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 receiver: counterparty_id: f7e6d5c4-b3a2-1098-7654-321fedcba098 account_id: 12345678-90ab-cdef-1234-567890abcdef amount: 100.5 currency: EUR charge_bearer: shared same_currency_internal: summary: Same-currency internal transfer value: account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 receiver: counterparty_id: f7e6d5c4-b3a2-1098-7654-321fedcba098 account_id: 87654321-abcd-ef01-2345-678901234567 amount: 25 currency: GBP responses: '200': description: The expected processing attributes for the potential transfer content: application/json: schema: $ref: '#/components/schemas/IndicativeQuoteResponse' examples: cross_currency_swift: summary: Cross-currency SWIFT payment with fees and exchange rate value: amount: amount: 100.5 currency: EUR fee: amount: 20 currency: GBP breakdown: transfer_fee: amount: 20 currency: GBP estimated_total: amount: 106.3 currency: GBP estimated_exchange_rate: '1.16458' estimated_amount_after_exchange: amount: 86.3 currency: GBP estimated_arrival: date: '2026-05-14' speed: instant same_currency_internal: summary: Same-currency internal transfer - instant with no fees value: amount: amount: 25 currency: GBP fee: amount: 0 currency: GBP estimated_total: amount: 25 currency: GBP estimated_arrival: date: '2026-05-14' speed: instant fx_transfer_fees: summary: FX transfer with transfer and exchange fee value: amount: amount: 100.5 currency: EUR fee: amount: 5.75 currency: GBP breakdown: transfer_fee: amount: 3 currency: GBP exchange_fee: amount: 2.75 currency: GBP estimated_total: amount: 92.05 currency: GBP estimated_exchange_rate: '1.16458' estimated_amount_after_exchange: amount: 86.3 currency: GBP estimated_arrival: date: '2026-05-14' speed: instant volatile_fx_rate: summary: Volatile FX rate warning value: amount: amount: 100.5 currency: EUR fee: amount: 5.75 currency: GBP breakdown: transfer_fee: amount: 3 currency: GBP exchange_fee: amount: 2.75 currency: GBP estimated_total: amount: 92.05 currency: GBP estimated_exchange_rate: '1.16458' estimated_amount_after_exchange: amount: 86.3 currency: GBP estimated_arrival: date: '2026-05-14' speed: instant warnings: - volatile_fx_rate '400': description: |- Bad request For example: - the request is invalid (e.g. malformed body, validation failure) - both `account_id` and `card_id` are provided in `receiver` (only one of these values can be provided in a single request) - the specified `charge_bearer` is not supported - `exchange_reason_code` is required for such a transfer but was not provided in the request - the specified counterparty, account, or card was not found content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: invalid_request: summary: Invalid request (malformed body, validation failure) value: error_id: 3bfe9326-87eb-a849-9e35-150de29664dd code: 2101 message: Request body is not valid JSON missing_counterparty: summary: Missing receiver.counterparty_id value: error_id: 6fa7dcdd-bdd3-43d6-bffa-423452083501 code: 2101 message: '''receiver.counterparty_id'' is required' missing_account_or_card: summary: Missing receiver.account_id or receiver.card_id when multiple options available for counterparty value: error_id: 510bea31-df11-4229-84ae-35a9a0dba020 code: 2101 message: '''receiver.account_id'' or ''receiver.card_id'' is missing' invalid_charge_bearer: summary: Invalid charge_bearer value: error_id: f2bb54d3-8e8d-49ae-a3db-178afebc9da3 code: 2101 message: '''charge_bearer'' must be one of: shared, debtor, prefer_debtor' multiple_receiver_methods: summary: Both account_id and card_id provided value: error_id: c5698032-4ca2-446b-b43a-e278e21ac100 code: 2101 message: Both 'account_id' and 'card_id' can't be provided currency_mismatch: summary: Mismatched currency value: error_id: ea1fc5c9-d0cb-4614-a19c-71c9ce4e2e72 code: 3187 message: The payment currency does not match the counterparty's account currency unsupported_charge_bearer: summary: Unsupported charge_bearer value: error_id: c4e93983-4bcf-4bbc-88de-171be6811d35 code: 3287 message: Specified 'charge_bearer' is not supported for this transaction. missing_exchange_reason_code: summary: Missing exchange_reason_code value: error_id: 6e8365f6-560f-469c-9561-07d024fad9c5 code: 3448 message: exchange_reason_code is required for this transfer counterparty_not_found: summary: Invalid recipient - the specified counterparty was not found value: error_id: 7300ed0a-bfed-4b47-b46e-6d55c9aa398c code: 3544 message: Counterparty not found f7e6d5c4-b3a2-1098-7654-321fedcba098 account_not_found: summary: Invalid recipient - the account specified for the counterparty was not found value: error_id: ab3d5761-4b97-42dc-b4a4-8c2b010836e7 code: 3544 message: Account not found for counterparty f7e6d5c4-b3a2-1098-7654-321fedcba098 card_not_found: summary: Invalid recipient - the card specified for the counterparty was not found value: error_id: d89d4df4-e461-47e0-90d8-a79fefcf9e18 code: 3544 message: Card not found for counterparty f7e6d5c4-b3a2-1098-7654-321fedcba098 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' tags: - Transfers /pay/fields: post: summary: Check transfer field requirements operationId: getPaymentRequirements description: |- Retrieve the list of conditionally required or applicable fields for a specific transfer destination together with their constraints. :::note [Note] This feature is not available in Sandbox. ::: When creating a payment via the [`/pay` endpoint](https://developer.revolut.com/docs/api/business#create-payment), certain fields (such as `transfer_reason_code`, `charge_bearer`, or `exchange_reason_code`) become required or applicable depending on the source account, destination corridor, and business profile. This read-only endpoint allows you to discover these contextual fields dynamically, along with their validation rules and available options. :::tip A **destination corridor** is a specific combination of bank country and currency representing a supported payment destination (e.g. GBP to GB, USD to US). ::: Only the fields relevant to the specific context are returned. Universally required fields (such as `amount`, `account_id`, `receiver`, and `request_id`) are always required and are intentionally excluded from this response. For more details, see the guides: **Check transfer field requirements** section in [Bank transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/bank-transfers#check-transfer-field-requirements) or [Card transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/card-transfers#check-transfer-field-requirements). security: - AccessToken: - READ - PAY requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentRequirementsRequest' examples: standard_request: summary: Standard requirements request value: account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 receiver: counterparty_id: f7e6d5c4-b3a2-1098-7654-321fedcba098 account_id: 12345678-90ab-cdef-1234-567890abcdef responses: '200': description: The applicable and conditionally required fields for the specified transfer destination content: application/json: schema: $ref: '#/components/schemas/PaymentRequirementsResponse' examples: swift_payment: summary: SWIFT payment - charge bearer applicable, reference required value: fields: - name: reference required: true validation: max_length: 140 - name: charge_bearer required: false options: - value: shared default: true - value: debtor - value: prefer_debtor inr_payment: summary: INR payment - transfer reason required, reference capped at 30 characters value: fields: - name: reference required: true validation: max_length: 30 - name: transfer_reason_code required: true options: - value: advertising - value: advisor_fees - value: construction - value: exports - value: goods - value: insurance_claims - value: other_fees - value: personal_transfer - value: property_rental - value: royalties - value: services - value: travel swiss_qr_payment: summary: Swiss QR payment - strict reference validation with regex value: fields: - name: reference required: true validation: min_length: 27 max_length: 27 regex: pattern: \d{27} description: Value should be numbers only - name: charge_bearer required: false options: - value: shared - value: debtor default: true '400': description: |- Bad request For example: - the request is invalid (e.g. malformed body, validation failure) - both `account_id` and `card_id` are provided in `receiver` (only one of these values can be provided in a single request) content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_request: summary: Invalid request value: code: 2101 message: Invalid request (malformed body, validation failure) multiple_receiver_methods: summary: Both account_id and card_id provided value: code: 3000 message: Both account_id and card_id provided in receiver '404': description: |- Not found Returned when the specified counterparty, account, or card was not found. content: application/json: schema: $ref: '#/components/schemas/Error' examples: counterparty_not_found: summary: Counterparty, account, or card not found value: code: 3006 message: The specified counterparty, account, or card was not found default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Transfers /transfer: post: summary: Move money between your accounts operationId: createTransfer description: |- Move money between the Revolut accounts of the business in the same currency. The resulting transaction has the type `transfer`. For more information, see the guides: [Send money](https://developer.revolut.com/docs/guides/manage-accounts/transfers/send-money). security: - AccessToken: - READ - PAY requestBody: description: Create a transfer required: true content: application/json: schema: $ref: '#/components/schemas/TransferRequest' example: request_id: '129999' source_account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf1234 target_account_id: ae2e1241-81dd-498d-868e-075484785678 amount: 10 currency: GBP reference: John's transfer responses: '200': description: The information about the transfer created content: application/json: schema: $ref: '#/components/schemas/TransferResponse' example: id: 630f95f7-a3f9-abf2-b4e4-3f65281234dc state: completed created_at: '2020-11-23T08:39:35.811005Z' completed_at: '2020-11-23T08:39:35.811005Z' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Transfers /transfer-reasons: get: summary: Get transfer reasons description: |- In order to initiate a transfer in certain currencies and countries, you must provide a transfer reason. With this endpoint you can retrieve all transfer reasons available to your business account per country and currency. After you retrieve the results, use the appropriate reason code in the `transfer_reason_code` field when [making a transfer to a counterparty](https://developer.revolut.com/docs/api/business#create-payment) or [creating a payout link](https://developer.revolut.com/docs/api/business#create-payout-link). operationId: getTransferReasons security: - AccessToken: - READ tags: - Transfers - Payout links responses: '200': description: List of transfer reasons content: application/json: schema: $ref: '#/components/schemas/TransferReasons' example: - country: IN currency: INR code: advertising description: Advertising - country: IN currency: INR code: advisor_fees description: Advisor fees - country: IN currency: INR code: construction description: Construction - country: IN currency: INR code: delivery description: Delivery default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' /webhook: servers: - url: https://b2b.revolut.com/api/1.0/ description: Production server (uses live data) - url: https://sandbox-b2b.revolut.com/api/1.0/ description: Sandbox server (uses test data) get: summary: Retrieve a webhook operationId: getWebhookV1 description: Get your webhook URL. deprecated: true security: - AccessToken: - READ responses: '200': description: The existing webhook content: application/json: schema: $ref: '#/components/schemas/Webhook-v1' example: url: https://www.revolut.com default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v1) (deprecated) post: summary: Set a webhook operationId: setUpWebhook description: Set up a webhook URL so that event notifications are pushed to the specified URL. Only HTTPS URLs are supported. deprecated: true security: - AccessToken: - READ - WRITE requestBody: description: URL to set up as a webhook required: true content: application/json: schema: $ref: '#/components/schemas/Webhook-v1' example: url: https://www.revolut.com responses: '204': description: The webhook has been set up default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v1) (deprecated) delete: summary: Delete a webhook operationId: deleteWebhookV1 description: Delete a webhook so that events are not sent to the specified URL any more. deprecated: true security: - AccessToken: - READ - WRITE responses: '204': description: The webhook has been deleted default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v1) (deprecated) /webhooks: servers: - url: https://b2b.revolut.com/api/2.0 description: Production server (uses live data) - url: https://sandbox-b2b.revolut.com/api/2.0 description: Sandbox server (uses test data) post: summary: Create a new webhook operationId: createWebhook description: |- Create a new webhook to receive event notifications to the specified URL. Provide a list of event types that you want to subscribe to and a URL for the webhook. Only HTTPS URLs are supported. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#create-a-webhook). security: - AccessToken: - WRITE requestBody: description: The webhook to create. required: true content: application/json: schema: $ref: '#/components/schemas/CreateWebhookRequest' example: url: https://www.example.com events: - TransactionCreated - PayoutLinkCreated responses: '201': description: The successfully created webhook content: application/json: schema: $ref: '#/components/schemas/Webhook-v2' example: id: c6db947e-e9ce-41c2-b445-02e6eb741d21 url: https://www.example.com events: - TransactionCreated - PayoutLinkCreated signing_secret: wsk_4jETWMz1g1b37gCONjNp84t2KSSIT7dK '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Required 'url' is missing code: 3000 '422': description: Unprocessable Entity content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Owner [ownerId=a3e64c3f-eedd-4487-9ab3-246e23c9ec3e,ownerType=BUSINESS] already has 10 webhooks. Only 10 are allowed. code: 3352 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) get: summary: Retrieve a list of webhooks operationId: getWebhooks description: |- Get the list of all your existing webhooks and their details. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#retrieve-a-list-of-webhooks). security: - AccessToken: - READ responses: '200': description: The list of all your existing webhooks content: application/json: schema: $ref: '#/components/schemas/Webhooks' example: - $ref: '#/components/examples/webhookV2BasicSelectedEvents' - $ref: '#/components/examples/webhookV2BasicAllEvents' default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) /webhooks/{webhook_id}: servers: - url: https://b2b.revolut.com/api/2.0 description: Production server (uses live data) - url: https://sandbox-b2b.revolut.com/api/2.0 description: Sandbox server (uses test data) get: summary: Retrieve a webhook operationId: getWebhook description: |- Get the information about a specific webhook by ID. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#retrieve-a-specific-webhook). security: - AccessToken: - READ parameters: - name: webhook_id in: path required: true description: The ID of the webhook to retrieve. schema: type: string format: uuid responses: '200': description: The information about the webhook content: application/json: schema: $ref: '#/components/schemas/Webhook-v2' example: id: c6db947e-e9ce-41c2-b445-02e6eb741d21 url: https://www.example.com events: - TransactionCreated - PayoutLinkCreated signing_secret: wsk_4jETWMz1g1b37gCONjNp84t2KSSIT7dK '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Something went wrong code: 2101 '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Webhook not found code: 3040 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) patch: summary: Update a webhook operationId: updateWebhook description: |- Update an existing webhook. Change the URL to which event notifications are sent or the list of event types to be notified about. You must specify at least one of these two. The fields that you don't specify are not updated. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#update-a-webhook). security: - AccessToken: - WRITE parameters: - name: webhook_id in: path required: true description: The ID of the webhook to update. schema: type: string format: uuid requestBody: description: The new webhook URL for the given webhook required: true content: application/json: schema: $ref: '#/components/schemas/UpdateWebhookRequest' examples: modify_url: summary: Modify the URL value: url: https://www.example.com/ modify_events: summary: Modify the subscribed event types value: events: - TransactionCreated - PayoutLinkCreated modify_all: summary: Modify both the URL and event types value: url: https://www.example.com/ events: - TransactionCreated - PayoutLinkCreated responses: '200': description: The successfully updated webhook content: application/json: schema: $ref: '#/components/schemas/Webhook-v2-basic' example: id: c6db947e-e9ce-41c2-b445-02e6eb741d21 url: https://www.example.com events: - TransactionCreated - PayoutLinkCreated '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' example: message: url or events must be provided code: 3000 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) delete: summary: Delete a webhook operationId: deleteWebhook description: |- Delete a specific webhook. A successful response does not get any content in return. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#delete-a-webhook). security: - AccessToken: - WRITE parameters: - name: webhook_id in: path required: true description: The ID of the webhook to delete. schema: type: string format: uuid responses: '204': description: The webhook has been deleted '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Webhook not found code: 3040 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) /webhooks/{webhook_id}/rotate-signing-secret: servers: - url: https://b2b.revolut.com/api/2.0 description: Production server (uses live data) - url: https://sandbox-b2b.revolut.com/api/2.0 description: Sandbox server (uses test data) post: summary: Rotate a webhook signing secret operationId: rotateWebhookSigningSecret description: |- Rotate a signing secret for a specific webhook. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#rotate-a-webhook-signing-secret). security: - AccessToken: - WRITE parameters: - name: webhook_id in: path required: true description: The ID of the webhook for which to rotate the secret. schema: type: string format: uuid requestBody: description: Webhook signing secret rotation request required: true content: application/json: schema: $ref: '#/components/schemas/WebhookSigningSecretRotateRequest' responses: '200': description: The details of the webhook for which you rotated the signing secret content: application/json: schema: $ref: '#/components/schemas/Webhook-v2' example: id: c6db947e-e9ce-41c2-b445-02e6eb741d21 url: https://www.example.com events: - TransactionCreated - PayoutLinkCreated signing_secret: wsk_4jETWMz1g1b37gCONjNp84t2KSSIT7dK '400': description: |- Bad Request Returned, for example, for an incorrect expiration period provided. content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Something went wrong code: 2101 '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Webhook not found code: 3040 '422': description: Unprocessable Entity content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Webhook bf6c61eb-a4b0-4e0d-afb1-d6d2f3d27a9e can't have more than 3 active signing keys code: 3355 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) /webhooks/{webhook_id}/failed-events: servers: - url: https://b2b.revolut.com/api/2.0 description: Production server (uses live data) - url: https://sandbox-b2b.revolut.com/api/2.0 description: Sandbox server (uses test data) get: summary: Retrieve a list of failed webhook events operationId: getFailedWebhookEvents description: |- Get the list of all your failed webhook events, or use the query parameters to filter the results. The events are sorted by the `created_at` date in reverse chronological order. The returned failed events are **paginated**. The maximum number of events returned per page is specified by the `limit` parameter. To get to the next page, make a new request and use the `created_at` date of the last event returned in the previous response. For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks#retrieve-a-list-of-failed-webhook-events). security: - AccessToken: - READ parameters: - name: webhook_id in: path required: true description: The ID of the webhook for which to get the failed events. schema: type: string format: uuid - name: limit in: query description: |- The maximum number of events returned per page. To get to the next page, make a new request and use the `created_at` date of the last event returned in the previous response as value for `created_before`. schema: type: integer minimum: 1 maximum: 1000 default: 100 - name: created_before in: query description: |- Retrieves events with `created_at` < `created_before`. Cannot be older than the current date minus 21 days. The default value is the current date and time at which you are calling the endpoint. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. schema: type: string format: date-time or date minimum: '''created_at'' - 21 days' default: the date-time at which the request is made responses: '200': description: The list of all your existing failed webhook events content: application/json: schema: $ref: '#/components/schemas/WebhookEvents' example: - id: d6d04ec2-2a48-4825-8fba-3603cdacdba7 created_at: '2023-01-26T16:22:21.297570Z' updated_at: '2023-01-26T16:22:21.534872Z' webhook_id: c8083529-fb91-4de0-a66d-9fc3ccc1da10 webhook_url: https://www.example.com payload: data: id: 63d2a8bd-8b67-a2de-b1d2-b58ee21d7073 legs: - fee: 0.2 amount: -10 leg_id: 63d2a8bd-8b67-a2de-0000-b58ee21d7073 currency: GBP account_id: 05018b0d-e67c-4fec-bea6-415e9da9432c description: To Acme Corp counterparty: id: 7e18625a-3e6c-4d4f-8429-216c25309a5f account_id: ff29e658-f07f-4d81-bc0f-7ad0ff141357 account_type: external type: transfer state: pending reference: To John Doe created_at: '2023-01-26T16:22:21.232551Z' request_id: 6a8b2ad9-d8b9-4348-9207-1c5737ccf11b updated_at: '2023-01-26T16:22:21.232551Z' event: TransactionCreated timestamp: '2023-01-26T16:22:21.230599Z' last_sent_date: '2023-01-26T16:52:21.534798Z' - id: d6d04ec2-2a48-4825-8fba-3603cdacdba7 created_at: '2023-07-22T11:52:21.297570Z' updated_at: '2023-07-22T11:52:21.534872Z' webhook_id: c8083529-fb91-4de0-a66d-9fc3ccc1da10 webhook_url: https://www.example.com payload: data: id: 0e1a8d4b-1d1e-457d-9f10-3e7007a82ea8 request_id: 2e2837f5-828d-473f-85e8-5614afd3f8e8 old_state: active new_state: processed event: PayoutLinkStateChanged timestamp: '2023-07-22T12:31:18.534798Z' last_sent_date: '2023-07-22T12:52:21.534798Z' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/Error' examples: bad_limit: summary: Bad limit value: message: limit must be between 1 and 1000 code: 2101 bad_created_before: summary: Bad created_before value: message: 'created_before must be after 2023-07-11T13:11:39.623178Z, but is: 2023-07-10T16:22:21.297570Z' code: 2101 '404': description: Webhook not found content: application/json: schema: $ref: '#/components/schemas/Error' example: message: Webhook not found code: 3040 default: description: Unexpected error content: application/json: schema: $ref: '#/components/schemas/Error' tags: - Webhooks (v2) components: securitySchemes: AccessToken: type: http scheme: bearer description: |- Each Business API request must contain an authorization header in the following format to make a call: `Bearer `. The access token will be obtained the first time you set up your application and has an expiration of 40 minutes. During setup, a `refresh_token` will also be obtained which allows to obtain a new `access_token`. :::danger Never share your client-assertion JWT (JSON web token), `access_token` and `refresh_token` with anyone, as these can be used to access your banking data and initiate transactions. ::: Access tokens can be issued with four security scopes and require a JWT (JSON Web Token) signature to be obtained: - `READ`: Permissions for `GET` operations. - `WRITE`: Permissions to update counterparties, webhooks, and issue payment drafts. - `PAY`: Permissions to initiate or cancel transactions and currency exchanges. - `READ_SENSITIVE_CARD_DATA`: Permissions to retrieve sensitive card details. :::warning If you enable the `READ_SENSITIVE_CARD_DATA` scope for your access token, you must set up IP whitelisting. Failing to do so will prevent you from accessing **any** Business API endpoint. IP whitelisting means that you must specify an IP or a set of IPs which will be the only IPs from which requests to the API will be accepted. To do so: 1. Go to the Revolut Business web app [settings](https://business.revolut.com/settings) → **APIs** → **Business API**. 2. Select the corresponding API certificate. 3. In **Production IP whitelist**, provide the IP(s) which should be whitelisted. Make sure that the IPs you provide are **not** [local (i.e. private) IP addresses](https://www.okta.com/en-sg/identity-101/understanding-private-ip-ranges/). 4. Save the new settings. ::: To configure your JWT and obtain the refresh and first access tokens, complete the following steps: 1. [Sign up for a Revolut Business account](https://developer.revolut.com/docs/guides/manage-accounts/get-started/sign-up-for-revolut-business-account) 2. [Prepare your Sandbox environment](https://developer.revolut.com/docs/guides/manage-accounts/get-started/prepare-sandbox-environment) 3. [Make your first API request](https://developer.revolut.com/docs/guides/manage-accounts/get-started/make-your-first-api-request) schemas: AccountingCategoryResponse: type: object required: - id - name - created_at - updated_at properties: id: type: string format: uuid description: The unique ID of the accounting category. example: 8d831292-f950-4c5a-83f9-030df8cacd3f name: type: string description: The name of the accounting category. example: Transportation code: type: string description: The code of the accounting category. example: '305' created_at: type: string format: date-time description: The date and time the accounting category was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. example: '2025-10-20T15:09:24Z' updated_at: type: string format: date-time description: The date and time the accounting category was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. example: '2025-10-20T15:09:24Z' default_tax_rate_id: type: string format: uuid description: The ID of the default [tax rate](https://developer.revolut.com/docs/api/business#get-tax-rate) applied to items in this accounting category unless overridden for a specific item. example: 2a3520af-e6f7-416c-821e-0e83ffac1dfa AccountingTaxRate: type: object description: The tax rate that can be applied to financial records, such as expenses. required: - name properties: name: type: string description: The name of the tax. minLength: 1 maxLength: 20 percentage: type: number format: double minimum: 0 maximum: 100 description: The tax rate percentage applied to the taxable amount. For example, `23` for 23%. Account: type: object description: '' properties: id: type: string format: uuid description: The account ID. name: type: string description: The account name. balance: type: number format: double description: The current balance on the account. currency: $ref: '#/components/schemas/AccountCurrency' state: type: string enum: - active - inactive description: Indicates the state of the account. public: type: boolean description: Indicates whether the account is visible to other businesses on Revolut. created_at: type: string format: date-time description: The date and time the account was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. updated_at: type: string format: date-time description: The date and time the account was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. account_type: type: string enum: - current - merchant - savings - credit - debt - blocking - other description: |- The type of the account. | Value | Description | | --- | --- | | **`current`** | Standard account for everyday spending and transfers. | | **`merchant`** | Account for receiving payments as a [merchant](https://developer.revolut.com/docs/guides/merchant/introduction), for example from sales, invoices, and payment requests. | | **`savings`** | Savings account, such as a vault or cashback account. | | **`credit`** | Account associated with a credit card. | | **`debt`** | Account holding funds blocked or collected on behalf of a government authority. The account holder can't use these funds, and they contribute to the total negative balance. | | **`blocking`** | Account holding funds temporarily blocked during a compliance review. | | **`other`** | Any account type not covered by the above categories. | required: - id - balance - currency - state - public - created_at - updated_at - account_type Accounts: type: array items: $ref: '#/components/schemas/Account' AccountBankDetailsItem: type: object description: '' properties: iban: type: string description: The IBAN number. bic: type: string description: The BIC number, also known as SWIFT code. account_no: type: string description: The account number. sort_code: type: string description: The sort code of the account. routing_number: type: string description: The routing number of the account. beneficiary: type: string description: The name of the counterparty. beneficiary_address: $ref: '#/components/schemas/BeneficiaryAddress' bank_country: $ref: '#/components/schemas/BankCountryCode' pooled: type: boolean description: Indicates whether the account address is pooled or unique. unique_reference: type: string description: The reference of the pooled account. schemes: type: array description: The schemes that are available for this currency account. uniqueItems: false items: $ref: '#/components/schemas/PaymentSystem' estimated_time: $ref: '#/components/schemas/EstimatedTime' required: - beneficiary - beneficiary_address - schemes - estimated_time AccountBankDetailsItems: type: array description: Indicates the payment scheme used to execute transactions. items: $ref: '#/components/schemas/AccountBankDetailsItem' AccountCurrency: type: string pattern: ^[A-Z]{3}$ description: '[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.' AccountNameValidationReasonUK: type: object description: |- A code which explains why a given result was returned, and the service that returned it. For example, it might happen that the details you provided match the account details, but you specified the counterparty as an individual, and the account type is business. properties: type: type: string description: |- The reason type. Determines the [service](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services) used for the validation that returned the reason code. For UK, the values is: `uk_cop`. enum: - uk_cop - eu_cop - ro_cop - au_cop code: type: string description: |- The reason code. Possible values for UK: | Value | Description | | --- | --- | | **`close_match`** | The provided name is similar to the account name, the account type is correct. The actual name is returned. | | **`individual_account_name_matched`** | The names match but the counterparty is an individual, not a business. | | **`company_account_name_matched`** | The names match but the counterparty is a business, not an individual. | | **`individual_account_close_match`** | The provided name is similar to the account name, and the account type is incorrect – the counterparty is an individual, not a business. The actual name is returned. | | **`company_account_close_match`** | The provided name is similar to the account name, and the account type is incorrect - the counterparty is a business, not an individual. The actual name is returned. | | **`not_matched`** | The account details don't match the provided values. | | **`account_does_not_exist`** | The account does not exist. | | **`account_switched`** | The account has been switched using the Current Account Switching Service. Please contact the recipient for updated account details. | | **`cannot_be_checked`** | The account cannot be checked. | enum: - close_match - individual_account_name_matched - company_account_name_matched - individual_account_close_match - company_account_close_match - not_matched - account_does_not_exist - account_switched - cannot_be_checked AccountNameValidationReasonAU: type: object description: |- A code which explains why a given result was returned, and the service that returned it. In some cases, it may provide more details about the result. properties: type: type: string description: |- The reason type. Determines the [service](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services) used for the validation that returned the reason code. For AU, the value is: `au_cop`. enum: - uk_cop - eu_cop - ro_cop - au_cop code: type: string description: |- The reason code. Possible values for AU: | Value | Description | | --- | --- | | **`close_match`** (business accounts): | The provided name is similar to the account name. The actual name is returned. Mismatched account type is corrected. | | **`not_matched`** | The account details don't match the provided values. | | **`account_does_not_exist`** | The account does not exist. | | **`account_switched`** | The account has been switched using the Current Account Switching Service. Please contact the recipient for updated account details. | | **`cannot_be_checked`** | The account cannot be checked. | enum: - close_match - individual_account_name_matched - company_account_name_matched - individual_account_close_match - company_account_close_match - not_matched - account_does_not_exist - account_switched - cannot_be_checked AccountNameValidationReasonRO: type: object description: A code which explains why a given result was returned, and the service that returned it. properties: type: type: string description: |- The reason type. Determines the [service](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services) used for the validation that returned the reason code. For RO, the value is: `ro_cop`. enum: - uk_cop - eu_cop - ro_cop - au_cop code: type: string description: |- The reason code. Possible values for RO: | Value | Description | | --- | --- | | **`cannot_be_checked`** | The account cannot be checked. | enum: - close_match - individual_account_name_matched - company_account_name_matched - individual_account_close_match - company_account_close_match - not_matched - account_does_not_exist - account_switched - cannot_be_checked AccountNameValidationReasonEUR: type: object description: |- A code which explains why a given result was returned, and the service that returned it. For example, it might happen that the details you provided match the account details, but you specified the counterparty as an individual, and the account type is business. properties: type: type: string description: |- The reason type. Determines the [service](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services) used for the validation that returned the reason code. For EUR, the value is: `eu_cop`. enum: - uk_cop - eu_cop - ro_cop - au_cop code: type: string description: |- The reason code. Possible values for EUR: | Value | Description | | --- | --- | | **`close_match`** | The provided name is similar to the account name. The actual name is returned. | | **`not_matched`** | The account details don't match the provided values. | | **`account_does_not_exist`** | The account does not exist. | | **`account_switched`** | The account has been switched using the Current Account Switching Service. Please contact the recipient for updated account details. | | **`cannot_be_checked`** | The account cannot be checked. | enum: - close_match - individual_account_name_matched - company_account_name_matched - individual_account_close_match - company_account_close_match - not_matched - account_does_not_exist - account_switched - cannot_be_checked Amount: description: The amount of money. type: number format: double AmountWithCurrency: type: object description: '' properties: amount: type: number format: double description: The amount of the transaction. currency: $ref: '#/components/schemas/Currency' BankCountryCode: type: string pattern: ^[A-Z]{2}$ description: The country of the bank, provided as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. example: GB BeneficiaryAddress: type: object description: The address of the counterparty. properties: street_line1: type: string description: Street line 1 information. example: Revolut LTD street_line2: type: string description: Street line 2 information. example: 1 Canada Square region: type: string description: The name of the region (state or province), for example, Ontario for Canada. example: Ontario city: type: string description: The name of the city. example: London country: type: string pattern: ^[A-Z]{2}$ description: The country of the counterparty, as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. example: GB postcode: type: string description: The postcode of the counterparty address. example: E14 5AB required: - country - postcode UpdateCounterpartyPaymentMethodRequest: type: object description: The request body for updating a counterparty's payment method address. required: - address properties: address: $ref: '#/components/schemas/UpdateCounterpartyPaymentMethodAddress' UpdateCounterpartyPaymentMethodAddress: type: object description: The updated address for the counterparty's payment method. All required fields must be provided. properties: street_line1: type: string maxLength: 100 description: Street line 1 information. example: 7 Revolut Street street_line2: type: string maxLength: 100 description: Street line 2 information. example: Floor 3 region: type: string maxLength: 50 description: The name of the region (state or province), for example, Ontario for Canada. example: Greater London city: type: string maxLength: 50 description: The name of the city. example: London country: type: string pattern: ^[A-Z]{2}$ description: The country of the counterparty, provided as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. example: GB postcode: type: string maxLength: 15 description: The postcode of the counterparty address. example: EC2V 8PH required: - country - street_line1 - city - postcode BusinessMerchantCategory: enum: - health - general - services - airlines - transport - accommodation - utilities - shopping - financial - furniture - hardware - groceries - fuel - entertainment - software - restaurants - advertising - cash - education - government type: string CardInvitationId: type: string description: The ID of the card invitation. format: uuid CardInvitationState: type: string enum: - created - expired - failed - redeemed description: |- The current state of the card invitation: | Value | Description | | --- | --- | | **`created`** | Invitation has been created but not yet claimed. | | **`expired`** | Invitation has expired due to expiry date being reached or manual cancellation. | | **`failed`** | Invitation claim attempt failed. | | **`redeemed`** | Invitation has been successfully claimed. | To learn more about card invitation lifecycle, see the guide: [Manage card invitations → Card invitation state](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations#card-invitation-state). CardInvitationCreatedAt: type: string description: The date and time the card invitation was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time CardInvitationUpdatedAt: type: string description: The date and time the card invitation was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time CardInvitationExpiryDate: type: string format: date-time description: |- The date and time after which this card invitation expires if not claimed or cancelled before then. Specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. :::note Only returned for invitations in state `created`. :::tip For other states, to find out when a card invitation transitioned to its [final state](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations#card-invitation-state), check the `updated_at` value. ::: example: '2025-10-20T15:09:24Z' CardInvitationCardId: type: string format: uuid description: | The ID of the card issued after this invitation was claimed. :::note Only returned for invitations in state `redeemed`. ::: CardInvitationCreatedHolderId: type: string description: The ID of the team member to be assigned as the holder of the card after the invitation is claimed. format: uuid CardInvitationHolderId: type: string description: |- The ID of the team member to be assigned as the holder of the card after the invitation is claimed. :::note If the team member has been deleted since the invitation was created, the `holder_id` is not returned. ::: format: uuid CardInvitationVirtual: type: boolean description: Specifies whether the issued card will be a virtual (`true`) or physical (`false`) one. CardInvitationLabel: type: string description: The label of the card. CardInvitationSpendingPeriod: description: |- The controls for the card's spending period. They specify the dates when the card will become available or unavailable for spending, and define what happens after the end date. type: object allOf: - $ref: '#/components/schemas/SpendingPeriodSchema' CardInvitationCategories: type: array description: |- The list of merchant categories that will be available for card spending. If this parameter is not specified, categories are not restricted. items: $ref: '#/components/schemas/BusinessMerchantCategory' CardInvitationCountries: description: |- The list of countries where the team member will be able to use the card. Specified as 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) codes. type: array items: type: string pattern: ^[A-Z]{2}$ example: GB CardInvitationAccounts: type: array description: The list of accounts that will be linked to the card. items: type: string format: uuid CardInvitationCreatedResponse: type: object properties: id: $ref: '#/components/schemas/CardInvitationId' state: $ref: '#/components/schemas/CardInvitationState' created_at: $ref: '#/components/schemas/CardInvitationCreatedAt' updated_at: $ref: '#/components/schemas/CardInvitationUpdatedAt' expiry_date: $ref: '#/components/schemas/CardInvitationExpiryDate' holder_id: $ref: '#/components/schemas/CardInvitationCreatedHolderId' virtual: $ref: '#/components/schemas/CardInvitationVirtual' label: $ref: '#/components/schemas/CardInvitationLabel' spending_limits: $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: $ref: '#/components/schemas/CardInvitationSpendingPeriod' categories: $ref: '#/components/schemas/CardInvitationCategories' merchant_controls: $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: $ref: '#/components/schemas/MccControlsSchema' countries: $ref: '#/components/schemas/CardInvitationCountries' accounts: $ref: '#/components/schemas/CardInvitationAccounts' required: - id - created_at - updated_at - virtual - state - accounts CardInvitationUpdatedResponse: type: object properties: id: $ref: '#/components/schemas/CardInvitationId' state: $ref: '#/components/schemas/CardInvitationState' created_at: $ref: '#/components/schemas/CardInvitationCreatedAt' updated_at: $ref: '#/components/schemas/CardInvitationUpdatedAt' expiry_date: $ref: '#/components/schemas/CardInvitationExpiryDate' holder_id: $ref: '#/components/schemas/CardInvitationCreatedHolderId' virtual: $ref: '#/components/schemas/CardInvitationVirtual' label: $ref: '#/components/schemas/CardInvitationLabel' spend_program: $ref: '#/components/schemas/SpendProgram' spending_limits: $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: $ref: '#/components/schemas/CardInvitationSpendingPeriod' categories: $ref: '#/components/schemas/CardInvitationCategories' merchant_controls: $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: $ref: '#/components/schemas/MccControlsSchema' countries: $ref: '#/components/schemas/CardInvitationCountries' accounts: $ref: '#/components/schemas/CardInvitationAccounts' required: - id - created_at - updated_at - virtual - state - accounts CardInvitationResponse: type: object properties: id: $ref: '#/components/schemas/CardInvitationId' state: $ref: '#/components/schemas/CardInvitationState' created_at: $ref: '#/components/schemas/CardInvitationCreatedAt' updated_at: $ref: '#/components/schemas/CardInvitationUpdatedAt' expiry_date: $ref: '#/components/schemas/CardInvitationExpiryDate' card_id: $ref: '#/components/schemas/CardInvitationCardId' holder_id: $ref: '#/components/schemas/CardInvitationHolderId' virtual: $ref: '#/components/schemas/CardInvitationVirtual' label: $ref: '#/components/schemas/CardInvitationLabel' spend_program: $ref: '#/components/schemas/SpendProgram' spending_limits: $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: $ref: '#/components/schemas/CardInvitationSpendingPeriod' categories: $ref: '#/components/schemas/CardInvitationCategories' merchant_controls: $ref: '#/components/schemas/MerchantControlsSchema' mcc_controls: $ref: '#/components/schemas/MccControlsSchema' countries: $ref: '#/components/schemas/CardInvitationCountries' accounts: $ref: '#/components/schemas/CardInvitationAccounts' required: - id - created_at - updated_at - virtual - state - accounts CardInvitationsResponse: type: array items: $ref: '#/components/schemas/CardInvitationResponse' description: A list of card invitations CardCreatedResponse: type: object properties: id: $ref: '#/components/schemas/CardId' holder_id: $ref: '#/components/schemas/CardHolderId' contact_ids: $ref: '#/components/schemas/CardContacts' created_at: $ref: '#/components/schemas/CardCreatedAt' updated_at: $ref: '#/components/schemas/CardUpdatedAt' product: $ref: '#/components/schemas/CardProduct' virtual: $ref: '#/components/schemas/CardVirtual' last_digits: $ref: '#/components/schemas/CardLastDigits' expiry: $ref: '#/components/schemas/CardExpiry' label: $ref: '#/components/schemas/CardLabel' references: $ref: '#/components/schemas/CardReferences' state: $ref: '#/components/schemas/CardState' description: The state that the card is in. can_be_unlocked: $ref: '#/components/schemas/CardCanBeUnlocked' spending_limits: $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: $ref: '#/components/schemas/CardSpendingPeriod' categories: $ref: '#/components/schemas/CardBusinessMerchantCategories' merchant_controls: $ref: '#/components/schemas/CardMerchantControls' mcc_controls: $ref: '#/components/schemas/MccControlsSchema' countries: $ref: '#/components/schemas/CardCountries' accounts: $ref: '#/components/schemas/CardAccounts' required: - id - created_at - updated_at - virtual - last_digits - expiry - state - accounts CardResponse: type: object properties: id: $ref: '#/components/schemas/CardId' holder_id: $ref: '#/components/schemas/CardHolderId' contact_ids: $ref: '#/components/schemas/CardContacts' created_at: $ref: '#/components/schemas/CardCreatedAt' updated_at: $ref: '#/components/schemas/CardUpdatedAt' product: $ref: '#/components/schemas/CardProduct' virtual: $ref: '#/components/schemas/CardVirtual' last_digits: $ref: '#/components/schemas/CardLastDigits' expiry: $ref: '#/components/schemas/CardExpiry' label: $ref: '#/components/schemas/CardLabel' references: $ref: '#/components/schemas/CardReferences' state: $ref: '#/components/schemas/CardState' can_be_unlocked: $ref: '#/components/schemas/CardCanBeUnlocked' spend_program: $ref: '#/components/schemas/SpendProgram' spending_limits: $ref: '#/components/schemas/SpendingLimitsSchema' spending_period: $ref: '#/components/schemas/CardSpendingPeriod' categories: $ref: '#/components/schemas/CardBusinessMerchantCategories' merchant_controls: $ref: '#/components/schemas/CardMerchantControls' mcc_controls: $ref: '#/components/schemas/MccControlsSchema' countries: $ref: '#/components/schemas/CardCountries' accounts: $ref: '#/components/schemas/CardAccounts' required: - id - created_at - updated_at - virtual - last_digits - expiry - state - accounts CardsResponse: type: array items: $ref: '#/components/schemas/CardResponse' description: A list of cards. CardResponseWithTerminated: type: object properties: id: $ref: '#/components/schemas/CardId' holder_id: $ref: '#/components/schemas/CardHolderId' contact_ids: $ref: '#/components/schemas/CardContacts' created_at: $ref: '#/components/schemas/CardCreatedAt' updated_at: $ref: '#/components/schemas/CardUpdatedAt' terminated_at: $ref: '#/components/schemas/CardTerminatedAt' product: $ref: '#/components/schemas/CardProduct' virtual: $ref: '#/components/schemas/CardVirtual' last_digits: $ref: '#/components/schemas/CardLastDigits' expiry: $ref: '#/components/schemas/CardExpiry' label: $ref: '#/components/schemas/CardLabel' references: $ref: '#/components/schemas/CardReferences' state: $ref: '#/components/schemas/CardStateWithTerminated' can_be_unlocked: $ref: '#/components/schemas/CardCanBeUnlocked' spend_program: $ref: '#/components/schemas/SpendProgram' spending_limits: $ref: '#/components/schemas/SpendingLimitsWithUsage' spending_period: $ref: '#/components/schemas/CardSpendingPeriod' categories: $ref: '#/components/schemas/CardBusinessMerchantCategories' merchant_controls: $ref: '#/components/schemas/CardMerchantControls' mcc_controls: $ref: '#/components/schemas/MccControlsSchema' countries: $ref: '#/components/schemas/CardCountries' accounts: $ref: '#/components/schemas/CardAccounts' required: - id - created_at - updated_at - virtual - last_digits - expiry - state - accounts CardAccounts: type: array description: The list of linked accounts. items: type: string format: uuid CardBusinessMerchantCategories: type: array description: The list of merchant categories that are available for card spending. If not specified, categories are not restricted. items: $ref: '#/components/schemas/BusinessMerchantCategory' CardCanBeUnlocked: type: boolean description: |- Returned for locked cards (`state=locked`). Indicates whether the card can be [unlocked](https://developer.revolut.com/docs/api/business#unlock-card) manually (via API or in-app). If `true`, you'll still need the [necessary scope or permission](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#lock-or-unlock-cards) to unlock the card. :::info Cards can be locked for various reasons. For example, a card can be locked by the user, due to spending period settings, or automatically by the system. Only certain types of lock can be lifted manually. ::: CardContact: description: One of the card's contacts. type: string format: uuid CardContacts: description: The list of contacts for a [company card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards). type: array minItems: 1 maxItems: 5 uniqueItems: true items: $ref: '#/components/schemas/CardContact' CardCountries: description: The list of countries where the card can be used, specified as 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) codes. type: array items: type: string pattern: ^[A-Z]{2}$ example: GB CardCreatedAt: type: string description: The date and time the card was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time CardExpiry: type: string format: MM/YYYY description: The card expiration date. pattern: ^(0[1-9]|1[0-2])/[0-9]{4}$ CardHolderId: type: string description: |- The ID of the team member who is the holder of the card. If the card belongs to the business, this will be empty. For more information, see the guides: [Manage Cards - Create a virtual card](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#create-a-virtual-card). format: uuid CardId: type: string description: The ID of the card. format: uuid CardLabel: type: string description: The label of the card. CardLastDigits: type: string description: The last 4 digits of the card's PAN. pattern: ^[0-9]{4}$ CardMerchantControls: description: |- The merchant-level controls for card spending. They block or allow the card to only transact with specific merchants. type: object allOf: - $ref: '#/components/schemas/MerchantControlsSchema' CardProduct: description: |- The card product offered by the card provider for this card. In other words, the program that the card was issued under. :::note This property is only available to travel intermediaries using our travel solution. To use it, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: type: object properties: code: type: string description: The code of the card product. required: - code CardReference: description: |- Reference for the card. One of the name-value pairs assigned to the card for tracking. :::info Each time the card is used, the references are recorded in the [transaction details](https://developer.revolut.com/docs/api/business#get-transaction#response) (`card.references`), helping track transactions made with this card. ::: The names must be unique. The references can be [amended](https://developer.revolut.com/docs/api/business#update-card-references) up to 10 times. References are only supported for cards owned by the business (i.e. [company](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) or [auto-issued cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards)). They are **not** supported for [team member cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (i.e. with `holder_id` present). :::note The references recorded on a transaction are those assigned to the card at the time the transaction took place. If the references are amended, the new references are only applied to future transactions. Existing transaction are not affected. ::: type: object required: - name - value properties: name: description: |- The name of the card reference. Must be unique. type: string minLength: 1 maxLength: 30 value: description: The value for this reference. type: string minLength: 1 maxLength: 30 example: name: PNR value: RT12345 CardReferences: description: |- References for the card. Up to 5 name-value pairs assigned to the card for tracking. :::info Each time the card is used, the references are recorded in the [transaction details](https://developer.revolut.com/docs/api/business#get-transaction#response) (`card.references`), helping track transactions made with this card. ::: The names must be unique. The references can be [amended](https://developer.revolut.com/docs/api/business#update-card-references) up to 10 times. References are only supported for cards owned by the business (i.e. [company](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) or [auto-issued cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards)). They are **not** supported for [team member cards](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#different-types-of-cards) (i.e. with `holder_id` present). :::note The references recorded on a transaction are those assigned to the card at the time the transaction took place. If the references are amended, they will only be applied to future transactions. Existing transaction are not affected. ::: type: array minItems: 1 maxItems: 5 uniqueItems: true items: $ref: '#/components/schemas/CardReference' example: - name: PNR value: RT12345 - name: Traveller value: John Smith CardSpendingPeriod: description: |- The controls for the card's spending period. They specify the dates when the card becomes available or unavailable for spending, and define what happens after the end date. type: object allOf: - $ref: '#/components/schemas/SpendingPeriodSchema' CardState: enum: - created - pending - active - frozen - locked description: |- The state that the card is in. Possible values: | Value | Description | | --- | --- | | **`active`** | The card is available for spending. Newly created cards typically go into `active` unless subject to certain conditions, for example, spending period starting in the future. | | **`frozen`** | The card has been frozen and is temporarily unavailable for spending. | | **`locked`** | The card is locked, typically due to an [admin lock](https://developer.revolut.com/docs/api/business#lock-card) or spending period settings, i.e. when its `spending_period.start_date` is in the future or `spending_period.end_date` is in the past. A locked card is unavailable for spending until it's [unlocked](https://developer.revolut.com/docs/api/business#unlock-card) and active. | | **`created`** | The card has been created but is not yet active. Used only for a specific type of cards. | | **`pending`** | This status is currently not in use. | :::tip[Card locked?] To see if the card can be unlocked, check the `can_be_unlocked` parameter. Note that you'll still need the [necessary scope or permission](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#lock-or-unlock-cards) to unlock it. ::: type: string CardStateWithTerminated: enum: - created - pending - active - frozen - locked - terminated description: |- The state that the card is in. Possible values: | Value | Description | | --- | --- | | **`active`** | The card is available for spending. Newly created cards typically go into `active` unless subject to certain conditions, for example, spending period starting in the future. | | **`frozen`** | The card has been frozen and is temporarily unavailable for spending. | | **`locked`** | The card is locked, typically due to an [admin lock](https://developer.revolut.com/docs/api/business#lock-card) or spending period settings, i.e. when its `spending_period.start_date` is in the future or `spending_period.end_date` is in the past. A locked card is unavailable for spending until it's [unlocked](https://developer.revolut.com/docs/api/business#unlock-card) and active. | | **`created`** | The card has been created but is not yet active. Used only for a specific type of cards. | | **`pending`** | This status is currently not in use. | | **`terminated`** | The card is terminated and cannot be used. This is a final state and cannot be reversed. | :::tip[Card locked?] To see if the card can be unlocked, check the `can_be_unlocked` parameter. Note that you'll still need the [necessary scope or permission](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards#lock-or-unlock-cards) to unlock it. ::: type: string CardUpdatedAt: type: string description: The date and time the card was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time CardTerminatedAt: type: string description: The date and time the card was terminated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Only returned for cards in the `terminated` state. This is distinct from `updated_at`, as a terminated card can still have updates after termination. format: date-time example: '2026-07-22T11:15:41.113202Z' CardVirtual: type: boolean description: Specifies whether the card is virtual (`true`) or physical (`false`). Category: type: object description: The [accounting category](https://developer.revolut.com/docs/api/business#delete-accounting-category) of the expense split. required: - id - name properties: id: type: string format: uuid description: The ID of the accounting category. name: type: string description: The name of the accounting category. code: type: string description: The code of the accounting category. ChargeBearer: type: string enum: - shared - debtor - prefer_debtor description: |- The party to which any transaction fees are charged if the resulting transaction route has associated fees: | Value | Description | | --- | --- | | **`shared`** | Also known as **SHA**. The transaction route fees are split between the sender and the recipient. The sender pays the fees charged by their bank, while the recipient pays the fees charged by the receiving and any intermediary banks. | | **`debtor`** | Also known as **OUR**. The sender pays all explicit transaction fees. | | **`prefer_debtor`** | Selects the SWIFT **OUR** option when available. If the payment doesn't offer the OUR option, this value is ignored and the default fee handling applies — no error `3287` is returned. | :::note Some transactions with fees might not support forced charge bearer selection. If this is the case, the request will return an error. This does **not** apply to `prefer_debtor`, which falls back to default if `debtor` is not available. ::: Counterparty: type: object properties: id: type: string format: uuid description: The ID of the counterparty. name: type: string description: The name of the counterparty. revtag: type: string description: The [Revtag](https://help.revolut.com/help/transfers/internal-transfers/username-payments/revtags/) of the counterparty. profile_type: $ref: '#/components/schemas/ProfileType' country: $ref: '#/components/schemas/CountryCode' state: enum: - created - draft - deleted description: Indicates the state of the counterparty. type: string created_at: type: string format: date-time description: The date and time the counterparty was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. updated_at: type: string format: date-time description: The date and time the counterparty was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. accounts: type: array description: The list of public accounts associated with this counterparty. items: $ref: '#/components/schemas/CounterpartyAccount' cards: type: array description: The list of cards associated with this counterparty. items: $ref: '#/components/schemas/CounterpartyCard' required: - id - name - state - created_at - updated_at Counterparties: type: array items: $ref: '#/components/schemas/Counterparty' CounterpartyAccount: type: object properties: id: type: string format: uuid description: The ID of the counterparty's account. name: type: string description: The name of the counterparty. bank_country: $ref: '#/components/schemas/BankCountryCode' currency: $ref: '#/components/schemas/AccountCurrency' type: enum: - revolut - external description: Indicates the type of account. type: string account_no: type: string description: The bank account number of the counterparty. iban: type: string description: The IBAN number of the counterparty's account if applicable. sort_code: type: string description: The sort code of the counterparty's account if applicable. routing_number: type: string description: The routing number of the counterparty's account if applicable. bic: type: string description: The BIC number of the counterparty's account if applicable. clabe: type: string description: The CLABE number of the counterparty's account if applicable. ifsc: type: string description: The IFSC number of the counterparty's account if applicable. bsb_code: type: string description: The BSB number of the counterparty's account if applicable. route: type: string enum: - ach - fedwire - swift description: Routing method for US/USD transfers. Defaults to `ach` for US-registered businesses and `fedwire` for non-US businesses. example: ach bank_number: type: string description: Brazilian bank identification code (COMPE). Returned for BR counterparties. example: '033' branch_code: type: string description: Brazilian branch (agência) code. Returned for BR counterparties. example: '0001' account_type: type: string enum: - checking - savings description: Bank account type. Returned for BR, CO, and CL counterparties. Defaults to `checking` for US ACH transfers. example: checking tax_id: type: string maxLength: 20 description: |- Tax identification number. Routed based on `bank_country` and recipient type: | Country | Recipient type | Tax ID type | Format | Example | |-----------|----------------------------------|-----------------------------------------------|-----------------------------------------------------|------------------------------------------| | **BR** | **Individual** | CPF (Cadastro de Pessoas Físicas) | `^\d{11}$` or `^\d{3}\.\d{3}\.\d{3}-\d{2}$` | `52998224725` or `529.982.247-25` | | **BR** | **Company** | CNPJ (Cadastro Nacional da Pessoa Jurídica) | `^\d{14}$` or `^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$` | `12345678000195` or `12.345.678/0001-95` | | **CO** | **Company** | NIT (Número de Identificación Tributaria) | `^\d{10}$` | `9012345678` | | **CL** | **Individual**, **Company** | RUT (Rol Único Tributario) | `^\d{7,8}[0-9Kk]$` | `12345678K` | national_id: type: string description: |- National identification number. Specifies Colombian Cédula de Ciudadanía when `bank_country` is `CO` and `profile_type` is `personal`. phone: type: string maxLength: 20 description: |- The phone number of the counterparty in [E.164](https://en.wikipedia.org/wiki/E.164) format. Country-specific formats: | Country | Format description | Format | Example | |---------|-----------------------------|-----------------|-----------------| | **CO** | `+57` followed by 10 digits | `^\+?57\d{10}$` | `+573001234567` | | **LK** | `+94` followed by 10 digits | `^\+?94\d{10}$` | `+941234567890` | | **KR** | `+82` followed by 10 digits | `^\+?82\d{10}$` | `+821012345678` | example: '+573001234567' business_registration_id: type: string maxLength: 64 description: Company registration number. Used for business LK counterparties. example: PV12345 recipient_charges: enum: - 'no' - expected description: |- Indicates the possibility of the recipient charges. :::warning This field is deprecated and should be disregarded. It is returned for legacy purposes only. ::: type: string deprecated: true address: $ref: '#/components/schemas/CounterpartyAddress' required: - id - currency - type CounterpartyAddress: type: object description: The address of the counterparty's account. required: - country properties: street_line1: type: string maxLength: 100 description: Street line 1 information. street_line2: type: string maxLength: 100 description: Street line 2 information. region: type: string maxLength: 50 description: The name of the region (state or province), for example, Ontario for Canada. city: type: string maxLength: 50 description: The name of the city. country: type: string pattern: ^[A-Z]{2}$ description: The country of the counterparty, as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. postcode: type: string maxLength: 15 description: The postcode of the counterparty address. CounterpartyCard: type: object required: - id - name - last_digits - scheme - country - currency properties: id: type: string format: uuid description: The ID of the counterparty's card. name: type: string description: The name of the counterparty. last_digits: type: string description: The last four digits of the card number. scheme: type: string enum: - visa - mastercard description: The card brand. country: $ref: '#/components/schemas/CountryCodeCard' currency: $ref: '#/components/schemas/Currency' CounterpartyError: type: object properties: code: type: integer description: The error code. message: type: string description: The description of the error. params: $ref: '#/components/schemas/CounterpartyErrorParams' required: - code - message CounterpartyErrorParams: type: object description: Additional parameters related to the error. properties: counterparty_id: type: string format: uuid description: The ID of the Revolut counterparty (i.e. internal counterparty) that already exists. CountryCode: type: string pattern: ^[A-Z]{2}$ description: The counterparty's bank country, provided as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. CountryCodeCard: type: string pattern: ^[A-Z]{2}$ description: The country of the card issuer, provided as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. CountryCodeMerchant: type: string pattern: ^[A-Z]{2,3}$ description: |- The bank country of the merchant, provided as an [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. Typically 3 letters, though in some cases, card networks might provide it as a 2-letter code. CreateAccountingCategoryRequest: type: object description: The accounting category to create. required: - name - code properties: name: type: string description: The full name for the accounting category. minLength: 1 maxLength: 60 example: Work From Home equipment code: type: string description: The code name for the accounting category. minLength: 1 maxLength: 50 example: WFH default_tax_rate_id: type: string format: uuid description: The ID of the default [tax rate](https://developer.revolut.com/docs/api/business#get-tax-rate) that should be applied to items in this accounting category unless overridden for a specific item. example: f93f6c3e-bf95-4b58-bfcd-e642c4fc098e CounterpartyCountriesResponse: type: object description: The response containing supported bank countries and their available currencies. properties: countries: type: array description: A list of supported bank countries. items: $ref: '#/components/schemas/CounterpartyCountry' required: - countries CounterpartyCountry: type: object description: A supported bank country with its available currencies. properties: country: $ref: '#/components/schemas/BankCountryCode' currencies: type: array description: The currencies available for counterparty creation in this country. items: $ref: '#/components/schemas/Currency' required: - country - currencies CounterpartyRequirementsResponse: type: object description: The response containing applicable counterparty fields and their validation rules. properties: fields: type: array description: A list of applicable and conditionally required fields for the specific counterparty context. items: $ref: '#/components/schemas/CounterpartyRequirementsField' required: - fields CounterpartyRequirementsField: type: object description: Represents a contextual field and its rules. properties: name: type: string description: |- The name of the field to be provided in the [Create a counterparty endpoint](https://developer.revolut.com/docs/api/business#add-counterparty) request body. Matches the field names in the Create a counterparty endpoint exactly (e.g. `first_name`, `last_name`, `tax_id`, `route`, `account_type`). required: type: boolean description: Indicates whether this field must be provided when creating the counterparty. regex: $ref: '#/components/schemas/CounterpartyRequirementsFieldRegex' options: type: array description: |- A list of allowed values for the field (enum). If provided, the field value must be one of these options. items: $ref: '#/components/schemas/CounterpartyRequirementsFieldOption' required: - name - required CounterpartyRequirementsFieldRegex: type: object description: Regular expression validation rules. properties: pattern: type: string description: The regex pattern the field value must match. description: type: string description: A human-readable description of the regex constraint. required: - pattern - description CounterpartyRequirementsFieldOption: type: object description: An allowed value option for the field. properties: value: type: string description: The accepted value to be passed to the API. default: type: boolean description: Indicates the default option for the field if there is one. required: - value CreateCounterpartyRequest: type: object properties: profile_type: type: string enum: - personal - business description: |- The type of the Revolut profile. Indicates whether the counterparty is a personal or business account. Provide it when adding a Revolut counterparty via Revtag. revtag: type: string description: The [Revtag](https://help.revolut.com/help/transfers/internal-transfers/username-payments/revtags/) of the counterparty to add. name: type: string description: | The name of the counterparty, provided when the counterparty is being added via **Revtag**. If specified, `individual_name` and `company_name` must be empty. :::note The name that you provide must match or closely match the actual name associated with the account that you're trying to add. Otherwise, the creation fails and a `404` error is returned. ::: company_name: type: string description: |- The name of the counterparty, provided when the counterparty is a **company** (business account type) and is **not** being added via Revtag. If specified, `individual_name` and `name` must be empty. :::warning The `company_name` must contain at least 2 letters (not just characters). For example, names like `12` will fail validation because they are two characters but not two letters. ::: individual_name: $ref: '#/components/schemas/IndividualName' bank_country: $ref: '#/components/schemas/BankCountryCode' currency: $ref: '#/components/schemas/Currency' account_no: type: string description: The bank account number of the counterparty. iban: type: string description: The IBAN number of the counterparty's account. This field is displayed for IBAN countries. sort_code: type: string description: The sort code of the counterparty's account. This field is required for GBP accounts. routing_number: type: string description: The routing number of the counterparty's account. This field is required for USD accounts. bic: type: string description: The BIC number of the counterparty's account. This field is required for non-SEPA IBAN/SWIFT. clabe: type: string description: The CLABE number of the counterparty's account. This field is required for SWIFT MX. ifsc: type: string description: The IFSC number of the counterparty's account. This field is required for INR accounts. bsb_code: type: string description: The BSB number of the counterparty's account. This field is required for AUD accounts. address: $ref: '#/components/schemas/BeneficiaryAddress' route: type: string enum: - ach - fedwire - swift description: |- Routing method for US USD transfers. When omitted, defaults to `ach` for US-registered businesses and `fedwire` for non-US businesses. Required when `bank_country` is `US` and the desired routing method differs from the default. example: ach bank_number: type: string minLength: 3 maxLength: 3 description: Brazilian bank identification code (COMPE). Required for BR counterparties. example: '033' branch_code: type: string minLength: 4 maxLength: 4 description: Brazilian branch (agência) code. Required for BR counterparties. example: '0001' account_type: type: string enum: - checking - savings description: |- Bank account type. Defaults to `checking` for US ACH transfers when omitted. Required for BR, CO, and CL counterparties. example: checking tax_id: type: string maxLength: 20 description: |- Tax identification number. Required and routed based on `bank_country` and recipient type: | Country | Recipient type | Tax ID type | Format | Example | |-----------|----------------------------------|-----------------------------------------------|-----------------------------------------------------|------------------------------------------| | **BR** | **Individual** | CPF (Cadastro de Pessoas Físicas) | `^\d{11}$` or `^\d{3}\.\d{3}\.\d{3}-\d{2}$` | `52998224725` or `529.982.247-25` | | **BR** | **Company** | CNPJ (Cadastro Nacional da Pessoa Jurídica) | `^\d{14}$` or `^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$` | `12345678000195` or `12.345.678/0001-95` | | **CO** | **Company** | NIT (Número de Identificación Tributaria) | `^\d{10}$` | `9012345678` | | **CL** | **Individual**, **Company** | RUT (Rol Único Tributario) | `^\d{7,8}[0-9Kk]$` | `12345678K` | national_id: type: string description: National identification number. Required when `bank_country` is `CO` and `profile_type` is `personal`, must specify Colombian Cédula de Ciudadanía. phone: type: string maxLength: 20 description: |- The phone number of the counterparty in [E.164](https://en.wikipedia.org/wiki/E.164) format. - For internal (Revolut) counterparties: the recipient's Revolut phone number used to look them up. - For external counterparties in CO, KR, and LK: the bank account phone number. Required when `bank_country` is `CO`, `KR`, or `LK`. Country-specific formats: | Country | Format description | Format | Example | |---------|-----------------------------|-----------------|-----------------| | **CO** | `+57` followed by 10 digits | `^\+?57\d{10}$` | `+573001234567` | | **KR** | `+82` followed by 10 digits | `^\+?82\d{10}$` | `+821012345678` | | **LK** | `+94` followed by 10 digits | `^\+?94\d{10}$` | `+941234567890` | example: '+573001234567' business_registration_id: type: string maxLength: 64 description: 'Company registration number. Required for business LK counterparties (`profile_type`: `business`).' example: PV12345 CreateLabelGroupRequest: type: object required: - name - labels properties: name: description: The name for the new label group. type: string minLength: 1 maxLength: 100 labels: description: |- The labels to create in the new group. The maximum number of labels you can create for a new group is 200. If you need to add more, you can add them later by [creating new labels individually](https://developer.revolut.com/docs/api/business#create-label). type: array minItems: 1 maxItems: 200 items: $ref: '#/components/schemas/CreateLabelRequest' CreateLabelRequest: type: object required: - name properties: name: description: The name for the new label. type: string minLength: 1 maxLength: 100 CreatePaymentDraftRequest: type: object properties: title: type: string minLength: 1 maxLength: 255 description: The title of the payment draft. schedule_for: type: string format: date description: The scheduled date of the payment draft in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. payments: type: array description: The details of the payment(s) to be made. items: $ref: '#/components/schemas/PaymentRequest' required: - payments CreatePaymentDraftResponse: type: object properties: id: type: string format: number description: The ID of the payment draft created. required: - id CreatePaymentDraftPaymentResponse: type: object required: - id properties: id: type: string format: uuid description: The ID of the payment added to the draft. CreatePayoutLinkRequest: type: object required: - counterparty_name - request_id - account_id - amount - currency - reference properties: counterparty_name: $ref: '#/components/schemas/PayoutLinkCounterpartyName' save_counterparty: type: boolean description: |- Indicates whether to save the recipient as your counterparty upon link claim. If `false` then the counterparty will not show up on your counterparties list, for example, when you retrieve your counterparties. However, you will still be able to retrieve this counterparty by its ID. If you don't choose to save the counterparty on link creation, you can do it later from your transactions list in the Business app. default: false request_id: $ref: '#/components/schemas/PayoutLinkRequestId' description: |- The ID of the request, provided by the sender. :::warning To ensure that a link payment is not processed multiple times if there are network or system errors, the same `request_id` should be used for requests related to the same link. ::: example: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dd1 account_id: $ref: '#/components/schemas/PayoutLinkAccountId' amount: $ref: '#/components/schemas/PayoutLinkAmount' currency: $ref: '#/components/schemas/Currency' example: GBP reference: type: string minLength: 1 maxLength: 100 description: |- The reference for the payout link. A piece of text or number you provide to help identify what the payment relates to. It can be used, for example, for reconciliation or tracking purposes. You might include an invoice number, account or transaction ID, or any other reference meaningful to you or the recipient. payout_methods: $ref: '#/components/schemas/PayoutLinkPayoutMethods' default: - revolut - bank_account expiry_period: $ref: '#/components/schemas/PayoutLinkExpiryPeriod' transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' CreateTaxRateRequest: allOf: - $ref: '#/components/schemas/AccountingTaxRate' - description: The tax rate to create. required: - name - percentage CreateWebhookRequest: type: object required: - url properties: url: $ref: '#/components/schemas/Url' description: A valid webhook URL to which to send event notifications. The supported protocol is `https`. events: description: |- A list of event types to subscribe to. If you don't provide it, you're automatically subscribed to the [default event types](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks#default-event-types). type: array items: $ref: '#/components/schemas/WebhookEventType' default: - TransactionCreated - TransactionStateChanged Currency: type: string pattern: ^[A-Z]{3}$ description: '[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.' Department: type: object properties: id: type: string description: The ID of the department. format: uuid name: type: string maxLength: 100 description: The name of the department. created_at: type: string description: The date and time the department was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time updated_at: type: string description: The date and time the department was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time required: - id - name - created_at - updated_at Error: type: object properties: code: type: integer description: The error code. message: type: string description: The description of the error. required: - code - message ErrorWithId: required: - code - message - error_id type: object properties: error_id: type: string description: The ID of the specific error instance. Used for traceability. code: type: integer description: The error code. message: type: string description: The description of the error. ErrorUnauthorized: type: object description: |- Unauthorised Returned, for example, when the credentials you used to make the request are invalid. For more information, see the **Authorization** section. allOf: - $ref: '#/components/schemas/ErrorWithStatus' ErrorUnprocessableEntity: type: object description: |- Unprocessable entity Returned, for example, when you try to modify a resource which is not a in state that would allow for modifications, e.g. a card invitation in state `failed`. properties: code: type: integer description: The error code. message: type: string description: The description of the error. required: - message ErrorWithStatus: type: object description: Error returning a status instead of code. properties: status: type: integer description: The error code. message: type: string description: The description of the error. required: - status - message EstimatedTime: type: object description: The estimated time of the inbound transfer of the funds, i.e. when we expect the recipient to receive the transfer. properties: unit: type: string description: The estimated time unit of the inbound transfer of the funds. enum: - days - hours example: days min: type: integer description: The minimum time estimate. example: 1 max: type: integer description: The maximum time estimate. example: 3 required: - unit ExchangePartFrom: type: object description: The details of the currency to exchange from. properties: account_id: type: string format: uuid description: The ID of the account to sell currency from. currency: $ref: '#/components/schemas/Currency' amount: type: number format: double description: |- The amount of currency. Specify **only** if you want to sell currency. required: - account_id - currency ExchangePartTo: type: object description: The details of the currency to exchange to. properties: account_id: type: string format: uuid description: The ID of the account to receive exchanged currency into. currency: $ref: '#/components/schemas/Currency' amount: type: number format: double description: |- The amount of currency. Specify **only** if you want to buy currency. required: - account_id - currency ExchangeRateResponse: type: object properties: from: description: The money to sell. $ref: '#/components/schemas/AmountWithCurrency' to: description: The money to receive. $ref: '#/components/schemas/AmountWithCurrency' rate: type: number format: double description: The proposed exchange rate. fee: description: The expected fee for the transaction. $ref: '#/components/schemas/Fee' rate_date: type: string format: date-time description: The date of the proposed exchange rate in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. required: - from - to - rate - fee - rate_date ExchangeReason: type: object required: - code - name properties: code: type: string enum: - business_expense_and_claims - fees_and_charges - fund_transfer_and_intracompany_payment - gifts_and_donations - government_services_and_tax - insurance - inventory - investment_dividend_and_interest - loan_and_loan_repayment - marketing - payment_for_goods_and_services - payroll - refund - rental_and_property - sales - service_provider_and_software - travel_and_transportation - utilities description: Category code of the reason for the exchange. name: type: string description: Category name of the reason for the exchange. ExchangeReasons: type: array items: $ref: '#/components/schemas/ExchangeReason' description: The list of available exchange reasons. example: - code: business_expense_and_claims name: Business expense and claims - code: fees_and_charges name: Fees and charges - code: fund_transfer_and_intracompany_payment name: Fund transfer and intracompany payment - code: gifts_and_donations name: Gifts and donations - code: government_services_and_tax name: Government services and tax - code: insurance name: Insurance - code: inventory name: Inventory - code: investment_dividend_and_interest name: Investment, dividend and interest - code: loan_and_loan_repayment name: Loan and loan repayment - code: marketing name: Marketing - code: payment_for_goods_and_services name: Payment for goods and services - code: payroll name: Payroll - code: refund name: Refund - code: rental_and_property name: Rental and property - code: sales name: Sales - code: service_provider_and_software name: Service provider and software - code: travel_and_transportation name: Travel and transportation - code: utilities name: Utilities ExchangeReasonCode: type: string description: |- The reason code for the exchange. Depending on the country and the amount of funds to be exchanged, you might be required to provide an exchange reason. You can check available reason codes with the [`GET /exchange-reasons` operation](https://developer.revolut.com/docs/api/business#get-exchange-reasons). If an exchange reason is not required, this field is ignored. example: fund_transfer_and_intracompany_payment ExchangeRequest: type: object description: The exchange information. properties: from: $ref: '#/components/schemas/ExchangePartFrom' to: $ref: '#/components/schemas/ExchangePartTo' reference: type: string description: |- The reference for the exchange transaction, provided by you. It helps you to identify the transaction if you want to look it up later. request_id: type: string description: |- The ID of the request, provided by you. It helps you identify the transaction in your system. :::warning To ensure that an exchange transaction is not processed multiple times if there are network or system errors, the same `request_id` should be used for requests related to the same transaction. ::: maxLength: 40 exchange_reason_code: $ref: '#/components/schemas/ExchangeReasonCode' required: - from - to - request_id ExchangeResponse: type: object properties: id: type: string format: uuid description: The ID of the created transaction. type: type: string description: The type of the transaction. For money exchange, it is `exchange`. reason_code: type: string description: |- The reason why the transaction was failed or declined. Present only when the `state` parameter of the transaction is `declined` or `failed`. created_at: type: string format: date-time description: The date and time the transaction was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. completed_at: type: string format: date-time description: The date and time the transaction was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. state: $ref: '#/components/schemas/TransactionState' Expense: type: object properties: id: type: string format: uuid description: The ID of the expense. state: $ref: '#/components/schemas/ExpenseState' transaction_type: $ref: '#/components/schemas/ExpenseTransactionType' description: type: string description: The description of the expense. submitted_at: type: string format: date-time description: The date and time the expense was submitted in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. completed_at: type: string format: date-time description: The date and time the expense was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. payer: type: string description: The name of the [team member](https://developer.revolut.com/docs/api/business#delete-team-member) who made the transaction, refund request, or ATM withdrawal, or the name of the business if the related transaction is of type `fee`. merchant: type: string description: The name of the merchant. transaction_id: type: string format: uuid description: The ID of the [transaction](https://developer.revolut.com/docs/api/business#get-transaction) related to the expense. Not available for transactions of type `external`. expense_date: type: string format: date-time description: |- The expense data depends on the type of the expense and whether it has been completed. Typically, it's the date and time of the expense [transaction](https://developer.revolut.com/docs/api/business#get-transaction) in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. - If the transaction related to the expense is completed, it is the date and time of its completion ([`completed_at`](https://developer.revolut.com/docs/api/business#get-transaction#response)). - Otherwise, it is the date and time of its creation ([`created_at`](https://developer.revolut.com/docs/api/business#get-transaction#response)). For reimbursements, it's the payment date provided in the reimbursement request. labels: type: object description: |- :::warning [Deprecated] This field is deprecated. Labels are now assigned per split and returned in `splits[].labels`. During the deprecation period, this field is still returned for backwards compatibility, and the labels are filled as follows: - For expenses created before the migration, the expense-level label is copied to all splits of the expense. - For new expenses, the labels are set at the split level, and the expense-level label is populated with the label from the first split. This field will be removed in a future release. ::: The [labels](https://developer.revolut.com/docs/api/business#delete-label) added to the expense, organised in groups. You can have up to 5 label groups, with max. 1 label per group. The labels are provided as an object, where each key is the name of a label group, and each value is a single-element array containing the selected label from that group. This field is always returned, but it can be an empty object (`{}`) if no label is assigned. maxProperties: 5 additionalProperties: $ref: '#/components/schemas/LabelGroup' deprecated: true example: Office supplies: - Photocopying Department: - HR splits: type: array description: |- The splits of the expense. A single expense can be divided into multiple parts (splits), for example, to allocate different portions of the expense to different categories. items: $ref: '#/components/schemas/ExpenseSplit' receipt_ids: type: array description: The IDs of the receipts related to the expense. items: type: string format: uuid spent_amount: type: object description: |- The expense amount in billed currency. If the expense involves FX, this currency can differ from the currency of the splits. properties: amount: $ref: '#/components/schemas/Amount' currency: $ref: '#/components/schemas/Currency' required: - amount - currency required: - id - state - transaction_type - expense_date - labels - splits - spent_amount - receipt_ids Expenses: type: array items: $ref: '#/components/schemas/Expense' ExpenseSplit: type: object required: - amount - category - labels - tax_rate properties: amount: type: object description: The original amount of the expense split. properties: amount: $ref: '#/components/schemas/Amount' currency: $ref: '#/components/schemas/Currency' category: $ref: '#/components/schemas/Category' labels: type: object description: |- :::note This field replaces the expense-level `labels` field, which is now deprecated. During the deprecation period, the labels are filled as follows: - For expenses created before the migration, the expense-level label is copied to all splits of the expense. - For new expenses, the labels are set at the split level, and the expense-level label is populated with the first label from the first split. ::: The [labels](https://developer.revolut.com/docs/api/business#delete-label) assigned to the split, organised in groups. You can have up to 5 label groups, with max. 1 label per group. Each split can have a different set of labels. The labels are provided as an object, where each key is the name of a label group, and each value is a single-element array containing the selected label from that group. This field is always returned, but it can be an empty object (`{}`) when the split has no labels. maxProperties: 5 additionalProperties: $ref: '#/components/schemas/LabelGroup' example: Office supplies: - Photocopying tax_rate: $ref: '#/components/schemas/TaxRate' ExpenseState: enum: - missing_info - awaiting_review - rejected - pending_reimbursement - refund_requested - refunded - approved - reverted description: |- Indicates the state of the expense. Possible values: | Value | Description | | --- | --- | | **`missing_info`** | The expense is missing some required information. This is the initial state of the expense when it's first created. Once the missing information is provided, the expense is ready to be submitted. | | **`awaiting_review`** | The expense is awaiting approval before it can be completed. The approver can approve, reject, or request repayment for the expense. It is also possible for the submitter to undo the submission at this stage. | | **`rejected`** | The expense has been rejected by the approver. The expense submitter (typically, the payer) should fix the issue that was the reason for the rejection and resubmit the expense. | | **`pending_reimbursement`** | The reimbursement request has been approved, and the expense is awaiting reimbursement. This state is possible for reimbursements (transaction type = `External`). | | **`refund_requested`** | The expense has been rejected and repayment has been requested.* This state is possible for card transactions. It indicates that following the review, the approver rejected the expense and requested that it be paid back to the business account. This can happen, for example, if an employee accidentally makes a personal purchase with their business card. Once the money has been returned, the **admin** can mark this expense as repaid. | | **`refunded`** | The expense has been repaid.* This state indicates that the admin has marked the expense as repaid. | | **`approved`** | The expense has been approved and is now completed.* | | **`reverted`** | The expense has been reverted. This status indicates that the transaction related to the expense has been reverted. In such a case, the expense status is automatically set to `reverted`, and the expense is completed. This can happen, for example, when the transaction has been reverted by the merchant. | _*Additionally, if an admin has previously approved the expense, marked it as repaid/completed, or requested repayment, they can revert their decision. In such a case, the expense goes back to the initial `missing_info` state._ For more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses#expense-state). type: string ExpenseTransactionType: enum: - atm - card_payment - fee - transfer - external - mileage_reimbursement - rev_payment description: The type of the [transaction](https://developer.revolut.com/docs/api/business#get-transaction) related to the expense. type: string Fee: type: object properties: amount: type: number format: double description: The fee amount. currency: $ref: '#/components/schemas/Currency' IndicativeQuoteEstimatedArrival: type: object description: |- Estimated time and speed of funds arrival in relation to the current date and time. Present if such information is available. properties: date: type: string format: date description: The estimated arrival date provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. speed: type: string enum: - instant - in_seconds - today - tomorrow - by_date description: |- The expected speed of the transfer. Possible values are: | Value | Description | | --- | --- | | **`instant`** | The funds are expected to reach the recipient **immediately** after the transfer is created. | | **`in_seconds`** | The funds are expected to reach the recipient **within 5 minutes** after the transfer is created. | | **`today`** | The funds are expected to reach the recipient by the end of the **same day** the transfer is created. | | **`tomorrow`** | The funds are expected to reach the recipient by the end of the **day after** the transfer is created. | | **`by_date`** | The funds are expected to reach the recipient by the end of the **day specified** in the `date` parameter. | required: - date - speed IndicativeQuoteFee: type: object description: Details of the total fee for the transfer. properties: amount: type: number format: double description: Fee amount in major units. currency: $ref: '#/components/schemas/Currency' breakdown: $ref: '#/components/schemas/IndicativeQuoteFeeBreakdown' required: - amount - currency IndicativeQuoteFeeBreakdown: type: object description: |- Breakdown of transfer and exchange fees. When the total `fee` is zero, this field is omitted from the response. properties: transfer_fee: $ref: '#/components/schemas/SimpleFee' exchange_fee: $ref: '#/components/schemas/SimpleFee' IndicativeQuoteRequest: type: object description: The request details for an indicative quote. properties: account_id: type: string format: uuid description: The ID of the account from which the transfer will be made. receiver: $ref: '#/components/schemas/PaymentReceiver' amount: type: number format: double description: The transfer amount in major units. currency: $ref: '#/components/schemas/Currency' charge_bearer: $ref: '#/components/schemas/ChargeBearer' transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' exchange_reason_code: $ref: '#/components/schemas/ExchangeReasonCode' required: - account_id - receiver - amount - currency IndicativeQuoteResponse: type: object description: The expected processing attributes for a potential transfer. properties: amount: $ref: '#/components/schemas/Money' description: Amount the recipient receives before fees are deducted, in major units. fee: $ref: '#/components/schemas/IndicativeQuoteFee' description: Total fee for the transfer (in source or target currency). estimated_total: $ref: '#/components/schemas/Money' description: Total amount of money which will be charged on the sender's account. estimated_exchange_rate: type: string description: |- Exchange rate for the transfer. For same-currency transfers, this field is omitted from the response. estimated_amount_after_exchange: $ref: '#/components/schemas/Money' description: |- Amount of the money converted to the sender's currency. For same-currency transfers, this field is omitted from the response. estimated_arrival: $ref: '#/components/schemas/IndicativeQuoteEstimatedArrival' warnings: type: array description: |- Potential warnings regarding the quote: | Value | Description | | --- | --- | | **`volatile_fx_rate`** | Returned when the specified FX rate is volatile. | items: type: string enum: - volatile_fx_rate required: - amount - fee - estimated_total IndividualName: type: object description: |- The name of the counterparty, provided when the counterparty is an **individual** (personal account type) and is **not** being added via Revtag. If specified, `company_name` and `name` must be empty. properties: first_name: type: string description: The first name of the individual counterparty. last_name: type: string description: The last name of the individual counterparty. LabelGroup: type: array description: |- A label group with the selected label from that group. For example, you might have a label group called **Department**, and the label you select from that group might be **HR**: `"Department": [ "HR" ]`. minItems: 1 maxItems: 1 example: - HR items: type: string description: The name of the selected label. example: HR LabelGroupResponse: type: object required: - id - name - created_at - updated_at properties: id: type: string format: uuid description: The unique ID of the label group. readOnly: true name: type: string description: The name of the label group. minLength: 1 maxLength: 100 created_at: type: string format: date-time description: The date and time the label group was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. readOnly: true updated_at: type: string format: date-time description: The date and time the label group was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. readOnly: true LabelResponse: type: object required: - id - name - created_at - updated_at properties: id: type: string format: uuid description: The unique ID of the label. readOnly: true name: type: string description: The name of the label. minLength: 1 maxLength: 100 created_at: type: string format: date-time description: The date and time the label was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. readOnly: true updated_at: type: string format: date-time description: The date and time the label was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. readOnly: true MerchantControlsSchema: type: object description: The merchant-level controls for card spending. required: - control_type - merchant_ids properties: control_type: type: string enum: - block - allow description: |- The type of control to apply. Possible values: | Value | Description | | --- | --- | | **`allow`** | Permits only the specified merchants. | | **`block`** | Blocks the specified merchants. | merchant_ids: type: array minItems: 1 maxItems: 20 description: |- The list of IDs of merchants to which the control applies. :::tip To find merchant IDs, check transaction details (→ `merchant.id`). You can fetch transaction details for a [specific transaction](https://developer.revolut.com/docs/api/business#get-transaction#response) or for [all transactions](https://developer.revolut.com/docs/api/business#get-transactions#response). ::: items: type: string format: uuid MccControlsSchema: type: object description: |- The MCC controls for card spending. They restrict card spending to merchants with the specified [ISO 18245](https://en.wikipedia.org/wiki/ISO_18245) merchant category codes (MCCs). :::tip MCCs are 4-digit codes used by payment card networks to classify businesses by the type of goods or services they provide — for example, `5411` for grocery stores or `7011` for hotels. ::: required: - control_type - mccs properties: control_type: $ref: '#/components/schemas/MccControlType' mccs: $ref: '#/components/schemas/Mccs' MccControlType: type: string enum: - allow x-accept-case-insensitive: true description: The type of control to apply. Mccs: type: array minItems: 1 maxItems: 100 uniqueItems: true description: The list of [ISO 18245](https://en.wikipedia.org/wiki/ISO_18245) merchant category codes to which the control applies. items: type: string description: A 4-digit [ISO 18245](https://en.wikipedia.org/wiki/ISO_18245) merchant category code. pattern: ^[0-9]{4}$ example: '7033' Money: type: object description: A monetary amount and its associated currency. properties: amount: type: number format: double description: Amount in major units. currency: $ref: '#/components/schemas/Currency' required: - amount - currency PaymentDraftResponse: type: object properties: scheduled_for: type: string format: date description: The scheduled date of the payment draft in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. title: type: string description: The title of the payment draft. payments: type: array description: The list of payments in the bulk. items: $ref: '#/components/schemas/PaymentInfo' source: type: string description: The source from which the payment draft was created. enum: - api - integration - email - business_app required: - payments PageToken: type: string format: byte description: |- Cursor for the next page. Used for pagination when the total number of results exceeds the maximum number per page. To get the next page of results, make a new request and set `page_token` to the `next_page_token` value returned in the previous response. Omit this parameter to fetch the first page. :::note If there are no more results to fetch, `next_page_token` is not returned in the response. ::: example: MjAyNi0wMS0wMVQwOToxMzoxNS40MDZaN2RhNTFjZGY0LTZiYjctNDRkNi04OWU1LTc2OWEzZGYxZDc5ZA PaymentDraftsResponse: type: object required: - payment_orders properties: payment_orders: type: array description: The list of payment drafts that haven't been sent for processing. items: $ref: '#/components/schemas/PaymentOrderInfo' PaymentInfo: type: object description: The details of the payment draft. properties: id: type: string format: uuid description: |- The ID of the payment. Do not confuse it with the [payment draft ID](https://developer.revolut.com/docs/api/business#get-payment-drafts#response) or [transaction ID](https://developer.revolut.com/docs/api/business#get-transaction). amount: $ref: '#/components/schemas/AmountWithCurrency' currency: $ref: '#/components/schemas/Currency' account_id: type: string format: uuid description: The ID of the account to pay from. receiver: $ref: '#/components/schemas/PaymentReceiver' state: $ref: '#/components/schemas/PaymentState' reason: type: string description: The reason for the current state. error_message: type: string description: The description of the error message. current_charge_options: type: object description: The explanation of conversion process. required: - from - to properties: from: $ref: '#/components/schemas/AmountWithCurrency' to: $ref: '#/components/schemas/AmountWithCurrency' rate: type: string fee: $ref: '#/components/schemas/AmountWithCurrency' reference: type: string description: The description of the transaction. transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' required: - id - amount - account_id - state - current_charge_options PaymentOrderInfo: type: object description: A list of payments. properties: id: type: string format: uuid description: The ID of the payment draft. scheduled_for: type: string format: date description: The scheduled date of the payment draft in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. title: type: string description: The title of the payment draft. payments_count: type: integer description: The number of payments in the payment draft. source: type: string description: The source from which the payment draft was created. enum: - api - integration - email - business_app required: - id - payments_count PaymentReceiver: type: object description: |- The details of the transfer recipient. If the counterparty has multiple payment methods available (e.g. 2 accounts, or 1 account and 1 card), you must specify the account (`account_id`) or card (`card_id`) to which you want to transfer the money. properties: counterparty_id: type: string format: uuid description: The ID of the receiving counterparty. account_id: type: string format: uuid description: |- The ID of the receiving counterparty's account. Used for bank transfers. If the counterparty has multiple payment methods available, use it to specify the account to which you want to send the money. card_id: type: string format: uuid description: |- The ID of the receiving counterparty's card. Used for card transfers. If the counterparty has multiple payment methods available, use it to specify the card to which you want to send the money. required: - counterparty_id PaymentRequest: type: object description: The details of the draft payment. properties: account_id: type: string format: uuid description: |- The ID of the account to pay from. :::note You can specify only one account ID for multiple payments in the same payment draft. ::: receiver: $ref: '#/components/schemas/PaymentReceiver' amount: type: number format: double exclusiveMinimum: true minimum: 0 description: The amount of the payment. currency: $ref: '#/components/schemas/Currency' reference: type: string maxLength: 255 description: |- The reference for the payment. A piece of text or number you provide to help identify what the payment relates to. It can be used, for example, for reconciliation or tracking purposes. You might include an invoice number, account or transaction ID, or any other reference meaningful to you. charge_bearer: type: string description: |- The party that should bear the transaction fees related to the selected transaction route if applied. Possible options are: | Value | Description | | --- | --- | | **`shared`** | Also known as **SHA**. The transaction route fees are split between the sender and the recipient. The sender pays the fees charged by their bank, while the recipient pays the fees charged by the receiving and any intermediary banks. | | **`debtor`** | Also known as **OUR**. The sender pays all explicit transaction fees. | :::note - This field is not supported for [bulk payments](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts#use-cases). - Some transactions with fees might not support charge bearer selection. If this is the case, the request will return an error. To proceed with the default fee handling, remove this field from your request and try again. ::: enum: - shared - debtor transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' required: - account_id - receiver - amount - currency - reference PaymentRequirementsRequest: type: object description: The request details to evaluate payment requirements. properties: account_id: type: string format: uuid description: The ID of the account from which the transfer will be made. receiver: $ref: '#/components/schemas/PaymentReceiver' required: - account_id - receiver PaymentRequirementsResponse: type: object description: The response containing applicable payment fields and their validation rules. properties: fields: type: array description: A list of applicable and conditionally required fields for the specific payment context. items: $ref: '#/components/schemas/PaymentRequirementsField' required: - fields PaymentRequirementsField: type: object description: Represents a contextual field and its rules. properties: name: type: string description: |- The name of the field to be provided in the [`/pay` endpoint](https://developer.revolut.com/docs/business#create-payment) request body. Matches the field names in the `/pay` endpoint exactly. E.g. `reference`, `charge_bearer`, `transfer_reason_code`, `exchange_reason_code`, `fiscal_code`. Universally required fields (such as `amount`, `account_id`, `receiver`, and `request_id`) are always required and are intentionally excluded from this response. For field descriptions, see the [`/pay` endpoint](https://developer.revolut.com/docs/business#create-payment) request body. required: type: boolean description: Indicates whether this field must be provided for the given transfer. validation: $ref: '#/components/schemas/PaymentRequirementsFieldValidation' options: type: array description: |- A list of allowed values for the field (enum). If provided, the field value must be one of these options. items: $ref: '#/components/schemas/PaymentRequirementsFieldOption' required: - name - required PaymentRequirementsFieldValidation: type: object description: Validation rules applied to the field. properties: min_length: type: integer description: The minimum allowed character length for the field value. max_length: type: integer description: The maximum allowed character length for the field value. regex: $ref: '#/components/schemas/PaymentRequirementsFieldRegex' PaymentRequirementsFieldRegex: type: object description: Regular expression validation rules. properties: pattern: type: string description: The regex pattern the field value must match. description: type: string description: A human-readable description of the regex constraint. required: - pattern - description PaymentRequirementsFieldOption: type: object description: An allowed value option for the field. properties: value: type: string description: The accepted value to be passed to the API. default: type: boolean description: Indicates the default option for the field if there is one. required: - value PaymentState: enum: - CREATED - PENDING - COMPLETED - REVERTED - DECLINED - CANCELLED - FAILED - DELETED type: string description: Indicates the state of the transaction. PaymentSystem: enum: - chaps - bacs - faster_payments - sepa - swift - ach - elixir - sorbnet - nics - rix - sumclearing example: swift type: string description: Indicates the payment scheme used to execute transactions. PayoutLinkInitialProps: type: object required: - id - state - created_at - updated_at - counterparty_name - request_id - payout_methods - account_id - amount - currency - reference - save_counterparty properties: id: type: string format: uuid description: The ID of the payout link. state: $ref: '#/components/schemas/PayoutLinkState' created_at: type: string format: date-time description: The date and time the payout link was created in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601). updated_at: type: string format: date-time description: The date and time the payout link was last updated in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601). counterparty_name: $ref: '#/components/schemas/PayoutLinkCounterpartyName' save_counterparty: type: boolean default: false description: |- Indicates whether you chose to save the recipient as your counterparty upon link claim. If `false` then the counterparty will not show up on your counterparties list, for example, when you [retrieve your counterparties](https://developer.revolut.com/docs/api/business#get-counterparties). However, you can still [retrieve this counterparty by its ID](https://developer.revolut.com/docs/api/business#get-counterparty). If you didn't choose to save the counterparty on link creation, you can still do it from your transactions list in the Business app. request_id: $ref: '#/components/schemas/PayoutLinkRequestId' expiry_date: $ref: '#/components/schemas/PayoutLinkExpiryDate' payout_methods: $ref: '#/components/schemas/PayoutLinkPayoutMethods' account_id: $ref: '#/components/schemas/PayoutLinkAccountId' amount: $ref: '#/components/schemas/PayoutLinkAmount' currency: $ref: '#/components/schemas/Currency' url: type: string format: uri description: The URL of the payout link. Returned only for active payout links. reference: $ref: '#/components/schemas/PayoutLinkReference' transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' PayoutLinkAdditionalProps: type: object properties: counterparty_id: type: string format: uuid description: |- The ID of the counterparty created based on the recipient's details. :::note By default, the newly created counterparty is hidden from your counterparties list. To automatically save it when the link is claimed, pass the `save_counterparty` parameter set to `true`. Alternatively, you can add the recipient to your counterparties later from the list of transactions in the Business app. ::: transaction_id: type: string format: uuid description: The ID of the created transaction. Returned only if the payout has been claimed. cancellation_reason: type: string readOnly: true enum: - too_many_name_check_attempts description: The reason for which the payout link was cancelled. PayoutLink: allOf: - $ref: '#/components/schemas/PayoutLinkInitialProps' - $ref: '#/components/schemas/PayoutLinkAdditionalProps' PayoutLinks: type: array items: $ref: '#/components/schemas/PayoutLink' description: A list of payout links PayoutLinkAccountId: type: string format: uuid description: The ID of the sender's account. example: 85f515e4-588f-4496-a6a5-a7615a193e6b PayoutLinkAmount: type: number format: double description: |- The amount of money to be transferred. :::note The amount must be between £1 and £2,500, or equivalent in the selected currency. ::: example: 105.6 PayoutLinkCounterpartyName: type: string description: The name of the counterparty provided by the sender. example: John Smith PayoutLinkExpiryDate: type: string format: date-time description: |- The date and time after which the payout link expires in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601). If the recipient doesn't claim the money before then, the payout link expires and is no longer available. The default and maximum value is the date and time of creating the link + 7 days. default: now + 7 days maximum: now + 7 days minimum: now + 1 day example: 2023‐07‐20T15:09:24Z PayoutLinkExpiryPeriod: type: string format: duration description: |- The period after which the payout link expires if not claimed before, provided in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601). The default and maximum value is 7 days from the link creation. default: P7D maximum: P7D minimum: P1D example: P3D PayoutLinkPayoutMethods: type: array items: $ref: '#/components/schemas/PayoutMethod' explode: true description: The list of payout methods that the recipient can use to claim the payout. example: - revolut - bank_account - card PayoutLinkReference: type: string description: The reference for the payout transaction, provided by the sender. example: Rent PayoutLinkRequestId: type: string description: The ID of the request, provided by the sender. example: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dd1 PayoutLinkState: enum: - created - failed - awaiting - active - expired - cancelled - processing - processed type: string description: |- The state that the payout link is in. Possible states are: | Value | Description | | --- | --- | | **`created`** | The payout link has been created, but the amount has not yet been [blocked](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payout-links#sender-link-generation). | | **`failed`** | The payout link couldn't be generated due to a failure during transaction booking. | | **`awaiting`** | The payout link is awaiting approval. | | **`active`** | The payout link can be redeemed. | | **`expired`** | The payout link cannot be redeemed because it wasn't claimed before its expiry date. | | **`cancelled`** | The payout link cannot be redeemed because it was cancelled. | | **`processing`** | The payout link has been redeemed and is being processed. | | **`processed`** | The payout link has been redeemed and the money has been transferred to the recipient. | PayoutMethod: type: string description: |- The payout method that the recipient can use to claim the payout. | Value | Description | | --- | --- | | **`revolut`** | Revolut peer-to-peer (P2P) transfer | | **`bank_account`** | External bank transfer | | **`card`** | Card transfer
**Note:** | enum: - revolut - bank_account - card ProfileType: type: string enum: - personal - business description: |- The type of the counterparty. Indicates whether the recipient is an individual or a company. ResourceCreatedResponse: description: Successfully created resource. type: object properties: id: type: string format: uuid description: The ID of the created resource. Role: type: object properties: id: type: string description: The ID of the role. This can be a UUID or other default role such as `OWNER`. name: type: string description: The name of the role. created_at: type: string description: The date and time the role was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time updated_at: type: string description: The date and time the role was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time required: - id - name - created_at - updated_at SimpleFee: type: object description: A specific fee component. properties: amount: type: number format: double description: Fee amount in major units. currency: $ref: '#/components/schemas/Currency' required: - amount - currency SpendProgram: description: |- The [spend program](https://help.revolut.com/business/help/making-paymentsbusiness/spend-controls/setting-card-presets-for-my-team-members/) assigned to the card. :::note To use this property, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: type: object readOnly: true properties: label: description: The name of the spend program. type: string maxLength: 30 required: - label SpendingLimitPeriodic: type: object description: The limit for transactions within a given period. properties: amount: type: number format: double description: The value of the spending limit. currency: $ref: '#/components/schemas/TransactionLimitCurrency' required: - amount - currency SpendingLimitSingleTransaction: type: object description: The limit for a single transaction. properties: amount: type: number format: double description: The value of the spending limit. currency: $ref: '#/components/schemas/TransactionLimitCurrency' required: - amount - currency SpendingLimitsSchema: type: object properties: single: description: The limit for a single transaction. $ref: '#/components/schemas/SpendingLimitSingleTransaction' day: description: The daily limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodic' week: description: The weekly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodic' month: description: The monthly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodic' quarter: description: The quarterly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodic' year: description: The yearly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodic' all_time: description: The all-time limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodic' example: single: amount: 200.22 currency: GBP week: amount: 200.44 currency: GBP SpendingLimitPeriodicWithUsage: type: object description: The limit for transactions within a given period, including spending limit utilisation. allOf: - $ref: '#/components/schemas/SpendingLimitPeriodic' - type: object properties: usage: type: number format: double minimum: 0 description: The amount used within the current spending-limit period, in the same currency and decimal representation as `amount`. Returned only when usage data is available. SpendingLimitsWithUsage: description: All spending limits set for the card, including spending limit utilisation for periodic limits. type: object properties: single: description: The limit for a single transaction. $ref: '#/components/schemas/SpendingLimitSingleTransaction' day: description: The daily limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodicWithUsage' week: description: The weekly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodicWithUsage' month: description: The monthly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodicWithUsage' quarter: description: The quarterly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodicWithUsage' year: description: The yearly limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodicWithUsage' all_time: description: The all-time limit for transactions. $ref: '#/components/schemas/SpendingLimitPeriodicWithUsage' SpendingPeriodSchema: type: object properties: start_date: type: string format: date description: |- The start date (inclusive) of the spending period, in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DD`). Uses the [timezone set by the business](https://business.revolut.com/settings/appearance), or defaults to `Europe/London`. example: '2025-09-26' end_date: type: string format: date description: |- The end date (inclusive) of the spending period, in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DD`). Uses the [timezone set by the business](https://business.revolut.com/settings/appearance), or defaults to `Europe/London`. example: '2030-12-31' end_date_action: type: string enum: - lock - terminate description: The action to take after the end date of the spending period. anyOf: - required: - start_date - required: - end_date - end_date_action TaxRate: type: object description: The [tax rate](https://developer.revolut.com/docs/api/business#delete-tax-rate) applied to the expense split. required: - id - name properties: id: type: string format: uuid description: The ID of the tax rate. name: type: string description: The name of the tax. minLength: 1 maxLength: 20 percentage: type: number format: double minimum: 0 maximum: 100 description: The tax rate percentage applied to the taxable amount. For example, `23` for 23%. TaxRateResponse: type: object required: - id - name - created_at - updated_at properties: id: type: string format: uuid description: The unique ID of the tax rate. readOnly: true name: type: string description: The name of the tax. minLength: 1 maxLength: 20 created_at: type: string format: date-time description: The date and time the tax rate was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. readOnly: true updated_at: type: string format: date-time description: The date and time the tax rate was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. readOnly: true percentage: type: number format: double description: |- The tax rate percentage applied to the taxable amount. For example, `23` for 23%. :::note You cannot create negative tax rates manually. However, negative tax rates might be synced from your accounting software, if integrated. ::: minimum: -100 maximum: 100 TeamMember: type: object properties: id: type: string description: The ID of the team member. format: uuid email: type: string description: The email of the team member. format: email first_name: type: string description: The team member's first name. last_name: type: string description: The team member's last name. state: $ref: '#/components/schemas/TeamMemberState' role_id: type: string description: The ID of the team member's [role](https://developer.revolut.com/docs/api/business#get-roles). This can be a UUID or other default role such as `Owner`. created_at: type: string description: The date and time the team member was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time updated_at: type: string description: The date and time the team member was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. format: date-time department_id: type: string description: The ID of the [department](https://developer.revolut.com/docs/api/business#get-departments) the team member is assigned to. format: uuid manager_id: type: string description: The ID of the team member's manager. format: uuid required: - id - email - state - role_id - created_at - updated_at TeamMemberState: description: The state that the team member is in. enum: - created - confirmed - waiting - active - locked - disabled type: string Transaction: type: object properties: id: type: string description: The ID of the transaction. type: $ref: '#/components/schemas/TransactionType' request_id: type: string description: The request ID that you provided previously. state: $ref: '#/components/schemas/TransactionState' reason_code: type: string description: The reason code when the transaction `state` is `declined` or `failed`. created_at: type: string format: date-time description: The date and time the transaction was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. updated_at: type: string format: date-time description: The date and time the transaction was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. completed_at: type: string format: date-time description: |- The date and time the transaction was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. This is required when the transaction `state` is `completed`. scheduled_for: type: string format: date description: |- The scheduled date of the payment, if applicable. Provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. related_transaction_id: type: string format: uuid description: |- The ID of the original transaction to which this transaction is related. Returned, for example, when this transaction is a refund of the related transaction, or for transactions related to cashback. merchant: $ref: '#/components/schemas/TransactionMerchant' reference: type: string description: The payment reference. legs: type: array description: |- The legs of the transaction: - For transactions between your Revolut accounts, there can be 2 legs, for example, an internal transfer made out of the GBP account and into the EUR account. - For transactions in other cases, there is only 1 leg. items: $ref: '#/components/schemas/TransactionLeg' card: $ref: '#/components/schemas/TransactionCard' auth_code: type: string description: |- The authorization code from the card network. Returned for card transactions when the authorization code is available. required: - id - type - state - created_at - updated_at - legs Transactions: type: array items: $ref: '#/components/schemas/Transaction' TransactionCard: type: object description: The details of the card associated with the transaction. properties: id: type: string format: uuid description: The ID of the card. card_number: type: string description: The masked card number. first_name: type: string description: The first name of the cardholder. last_name: type: string description: The last name of the cardholder. phone: type: string description: The phone number of the cardholder in [E.164](https://en.wikipedia.org/wiki/E.164) format. references: type: array description: |- Card references ([`references`](https://developer.revolut.com/docs/api/business#get-card#response)). :::note These are the references that were assigned to the card at the time the transaction was made. Any [update](https://developer.revolut.com/docs/api/business#update-card-references) to card references does not affect existing transactions. ::: minItems: 1 maxItems: 5 items: $ref: '#/components/schemas/CardReference' required: - id - card_number TransactionCounterparty: type: object properties: account_id: type: string format: uuid description: The ID of the counterparty account. account_type: $ref: '#/components/schemas/TransactionCounterpartyAccountType' id: type: string format: uuid description: The ID of the counterparty. required: - account_type TransactionCounterpartyAccountType: enum: - self - revolut - external description: Indicates the type of the account. type: string TransactionLeg: type: object description: |- The legs of the transaction: - For transactions between your Revolut accounts, there can be 2 legs, for example, an internal transfer made out of the BGP account and into the EUR account. - For transactions in other cases, there is only 1 leg. properties: leg_id: type: string format: uuid description: The ID of the leg. amount: type: number format: double description: The amount of the transaction. fee: type: number format: double description: The amount of the transaction fee. currency: $ref: '#/components/schemas/Currency' bill_amount: type: number format: double description: The billing amount for cross-currency payments. bill_currency: $ref: '#/components/schemas/Currency' account_id: type: string format: uuid description: The ID of the account that the transaction is associated with. counterparty: $ref: '#/components/schemas/TransactionCounterparty' description: type: string description: The transaction leg purpose. balance: type: number format: double description: The total balance of the account that the transaction is associated with. required: - leg_id - amount - currency - account_id TransactionLimitCurrency: type: string pattern: ^[A-Z]{3}$ description: The currency of the spending limit, provided as [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) code in upper case. TransactionMerchant: type: object description: The information about the merchant (only for card transactions). properties: id: type: string format: uuid description: The ID of the merchant. name: type: string description: The name of the merchant. If `full_name` is available and merchant mapping applies, this is the cleaned, mapped name. example: Acme Corp. full_name: type: string description: The original merchant name supplied by the card network. example: ACME*1234MN1HA2 city: type: string description: The city of the merchant. category_code: type: string description: The category code of the merchant. country: $ref: '#/components/schemas/CountryCodeMerchant' TransactionPaymentRequest: type: object properties: request_id: type: string description: |- A unique identifier for the transaction, provided by you. This is used for idempotency to prevent duplicate payments. There are no strict format requirements, but we recommend using UUID v4 values. :::tip[Retrying requests safely with idempotency] If you do not receive a response (for example, due to a network error or timeout), you can safely retry the request using the same `request_id`. If a transaction with the same `request_id` was already created, the API will not create a duplicate transaction. :::warning[Idempotency expiry] Idempotency checks apply only to transactions created **within the last 2 weeks**. Reusing a `request_id` **after this period** may result in a **new transaction being created**. ::: maxLength: 40 account_id: type: string format: uuid description: The ID of the account that you send the funds from. receiver: $ref: '#/components/schemas/PaymentReceiver' amount: type: number format: double description: The amount to transfer. currency: $ref: '#/components/schemas/Currency' reference: type: string maxLength: 140 description: |- The reference for the payment. - For **BRL**/**KRW**/**VND**/**COP**/**LKR**/**CLP**/**NPR** company transfers, and all **INR** transfers: This field must specify the commercial invoice number. - For other corridors: A piece of text or number you provide to help identify what the payment relates to. It can be used, for example, for reconciliation or tracking purposes. You might include an invoice number, account or transaction ID, or any other reference meaningful to you. If the provided reference is longer than 140 characters, it will be truncated. Note that some recipient banks might truncate the reference even further. charge_bearer: $ref: '#/components/schemas/ChargeBearer' transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' exchange_reason_code: $ref: '#/components/schemas/ExchangeReasonCode' fiscal_code: type: string maxLength: 50 pattern: ^[a-zA-Z0-9]+$ description: |- Fiscal code of the payer, required for payments to Romanian tax authority beneficiaries (counterparty BIC: `TREZROBUXXX`). The business's own tax identification number (TIN) is attached automatically from the business profile. example: RO12345678 name_validation_id: type: string format: uuid description: |- The identifier returned by a preceding [account name validation (CoP)](https://developer.revolut.com/docs/api/business#validate-account-name) check. Pass this to link the CoP check to the payment, preventing rate-limiting issues in regions like Romania, where CoP queries are limited to 3 per 24 hours without an initiated payment. example: a1b2c3d4-e5f6-7890-abcd-ef1234567890 required: - request_id - account_id - receiver - amount - currency TransactionState: enum: - created - pending - completed - declined - failed - reverted description: |- Indicates the transaction state. Possible values: | Value | Description | | --- | --- | | **`created`** | The transaction has been created and is either processed asynchronously or scheduled for a later time. | | **`pending`** | The transaction is pending until it's being processed. If the transfer is made between Revolut accounts, this state is skipped and the transaction is executed instantly. | | **`completed`** | The transaction was successful. | | **`declined`** | The transaction was unsuccessful. This can happen for a variety of reasons, for example, insufficient account balance, wrong receiver information, etc. | | **`failed`** | The transaction was unsuccessful. This can happen for a variety of reasons, for example, invalid API calls, blocked payments, etc. | | **`reverted`** | The transaction was reverted. This can happen for a variety of reasons, for example, the receiver being inaccessible. | type: string TransactionType: enum: - atm - card_payment - card_refund - card_chargeback - card_credit - charge - charge_refund - exchange - transfer - loan - fee - refund - topup - topup_return - tax - tax_refund - rev_payment description: Indicates the transaction type. type: string TransferReason: type: object properties: country: $ref: '#/components/schemas/CountryCode' currency: $ref: '#/components/schemas/Currency' code: type: string description: Category name of the transfer reason. enum: - advertising - advisor_fees - business_insurance - construction - delivery - education - family - fund_investment - goods - homesend - hotel - exports - insurance_claims - insurance_premium - loan_repayment - medical - office - other_fees - personal_transfer - property_purchase - property_rental - royalties - services - share_investment - tax - transfer - transportation - travel - utilities description: type: string description: The description of the given transfer reason. required: - country - currency - code - description TransferReasons: type: array items: $ref: '#/components/schemas/TransferReason' TransferReasonCode: type: string description: |- The reason code for the transaction. Transactions to certain countries and currencies might require you to provide a transfer reason. You can check available reason codes with the [`GET /transfer-reasons` operation](https://developer.revolut.com/docs/api/business#get-transfer-reasons). If a transfer reason is not required for the given currency and country, this field is ignored. example: property_rental TransferRequest: type: object description: Transfer the funds between accounts of the business in the same currency. properties: request_id: type: string description: |- The ID of the request, provided by you. It helps you identify the transaction in your system. :::warning To ensure that a transfer is not processed multiple times if there are network or system errors, the same `request_id` should be used for requests related to the same transfer. ::: maxLength: 40 source_account_id: type: string format: uuid description: The ID of the source account that you transfer the funds from. target_account_id: type: string format: uuid description: The ID of the target account that you transfer the funds to. amount: type: number format: double description: The amount of the funds to be transferred. currency: $ref: '#/components/schemas/Currency' reference: type: string description: The reference for the funds transfer. required: - request_id - source_account_id - target_account_id - amount - currency TransferResponse: type: object properties: id: type: string description: The ID of the transaction created. state: $ref: '#/components/schemas/TransactionState' created_at: type: string format: date-time description: The date and time the transaction was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. completed_at: type: string format: date-time description: The date and time the transaction was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. required: - id - state - created_at UpdateAccountingCategoryRequest: type: object description: The new settings for the accounting category. minProperties: 1 properties: name: type: string description: The new full name for the accounting category. minLength: 1 maxLength: 60 example: Work From Home equipment code: type: string description: The new code name for the accounting category. minLength: 1 maxLength: 50 example: WFH default_tax_rate_id: type: string format: uuid description: The ID of the new default [tax rate](https://developer.revolut.com/docs/api/business#get-tax-rate) that should be applied to items in this accounting category unless overridden for a specific item. example: f93f6c3e-bf95-4b58-bfcd-e642c4fc098e UpdateDraftPaymentRequest: type: object description: The updated details of a single payment in a payment draft. minProperties: 1 properties: receiver: $ref: '#/components/schemas/PaymentReceiver' amount: type: number format: double exclusiveMinimum: true minimum: 0 description: The amount of the payment. currency: $ref: '#/components/schemas/Currency' reference: type: string minLength: 1 maxLength: 255 description: |- The reference for the payment. A piece of text or number you provide to help identify what the payment relates to. It can be used, for example, for reconciliation or tracking purposes. charge_bearer: type: string nullable: true description: |- The party that should bear the transaction fees related to the selected transaction route if applied. | Value | Description | | --- | --- | | **`shared`** | Also known as **SHA**. The transaction route fees are split between the sender and the recipient. | | **`debtor`** | Also known as **OUR**. The sender pays all explicit transaction fees. | enum: - shared - debtor transfer_reason_code: $ref: '#/components/schemas/TransferReasonCode' UpdateLabelGroupRequest: type: object description: The new name for the label group. required: - name properties: name: description: The new name for the label group. type: string minLength: 1 maxLength: 100 UpdateLabelRequest: type: object description: The new name for the label. required: - name properties: name: description: The new name for the label. type: string minLength: 1 maxLength: 100 UpdatePaymentDraftRequest: type: object description: The updated metadata of a payment draft. minProperties: 1 properties: title: type: string minLength: 1 maxLength: 255 nullable: true description: The title of the payment draft. To clear the title, provide `null`. schedule_for: type: string format: date nullable: true description: |- The scheduled date of the payment draft in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. :::note The date must be in the future. ::: To clear the scheduled date, provide `null`. UpdateTaxRateRequest: type: object description: The new setting for the tax rate. minProperties: 1 properties: name: description: The new name for the tax rate. type: string minLength: 1 maxLength: 20 UpdateWebhookRequest: type: object properties: url: $ref: '#/components/schemas/Url' description: A valid webhook URL to which to send event notifications. The supported protocol is `https`. events: description: A list of event types to subscribe to. type: array items: $ref: '#/components/schemas/WebhookEventType' Url: description: A valid webhook URL to which to send event notifications. The supported protocol is `https`. type: string format: uri AccountNameValidationId: type: string format: uuid description: |- The unique identifier of a CoP (Confirmation of Payee) check. Pass this as `name_validation_id` on a subsequent [`POST /pay`](https://developer.revolut.com/docs/api/business#create-payment) request to link the check to the payment. This prevents rate-limiting issues in regions like Romania, where CoP queries are limited to 3 per 24 hours without an initiated payment. example: a1b2c3d4-e5f6-7890-abcd-ef1234567890 ValidateAccountNameRequest: discriminator: mapping: UK: '#/components/schemas/ValidateAccountNameRequestUK' AU: '#/components/schemas/ValidateAccountNameRequestAU' RO: '#/components/schemas/ValidateAccountNameRequestRO' EUR: '#/components/schemas/ValidateAccountNameRequestEUR' ValidateAccountNameRequestUK: title: UK type: object properties: account_no: type: string description: The account number of the counterparty. sort_code: type: string description: The sort code of the counterparty's account. company_name: type: string description: | The name of the business counterparty. **Required** when the account type is business (`individual_name` is not specified). individual_name: type: object description: | The name of the individual counterparty, split into first name and last name. **Required** when the account type is personal (`company_name` isn't specified). required: - first_name - last_name properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. required: - account_no - sort_code ValidateAccountNameRequestAU: title: AU type: object properties: account_no: type: string description: The account number of the counterparty. bsb: type: string description: |- The BSB (Bank-State-Branch) number for the counterparty's account. Used to identify the bank and branch in Australia. company_name: type: string description: | The name of the business counterparty. **Required** when the account type is business (`individual_name` is not specified). individual_name: type: object description: | The name of the individual counterparty, split into first name and last name. **Required** when the account type is personal (`company_name` isn't specified). required: - first_name - last_name properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. required: - account_no - bsb ValidateAccountNameRequestRO: title: RO type: object properties: iban: type: string description: The IBAN (International Bank Account Number) for the counterparty's account. bic: type: string description: |- The BIC (Bank Identifier Code) for the counterparty's account. Also known as the SWIFT code. This value is optional. It can be provided, for example, when the automatic BIC detection fails and the check is unsuccessful. recipient_country: type: string pattern: ^[A-Z]{2}$ description: |- The counterparty's bank country, provided as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. For RO CoP, the **possible value** is `RO`. example: RO recipient_currency: type: string pattern: ^[A-Z]{3}$ description: | The counterparty account’s currency, provided as a 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) code. For RO CoP, the **possible value** is `RON`. example: RON company_name: type: string description: | The name of the business counterparty. **Required** when the account type is business (`individual_name` is not specified). ⓘ Note that for [RO](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services), the name you provide helps identify the request, but is **not** used for the actual check. The API simply returns the partially masked name associated with the IBAN for you to validate. Therefore, the returned name may differ from the one you provide. individual_name: type: object description: | The name of the individual counterparty, split into first name and last name. **Required** when the account type is personal (`company_name` isn't specified). ⓘ Note that for [RO](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/confirmation-of-payee#supported-regions-and-services), the name you provide helps identify the request, but is **not** used for the actual check. The API simply returns the partially masked name associated with the IBAN for you to validate. Therefore, the returned name may differ from the one you provide. required: - first_name - last_name properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. required: - iban - recipient_country - recipient_currency ValidateAccountNameRequestEUR: title: EUR type: object properties: iban: type: string description: The IBAN (International Bank Account Number) for the counterparty's account. bic: type: string description: |- The BIC (Bank Identifier Code) for the counterparty's account. Also known as the SWIFT code. It can be provided, for example, when the automatic BIC detection fails and the check is unsuccessful. recipient_country: type: string pattern: ^[A-Z]{2}$ description: The counterparty's bank country, provided as a 2-letter [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) code. example: FR recipient_currency: type: string pattern: ^[A-Z]{3}$ description: | The counterparty account’s currency, provided as a 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) code. For VoP, the **possible value** is `EUR`. example: EUR company_name: type: string description: | The name of the business counterparty. **Required** when the account type is business (`individual_name` is not specified). individual_name: type: object description: | The name of the individual counterparty, split into first name and last name. **Required** when the account type is personal (`company_name` isn't specified). required: - first_name - last_name properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. required: - iban - recipient_country - recipient_currency ValidateAccountNameResponse: discriminator: mapping: UK: '#/components/schemas/ValidateAccountNameResponseUK' AU: '#/components/schemas/ValidateAccountNameResponseAU' RO: '#/components/schemas/ValidateAccountNameResponseRO' EUR: '#/components/schemas/ValidateAccountNameResponseEUR' ValidateAccountNameResponseUK: title: UK type: object properties: result_code: description: |- The result of the check. Possible values for UK: | Result code | Description | |-------------------|-------------| | **`matched`** | The name and account type match the provided details. | | **`close_match`** | The name and/or account type are similar to the provided values: The actual values are returned. | | **`not_matched`** | The name and account type don't match the provided values. | | **`cannot_be_checked`** | The check cannot be performed and retries won't help. For example, the recipient's bank doesn't support CoP. | | **`temporarily_unavailable`** | The check cannot be performed right now. For example, the recipient's bank didn't respond to our request. You should retry the request later. | type: string enum: - matched - close_match - not_matched - cannot_be_checked - temporarily_unavailable reason: $ref: '#/components/schemas/AccountNameValidationReasonUK' company_name: type: string description: |- The name of the recipient when the account type is business. Provided only if `individual_name` is not specified. When the name is a close match, the actual full name is returned, otherwise, the name you provided is returned. individual_name: type: object required: - first_name - last_name description: |- The name of the recipient when the account type is personal. Provided only if `company_name` is not specified. When the name is a close match, the actual first and last names are returned in full. properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. name_validation_id: $ref: '#/components/schemas/AccountNameValidationId' required: - result_code ValidateAccountNameResponseAU: title: AU type: object properties: result_code: description: |- The result of the check. Possible values for AU: | Result code | Description | |------------------------------------|-------------| | **`matched`** | The name matches the provided details. For personal accounts, this also covers **close matches**, in which case the **actual name** is returned. | | **`close_match` (business account)** | The name is similar to the provided value. | | **`not_matched`** | The name doesn't match the provided values. | | **`cannot_be_checked`** | The check cannot be performed and retries won't help. For example, the recipient's bank doesn't support CoP. | | **`temporarily_unavailable`** | The check cannot be performed right now. For example, the recipient's bank didn't respond to our request. You should retry the request later. | type: string enum: - matched - close_match - not_matched - cannot_be_checked - temporarily_unavailable reason: $ref: '#/components/schemas/AccountNameValidationReasonAU' company_name: type: string description: |- The name of the recipient when the account type is business. Provided only if `individual_name` is not specified. When the name is a close match, the actual full name is returned. Otherwise, the name you provided is returned. :::tip[Mismatched name type is corrected] The mismatched name type in the request is corrected in the response. This means that, for example, if an individual recipient's name was provided under `company_name`, in the response it is returned under `individual_name`. ::: individual_name: type: object required: - first_name - last_name description: |- The name of the recipient when the account type is personal. Provided only if `company_name` is not specified. When the name is a close match, the actual first and last names are returned. Otherwise, the name you provided is returned. :::tip[Mismatched name type is corrected] The mismatched name type in the request is corrected in the response. This means that, for example, if an individual recipient's name was provided under `company_name`, in the response it is returned under `individual_name`. ::: properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. name_validation_id: $ref: '#/components/schemas/AccountNameValidationId' required: - result_code ValidateAccountNameResponseRO: title: RO type: object properties: result_code: description: |- The result of the check. For RO CoP, the API **checks if an account exists for the provided IBAN**. Possible results are: | Result code | Description | |-----------------------------|-------------| | **`matched`** | An account with the provided IBAN was found. When this status is returned, the API also returns a partial name of the account holder. Use this returned name to validate your recipient's details. | | **`cannot_be_checked`** | The check cannot be performed and retries won't help. For example, the recipient's bank doesn't support CoP. | | **`temporarily_unavailable`** | The check cannot be performed right now. For example, the recipient's bank didn't respond to our request. You should retry the request later. | type: string enum: - matched - close_match - not_matched - cannot_be_checked - temporarily_unavailable reason: $ref: '#/components/schemas/AccountNameValidationReasonRO' company_name: type: string description: |- The **partially masked** name of the recipient when the account type is business. Provided only if `individual_name` is not specified. :::warning[Name considerations] - The name you provide helps identify the request, but is not used for the actual check. The API simply returns the partial name associated with the IBAN for you to validate. Therefore, the **returned name may differ** from the one you provided. - **Mismatched name type is not corrected**. This means that the name type in the response is returned as it was provided in the request. For example, if an individual recipient's name was provided under `company_name`, in the response it's still returned under `company_name` (instead of `individual_name`). ::: example: Rodri**** SA individual_name: type: object required: - first_name - last_name description: |- The partial name of the recipient when the account type is personal, that is, the first name and the last name's initial. Provided only if `company_name` is not specified. :::warning[Name considerations] - The name you provide helps identify the request, but is not used for the actual check. The API simply returns the partial name associated with the IBAN for you to validate. Therefore, the **returned name may differ** from the one you provided. - **Mismatched name type is not corrected**. This means that the name type in the response is returned as it was provided in the request. For example, if an individual recipient's name was provided under `company_name`, in the response it's still returned under `company_name` (instead of `individual_name`). ::: properties: first_name: type: string description: The first name of the recipient. example: Alexandru last_name: type: string description: The initial of the last name of the recipient. example: I. name_validation_id: $ref: '#/components/schemas/AccountNameValidationId' required: - result_code ValidateAccountNameResponseEUR: title: EUR type: object properties: result_code: description: |- The result of the check. Possible values for EUR: | Result code | Description | |-----------------------------|-------------| | **`matched`** | The name matches the provided details. | | **`close_match`** | The recipient's name is similar to the provided value. The **actual name** is returned. | | **`not_matched`** | The name and account type don't match the provided values. The **name provided in the request** is returned. | | **`cannot_be_checked`** | The check cannot be performed and retries won't help. For example, the recipient's bank doesn't support VoP. | | **`temporarily_unavailable`** | The check cannot be performed right now. For example, the recipient's bank didn't respond to our request. You should retry the request later. | type: string enum: - matched - close_match - not_matched - cannot_be_checked - temporarily_unavailable reason: $ref: '#/components/schemas/AccountNameValidationReasonEUR' company_name: type: string description: |- The name of the recipient when the account type is business. Provided only if `individual_name` is not specified. When the name is a close match, the actual name is returned. Otherwise, the name you provided is returned. :::warning[Mismatched name type is not corrected] The name type in the response is returned as it was provided in the request. For example, if an individual recipient's name was provided under `company_name`, in the response it's still returned under `company_name` (instead of `individual_name`). ::: individual_name: type: object required: - first_name - last_name description: |- The name of the recipient when the account type is personal. Provided only if `company_name` is not specified. When the name is a close match, the actual name is returned. Otherwise, the name you provided is returned. :::warning[Mismatched name type is not corrected] The name type in the response is returned as it was provided in the request. For example, if an individual recipient's name was provided under `company_name`, in the response it's still returned under `company_name` (instead of `individual_name`). ::: properties: first_name: type: string description: The first name of the recipient. last_name: type: string description: The last name of the recipient. name_validation_id: $ref: '#/components/schemas/AccountNameValidationId' required: - result_code Webhook-v1: type: object properties: url: type: string format: uri description: The valid webhook URL that event notifications are sent to. The supported protocol is `https`. required: - url Webhook-v2-basic: type: object required: - id - url - events properties: id: type: string format: uuid description: The ID of the webhook. url: type: string format: uri description: The valid webhook URL that event notifications are sent to. The supported protocol is `https`. events: type: array items: $ref: '#/components/schemas/WebhookEventType' description: The list of event types that you are subscribed to. example: id: 6fc346be-5cb5-4c14-aadc-e8aba6a655d7 url: https://www.example.com/ events: - TransactionCreated Webhook-v2: type: object required: - id - url - events - signing_secret properties: id: type: string format: uuid description: The ID of the webhook. url: type: string format: uri description: The valid webhook URL that event notifications are sent to. The supported protocol is `https`. events: type: array items: $ref: '#/components/schemas/WebhookEventType' description: The list of event types that you are subscribed to. signing_secret: type: string description: The signing secret for the webhook. example: id: 6fc346be-5cb5-4c14-aadc-e8aba6a655d7 url: https://www.example.com/ events: - TransactionCreated signing_secret: wsk_4jETWMz1g1b37gCONjNp84t2KSSIT7dK Webhooks: type: array items: $ref: '#/components/schemas/Webhook-v2-basic' WebhookEvent: type: object required: - id - created_at - updated_at - webhook_id - webhook_url - payload description: A webhook event properties: id: type: string format: uuid description: The ID of the webhook event. created_at: type: string format: date-time description: The date and time the event was created in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. updated_at: type: string format: date-time description: The date and time the event was last updated in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. webhook_id: type: string format: uuid description: The ID of the webhook for which the event failed. webhook_url: type: string format: uri description: The valid webhook URL that event notifications are sent to. The supported protocol is `https`. payload: type: object description: The details of the failed event. last_sent_date: type: string format: date-time description: The date and time the last attempt at the event delivery occurred in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. WebhookEvents: type: array items: $ref: '#/components/schemas/WebhookEvent' WebhookEventType: enum: - TransactionCreated - TransactionStateChanged - PayoutLinkCreated - PayoutLinkStateChanged description: The type of the webhook event to subscribe to. WebhookSigningSecretRotateRequest: type: object properties: expiration_period: type: string format: duration description: The expiration period for the signing secret in [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601#Durations). If set, when you rotate the secret, it continues to be valid until the expiration period has passed. Otherwise, on rotation, the secret is invalidated immediately. The maximum value is 7 days. maximum: P7D example: PT5H30M default: P0D parameters: PageToken: in: query name: page_token required: false schema: $ref: '#/components/schemas/PageToken' responses: Unauthorized: description: |- Unauthorized – authentication credentials are missing or invalid Returned when the request was not fulfilled because authentication has failed or has not been provided. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: access_token_invalid_or_expired: summary: Access token invalid or expired value: error_id: 69bb3be2-24b7-afe7-8c69-c9f26aa37a69 code: 1000 message: Access token is invalid or has expired. Please refresh your access token or generate a new one following the 'Get a new access token' guide in the Revolut API docs. invalid_token: summary: Invalid token value: error_id: 7835beae-98ed-42dc-b993-95f4ded951a1 code: 1000 message: Invalid token. The authorization header must follow the 'Bearer ' format. Forbidden: description: |- Action forbidden - insufficient permissions to perform this action Returned, for example, when you don't have permissions necessary to perform this action. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: c5deadcc-1934-4438-818a-3c7ca1e6c01c code: 9002 message: This action is forbidden TooManyRequests: description: |- Too many requests Returned, for example, when the rate limit has been exceeded. If the response includes the `Retry-After` instruction, please respect it and refrain from earlier retry attempts. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: rateLimitExceededNoRetryAfter: summary: Rate limit exceeded (no Retry-After) value: error_id: 06153eec-c5cd-4db8-8898-7ae96b9d89ab code: 3162 message: Request rate limit has been reached. Try again later. rateLimitExceededWithRetryAfter: summary: Rate limit exceeded (with Retry-After) value: error_id: 06153eec-c5cd-4db8-8898-7ae96b9d89ab code: 3162 message: Request rate limit has been reached. Try again after 30 seconds. InternalServerError: description: |- Internal server error An unexpected application error occurred. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' example: error_id: 7f96652e-7518-4229-872b-4e4c867fb4da code: 5000 message: An unexpected error occurred while processing your request. If the issue persists, please contact support ServiceUnavailable: description: |- Service Unavailable The system is temporarily unavailable. If the response includes the `Retry-After` header instruction, please respect it and refrain from earlier retry attempts. content: application/json: schema: $ref: '#/components/schemas/ErrorWithId' examples: service_unavailable: summary: System temporarily unavailable value: error_id: 201768bc-c5cd-4db8-8898-7ae96b9d89ab code: 5003 message: The service is temporarily unavailable. Try again in a few moments. If the issue persists, please contact support ResourceCreatedResponse: description: |- Resource created On successful creation, the response returns only the ID of the new resource, even if the resource has more properties. To get all details, use the returned resource ID with a GET request. content: application/json: schema: $ref: '#/components/schemas/ResourceCreatedResponse' examples: resource_created: summary: Resource created value: id: 6a37383e-cfd3-4a2f-aa81-e3a6e6939efa examples: cardErrorBadId: summary: Invalid ID - the path parameter must be UUID value: message: 'Invalid path parameter ''id'': expected UUID' code: 2101 cardErrorBadCountryCode: summary: Invalid country code (when countries=["GB", "USA"]) value: code: 3000 message: 'Invalid value for ''countries[1]'': expected a 2-letter ISO country code (e.g. ''US'').' cardInvitationMinCreate: summary: Card invitation for an onboarding team member - minimal example value: request_id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true cardInvitationMaxCreate: summary: Card invitation for an onboarding team member - full example value: request_id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd expiry_period: P14D holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: end_date: '2026-12-31' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationWithMccControlsCreate: summary: Card invitation with MCC controls value: request_id: 5027c902-cc61-5ce3-9b2c-bec85f5bbdce expiry_period: P14D holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie mcc_controls: control_type: allow mccs: - '5411' - '7011' countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationUpdatedAllProperties: summary: Update all properties value: id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T10:27:15Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: New card label spending_limits: single: amount: 100 currency: GBP week: amount: 300 currency: GBP spending_period: start_date: '2025-12-20' end_date: '2027-12-20' end_date_action: lock categories: - services - shopping - furniture merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 - 3f09819f-63d1-473a-966c-54d8b9f43a93 countries: - GB - SG - ES accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 - 9ae4345a-5ee5-496b-b776-241fcc5a5ba4 cardInvitationUpdatedEraseSpendingPeriodStartDate: summary: Erase spending period start date and update end date value: id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T10:27:15Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: end_date: '2027-12-20' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationUpdatedEraseAllSpendingLimits: summary: Erase all spending limits value: id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T10:27:15Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_period: start_date: '2025-12-20' end_date: '2026-12-31' end_date_action: lock categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationUpdatedAllowSpecificMerchants: summary: Erase single-transaction limit value: id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T10:27:15Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: start_date: '2025-12-20' end_date: '2026-12-31' end_date_action: lock merchant_controls: control_type: allow merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationUpdatedEraseSingleTransactionLimit: summary: Erase single-transaction limit value: id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T10:27:15Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_limits: week: amount: 250 currency: GBP spending_period: start_date: '2025-12-20' end_date: '2026-12-31' end_date_action: lock categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationCreatedDetails: summary: Created (active) invitation (example with spending limits) value: id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T00:00:00Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: end_date: '2026-12-31' end_date_action: lock categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a cardInvitationRedeemedDetails: summary: Redeemed invitation (example with spend program) value: id: 809d745d-9598-4680-8464-d82113e9024b state: redeemed created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-23T09:01:13Z' card_id: 744b29d4-19e9-40f8-89e6-bfb264ef5710 holder_id: 19c76bef-3583-4848-af09-4b2a96c75a14 virtual: true label: Manuel Haleigh - WFH spend_program: label: WFH equipment spending_period: start_date: '2025-11-23' end_date: '2025-12-23' end_date_action: terminate categories: - furniture - hardware countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 cardInvitationExpiredDetails: summary: Expired or cancelled invitation value: id: 0c0d252e-5fff-498e-83f8-f9b635904275 state: expired created_at: '2025-11-22T00:00:00Z' updated_at: '2025-11-30T00:00:00Z' holder_id: 5ea0ffa1-5dc5-43c4-ac5e-b9e0deb9ec12 virtual: true label: Valeria Keone - meals spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: start_date: '2025-11-29' end_date: '2025-12-29' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 cardInvitationFailedDetails: summary: Failed invitation value: id: 9ab6019a-6a26-41f8-b034-44b591f8b1a8 state: failed created_at: '2025-11-27T00:00:00Z' updated_at: '2025-11-27T00:00:00Z' holder_id: af686385-4ec0-4139-a4a0-963ee9fa5bc8 virtual: true label: Connor Thato - meals spending_period: start_date: '2025-12-01' end_date: '2026-01-01' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 cardInvitationFailedNoHolderDetails: summary: Invitation that failed because team member was deleted value: id: bfc40b73-1e8b-4cba-ad7d-2f54ee707a21 state: failed created_at: '2025-11-28T00:00:00Z' updated_at: '2025-12-02T11:31:15Z' virtual: true label: Natália Popović - offb spending_period: start_date: '2025-11-30' end_date: '2026-11-30' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 cardInvitationsList: summary: List of card invitations value: - id: 4016b891-bb50-4bd2-8a1b-adb74f4aacdd state: created created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-21T00:00:00Z' expiry_date: '2025-12-06T00:00:00Z' holder_id: 3791712d-e5b5-4d5f-b1f1-79a93d57e08b virtual: true label: Dariel Pattie spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: end_date: '2026-12-31' end_date_action: lock categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 26a852b8-4046-4e71-949d-22f4cb6be26a - id: 809d745d-9598-4680-8464-d82113e9024b state: redeemed created_at: '2025-11-21T00:00:00Z' updated_at: '2025-11-23T09:01:13Z' card_id: 744b29d4-19e9-40f8-89e6-bfb264ef5710 holder_id: 19c76bef-3583-4848-af09-4b2a96c75a14 virtual: true label: Manuel Haleigh - WFH spend_program: label: WFH equipment spending_period: start_date: '2025-11-23' end_date: '2025-12-23' end_date_action: terminate categories: - furniture - hardware countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 - id: 0c0d252e-5fff-498e-83f8-f9b635904275 state: expired created_at: '2025-11-22T00:00:00Z' updated_at: '2025-11-30T00:00:00Z' holder_id: 5ea0ffa1-5dc5-43c4-ac5e-b9e0deb9ec12 virtual: true label: Valeria Keone - meals spending_limits: single: amount: 50 currency: GBP week: amount: 250 currency: GBP spending_period: start_date: '2025-11-29' end_date: '2025-12-29' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 - id: 9ab6019a-6a26-41f8-b034-44b591f8b1a8 state: failed created_at: '2025-11-27T00:00:00Z' updated_at: '2025-11-27T00:00:00Z' holder_id: af686385-4ec0-4139-a4a0-963ee9fa5bc8 virtual: true label: Connor Thato - meals spending_period: start_date: '2025-12-01' end_date: '2026-01-01' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 - id: bfc40b73-1e8b-4cba-ad7d-2f54ee707a21 state: failed created_at: '2025-11-28T00:00:00Z' updated_at: '2025-12-02T11:31:15Z' virtual: true label: Natália Popović - offb spending_period: start_date: '2025-11-30' end_date: '2026-11-30' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 14c8d663-2093-4086-96ed-334a4011333f - 06e0f7fa-38a2-4fcf-a115-df5caf190b55 countries: - GB accounts: - 6b472c0e-f595-4681-88b4-76eaa0522824 cardsListSimple: summary: List of cards - virtual and physical value: - id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_limits: single: amount: 200.22 currency: GBP month: amount: 200.44 currency: GBP spending_period: start_date: '2025-09-20' end_date: '2026-12-20' end_date_action: terminate categories: - restaurants - groceries merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 - id: b8b56da4-1fde-4320-a8d7-cb7560252f7e created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' virtual: false last_digits: '2672' expiry: 09/2030 state: active cardIndividualCreate: summary: Team member card value: request_id: 7a10f3eb-fe56-4699-9bd0-044a63508828 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 virtual: true label: Kirby Janette spending_limits: single: amount: 200.22 currency: GBP week: amount: 200.44 currency: GBP spending_period: end_date: '2026-12-15' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardWithMccControlsCreate: summary: Team member card with MCC controls value: request_id: 8b21f4fc-af67-578a-0ce1-15bd3e7719e7 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 virtual: true label: Kirby Janette mcc_controls: control_type: allow mccs: - '5411' - '7011' countries: - GB accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardWithAllControlsCreate: summary: Team member card with categories, merchant controls, and MCC controls value: request_id: 9c32f5ad-b078-689b-1df2-26ce4f882af8 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 virtual: true label: Kirby Janette categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d mcc_controls: control_type: allow mccs: - '5411' - '7011' countries: - GB accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardIndividualDetails: summary: Team member card value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_limits: single: amount: 200.22 currency: GBP spending_period: end_date: '2026-12-15' end_date_action: terminate week: amount: 200.44 currency: GBP categories: - restaurants - groceries merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardCompanyCreate: summary: Company card value: request_id: 7a10f3eb-fe56-4699-9bd0-044a63508829 contact_ids: - 3ea984a5-d599-4c97-b2b3-c6c12bb9b5e9 - 02b969cb-b984-4a70-873d-f93220805e5e - 36d9604d-4821-45fc-bf1a-a2881f6336c0 virtual: true label: Engagement team spending_limits: single: amount: 200 currency: GBP week: amount: 1000 currency: GBP spending_period: end_date: '2026-12-15' end_date_action: terminate categories: - accommodation merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardCompanyDetails: summary: Company card value: id: 448b9493-8bd7-48f9-a7ce-59293b5118ec contact_ids: - 3ea984a5-d599-4c97-b2b3-c6c12bb9b5e9 - 02b969cb-b984-4a70-873d-f93220805e5e - 36d9604d-4821-45fc-bf1a-a2881f6336c0 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' virtual: true last_digits: '4321' expiry: 09/2030 label: Engagement team state: active spending_limits: single: amount: 200 currency: GBP week: amount: 1000 currency: GBP spending_period: end_date: '2026-12-15' end_date_action: terminate categories: - accommodation merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardAutogeneratedCreate: summary: Auto-issued card value: request_id: 7a10f3eb-fe56-4699-9bd0-044a63508830 product: code: MBJ virtual: true label: Reservation 123456 references: - name: PNR value: RT12345 - name: Traveller value: John Smith spending_limits: single: amount: 1500 currency: GBP week: amount: 3000 currency: GBP spending_period: end_date: '2026-12-15' end_date_action: terminate categories: - airlines merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardAutogeneratedDetails: summary: Auto-issued card value: id: f296f3b6-d28c-44e7-aae5-3d540e6a20e9 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' product: code: MBJ virtual: true last_digits: '9876' expiry: 09/2030 label: Reservation 123456 references: - name: PNR value: RT12345 - name: Traveller value: John Smith state: active spending_limits: single: amount: 1500 currency: GBP week: amount: 3000 currency: GBP spending_period: end_date: '2026-12-15' end_date_action: terminate categories: - airlines merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardWithSpendingPeriodStartDateCreate: summary: Card with a spending period start date value: request_id: 7a10f3eb-fe56-4699-9bd0-044a63508831 holder_id: d2d68875-55b4-42d9-a816-19449b8e0840 virtual: true label: Kim Took spending_limits: single: amount: 200.22 currency: GBP week: amount: 200.44 currency: GBP spending_period: start_date: '2025-11-16' end_date: '2026-12-15' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardWithSpendingPeriodStartDateDetails: summary: Card with a spending period start date value: id: e466e17f-7727-46b3-be0f-56acf9209195 holder_id: d2d68875-55b4-42d9-a816-19449b8e0840 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' virtual: true last_digits: '1289' expiry: 09/2030 label: Kim Took state: locked can_be_unlocked: true spending_limits: single: amount: 200.22 currency: GBP week: amount: 200.44 currency: GBP spending_period: start_date: '2025-11-16' end_date: '2026-12-15' end_date_action: terminate categories: - groceries - restaurants merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardWithSpendProgramDetails: summary: Card with a spend program value: id: f9bea0b8-ddbd-47c8-bccd-40c60c8fa266 contact_ids: - 3ea984a5-d599-4c97-b2b3-c6c12bb9b5e9 - 02b969cb-b984-4a70-873d-f93220805e5e - 36d9604d-4821-45fc-bf1a-a2881f6336c0 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' virtual: true last_digits: '3467' expiry: 09/2030 label: Company lunches state: locked spend_program: label: Lunch merchant_controls: control_type: allow merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB accounts: - 75aa436d-2a04-4ab9-af14-ed0955769b8c cardPhysicalDetails: summary: Physical card details value: id: b8b56da4-1fde-4320-a8d7-cb7560252f7e created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-15T11:04:11.047305Z' virtual: false last_digits: '2672' expiry: 09/2030 state: active cardTerminatedDetails: summary: Terminated card details value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-18T09:15:22.031844Z' terminated_at: '2025-09-17T14:22:18.113202Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: terminated spending_limits: single: amount: 200.22 currency: GBP month: amount: 200.44 currency: GBP spending_period: start_date: '2025-09-20' end_date: '2026-12-20' end_date_action: terminate categories: - restaurants - groceries merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardUpdatedAllPropertiesDetails: summary: Update all properties value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: New card label state: locked spending_limits: single: amount: 100 currency: GBP week: amount: 300 currency: GBP spending_period: start_date: '2025-09-18' end_date: '2026-12-20' end_date_action: lock categories: - services - shopping - furniture merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 - 3f09819f-63d1-473a-966c-54d8b9f43a93 countries: - GB - SG - ES accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 - 9ae4345a-5ee5-496b-b776-241fcc5a5ba4 cardUpdatedEraseSpendingPeriodStartDateDetails: summary: Erase spending period start date value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_period: end_date: '2026-12-20' end_date_action: lock categories: - restaurants - groceries accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardUpdatedEraseAllSpendingLimitsDetails: summary: Erase all spending limits value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active categories: - restaurants - groceries accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardUpdatedEraseSingleTransactionLimitDetails: summary: Erase the single-transaction limit value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_limits: month: amount: 200.44 currency: GBP categories: - restaurants - groceries accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardUpdatedAllowSpecificMerchantsDetails: summary: Allow only specific merchants value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_limits: single: amount: 200.22 currency: GBP month: amount: 200.44 currency: GBP merchant_controls: control_type: allow merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardVirtualDetails: summary: Virtual card details value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_limits: single: amount: 200.22 currency: GBP month: amount: 200.44 currency: GBP spending_period: start_date: '2025-09-20' end_date: '2026-12-20' end_date_action: terminate categories: - restaurants - groceries merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 cardWithSpendLimitUsage: summary: Card with spending limit utilisation value: id: aa14a9af-d7a7-4214-a743-10b818f74bd0 holder_id: 173ab846-de2a-1234-5678-160bd2e660e6 created_at: '2025-09-15T11:04:11.047305Z' updated_at: '2025-09-17T08:32:11.024721Z' virtual: true last_digits: '2671' expiry: 09/2030 label: Kirby Janette state: active spending_limits: single: amount: 200.22 currency: GBP month: amount: 200.44 currency: GBP usage: 125.3 spending_period: start_date: '2025-09-20' end_date: '2026-12-20' end_date_action: terminate categories: - restaurants - groceries merchant_controls: control_type: block merchant_ids: - 46df0a1b-3678-4ded-9cf5-9f4da1b5019d - e8a87432-f71e-4deb-be84-969a02792929 countries: - GB - SG accounts: - f52c6c84-26b9-4e95-bbcf-99ed6523fb51 CardContacts: summary: Company card contacts (max.5) value: - 3ea984a5-d599-4c97-b2b3-c6c12bb9b5e9 - 02b969cb-b984-4a70-873d-f93220805e5e - 36d9604d-4821-45fc-bf1a-a2881f6336c0 CardReferences: summary: References for the card (max.5) value: - name: Budget value: Engagement - name: Department value: Business errorUnauthorized: summary: Unauthorized value: status: 401 message: The request should be authorized. payoutLinkActive: id: 12dcd8c2-6408-458f-98a9-3f4abc180898 state: active created_at: '2023-07-11T13:55:54.834963Z' updated_at: '2023-07-11T13:55:55.082655Z' counterparty_name: John Smith request_id: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dd1 expiry_date: '2023-07-18T13:55:55.082280Z' payout_methods: - revolut - bank_account - card account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 105.6 currency: GBP url: https://business.revolut.com/p/uSJVAd5SnP1 reference: Rent transfer_reason_code: property_rental payoutLinkProcessed: id: 8e32b08a-e012-4530-bd15-c4e9ebde953d state: processed created_at: '2024-01-11T14:02:53.472318Z' updated_at: '2024-01-11T14:05:02.962886Z' counterparty_name: Jane Doe request_id: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dMM expiry_date: '2023-07-18T14:02:53.717626Z' payout_methods: - revolut account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 5.6 currency: GBP counterparty_id: 2ef4618a-f258-4ac5-a846-ca6e089214f6 transaction_id: 64ad618e-655a-a925-8425-2284c03f6c08 reference: Bus ticket transfer_reason_code: travel payoutLinkCancelled: id: 12dcd8c2-6408-458f-98a9-3f4abc180898 state: cancelled created_at: '2023-07-11T13:55:54.834963Z' updated_at: '2023-07-11T15:01:20.236508Z' counterparty_name: John Doe request_id: 5a7fcb46-4be4-47d4-a56f-27a2e5b78dd1 expiry_date: '2023-07-18T13:55:55.082280Z' payout_methods: - revolut - bank_account account_id: 85f515e4-588f-4496-a6a5-a7615a193e6b amount: 105.6 currency: GBP reference: Rent transfer_reason_code: property_rental webhookV2BasicSelectedEvents: id: c6db947e-e9ce-41c2-b445-02e6eb741d21 url: https://www.example.com events: - TransactionCreated - PayoutLinkCreated webhookV2BasicAllEvents: id: 9f9919a2-932d-498f-a088-3a01b9080c4a url: https://www.revolut.com events: - TransactionCreated - TransactionStateChanged - PayoutLinkCreated - PayoutLinkStateChanged tags: - name: Accounting description: |- Manage [accounting settings](https://business.revolut.com/settings/accounting) for your business that can be assigned to your financial records such as [expenses](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses) or bills*. Create, retrieve, update, and delete settings such as accounting categories, tax rates, and labels. For more information, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings), [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories), [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates) and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups), . See also the Revolut Help Centre: [Expenses](https://help.revolut.com/business/help/managing-my-business/expenses/) and [BillPay](https://help.revolut.com/business/help/integrating-with-external-apps/introduction-to-billpay/). _*Some settings are not supported for certain types of financial records. For example, labels cannot be applied to bills. Check the guides for details. _ - name: Accounting categories description: |- Manage accounting categories for your business. You can create, retrieve, and delete accounting categories that can be assigned to your financial records such as [expenses](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses) or bills. For more information, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories). See also the Revolut Help Centre: [Expenses](https://help.revolut.com/business/help/managing-my-business/expenses/) and [BillPay](https://help.revolut.com/business/help/integrating-with-external-apps/introduction-to-billpay/). - name: Accounts description: |- Get the balances, full banking details, and other details of your business accounts. For more information, see the guides: [Get your account details](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/manage-your-accounts). - name: Cards description: |- Manage cards issued for your business, freeze, unfreeze, lock, unlock, terminate and update card settings, such as spending limits and merchant controls. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage cards for your business](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-cards). :::tip [Card invitations for onboarding team members] To prepare virtual cards for team members who have not completed onboarding yet, use [Card invitations](https://developer.revolut.com/docs/api/business#update-card-invitation) instead. ::: - name: Card invitations description: |- Use card invitations to pre-create cards for [team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members) who have not yet onboarded. Once the team member completes onboarding, the card is automatically issued as per the configuration specified in the invitation. You can also retrieve and update the invitations, or cancel them if they're no longer needed. :::note To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com). ::: For more information, see the guides: [Manage card invitations](https://developer.revolut.com/docs/guides/manage-accounts/cards/manage-card-invitations). - name: Counterparties description: |- Manage counterparties that you intend to transact with. Request and response examples can vary based on the account provider's location and type of the counterparty. For more information, see the guides: [Create a counterparty](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/create-a-counterparty), [Retrieve counterparties](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/retrieve-counterparties), and [Update a counterparty's payment method](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/update-counterparty-payment-method). :::note In the Sandbox environment, you cannot add real people and businesses as Revolut counterparties. Therefore, to help you simulate [Create a counterparty](https://developer.revolut.com/docs/api/business#add-counterparty) requests, we have created some test accounts for counterparties of profile type `personal`. To add a counterparty via Revtag, use one of these pairs for the `name` and `revtag` fields respectively: - `Test User 1` & `john1pvki` - `Test User 2` & `john2pvki` - ... - `Test User 9` & `john9pvki` ::: - name: Expenses description: |- Get the list of all the expenses, or use the filters to narrow down the results. You can also get a specific expense, or get a receipt related to an expense by providing their respective IDs. :::note This feature is not available in Sandbox. ::: For more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses). - name: Foreign exchange description: |- Retrieve information on exchange rates between currencies, buy and sell currencies. For more information, see the guides: [Exchange money](https://developer.revolut.com/docs/guides/manage-accounts/exchange-money). - name: Labels description: |- Manage accounting labels and label groups for your business. Create, retrieve, update, and delete label groups and labels that can be added to your financial records such as [expenses](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses). For more information, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings), and [Manage labels and label groups](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-labels-and-label-groups). See also the Revolut Help Centre: [Expenses](https://help.revolut.com/business/help/managing-my-business/expenses/). - name: Payment drafts description: |- Payment drafts let you prepare payments for future processing, prepare payments that require an approval, or prepare bulk or scheduled payments. Simply create a draft, and when you're ready, [send it for processing as payment](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts#send-drafts-for-processing). If you or the payment you're making is subject to an [approval process](https://help.revolut.com/business/help/managing-my-business/users-and-employees/how-can-i-set-payment-approval-rules/), another team member designated as an approver must approve it in the [Revolut Business app](https://business.revolut.com/) before the payment can be processed. You can also retrieve or delete the drafts created with the API. For more information on use cases and other details, see the guides: [Payment drafts](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts). - name: Payout links description: |- Use payout links to send money without having to request full banking details of the recipient. The recipient must claim the money before the link expires. :::note This feature is available in the UK, the EEA, AU, and SG. ::: For more information, see the guides: [Send money via payout link](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payout-links). - name: Simulations description: |- The Simulations API is only available in the Sandbox environment. It lets you simulate certain events that are otherwise only possible in the production environment, such as your account's top-up and transfer state changes. For more information, see the guides: [Test your flows with simulations (Sandbox only)](https://developer.revolut.com/docs/guides/manage-accounts/api-usage-and-testing/test-flows-with-simulations). :::note To play around with Sandbox, [create a Sandbox account](https://sandbox-business.revolut.com/). ::: - name: Tax rates description: |- Manage tax rates for your business. Create, retrieve, update, and delete tax rates that can be assigned to your financial records such as [expenses](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses) or bills. For more information, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage tax rates](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-tax-rates). See also the Revolut Help Centre: [Expenses](https://help.revolut.com/business/help/managing-my-business/expenses/) and [BillPay](https://help.revolut.com/business/help/integrating-with-external-apps/introduction-to-billpay/). - name: Teams description: |- Team management: invite, retrieve, update, suspend, and delete team members, and manage their roles. Manage departments, assign team members to departments and managers. For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members) and [Manage departments](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-departments). - name: Transactions description: |- Get the details of your transactions. :::note An incoming or outgoing payment is represented as a transaction. ::: For more information, see the guides: [Retrieve transactions](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-transactions). - name: Transfers description: |- Move funds in the same currency between accounts of your business, or make payments to your counterparties. For more details, see the guides: [Send money](https://developer.revolut.com/docs/guides/manage-accounts/transfers/send-money). - name: Webhooks (v1) (deprecated) description: |- :::warning This is the v1 of the Webhooks API. This version is deprecated. For the latest version of the API, see [Webhooks (v2)](https://developer.revolut.com/docs/api/business#tag-webhooks-v2). ::: A webhook (also called a web callback) allows your system to receive updates about your account to an HTTPS endpoint that you provide. When a supported event occurs, a notification is posted via HTTP `POST` method to the specified endpoint. If the receiver returns an HTTP error response, Revolut will retry the webhook event two more times. The following events are supported: - `TransactionCreated` - `TransactionStateChanged` You cannot choose which event type to subscribe to. When you create a webhook, you automatically subscribe to all supported events. - name: Webhooks (v2) description: |- :::note This is the latest version of the Webhooks API, v2. For the previous version of the API, see [Webhooks (v1) (deprecated)](https://developer.revolut.com/docs/api/business#tag-webhooks-v1-deprecated). ::: A webhook (also called a web callback) allows your system to receive updates about your account to an HTTPS endpoint that you provide. When a supported event occurs, a notification is posted via HTTP `POST` method to the specified endpoint. If the receiver returns an HTTP error response, Revolut will retry the webhook event three more times, each with a 10-minute interval. The following events are supported: - `TransactionCreated` - `TransactionStateChanged` - `PayoutLinkCreated` - `PayoutLinkStateChanged` For more information, see the guides: [About webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/about-webhooks) and [Manage webhooks](https://developer.revolut.com/docs/guides/manage-accounts/webhooks/manage-webhooks).