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/manage-accounts/).

    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/business/accounts), [Accounting settings](https://developer.revolut.com/docs/business/accounting), [Expense management](https://developer.revolut.com/docs/business/expenses), [Transactions](https://developer.revolut.com/docs/business/transactions) 
    - Payments: 
      - [Counterparty management](https://developer.revolut.com/docs/business/counterparties)
      - Payment management: [Payment drafts](https://developer.revolut.com/docs/business/payment-drafts), [Payout links](https://developer.revolut.com/docs/business/payout-links), [Transfers](https://developer.revolut.com/docs/business/transfers)
      - [Foreign exchange](https://developer.revolut.com/docs/business/foreign-exchange)
    - Business team: [Card management](https://developer.revolut.com/docs/business/cards), [Card invitation management](https://developer.revolut.com/docs/business/card-invitations), [Team member management](https://developer.revolut.com/docs/business/team-members)
    - Developer tools: [Sandbox simulations](https://developer.revolut.com/docs/business/simulations), [Webhook management](https://developer.revolut.com/docs/business/webhooks-v-2)

    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/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/business/add-counterparty) or [making a transfer](https://developer.revolut.com/docs/business/create-payment) to a new or existing counterparty.

        :::caution
        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
                    individual_name:
                      first_name: Alexandru
                      last_name: I.
                match_company_ro:
                  summary: (RO) Account found, partial name returned for company
                  value:
                    result_code: matched
                    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
        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'
                - 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'
        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'
        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:
    servers:
      - url: https://b2b.revolut.com/api/1.0
        description: Production server (uses live data)
    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
        - This feature is not available in Sandbox.
        - 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.

                    :::caution
                    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/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.

                    :::note
                    The `categories` and `merchant_controls` parameters have the following restrictions:
                    - If you set `categories`, you **cannot** set `merchant_controls.control_type` to `allow`.
                    - You **can** set `merchant_controls.control_type` to `block`.
                    - You may also set **either** `categories` or `merchant_controls` independently, or **set neither**.
                    - Both parameters can be used together **only** if `merchant_controls.control_type` is `block`.
                    :::
                  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: 
                    - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set).
                    - `block`: blocks the specified merchants (can be used with or without `categories`).
                  type: object
                  $ref: '#/components/schemas/MerchantControlsSchema'
                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/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'
      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
                categories_and_allowed_merchants_cannot_coexist:
                  summary: Cannot set both categories and allowed merchants
                  value:
                    code: 2101
                    message: Allowed merchant categories must be empty when merchant controls of type ALLOW is present
                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
        - This feature is not available in Sandbox.
        - 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}:
    servers:
      - url: https://b2b.revolut.com/api/1.0
        description: Production server (uses live data)
    get:
      summary: Retrieve card invitation details
      operationId: getCardInvitation
      description: |-
        Get the details of a specific card invitation, based on its ID.

        :::note
        - This feature is not available in Sandbox.
        - 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
        - This feature is not available in Sandbox.
        - To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com).
        :::

        :::caution
        Some spend control parameters can affect one another.
        When updating spend controls, review the resulting settings in the response to ensure they reflect the configuration you intended.
        :::

        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).

                    :::note
                    The `categories` and `merchant_controls` parameters have the following restrictions:
                    - If you set `categories`, you **cannot** set `merchant_controls.control_type` to `allow`.
                    - You **can** set `merchant_controls.control_type` to `block`.
                    - You may also set **either** `categories` or `merchant_controls` independently, or **set neither**.
                    - Both parameters can be used together **only** if `merchant_controls.control_type` is `block`.
                    :::
                  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:
                    - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set).
                    - `block`: blocks the specified merchants (can be used with or without `categories`).
                  type: object
                  $ref: '#/components/schemas/MerchantControlsSchema'
                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/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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      summary: Cancel a card invitation
      operationId: cancelCardInvitation
      description: |-
        Cancel a specific card invitation, based on its ID.

        :::note
        - This feature is not available in Sandbox.
        - 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:
    servers:
      - url: https://b2b.revolut.com/api/1.0
        description: Production server (uses live data)
    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.

        :::note
        - This feature is not available in Sandbox.
        - 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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - 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.

                    :::caution
                    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/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/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/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/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.

                    :::note
                    The `categories` and `merchant_controls` parameters have the following restrictions:
                    - If you set `categories`, you **cannot** set `merchant_controls.control_type` to `allow`.
                    - You **can** set `merchant_controls.control_type` to `block`.
                    - You may also set **either** `categories` or `merchant_controls` independently, or **set neither**.
                    - Both parameters can be used together **only** if `merchant_controls.control_type` is `block`.
                    :::
                  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: 
                    - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set).
                    - `block`: blocks the specified merchants (can be used with or without `categories`).
                  type: object
                  $ref: '#/components/schemas/MerchantControlsSchema'
                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/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'
      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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      summary: Retrieve card details
      operationId: getCard
      description: |-
        Get the details of a specific card, based on its ID.

        :::note
        - This feature is not available in Sandbox.
        - 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/CardResponse'
              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'
        '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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      summary: Update card settings
      operationId: updateCard
      description: |-
        Update settings for a specific card, based on its ID.

        :::note
        - This feature is not available in Sandbox.
        - To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com).
        :::

        :::caution
        Some spend control parameters can affect one another.
        When updating spend controls, review the resulting settings in the response to ensure they reflect the configuration you intended.
        :::

        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/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).

                    :::note
                    The `categories` and `merchant_controls` parameters have the following restrictions:
                    - If you set `categories`, you **cannot** set `merchant_controls.control_type` to `allow`.
                    - You **can** set `merchant_controls.control_type` to `block`.
                    - You may also set **either** `categories` or `merchant_controls` independently, or **set neither**.
                    - Both parameters can be used together **only** if `merchant_controls.control_type` is `block`.
                    :::
                  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:
                    - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set).
                    - `block`: blocks the specified merchants (can be used with or without `categories`).
                  type: object
                  $ref: '#/components/schemas/MerchantControlsSchema'
                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/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/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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      summary: Terminate a card
      operationId: deleteCard
      description: |-
        Terminate a specific card, based on its ID.

        Once the card is terminated, it will not be returned by the API.

        A successful response does not get any content in return.

        :::note
        - This feature is not available in Sandbox.
        - 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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - 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.

        :::caution
        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/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.
          :::caution
          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.

            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 a list of contacts, such as: `["3ea984a5-d599-4c97-b2b3-c6c12bb9b5e9", "abc", "36d9604d-4821-45fc-bf1a-a2881f6336c0", ...]`, the first item (`3ea984a5-d599-4c97-b2b3-c6c12bb9b5e9`) has index `0`, the second item (`abc`) has index `1`, and so on.
            In the example, `abc` is invalid, because contacts must be UUIDs.
            In such a case, the error will indicate that `contact_ids[1]` is invalid, thus pointing to the second item in the array, i.e. `abc`.
          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: 'Invalid value for ''contact_ids[0]'': expected UUID.'
                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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      summary: Update card references
      operationId: updateCardReferences
      description: |-
        Update the list of [references (`references`)](https://developer.revolut.com/docs/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
        - This feature is not available in Sandbox.
        - 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.

        :::caution
        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/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.
          :::caution
          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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - 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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - 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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - 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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - To increase your account's card limits, please contact [Revolut API Support](mailto:api-requests@revolut.com).
        :::

        ::::::caution
        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/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/business/unlock-card) the card.
        4. [Update](https://developer.revolut.com/docs/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/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:
      servers:
        - url: https://b2b.revolut.com/api/1.0
          description: Production server (uses live data)
      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
        - This feature is not available in Sandbox.
        - 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
                    - 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
                    - 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
                    - 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
                    - 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
                    - 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.

        <details id='test-accounts-for-sandbox'>
          <summary> 
          <b>Test accounts for Sandbox</b>
          </summary>

          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`

        </details>

        ### 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.

        <table>
          <thead>
            <tr>
              <th rowSpan="2"> Counterparty type</th>
              <th colSpan="2">Name field to use when added with:</th>
            </tr>
            <tr>
              <th>Revtag</th>
              <th>Other details</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <th>Individual</th>
              <td><code>name</code> (string)</td>
              <td><code>individual_name</code> (<b>object</b> with string subfields for first and last name)</td>
            </tr>
            <tr>
              <th>Company</th>
              <td><code>name</code> (string)</td>
              <td><code>company_name</code> (string)</td>
            </tr>
          </tbody>
        </table>

        ---

        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'
  /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
                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: '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
                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
                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
  /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/business/exchange-money) or [making a payment](https://developer.revolut.com/docs/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 `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
      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'
                      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: Groceries
                        code: '555'
                      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'
                      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
                      tax_rate:
                        id: 728980d1-aa76-44f5-8902-53520160bfeb
                        name: 20% Fuel bills
                        percentage: 20
                  labels: {}
                  receipt_ids: []
                  spent_amount:
                    amount: 25.99
                    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 `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'
                        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: Groceries
                          code: '555'
                        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_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'
                        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'
                        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: {}
                    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/business/business-api#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/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/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/business/business-api#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/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/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 created with the API that haven't been [sent for processing](https://developer.revolut.com/docs/guides/manage-accounts/transfers/payment-drafts#send-drafts-for-processing).

        :::note
        Payment drafts created through the [Revolut Business app](https://business.revolut.com/) are not retrieved by the API.
        :::

        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
      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
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      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/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/Error'
              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/Error'
  /payment-drafts/{payment_draft_id}:
    get:
      summary: Retrieve a payment draft
      operationId: getPaymentDraft
      description: |-
        Get the information about a specific payment draft by ID.

        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/Error'
    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/Error'
  /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). Possible states are:
            - `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.

            Use for filtering to retrieve only links in specified states.
            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:
                    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
                processed_payout_link:
                  summary: Processed payout link
                  value:
                    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
                cancelled_payout_link:
                  summary: Cancelled payout link
                  value:
                    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
        '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/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:
        - Team members
      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'
        '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, 1000].'
        '401':
          description: |-
            Unauthorized

            Returned when the request was not fulfilled because authentication has failed or has not been provided
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 401
                message: The request should be authorized.
        '403':
          description: |-
            Action forbidden

            Returned, for example, when you don't have permissions necessary to retrieve team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 9002
                message: This action is forbidden
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    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:
        - Team members
      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/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/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/Error'
              examples:
                invalid_role_id_uuid:
                  summary: Invalid role ID (UUID)
                  value:
                    code: 3053
                    message: Business role 0098ac28-b92f-435e-a3a2-2829d3918dfb not found
                invalid_role_id_default:
                  summary: Invalid role ID (non-UUID)
                  value:
                    code: 3402
                    message: 'Invalid role: nonexistent_role_id'
                invalid_email:
                  summary: Invalid email address
                  value:
                    code: 3000
                    message: 'Invalid email address: (masked) ****.*******.*******.***'
        '401':
          description: |-
            Unauthorized

            Returned when the request was not fulfilled because authentication has failed or has not been provided
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 401
                message: The request should be authorized.
        '403':
          description: |-
            Action forbidden

            Returned, for example, when you don't have permissions necessary to invite team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 9002
                message: This action is forbidden
        '422':
          description: Team member with the given email cannot be invited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                user_already_invited:
                  summary: Team member already invited
                  value:
                    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:
                    code: 33008
                    message: Team member with given email cannot be invited.
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /team-members/{team_member_id}:
    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:
        - Team members
      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':
          description: |-
            Unauthorized

            Returned when the request was not fulfilled because authentication has failed or has not been provided
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 401
                message: The request should be authorized.
        '403':
          description: |-
            Action forbidden

            Returned, for example, when you don't have permissions necessary to delete team members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 9002
                message: This action is 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/Error'
              example:
                code: 3006
                message: Resource not found
        '422':
          description: Cannot modify owner
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 3547
                message: Cannot modify owner
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /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:
        - Team members
      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/Error'
              example:
                code: '2101'
                message: 'Parameter limit must be a valid integer in range: [1, 1000].'
        '401':
          description: |-
            Unauthorized

            Returned when the request was not fulfilled because authentication has failed or has not been provided
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 401
                message: The request should be authorized.
        '403':
          description: |-
            Action forbidden

            Returned, for example, when you don't have permissions necessary to retrieve roles
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: 9002
                message: This action is forbidden
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /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 transaction data](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.
      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.
                    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'
                - 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
        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.
        The details can include, for example, cardholder details for card payments.

        You can retrieve a transaction with its details either by its **transaction ID** or 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/business/create-payment).

        - To retrieve a transaction by its **transaction ID**, use:

          `/transaction/{transaction_id}`

        - To retrieve a transaction by a **request ID** provided at transaction creation, use:

          `/transaction/{request_id}?id_type=request_id`

          :::caution 
          Due to idempotency expiry, only transactions created within the last 2 weeks can be retrieved using their `request_id`.
          :::

        For more details, see the guides: [Retrieve transaction data](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 ID of the transaction, or the [request ID](https://developer.revolut.com/docs/business/create-payment#response) provided at payment creation if `id_type` = `request_id`.
          schema:
            type: string
        - name: id_type
          in: query
          required: false
          description: The type of the ID to retrieve the transaction by.
          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.
                      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'
                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
                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
                      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:
            - the specified `charge_bearer` is not supported
            - the transfer reason is required and `transfer_reason_code` is missing
            - the exchange reason is required and `exchange_reason_code` is missing
            - a duplicate `request_id` is being used
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                unsupported_charge_bearer:
                  summary: Unsupported charge_bearer
                  value:
                    code: 3287
                    message: Specified 'charge_bearer' is not supported for this transaction.
                missing_transfer_reason_code:
                  summary: Missing transfer_reason_code
                  value:
                    code: 4100
                    message: Please provide a reason for the transaction.
                missing_exchange_reason_code:
                  summary: Missing exchange_reason_code
                  value:
                    code: 3448
                    message: Exchange reason is required
                duplicate_request:
                  summary: Duplicate request_id
                  value:
                    code: 3020
                    message: 'Duplicate request: 1f0f3850-9627-42de-8ad4-a2c497c37d0b'
        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/business/create-payment) or [creating a payout link](https://developer.revolut.com/docs/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 <your_access_token>`.

        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.

          :::caution
          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/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.
      required:
        - id
        - balance
        - currency
        - state
        - public
        - created_at
        - updated_at
    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:
            - **`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:
            - **`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:
            - **`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:
            - **`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, provided 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
    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:
        - **`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.
    CardInvitationSpendProgram:
      $ref: '#/components/schemas/SpendProgram'
    CardInvitationSpendingLimits:
      $ref: '#/components/schemas/SpendingLimits'
    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'
    CardInvitationMerchantControls:
      description: |-
        The merchant-level controls for card spending.

        They block or allow the card to only transact with specific merchants: 
        - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set)
        - `block`: blocks the specified merchants (can be used with or without `categories`)
      type: object
      $ref: '#/components/schemas/MerchantControlsSchema'
    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/SpendingLimits'
        spending_period:
          $ref: '#/components/schemas/CardInvitationSpendingPeriod'
        categories:
          $ref: '#/components/schemas/CardInvitationCategories'
        merchant_controls:
          $ref: '#/components/schemas/CardInvitationMerchantControls'
        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/SpendingLimits'
        spending_period:
          $ref: '#/components/schemas/CardInvitationSpendingPeriod'
        categories:
          $ref: '#/components/schemas/CardInvitationCategories'
        merchant_controls:
          $ref: '#/components/schemas/CardInvitationMerchantControls'
        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/SpendingLimits'
        spending_period:
          $ref: '#/components/schemas/CardInvitationSpendingPeriod'
        categories:
          $ref: '#/components/schemas/CardInvitationCategories'
        merchant_controls:
          $ref: '#/components/schemas/CardInvitationMerchantControls'
        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:
          type: string
          description: The ID of the card.
          format: uuid
        holder_id:
          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
        contact_ids:
          $ref: '#/components/schemas/CardContacts'
        created_at:
          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
        updated_at:
          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
        product:
          $ref: '#/components/schemas/CardProduct'
        virtual:
          type: boolean
          description: Specifies whether the card is virtual (`true`) or physical (`false`).
        last_digits:
          type: string
          description: The last 4 digits of the card's PAN.
          pattern: ^[0-9]{4}$
        expiry:
          type: string
          format: DD/YYYY
          description: The card expiration date.
          pattern: ^[0-9]{2}/[0-9]{4}$
        label:
          type: string
          description: The label of the card.
        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/SpendingLimits'
        spending_period:
          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'
        categories:
          type: array
          description: |-
            The list of merchant categories that are available for card spending.             
            If this parameter is not specified, categories are not restricted.
          items:
            $ref: '#/components/schemas/BusinessMerchantCategory'
        merchant_controls:
          description: |-
            The merchant-level controls for card spending.

            They block or allow the card to only transact with specific merchants: 
            - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set)
            - `block`: blocks the specified merchants (can be used with or without `categories`)
          type: object
          $ref: '#/components/schemas/MerchantControlsSchema'
        countries:
          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
        accounts:
          type: array
          description: The list of linked accounts.
          items:
            type: string
            format: uuid
      required:
        - id
        - created_at
        - updated_at
        - virtual
        - last_digits
        - expiry
        - state
        - accounts
    CardResponse:
      type: object
      properties:
        id:
          type: string
          description: The ID of the card.
          format: uuid
        holder_id:
          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
        contact_ids:
          $ref: '#/components/schemas/CardContacts'
        created_at:
          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
        updated_at:
          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
        product:
          $ref: '#/components/schemas/CardProduct'
        virtual:
          type: boolean
          description: Specifies whether the card is virtual (`true`) or physical (`false`).
        last_digits:
          type: string
          description: The last 4 digits of the card's PAN.
          pattern: ^[0-9]{4}$
        expiry:
          type: string
          format: DD/YYYY
          description: The card expiration date.
          pattern: ^[0-9]{2}/[0-9]{4}$
        label:
          type: string
          description: The label of the card.
        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/SpendingLimits'
        spending_period:
          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'
        categories:
          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'
        merchant_controls:
          description: |-
            The merchant-level controls for card spending.

            They block or allow the card to only transact with specific merchants: 
            - `allow`: permits only the specified merchants (cannot be used if the `categories` parameter is set)
            - `block`: blocks the specified merchants (can be used with or without `categories`)
          type: object
          $ref: '#/components/schemas/MerchantControlsSchema'
        countries:
          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
        accounts:
          type: array
          description: The list of linked accounts.
          items:
            type: string
            format: uuid
      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.
    CardCanBeUnlocked:
      type: boolean
      description: |-
        Returned for locked cards (`state=locked`).
        Indicates whether the card can be [unlocked](https://developer.revolut.com/docs/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'
    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/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/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/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/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
    CardState:
      enum:
        - created
        - pending
        - active
        - frozen
        - locked
      description: |-
        The state that the card is in.

        Possible values:
        - `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/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/business/unlock-card) and active.
          :::tip
          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.
          :::
        - `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.
      type: string
    Category:
      type: object
      description: The [accounting category](https://developer.revolut.com/docs/business/accounting-categories) 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
      description: |-
        The party to which any transaction fees are charged if the resulting transaction route has associated fees. 
        Some transactions with fees might not be possible with the specified option, in which case error `3287` is returned.
    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.
        recipient_charges:
          enum:
            - 'no'
            - expected
          description: |-
            Indicates the possibility of the recipient charges.

            :::caution
            This field is deprecated and should be disregarded.
            It is returned for legacy purposes only.
            :::
          type: string
          deprecated: true
      required:
        - id
        - currency
        - type
    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/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
    CreateCounterpartyRequest:
      type: object
      description: ''
      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.

            :::caution
            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'
    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/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
          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
    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.

            :::caution
            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.'
    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/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.

            :::caution
            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/business/team-members) 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/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/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/business/get-transaction#response)).
            - Otherwise, it is the date and time of its creation ([`created_at`](https://developer.revolut.com/docs/business/get-transaction#response)).

            For reimbursements, it's the payment date provided in the reimbursement request.
        labels:
          type: object
          description: |-
            The [labels](https://developer.revolut.com/docs/business/labels) 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.
          maxProperties: 5
          additionalProperties:
            $ref: '#/components/schemas/LabelGroup'
        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.
          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
        - 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'
        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:

          - `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
      description: The type of the [transaction](https://developer.revolut.com/docs/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'
    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.
    MerchantControlsSchema:
      type: object
      required:
        - control_type
        - merchant_ids
      properties:
        control_type:
          type: string
          enum:
            - block
            - allow
          description: The type of control to apply.
        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/business/get-transaction#response) or for [all transactions](https://developer.revolut.com/docs/business/get-transactions#response).
            :::
          items:
            type: string
            format: uuid
    LabelGroup:
      type: array
      minItems: 1
      maxItems: 1
      items:
        type: string
      description: A label group with the selected label from that group.
    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
    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'
      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.
        :::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/business/get-payment-drafts#response) or [transaction ID](https://developer.revolut.com/docs/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.
      required:
        - id
        - amount
        - account_id
        - receiver
        - 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.
      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
          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
          description: The amount of the payment.
        currency:
          $ref: '#/components/schemas/Currency'
        reference:
          type: string
          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: 
            - `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 error `3287`.
              To proceed with the default fee handling, remove this field from your request and try again.
            :::
          enum:
            - shared
            - debtor
      required:
        - account_id
        - receiver
        - amount
        - currency
        - reference
    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/business/get-counterparties). 
            However, you can still [retrieve this counterparty by its ID](https://developer.revolut.com/docs/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, where:
        - `revolut`: Revolut peer-to-peer (P2P) transfer
        - `bank_account`: External bank transfer
        - `card`: Card transfer
          :::note
          - This payout method is available in the UK and the EEA.
          - This payout method is not available in Sandbox.
          :::
      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:
        - `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.
      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
    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
    SpendingLimits:
      description: All spending limits set for the card.
      type: object
      $ref: '#/components/schemas/SpendingLimitsSchema'
    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
    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/business/tax-rates) 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/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
      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'
      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/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/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.
        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.

            :::caution[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.
            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'
      required:
        - request_id
        - account_id
        - receiver
        - amount
    TransactionState:
      enum:
        - created
        - pending
        - completed
        - declined
        - failed
        - reverted
      description: |-
        Indicates the transaction state. Possible values:
          - `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
      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/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.

            :::caution
            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/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
    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
    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
    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:
            - **`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 name is a match, but the account type is incorrect.
                For example, an individual recipient's name was provided under `company_name`.
                The **actual account type** is returned.
              - The name is similar to the provided values.
                Account type is correct.
                The **actual name** is returned.
              - The name is similar to the provided values, and the account type is incorrect.
                The **actual values** are returned.

              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.
      required:
        - result_code
    ValidateAccountNameResponseAU:
      title: AU
      type: object
      properties:
        result_code:
          description: |-
            The result of the check. 

            Possible values for AU:
            - **`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.
      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:
            - **`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.

            :::caution[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.

            :::caution[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.
      required:
        - result_code
    ValidateAccountNameResponseEUR:
      title: EUR
      type: object
      properties:
        result_code:
          description: |-
            The result of the check. 

            Possible values for EUR:
            - **`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.

            :::caution[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.

            :::caution[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.
      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: 9d66499d-3fc5-45e9-92f6-3ddcad4793c6
                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 <token>' 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
    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:
        - $ref: '#/components/examples/cardInvitationCreatedDetails/value'
        - $ref: '#/components/examples/cardInvitationRedeemedDetails/value'
        - $ref: '#/components/examples/cardInvitationExpiredDetails/value'
        - $ref: '#/components/examples/cardInvitationFailedDetails/value'
        - $ref: '#/components/examples/cardInvitationFailedNoHolderDetails/value'
    cardsListSimple:
      summary: List of cards - virtual and physical
      value:
        - $ref: '#/components/examples/cardVirtualDetails/value'
        - $ref: '#/components/examples/cardPhysicalDetails/value'
    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
    cardIndividualDetails:
      summary: Team member card
      value:
        id: aa14a9af-d7a7-4214-a743-lok818f74bd0
        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
    cardUpdatedAllPropertiesDetails:
      summary: Update all properties
      value:
        id: aa14a9af-d7a7-4214-a743-lok818f74bd0
        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-lok818f74bd0
        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-lok818f74bd0
        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-lok818f74bd0
        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-lok818f74bd0
        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-lok818f74bd0
        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
    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.
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/).

      _*<small>Some settings are not supported for certain types of financial records.
      For example, labels cannot be applied to bills.
      Check the guides for details.
      </small>_
  - 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
      - This feature is not available in Sandbox.
      - 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/business/card-invitations) 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
      - This feature is not available in Sandbox.
      - 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).

      :::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/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: Team members
    description: |-
      Retrieve information on existing team members of your organisation, delete team members, and invite new members.

      For more information, see the guides: [Manage team members](https://developer.revolut.com/docs/guides/manage-accounts/teams/manage-team-members).
  - 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/business/webhooks-v-2).
      :::

      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/business/webhooks-v-1-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).
