Skip to main content
Expense List API

Authentication

All requests require an API key in the request headers. Headers:

Request

Query Parameters

Filtering by Tags

Expenses can be filtered by any tag configured for your organization using the tag[<tagSlug>] query parameter, where <tagSlug> is the tag’s slug (the id returned by the Tag List API).
Matching rules by tag type Combining filters
  • Repeat the parameter to pass multiple values for the same tag — the values are combined with OR: ?tag[cost-center]=Engineering&tag[cost-center]=Marketing returns expenses tagged with either value
  • Pass different tag slugs to combine them with AND: ?tag[cost-center]=Engineering&tag[project]=Apollo returns only expenses that carry both
  • Values must match exactly (case-insensitive); partial matches are not supported
  • Filtering is supported for DROPDOWN, VARCHAR, and DATETIME tags. Numeric tags (NUMBER, NUMERIC) cannot be used as filters
  • A slug that does not exist as a tag in your organization is ignored rather than rejected — verify slugs against the Tag List API if a filter returns unexpected results

Code Examples

Success Response

HTTP Status: 200 OK Response Fields:

Field Reference

state — Expense approval state

The approval lifecycle state of the expense.

syncState — Accounting sync state

Indicates whether the expense has been synced to the connected accounting system (e.g., Tally, Zoho).

paymentState — Bank transaction state

Indicates the state of the underlying payment/bank transaction for the expense.
The list API only returns expenses where paymentState is FINISHED. You will always see "FINISHED" for this field in list responses. Expenses with other payment states are accessible only in the Pazy web app.

status — Human-readable expense status label

A computed label summarizing the overall lifecycle position of the expense. This value is derived from a combination of state, syncState, paymentState, and internal fields. The API key context determines the label set (admin perspective).

syncStatus — Human-readable accounting sync status label

A computed label describing the expense’s position in the accounting sync pipeline. Relevant when an accounting integration (Tally, Zoho, etc.) is connected.

transactionData.isSelfTransfer

A boolean indicating whether the underlying payment was a self-transfer (a transfer between the user’s own accounts) rather than a payment to an external merchant or vendor.

Response Example

Error Responses

Validation Error

HTTP Status: 400 Bad Request

Access Denied

HTTP Status: 403 Forbidden

Authentication Errors

HTTP Status: 401 Unauthorized

Permission Errors

HTTP Status: 403 Forbidden

Internal Error

HTTP Status: 500 Internal Server Error

Best Practices

  • Use cursor and limit together to paginate; pass the nextCursor from the response as the cursor value for the next call
  • startDate and endDate are filtered against the expense date — provide both for a bounded range
  • Use the id from the response as the input to the Expense Details API for full expense information
  • The API returns at most 100 expenses per call regardless of the limit value
  • Fetch the available tag slugs from the Tag List API and their dropdown values from the Tag Detail API before building tag[<tagSlug>] filters
  • For DROPDOWN tags, prefer filtering by the tag value id — it is stable even if the value text is later renamed
  • URL-encode the brackets in tag[<tagSlug>] (tag%5Bcost-center%5D) if your HTTP client does not do it for you
  • Use the tags object in the response to confirm which tag values matched and to build follow-up filters
  • Access is limited to users with expense read permission and an admin or bookkeeper role