openapi: 3.0.1
info:
version: '1.0'
title: Business Accounting Counterparties API
description: "As a Revolut Business customer with a Business Account, you can use the Business API to automate your own business processes.\nSave time, reduce your costs, and avoid errors by using the Business API. \n\n:::tip[Before you get started]\nTo learn more about the Business API and its features, check the [**user guides**](https://developer.revolut.com/docs/guides/manage-accounts/introduction).\n\nYou can reach them at any time from the main navigation bar **→ Guides → Business**.\n:::\n\nYou can view accounts, manage counterparties, make payments or currency exchanges without manual effort in the Web UI:\n\n- Accounting: [Account management](https://developer.revolut.com/docs/api/business#get-account), [Accounting settings](https://developer.revolut.com/docs/api/business#tag-accounting), [Expense management](https://developer.revolut.com/docs/api/business#get-expense), [Transactions](https://developer.revolut.com/docs/api/business#get-transactions) \n- Payments: \n - [Counterparty management](https://developer.revolut.com/docs/api/business#get-counterparties)\n - Payment management: [Payment drafts](https://developer.revolut.com/docs/api/business#delete-payment-draft), [Payout links](https://developer.revolut.com/docs/api/business#get-payout-link), [Transfers](https://developer.revolut.com/docs/api/business#tag-transfers)\n - [Foreign exchange](https://developer.revolut.com/docs/api/business#tag-foreign-exchange)\n- Business team: [Card management](https://developer.revolut.com/docs/api/business#delete-card), [Card invitation management](https://developer.revolut.com/docs/api/business#update-card-invitation), [Team member management](https://developer.revolut.com/docs/api/business#delete-team-member)\n- Developer tools: [Sandbox simulations](https://developer.revolut.com/docs/api/business#tag-simulations), [Webhook management](https://developer.revolut.com/docs/api/business#tag-webhooks-v2)\n\nTo see the reference for the specific endpoints and operations of this API, browse the menu on the left.\n\n### Test the Business API\n\nYou can test the Business API in Postman by forking this collection:\n\n[](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)
tags:
- name: Counterparties
description: "Manage counterparties that you intend to transact with.\n\nRequest and response examples can vary based on the account provider's location and type of the counterparty. \nFor more information, see the guides: [Create a counterparty](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/create-a-counterparty), [Retrieve counterparties](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/retrieve-counterparties), and [Update a counterparty's payment method](https://developer.revolut.com/docs/guides/manage-accounts/counterparties/update-counterparty-payment-method).\n\n:::note\nIn the Sandbox environment, you cannot add real people and businesses as Revolut counterparties. \nTherefore, to help you simulate [Create a counterparty](https://developer.revolut.com/docs/api/business#add-counterparty) requests, we have created some test accounts for counterparties of profile type `personal`.\n\nTo add a counterparty via Revtag, use one of these pairs for the `name` and `revtag` fields respectively: \n- `Test User 1` & `john1pvki`\n- `Test User 2` & `john2pvki`\n- ...\n- `Test User 9` & `john9pvki`\n:::"
paths:
/account-name-validation:
post:
summary: Validate an account name (CoP/VoP)
operationId: validateAccountName
description: "Validate a counterparty's account name against their account details when [adding a counterparty](https://developer.revolut.com/docs/api/business#add-counterparty) or [making a transfer](https://developer.revolut.com/docs/api/business#create-payment) to a new or existing counterparty.\n\n:::warning\nThe CoP check is **not** a complete fraud-prevention tool, and it does **not** guarantee the person is who they claim to be.\nIt only confirms that the name and account details your provide match the bank's records.\n\nEven if the counterparty's details match, you should still exercise due caution when transferring funds.\n:::\n\n:::note[Availability & Sandbox behaviour]\n- 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).\n Additionally, to get access to CoP in the UK, eligible businesses must contact [Revolut API Support](mailto:api-requests@revolut.com).\n- In Sandbox, this feature is only available for **testing**.\n 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`.\n:::\n\nThe validation relies on different underlying services, depending on the recipient's payment scheme (region and currency).\nThese factors determine which fields you must provide and what response you get.\n- For examples, refer to the request body samples.\n- 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\n\n:::note\n- The actual results returned in the response come from the CoP services, not from Revolut.\n The Business API passes them on as received.\n\n Because of this, the descriptions below should be treated as an approximation rather than complete documentation.\n- The responses differ depending on the CoP service, even when the schema appears the same.\n Make sure that you refer to the appropriate response variant.\n:::"
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
/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. \n\nThe counterparties are sorted by the `created_at` date in reverse chronological order.\n\nThe returned counterparties are **paginated**. \nThe maximum number of counterparties returned per page is specified by the `limit` parameter.\nTo get to the next page, make a new request and use the `created_at` date of the last counterparty returned in the previous response.\n\nFor 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. \n\n:::note\nSpecial characters must be properly URL-encoded.\n:::"
- 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. \nOnly 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. \nOnly 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`.\nThe default value is the current date and time at which you are calling the endpoint. \n\nProvide it in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format."
- in: query
name: limit
schema:
type: integer
minimum: 1
maximum: 1000
default: 100
description: 'The maximum number of counterparties returned per page.
To get to the next page, make a new request and use the `created_at` date of the last counterparty returned in the previous response as the value for `created_before`.'
security:
- AccessToken:
- READ
responses:
'200':
description: List of your counterparties
content:
application/json:
schema:
$ref: '#/components/schemas/Counterparties'
examples:
all_counterparties:
summary: A list of your counterparties
value:
- id: 239d6f1f-2222-4ae6-1111-5cc603341b4e
name: Jane Doe Co.
profile_type: business
state: created
created_at: '2022-09-14T14:47:12.273718Z'
updated_at: '2022-09-14T14:47:12.273718Z'
accounts:
- iban: GB66REVO00996995908786
bic: REVOGB21
id: b209281b-aakk-9911-8d83-ac72469cef8f
name: Jane Doe Co.
bank_country: GB
currency: EUR
type: external
address:
street_line1: Revolut LTD
street_line2: 1 Canada Square
region: Greater London
city: London
country: GB
postcode: E14 5AB
- id: 8e0e9886-0af1-4b0c-acf4-111180d2892b
name: John Smith
revtag: johnsmith
profile_type: personal
country: GB
state: created
created_at: '2022-09-14T14:41:39.312017Z'
updated_at: '2022-09-14T14:41:39.312017Z'
- id: 11cae5ef-ec24-401d-98a3-e5baa0041671
name: John Smith Co.
revtag: jsmithco1
profile_type: business
country: GB
state: created
created_at: '2025-09-16T09:34:41.790401Z'
updated_at: '2025-09-16T09:34:41.790401Z'
accounts:
- id: ad3c3b03-611e-461e-99b2-572f4785e44b
name: Main GBP
currency: GBP
type: revolut
- id: 67fe3eaa-c994-40c0-b3e0-7b6bfe0cedca
name: Main EUR
currency: EUR
type: revolut
- id: e7e36cce-2e9c-4e96-818e-1c2fed325852
name: John Doe Co.
profile_type: business
state: created
created_at: '2022-08-14T14:34:11.168340Z'
updated_at: '2022-08-14T14:34:11.168340Z'
accounts:
- account_no: '12345674'
sort_code: '540107'
id: e277b2bd-3a6d-423b-933d-3d425094bb13
name: John Doe Co.
bank_country: GB
currency: GBP
type: external
address:
street_line1: 7 King's Road
region: Greater London
city: London
country: GB
postcode: SW3 4PQ
- id: 239d6f1f-2222-4ae6-1111-5cc603341b4e
name: Bleu Blanc Conseil SARL
profile_type: business
state: created
created_at: '2022-09-14T14:47:12.273718Z'
updated_at: '2022-09-14T14:47:12.273718Z'
accounts:
- iban: FR1420041010050500013M02606
bic: PSSTFRPPLIL
id: b209281b-aakk-9911-8d83-ac72469cef8f
name: Bleu Blanc Conseil SARL
bank_country: FR
currency: EUR
type: external
address:
street_line1: 12 Rue de la Paix
city: Paris
country: FR
postcode: '75002'
- id: b8ce3922-d518-4ae6-9426-e8cc117e5332
name: Johann Meier Co.
profile_type: business
state: created
created_at: '2023-08-10T12:43:20.273500Z'
updated_at: '2026-01-30T12:43:20.273500Z'
accounts:
- iban: CH9300762011623852957
bic: UBSWCHZH80A
id: d95bc455-f495-4f18-95fa-32f99479318c
name: Johann Meier Co.
bank_country: CH
currency: EUR
type: external
address:
street_line1: Bahnhofstrasse 10
city: Zurich
country: CH
postcode: '8001'
- id: 173e6a6b-d955-465f-8f31-7f6f7c03927c
name: Edelweiss Handel GmbH
profile_type: business
state: created
created_at: '2023-08-10T12:43:20.273500Z'
updated_at: '2026-01-32T10:54:03.350240Z'
accounts:
- iban: CH5604835012345678009
bic: UBSWCHZH80A
id: b3cc43e8-f141-459b-9bd5-3505cf9797f8
name: Edelweiss Handel GmbH
bank_country: CH
currency: CHF
type: external
address:
street_line1: Marktgasse 22
city: Bern
country: CH
postcode: '3011'
- id: 1d9013c8-84bf-474c-b3d9-690f2ae2e65c
name: Jane Doe
state: created
created_at: '2024-01-10T15:32:10.172300Z'
updated_at: '2024-01-10T15:32:10.172300Z'
cards:
- id: 0130f363-eeaf-4aa8-b77f-a6a629c603f5
name: Jane Doe
last_digits: 1234
scheme: visa
country: GB
currency: GBP
- id: fa05f2e5-d253-4661-85cc-bcff98b136ac
name: Jane Doe
last_digits: 5678
scheme: mastercard
country: GB
currency: GBP
no_search_results:
summary: No matching search results
value: []
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
bad_limit:
summary: Bad limit
value:
message: limit must be between 1 and 1000
code: 2101
bic_only_allowed_with_iban:
summary: BIC can be used only in combination with IBAN
value:
message: bic param can be used only combined with iban param
# --- truncated at 32 KB (90 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/revolut/refs/heads/main/openapi/revolut-counterparties-api-openapi.yml