openapi: 3.0.1
info:
version: '1.0'
title: Business Accounting 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: 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>_'
paths:
/accounting-categories:
post:
summary: Create an accounting category
operationId: createAccountingCategory
description: 'Add a new accounting category to the list of accounting categories that can be assigned to your financial records, such as expenses.
:::note
This operation is not supported for [externally managed accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories#externally-managed-settings).
:::
For more details, see the guides: [Manage accounting settings](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-settings) and [Manage accounting categories](https://developer.revolut.com/docs/guides/manage-accounts/accounting/manage-accounting-categories).'
security:
- AccessToken:
- WRITE
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAccountingCategoryRequest'
examples:
category_with_default_tax_rate:
summary: Accounting category with default tax rate
value:
name: Transportation
code: '400'
default_tax_rate_id: e6b84ddb-a127-466b-9a0a-501bda07773f
category_without_default_tax_rate:
summary: Accounting category without default tax rate
value:
name: Office supplies
code: '410'
responses:
'201':
description: 'Resource created
On successful creation, the response returns only the ID of the new resource (i.e. the accounting category), even if the resource has more properties.
To get all the details of the accounting category, use the returned resource ID with a [GET request](https://developer.revolut.com/docs/api/business#get-accounting-category).'
$ref: '#/components/responses/ResourceCreatedResponse'
'400':
description: 'Bad Request
Returned, for example, when a required parameter is missing or malformatted.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorWithId'
examples:
param_required:
summary: Required parameter(s) missing
value:
error_id: fa12f45e-0ebf-4f7c-88e0-ebb7a1441a18
code: 2101
message: '''code'' is required, ''name'' is required'
bad_param_type:
summary: Incorrect parameter type
value:
error_id: 29146977-8042-446f-b362-675e2921d71c
code: 2101
message: '''code'' must be a string, ''name'' must be a string'
invalid_json:
summary: Invalid JSON
value:
error_id: df7b76b2-1313-42f0-8c0b-3673c665f135
code: 2101
message: Request body is not valid JSON
param_value_too_short:
summary: Parameter value too short
value:
error_id: 7acc6073-5290-45f8-8956-c79d487ef1e5
code: 2101
message: '''name'' must be at least 1 character'
param_value_too_long:
summary: Parameter value too long
value:
error_id: c4da2d3c-1cd8-4bbc-ac43-233575e471b7
code: 2101
message: '''name'' must be at most 60 characters'
bad_param_format:
summary: Incorrect parameter format
value:
error_id: f70973ea-c939-41f8-a106-1656ab5fae2f
code: 2101
message: '''default_tax_rate_id'' must be a valid UUID'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'409':
description: 'Conflict
Request conflicts with the current state of the resource.
Returned, for example, when an accounting category with the provided name already exists.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorWithId'
examples:
category_with_name_exists:
summary: Name must be unique
value:
error_id: 8c08b656-ab6e-4768-4e57-f281da25aa2b
code: 3503
message: Category with name My Unique Accounting Category already exists
category_with_code_exists:
summary: Code must be unique
value:
error_id: 8c08b656-ab6e-4768-4e57-f281da25aa2b
code: 3504
message: Category with code MUAC already exists
'422':
description: "Unprocessable entity - accounting category cannot be created due to business rules \n\nReturned, for example, when you have an accounting software integration connected to your Revolut Business account, and accounting categories are managed by that integration.\n\nThe request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it.\nRetrying 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
get:
summary: Retrieve a list of accounting categories
operationId: getAccountingCategories
description: "Get available accounting categories based on the provided query criteria.\n\n:::note\nThe API returns a maximum of 500 accounting categories per request. \nThe default page size is 100.\n:::\n\nThe accounting categories are sorted by the `created_at` date in reverse chronological order, and they're **paginated**.\nThe page size, that is, the maximum number of accounting categories returned per page is specified by the `limit` parameter. \n- If the number of results exceeds the page size, the response also returns a cursor for the next page under `next_page_token`. \n To get the next page of results, make a new request using that `next_page_token` value in `page_token`.\n- If the number of results is smaller than the page size, `next_page_token` is not returned.\n\nFor 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_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
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 \n\nReturned, for example, when you have an accounting software integration connected to your Revolut Business account, and accounting categories are managed by that integration.\nMay 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`. \n\nThe request is well-formed and the server understands it, but the operation cannot be performed because the resource state doesn't permit it.\nRetrying 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:
de
# --- truncated at 32 KB (127 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/revolut/refs/heads/main/openapi/revolut-accounting-api-openapi.yml