Skip to main content
GET
List transactions

Authorizations

Authorization
string
header
required

API key prefixed with finta_

Query Parameters

limit
integer
default:100

Maximum number of results to return (1-500). Defaults to 100.

Required range: 1 <= x <= 500
starting_after
string

A cursor for pagination. Pass the next_cursor value from a previous response to fetch the next page.

status
enum<string>

Filter by approval status. If omitted, returns both approved and pending transactions.

Available options:
approved,
pending
category_id
string

Filter by assigned category prefixed ID.

Pattern: ^cat_
transaction_type
enum<string>

Filter by public transaction type.

Available options:
standard,
transfer,
split
categorized
boolean

Filter by whether the transaction has been categorized.

merchant
string

Case-insensitive text search on merchant name.

source_vendor
string

Case-insensitive exact match on the integration or vendor name.

source_type
enum<string>

Case-insensitive exact match on the source account type.

Available options:
bank,
credit,
reimbursement
start_date
string<date>

Return transactions on or after this date (YYYY-MM-DD). If omitted, no lower bound.

end_date
string<date>

Return transactions on or before this date (YYYY-MM-DD). If omitted, no upper bound.

updated_after
integer

Return only transactions modified after this Unix timestamp (seconds, not milliseconds), for keeping a local copy in sync without refetching everything. Supplying it changes the response in three ways: results are ordered oldest-modified first instead of by date, next_cursor becomes an opaque token rather than a transaction id, and deleted transactions are included with deleted: true so you can remove them from your copy. The response also carries a watermark — pass that value back as updated_after on your next sync rather than using your own clock. Page through until has_more is false, then store the watermark. Note this filters on when a transaction was last modified, which is unrelated to start_date/end_date, which filter on its date. Start a new mirror with updated_after=0, which matches every transaction: the initial load and every later sync then share one ordering and one cursor, and the watermark it returns joins them with no gap. Do not seed a mirror from the list without updated_after — it returns no watermark, leaving you to invent a starting point from your own clock, which is the drift this parameter exists to avoid. A sync from 0 also returns transactions deleted before you started, carrying deleted: true; you have no copy to remove, so skip them. Filters may be combined with updated_after and are applied normally, but know what you are getting. Filters match a transaction's current state, so a transaction that changes such that it no longer matches simply stops appearing — with no deleted tombstone, because it was not deleted. deleted: true is reported only for genuinely deleted transactions. If you are keeping a persistent mirror, that means your copy can only grow: rows enter correctly and never leave, and the drift is silent. Sync with updated_after alone and filter your own side. If you are answering a question rather than maintaining a copy, or filtering on something that cannot change (source_vendor, source_type), the combination is safe.

Example:

1771183600

Response

A paginated list of transactions

object
enum<string>
required
Available options:
list
url
string
required

The canonical path of the collection, relative to the API host. Useful for logging, debugging, and generic pagination utilities that do not need to be aware of the specific endpoint.

Example:

"/api/v1/transactions"

has_more
boolean
required

Whether there are more results beyond this page.

data
object[]
required
next_cursor
string | null

Pass this value as starting_after to fetch the next page. Null when has_more is false.

watermark
integer

Only present when updated_after was supplied. The server-generated Unix timestamp to pass as updated_after on your next sync. It is identical on every page of one sync; store it once you receive a page with has_more false.

Example:

1771183600