Revolut · Schema
Expense
CompanyFintechPaymentsBankingOpen BankingMerchant AcquiringCryptocurrencyCardsConsumer Banking
Properties
| Name | Type | Description |
|---|---|---|
| id | string | The ID of the expense. |
| state | object | |
| transaction_type | object | |
| description | string | The description of the expense. |
| submitted_at | string | The date and time the expense was submitted in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. |
| completed_at | string | The date and time the expense was completed in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. |
| payer | string | 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 relate |
| merchant | string | The name of the merchant. |
| transaction_id | string | 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 | string | 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#ge |
| labels | object | 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 pro |
| splits | array | 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. |
| receipt_ids | array | The IDs of the receipts related to the expense. |
| spent_amount | object | The expense amount in billed currency. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/revolut/main/json-schema/revolut-expense-schema.json",
"title": "Expense",
"x-generated": "2026-10-12",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/revolut-expenses-api-openapi.yml#/components/schemas/Expense",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "The ID of the expense."
},
"state": {
"$ref": "#/$defs/ExpenseState"
},
"transaction_type": {
"$ref": "#/$defs/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.\n\nTypically, 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.\n- 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)).\n- Otherwise, it is the date and time of its creation ([`created_at`](https://developer.revolut.com/docs/api/business#get-transaction#response)).\n\nFor 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.\n\nYou can have up to 5 label groups, with max. 1 label per group.\n\nThe 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": "#/$defs/LabelGroup"
}
},
"splits": {
"type": "array",
"description": "The splits of the expense.\n\nA single expense can be divided into multiple parts (splits), for example, to allocate different portions of the expense to different categories.",
"items": {
"$ref": "#/$defs/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": "#/$defs/Amount"
},
"currency": {
"$ref": "#/$defs/Currency"
}
},
"required": [
"amount",
"currency"
]
}
},
"required": [
"id",
"state",
"transaction_type",
"expense_date",
"labels",
"splits",
"spent_amount",
"receipt_ids"
],
"$defs": {
"Amount": {
"description": "The amount of money.",
"type": "number",
"format": "double"
},
"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."
}
}
},
"Currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "[ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case."
},
"ExpenseSplit": {
"type": "object",
"required": [
"amount",
"category",
"tax_rate"
],
"properties": {
"amount": {
"type": "object",
"description": "The original amount of the expense split.",
"properties": {
"amount": {
"$ref": "#/$defs/Amount"
},
"currency": {
"$ref": "#/$defs/Currency"
}
}
},
"category": {
"$ref": "#/$defs/Category"
},
"tax_rate": {
"$ref": "#/$defs/TaxRate"
}
}
},
"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"
},
"LabelGroup": {
"type": "array",
"description": "A label group with the selected label from that group.\n\nFor example, you might have a label group called **Department**, and the label you select from that group might be **HR**: `\"Department\": [ \"HR\" ]`.",
"minItems": 1,
"maxItems": 1,
"items": {
"type": "string",
"description": "The name of the selected label."
}
},
"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%."
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/revolut-expense"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.