Expense List API
Expense APIs
Expense List API
Retrieve a paginated list of expenses with filters by date, state, employee, amount, and tags
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 thetag[<tagSlug>] query parameter, where <tagSlug> is the tag’s slug (the id returned by the Tag List API).
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]=Marketingreturns expenses tagged with either value - Pass different tag slugs to combine them with AND:
?tag[cost-center]=Engineering&tag[project]=Apolloreturns only expenses that carry both - Values must match exactly (case-insensitive); partial matches are not supported
- Filtering is supported for
DROPDOWN,VARCHAR, andDATETIMEtags. 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
cursorandlimittogether to paginate; pass thenextCursorfrom the response as thecursorvalue for the next call startDateandendDateare filtered against the expense date — provide both for a bounded range- Use the
idfrom 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
limitvalue - 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
DROPDOWNtags, 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
tagsobject 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