Remote Expenses API
The Expenses API from Remote — 7 operation(s) for expenses.
The Expenses API from Remote — 7 operation(s) for expenses.
openapi: 3.0.0
info:
title: Remote Address Details Expenses API
version: 0.1.0
servers:
- url: https://gateway.remote.com/
variables: {}
- url: https://gateway.remote-sandbox.com/
variables: {}
security:
- OAuth2: []
tags:
- name: Expenses
paths:
/v1/expenses:
get:
callbacks: {}
description: 'Lists all expenses records
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | View expenses (`expense:read`) | Manage expenses (`expense:write`) |
'
operationId: get_v1_expenses
parameters:
- description: 'Requires a Company-scoped access token obtained through the Authorization Code flow or the Refresh Token flow.
The refresh token needs to have been obtained through the Authorization Code flow.
'
example: Bearer <COMPANY-SCOPED ACCESS TOKEN>
in: header
name: Authorization
required: true
schema:
type: string
- description: Starts fetching records after the given page
example: 1
in: query
name: page
required: false
schema:
type: integer
- description: Change the amount of records returned per page, defaults to 20, limited to 100
example: 30
in: query
name: page_size
required: false
schema:
type: integer
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/ListExpenseResponse'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Too many requests
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
summary: List expenses
tags:
- Expenses
post:
callbacks: {}
description: 'Creates an **approved** expense
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | - | Manage expenses (`expense:write`) |
'
operationId: post_v1_expenses
parameters:
- description: 'Requires a Company-scoped access token obtained through the Authorization Code flow or the Refresh Token flow.
The refresh token needs to have been obtained through the Authorization Code flow.
'
example: Bearer <COMPANY-SCOPED ACCESS TOKEN>
in: header
name: Authorization
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ParamsToCreateExpense'
description: Expenses
required: false
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/ExpenseResponse'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Too many requests
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:write
- employment_payments
- all:write
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:write
- employment_payments
- all:write
summary: Create expense
tags:
- Expenses
/v1/expenses/{expense_id}/receipt:
get:
callbacks: {}
deprecated: true
description: " Downloads an expense receipt.\n\n Deprecated since late February 2024 in favour of **[Download a receipt by id](#tag/Expenses/operation/get_download_by_id_expense_receipt)** endpoint.\n\n\n## Scopes\n\n| Category | Read only Scope | Write only Scope (read access implicit) |\n|---|---|---|\n| Manage expenses (`employment_payments`) | View expenses (`expense:read`) | Manage expenses (`expense:write`) |\n"
operationId: get_v1_expenses_expense_id_receipt
parameters:
- description: The expense ID
example: 3ab2e491-ad1c-47af-849c-3d0a53e20e0d
in: path
name: expense_id
required: true
schema:
type: string
responses:
'200':
content:
application/pdf:
schema:
$ref: '#/components/schemas/GenericFile'
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:
schema:
$ref: '#/components/schemas/GenericFile'
image/heic:
schema:
$ref: '#/components/schemas/GenericFile'
image/jpeg:
schema:
$ref: '#/components/schemas/GenericFile'
image/jpg:
schema:
$ref: '#/components/schemas/GenericFile'
image/png:
schema:
$ref: '#/components/schemas/GenericFile'
image/webp:
schema:
$ref: '#/components/schemas/GenericFile'
text/csv:
schema:
$ref: '#/components/schemas/GenericFile'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Unprocessable Entity
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
summary: Download a receipt
tags:
- Expenses
/v1/expenses/categories:
get:
callbacks: {}
description: Lists the effective hierarchy of expense categories. At least one of employment_id, expense_id, or country_code must be provided.
operationId: get_v1_expenses_categories
parameters:
- description: The employment ID for which to list categories. Required if neither expense_id nor country_code is provided.
in: query
name: employment_id
required: false
schema:
type: string
- description: The expense ID for which to list categories (includes the expense's category, even if it is not selectable by default). If provided without employment_id, will use the expense's employment context.
in: query
name: expense_id
required: false
schema:
type: string
- description: Include un-selectable intermediate categories in the response
in: query
name: include_parents
required: false
schema:
type: boolean
- description: Filter categories by country (ISO 3166-1 alpha-3 code, e.g. "GBR"). Only used when neither employment_id nor expense_id is provided.
in: query
name: country_code
required: false
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ListExpenseCategoriesResponse'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Too many requests
security:
- CustomerAPIToken: []
OAuth2AuthorizationCode: []
summary: List expense categories
tags:
- Expenses
/v1/employee/expense-categories:
get:
callbacks: {}
deprecated: false
description: 'Returns the flat list of expense categories applicable to the current employee. Only active categories are returned, filtered by the employee''s country / legal-entity visibility rules. Leaf nodes have `is_selectable: true`; parent nodes are excluded unless `include_parents=true`.
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | View expenses (`expense:read`) | Manage expenses (`expense:write`) |
'
operationId: get_v1_employee_expense-categories
parameters:
- description: Include parent (non-selectable) categories in addition to selectable leaves
in: query
name: include_parents
required: false
schema:
type: boolean
- description: Expense ID (slug) whose category should be included in the result, even if it is not selectable by default
in: query
name: expense_id
required: false
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ListExpenseCategoriesResponse'
description: Success
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
security:
- OAuth2Assertion:
- https://gateway.remote.com/employment.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
summary: List expense categories for the authenticated employee
tags:
- Expenses
/v1/expenses/{id}:
get:
callbacks: {}
description: 'Shows a single expense record
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | View expenses (`expense:read`) | Manage expenses (`expense:write`) |
'
operationId: get_v1_expenses_id
parameters:
- description: 'Requires a Company-scoped access token obtained through the Authorization Code flow or the Refresh Token flow.
The refresh token needs to have been obtained through the Authorization Code flow.
'
example: Bearer <COMPANY-SCOPED ACCESS TOKEN>
in: header
name: Authorization
required: true
schema:
type: string
- description: Expense ID
in: path
name: id
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ExpenseResponse'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Too many requests
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
summary: Show expense
tags:
- Expenses
patch:
callbacks: {}
description: 'Updates an expense
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | - | Manage expenses (`expense:write`) |
'
operationId: patch_v1_expenses_id (2)
parameters:
- description: Expense ID
in: path
name: id
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateExpenseParams'
description: Expenses
required: false
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ExpenseResponse'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/ConflictResponse'
description: Conflict
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Too many requests
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:write
- employment_payments
- all:write
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:write
- employment_payments
- all:write
summary: Update an expense
tags:
- Expenses
put:
callbacks: {}
description: 'Updates an expense
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | - | Manage expenses (`expense:write`) |
'
operationId: patch_v1_expenses_id
parameters:
- description: Expense ID
in: path
name: id
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateExpenseParams'
description: Expenses
required: false
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ExpenseResponse'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/ConflictResponse'
description: Conflict
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Too many requests
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:write
- employment_payments
- all:write
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:write
- employment_payments
- all:write
summary: Update an expense
tags:
- Expenses
/v1/expenses/{expense_id}/receipts/{receipt_id}:
get:
callbacks: {}
deprecated: false
description: 'Download a receipt by id.
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | View expenses (`expense:read`) | Manage expenses (`expense:write`) |
'
operationId: get_v1_expenses_expense_id_receipts_receipt_id
parameters:
- description: The expense ID
example: 3ab2e491-ad1c-47af-849c-3d0a53e20e0d
in: path
name: expense_id
required: true
schema:
type: string
- description: The receipt ID
example: 6ab2e49o-ad1c-47af-849c-3d0a53e21e0e
in: path
name: receipt_id
required: true
schema:
type: string
responses:
'200':
content:
application/pdf:
schema:
$ref: '#/components/schemas/GenericFile'
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:
schema:
$ref: '#/components/schemas/GenericFile'
image/heic:
schema:
$ref: '#/components/schemas/GenericFile'
image/jpeg:
schema:
$ref: '#/components/schemas/GenericFile'
image/jpg:
schema:
$ref: '#/components/schemas/GenericFile'
image/png:
schema:
$ref: '#/components/schemas/GenericFile'
image/webp:
schema:
$ref: '#/components/schemas/GenericFile'
text/csv:
schema:
$ref: '#/components/schemas/GenericFile'
description: Success
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/TooManyRequestsResponse'
description: Unprocessable Entity
security:
- CustomerAPIToken:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
OAuth2AuthorizationCode:
- https://gateway.remote.com/company.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
summary: Download a receipt by id
tags:
- Expenses
/v1/employee/expenses:
get:
callbacks: {}
deprecated: false
description: 'Returns a paginated list of expenses belonging to the current employee.
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | View expenses (`expense:read`) | Manage expenses (`expense:write`) |
'
operationId: get_v1_employee_expenses
parameters: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
description: Success
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not Found
security:
- OAuth2Assertion:
- https://gateway.remote.com/employment.manage
- expense:read
- expense:write
- employment_payments
- all:write
- all:read
summary: List expenses for the authenticated employee
tags:
- Expenses
post:
callbacks: {}
deprecated: false
description: 'Creates a new expense record for the current employee.
## Scopes
| Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|
| Manage expenses (`employment_payments`) | - | Manage expenses (`expense:write`) |
'
operationId: post_v1_employee_expenses
parameters: []
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ParamsToCreateEmployeeExpense'
description: Expense params
required: false
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
description: Created
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestResponse'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Unprocessable Entity
security:
- OAuth2Assertion:
- https://gateway.remote.com/employment.manage
- expense:write
- employment_payments
- all:write
summary: Create an expense for the authenticated employee
tags:
- Expenses
components:
schemas:
ParamsToCreateExpense:
description: " All the params needed to create an expense.\n\n An expense can be created using the `receipt` or `receipts` fields; however, these fields are not allowed together within the same object.\n\n For category selection, you can use either:\n - `category` (legacy enum values, deprecated but supported)\n - `expense_category_slug` (new hierarchical categories, recommended)\n\n If both are provided, `expense_category_slug` takes precedence.\n"
example:
amount: 8000
currency: EUR
employment_id: d4ebc714-4950-47a9-a464-28e1f1ab2a90
expense_category_slug: uuid-tech-equipment-slug
expense_date: '2020-12-11'
receipt:
content: UGVyaW9kIEVuZCBEYXRlLFBheSBEYXRlLEVtcG...5jZSBPZiBSZXNpZGVuYdXJyZW50LEFsbG93
name: receipt.pdf
reviewed_at: '2021-07-15T18:18:17Z'
reviewer_id: 14c14128-f5f4-475a-8ec0-6329b4832a61
tax_amount: 0
timezone: Etc/UTC
title: new keyboard
properties:
amount:
description: The expense amount in the specified currency, in cents.
type: integer
category:
deprecated: true
description: 'Categories allowed for an expense (legacy, deprecated).<br/>
Note: `coworking`, `home_office`, `phone_utilities`, `travel` are deprecated and will be removed in the future.
'
enum:
- car_rental
- coworking_office
- education_training
- entertainment
- flight
- fuel
- gifts
- insurance
- lodging
- meals
- other
- parking_toll
- subscription
- tech_equipment
- telecommunication
- transport
- utilities
- vaccination_testing
- visa
- wellness
- coworking
- home_office
- phone_utilities
- travel
nullable: true
type: string
currency:
description: " The three-letter code for the expense currency.<br/>\n Examples: `\"USD\"`, `\"EUR\"`, `\"CAD\"`\n"
type: string
employment_id:
description: The ID for the employment to which this expense relates.
type: string
expense_category_slug:
description: Slug of the expense category from the hierarchical categories system (recommended). Takes precedence over legacy category field.
nullable: true
type: string
expense_date:
description: Date of the purchase, which must be in the past
type: string
receipt:
$ref: '#/components/schemas/Base64File'
receipts:
items:
$ref: '#/components/schemas/Base64File'
maxItems: 5
type: array
reviewed_at:
description: The date and time that the expense was reviewed in ISO8601 format. If not provided, it defaults to the current datetime.
format: date-time
type: string
reviewer_id:
description: If the person reviewing the expense is a user in Remote, you can provide its user id for this field. If a value is not provided, defaults to the user that generated the API token.
type: string
tax_amount:
description: The tax portion of the expense amount, in cents. Use 0 if no tax applies.
type: integer
timezone:
$ref: '#/components/schemas/Timezone'
title:
description: A short description of the expense (e.g., "New keyboard", "Team dinner").
type: string
required:
- expense_date
- title
- amount
- currency
- employment_id
title: ParamsToCreateExpense
type: object
ParameterError:
example:
code: invalid_param
message: Invalid parameter
param: employment_id
properties:
code:
description: An error code that describes the nature of the error.
type: string
message:
description: A developer friendly error message that gives details on what the error was and how it may be remedied.
type: string
param:
description: The parameter that lead to the error message.
type: string
required:
- code
- message
- param
title: ParameterError
type: object
UpdateExpenseParams:
description: Update expense params
example:
status: approved
oneOf:
- $ref: '#/components/schemas/ApproveExpenseParams'
- $ref: '#/components/schemas/DeclineExpen
# --- truncated at 32 KB (73 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/remote/refs/heads/main/openapi/remote-expenses-api-openapi.yml