List transactions
List transactions, paginated, with their categorizations attached. This is the simple listing: filter by account, or by `status: "uncategorized"` for rows with no categorization at all. For anything richer (date ranges, amounts, counterparties, categories, free text, sorting) use `POST /transactions/search`, whose `open` status is also broader than `uncategorized` here. Do not aggregate by paging through this endpoint; the `data` slices compute totals server-side.
Authentication
sf_… API key in the bearerAuth field below.A SaaSFlow API key (format sf_…) or an OAuth bearer token. Paste only the key — the proxy adds the Bearer prefix. Create an API key in Settings → Company settings → API keys — see API keys.
In: header
Path Parameters
1 <= lengthQuery Parameters
Number of transactions to return (1-5000, default 100).
1 <= value <= 5000100Number of transactions to skip (default 0).
0 <= value0Filter by account ID.
"uncategorized" returns only transactions with NO categorizations yet (strictly open: excludes partially categorized and incomplete-transfer rows, which the POST /search "open" status includes). Deterministic, server-side scope for bulk categorization tooling.
Value in
- "uncategorized"
When true, omits transactions on accounts whose categorizations are owned by their managing integration (Stripe, Finway, Pleo, DATEV Payroll): those rows are categorized by the integration, not by this tooling. Composes with any status. Defaults to false.
Value in
- "true"
- "false"
Response Body
application/json
curl -X GET "https://example.com/companies/string/transactions"{ "items": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "companyId": "8bb73d03-06b4-47c7-80c7-59301f770eda", "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9", "date": "string", "fromTo": "string", "description": "string", "amountValue": "string", "amountCurrency": "EUR", "categorizationsAutoAssigned": true, "excludeFromAutoCategorization": true, "notes": "string", "source": "string", "assignedUserId": "string", "finApiTransactionId": "string", "plaidTransactionId": "string", "stripeBalanceTransactionId": "string", "stripeInvoiceId": "string", "stripeCreditNoteId": "string", "stripePaymentIntentId": "string", "stripeBillingEmail": "string", "hubspotPortalId": "string", "hubspotInvoiceId": "string", "hubspotCategorizationResolved": true, "finwayExpenseNumber": "string", "finwayInvoiceNumber": "string", "pleoExpenseId": "string", "createdVendorId": "91002d41-22cb-48a3-bc93-148a8439ef7f", "integrationId": "497a18ca-284e-40c0-985d-f72be35d468e", "pending": true, "createdTime": "2019-08-24T14:15:22Z", "createdUserId": "string", "lastUpdatedTime": "2019-08-24T14:15:22Z", "lastUpdatedUserId": "string", "categorizations": { "property1": { "counterparty": { "type": "customer", "id": "string" }, "categoryId": "string", "usingDateRule": { "type": "transactionDate" }, "computedStartDate": "2019-08-24", "computedEndDate": "2019-08-24", "plSplit": { "revenue": 0, "cogs": 0, "cac": 0, "pd": 0, "ga": 0, "no": 0, "neutral": 0 }, "passThroughTax": 0, "transferCounterPosition": { "transactionId": "string", "categorizationId": "string" }, "internalTransitLink": { "transactionId": "string", "categorizationId": "string" }, "sourceNote": "string", "externalInvoiceUrn": "string" }, "property2": { "counterparty": { "type": "customer", "id": "string" }, "categoryId": "string", "usingDateRule": { "type": "transactionDate" }, "computedStartDate": "2019-08-24", "computedEndDate": "2019-08-24", "plSplit": { "revenue": 0, "cogs": 0, "cac": 0, "pd": 0, "ga": 0, "no": 0, "neutral": 0 }, "passThroughTax": 0, "transferCounterPosition": { "transactionId": "string", "categorizationId": "string" }, "internalTransitLink": { "transactionId": "string", "categorizationId": "string" }, "sourceNote": "string", "externalInvoiceUrn": "string" } }, "inTransit": true } ], "totalCount": 0}Search
Search customers and vendors together by name or domain, returning a light record (id, name, type, domains, logo, default categorization) rather than the full entity. Built for pickers and autocomplete. `q` matches names and domains case-insensitively and may be omitted to get the first `limit` counterparties alphabetically. Narrow the result with `types=customer` or `types=vendor`; the caller still only sees types their permissions allow, so a grant with `customers:read` alone never returns vendors.
Create transaction
Create a single transaction on an account. `amountValue` is a signed decimal string: negative for money leaving the account, positive for money arriving. `categorizations` can be supplied inline to book it in one call, and their amounts must sum to the transaction amount or the row counts as open. Accounts owned by an integration that does not allow manual edits reject this with 422, and an account that already has an opening balance rejects a second initial-balance row with 409. For more than a handful of rows, use `/transactions/import`.