---
title: "List expenses"
method: GET
path: "/v1/expenses"
tags: ["Expenses"]
---

# List expenses

`GET /v1/expenses`

## Request

- Base URL: `https://api.dynt.ai/v1/dynt-server.onrender.com`
- URL: `https://api.dynt.ai/v1/dynt-server.onrender.com/v1/expenses`
- Auth: HTTP bearer

Expenses team members submitted, in every status but draft, newest first (created_at, then id), with their receipts as metadata. Narrow with `status`; drafts are never returned and `status=draft` is a 400.

## Query parameters

- `limit` string
- `cursor` string
- `status` 'pending' | 'processing' | 'sent' | 'reimbursed' | 'rejected' | 'cancelled'
- `from` string: Earliest expense date, inclusive (UTC; compared with date).
- `to` string: Latest expense date, inclusive (UTC; compared with date).
- `employee_id` string
- `updated_since` string, date-time

## Response `200`

OK

- object
  - `data` object[], required
    - `id` string, required
    - `number` string, required: Dynt's sequence number for the expense.
    - `custom_id` string, nullable, required: The organization's own expense number, when set.
    - `status` 'pending' | 'processing' | 'sent' | 'reimbursed' | 'rejected' | 'cancelled', required: Where the expense is in Dynt's workflow; the consuming system decides which statuses it books. Drafts are never returned.
    - `approval_status` string, required: The expense's review outcome in Dynt.
    - `accounting_status` string, required: The expense's bookkeeping review state in Dynt.
    - `date` string, date-time, required: The expense date as stored (UTC); the `from`/`to` filters use it.
    - `description` string, nullable, required: The comment entered with the expense.
    - `merchant` object, nullable, required: Where the money was spent.
      - `id` string, required
      - `name` string, required
    - `currency` string, required
    - `net_amount` string, required: Total before VAT.
    - `vat_amount` string, required: Decimal amount as a string with the currency's own decimals (ISO 4217: 2 for EUR, 0 for JPY, 3 for BHD, 4 for CLF), e.g. "1234.50"; eur_amount always has 2.
    - `total_amount` string, required: Total including VAT.
    - `eur_amount` string, nullable, required: Decimal amount as a string with the currency's own decimals (ISO 4217: 2 for EUR, 0 for JPY, 3 for BHD, 4 for CLF), e.g. "1234.50"; eur_amount always has 2.
    - `fx_rate` string, nullable, required: The stored exchange rate used for eur_amount, as a decimal string; null when none is stored.
    - `category` object, nullable, required
      - `id` string, required
      - `name` string, required
    - `sub_category` object, nullable, required
      - `id` string, required
      - `name` string, required
    - `event` object, nullable, required: The event (trip, conference) the expense is filed under, if any.
      - `id` string, required
      - `name` string, required
    - `employee` object, nullable, required: The team member the expense is filed under: their membership id (the `employee_id` filter) and display name; no contact details.
      - `id` string, required
      - `name` string, required
    - `external_guest` boolean, required: Filed for guest staff outside the organization.
    - `proofs` object[], required: The receipts, as metadata. A file that is also a receipt of a draft expense is withheld.
      - `id` string, required
      - `filename` string, required
      - `content_type` string, required
      - `size_bytes` integer, nullable, required: File size in bytes; null when unknown.
      - `created_at` string, date-time, required: When the file was attached.
    - `created_at` string, date-time, required: RFC 3339 date-time in UTC.
    - `updated_at` string, date-time, required: RFC 3339 date-time in UTC.
  - `next_cursor` string, nullable, required: Pass as `cursor` to fetch the next page; null when this is the last page.

## Other responses

- `400`: A parameter is invalid or unknown, or the request has a body (code bad_request).
- `401`: Missing, unknown, revoked or expired integration key (code unauthorized).
- `403`: The key lacks the read permission (code forbidden).
- `429`: Rate limited (code rate_limited).
- `500`: Internal error (code internal_error).
- `503`: Server busy; retry after the Retry-After delay (code server_busy).

---

[API](https://skmtc.dev/dynt/apis/dynt-api.md) · [All operations](https://skmtc.dev/dynt/apis/dynt-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dynt/apis/dynt-api/revisions/35825587b87b?raw)
