openapi: 3.0.1
info:
version: '1.0'
title: Business Accounting Expenses 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: 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).'
paths:
/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
- rev_payment
responses:
'200':
description: List of expenses
content:
application/json:
schema:
$ref: '#/components/schemas/Expenses'
example:
- id: 8decf9f8-053e-46cb-92d8-a7b450fe5ae0
state: approved
transaction_type: card_payment
description: Printer paper
submitted_at: '2024-09-13T20:48:40.912Z'
completed_at: '2024-09-13T20:48:40.948Z'
payer: Ray Trenfield
merchant: Best Printers Company
transaction_id: 163e0ef6-2414-4fcf-846f-1f871059d506
expense_date: '2024-09-13T18:47:01.782Z'
splits:
- amount:
amount: 15.39
currency: GBP
category:
id: 71b9ec74-d5ff-4aa1-a489-f8dc39d4c9b7
name: Printing & Stationery
code: '461'
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/api/business#access-token) or if the Expenses API is disabled for the business.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
forbidden:
summary: Forbidden
value:
message: This action is forbidden
code: 9002
api_disabled:
summary: Feature disabled
value:
message: Expenses API for business is disabled
code: 9002
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
message: Expense 'bd415411-6e3e-46e7-af07-42f9b790c44e' not found
code: 3006
'422':
description: 'Unprocessable content
Returned, for example, when the Expenses feature (not just the API) is disabled for the business.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
message: Expenses feature is not enabled
code: 3470
default:
description: Unexpected error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/expenses/{expense_id}/receipts/{receipt_id}/content:
servers:
- url: https://b2b.revolut.com/api/1.0
description: Production server (uses live data)
get:
summary: Retrieve a receipt related to an expense
operationId: getExpenseReceipt
description: 'Get the receipt related to an expense by providing the receipt''s ID.
:::note
This feature is not available in Sandbox.
:::
For more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses).'
security:
- AccessToken:
- READ
tags:
- Expenses
parameters:
- name: expense_id
in: path
required: true
description: The ID of the [expense](https://developer.revolut.com/docs/api/business#get-expense) to which the receipt is related.
schema:
type: string
format: uuid
- name: receipt_id
in: path
required: true
description: 'The ID of the receipt to retrieve.
To find the ID of a receipt related to a specific expense, refer to the [expense''s details](https://developer.revolut.com/docs/api/business#get-expense#response).
The IDs of receipts related to that expense are returned under `receipt_ids`.'
schema:
type: string
format: uuid
responses:
'200':
description: Receipt content. The exact format depends on the receipt.
content:
'*/*':
schema:
type: string
format: binary
examples:
receipt_pdf:
summary: A PDF receipt
value: '@sample-receipt.pdf'
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'Forbidden
Returned, for example, when the access token is missing the required [scope](https://developer.revolut.com/docs/api/business#access-token) or if the Expenses API is disabled for the business.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
forbidden:
summary: Forbidden
value:
message: This action is forbidden
code: 9002
api_disabled:
summary: Feature disabled
value:
message: Expenses API for business is disabled
code: 9002
'404':
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
message: Receipt 'cea368fe-c757-44ce-b2cc-3da94b3d13a6' for expense '3e45f3d7-9919-46df-9793-300726c9fed1' not found
code: 3006
'422':
description: 'Unprocessable content
Returned, for example, when the Expenses feature (not just the API) is disabled for the business.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
message: Expenses feature is not enabled
code: 3470
default:
description: Unexpected error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Category:
type: object
description: The [accounting category](https://developer.revolut.com/docs/api/business#delete-accounting-category) of the expense split.
required:
- id
- name
properties:
id:
type: string
format: uuid
description: The ID of the accounting category.
name:
type: string
description: The name of the accounting category.
code:
type: string
description: The code of the accounting category.
ExpenseState:
enum:
- missing_info
- awaiting_review
- rejected
- pending_reimbursement
- refund_requested
- refunded
- approved
- reverted
description: "Indicates the state of the expense. Possible values:\n\n - `missing_info`: The expense is missing some required information.\n\n This is the initial state of the expense when it's first created.\n Once the missing information is provided, the expense is ready to be submitted.\n\n - `awaiting_review`: The expense is awaiting approval before it can be completed.\n\n The approver can approve, reject, or request repayment for the expense.\n It is also possible for the submitter to undo the submission at this stage.\n\n - `rejected`: The expense has been rejected by the approver. \n\n The expense submitter (typically, the payer) should fix the issue that was the reason for the rejection and resubmit the expense.\n\n - `pending_reimbursement`: The reimbursement request has been approved, and the expense is awaiting reimbursement.\n\n This state is possible for reimbursements (transaction type = `External`). \n\n - `refund_requested`: The expense has been rejected and repayment has been requested.*\n\n This state is possible for card transactions.\n It indicates that following the review, the approver rejected the expense and requested that it be paid back to the business account.\n This can happen, for example, if an employee accidentally makes a personal purchase with their business card.\n Once the money has been returned, the **admin** can mark this expense as repaid.\n\n - `refunded`: The expense has been repaid.*\n\n This state indicates that the admin has marked the expense as repaid.\n\n - `approved`: The expense has been approved and is now completed.*\n\n - `reverted`: The expense has been reverted. \n\n This status indicates that the transaction related to the expense has been reverted.\n In such a case, the expense status is automatically set to `reverted`, and the expense is completed.\n This can happen, for example, when the transaction has been reverted by the merchant.\n\n_*Additionally, if an admin has previously approved the expense, marked it as repaid/completed, or requested repayment, they can revert their decision.\nIn such a case, the expense goes back to the initial `missing_info` state._\n\nFor more information, see the guides: [Retrieve expenses and receipts](https://developer.revolut.com/docs/guides/manage-accounts/accounts-and-transactions/retrieve-expenses#expense-state)."
type: string
ExpenseTransactionType:
enum:
- atm
- card_payment
- fee
- transfer
- external
- mileage_reimbursement
- rev_payment
description: The type of the [transaction](https://developer.revolut.com/docs/api/business#get-transaction) related to the expense.
type: string
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'
Expenses:
type: array
items:
$ref: '#/components/schemas/Expense'
TaxRate:
type: object
description: The [tax rate](https://developer.revolut.com/docs/api/business#delete-tax-rate) applied to the expense split.
required:
- id
- name
properties:
id:
type: string
format: uuid
description: The ID of the tax rate.
name:
type: string
description: The name of the tax.
minLength: 1
maxLength: 20
percentage:
type: number
format: double
minimum: 0
maximum: 100
description: The tax rate percentage applied to the taxable amount. For example, `23` for 23%.
Expense:
type: object
properties:
id:
type: string
format: uuid
description: The ID of the expense.
state:
$ref: '#/components/schemas/ExpenseState'
transaction_type:
$ref: '#/components/schemas/ExpenseTransactionType'
description:
type: string
description: The description of the expense.
submitted_at:
type: string
format: date-time
description: The date and time the expense was submitted in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
completed_at:
type: string
format: date-time
description: The date and time the expense was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
payer:
type: string
description: The name of the [team member](https://developer.revolut.com/docs/api/business#delete-team-member) who made the transaction, refund request, or ATM withdrawal, or the name of the business if the related transaction is of type `fee`.
merchant:
type: string
description: The name of the merchant.
transaction_id:
type: string
format: uuid
description: The ID of the [transaction](https://developer.revolut.com/docs/api/business#get-transaction) related to the expense. Not available for transactions of type `external`.
expense_date:
type: string
format: date-time
description: 'The expense data depends on the type of the expense and whether it has been completed.
Typically, it''s the date and time of the expense [transaction](https://developer.revolut.com/docs/api/business#get-transaction) in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
- If the transaction related to the expense is completed, it is the date and time of its completion ([`completed_at`](https://developer.revolut.com/docs/api/business#get-transaction#response)).
- Otherwise, it is the date and time of its creation ([`created_at`](https://developer.revolut.com/docs/api/business#get-transaction#response)).
For reimbursements, it''s the payment date provided in the reimbursement request.'
labels:
type: object
description: 'The [labels](https://developer.revolut.com/docs/api/business#delete-label) added to the expense, organised in groups.
You can have up to 5 label groups, with max. 1 label per group.
The labels are provided as an object, where each key is the name of a label group, and each value is a single-element array containing the selected label from that group.'
maxProperties: 5
additionalProperties:
$ref: '#/components/schemas/LabelGroup'
example:
Office supplies:
- Photocopying
Department:
- HR
splits:
type: array
description: 'The splits of the expense.
A single expense can be divided into multiple parts (splits), for example, to allocate different portions of the expense to different categories.'
items:
$ref: '#/components/schemas/ExpenseSplit'
receipt_ids:
type: array
description: The IDs of the receipts related to the expense.
items:
type: string
format: uuid
spent_amount:
type: object
description: The expense amount in billed currency.
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
Currency:
type: string
pattern: ^[A-Z]{3}$
description: '[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.'
Amount:
description: The amount of money.
type: number
format: double
Error:
type: object
properties:
code:
type: integer
description: The error code.
message:
type: string
description: The description of the error.
required:
- code
- message
LabelGroup:
type: array
description: 'A label group
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/revolut/refs/heads/main/openapi/revolut-expenses-api-openapi.yml