Get your API key
1
Go to API Keys
Sign in to Finta and go to Settings > API Keys.
2
Create a key
Click Create API key.
3
Copy the key
Copy the key immediately. It starts with
finta_ and is only shown once. You cannot retrieve it later.Permissions
A key acts as its owner rather than carrying scopes of its own. Every request requires the owner to currently hold API access: Manage, plus the permission the endpoint requires (for example Reports: View for reports and journal entries, Transactions: Manage to edit a transaction, or Team & access: Manage for any of the invitation operations). Because permissions are read live on every request, granting or revoking one takes effect on the very next call. There is nothing to reissue. See Permissions for the full endpoint-to-permission table and the403 you get when something is missing.
Base URL
All requests go to:Environments
There is no sandbox or test environment. Every request runs against your real company data, and every response reflects live production data. Write requests, such as categorizing a transaction, modify your live books.Authentication
Include your API key in theAuthorization header as a Bearer token:
Key prefix convention
Every Finta credential is prefixed so it can be recognized at a glance in logs, error messages, and secret scanners. Today there is one credential type and its prefix isfinta_. As additional credential or token types are introduced (for example restricted keys or webhook signing secrets), each will have its own distinct prefix that stacks on the brand prefix (e.g. finta_<type>_...). Treat the prefix as load-bearing: do not strip it before sending, and do not assume a missing or unknown prefix is still a Finta credential.
Content type
All responses are returned as JSON. List and report filters are passed as query strings. Write endpoints accept JSON request bodies.Pagination
List endpoints (/transactions, /journal_entries, and /parties/merchants) use cursor-based pagination. Responses are wrapped in a list envelope:
limit (default 100, max 500) to control page size, and starting_after with the next_cursor value to fetch the next page. Treat next_cursor as opaque and pass it back unchanged. There is no offset or page-number parameter. The url field carries the canonical path of the collection and is useful for logging and generic pagination helpers.
/categories, /departments, and /integrations are list endpoints too, but their result sets are small and bounded, so they always return everything in one response and omit has_more and next_cursor entirely.
/team is not a list endpoint at all. It returns a single team document with its own members and invitations arrays and no list envelope, so there is no object: "list", url, or data to read.
See Pagination for full parameters and an example fetch-all loop.
Monetary amounts
Every monetary field in the API follows two non-negotiable rules:- Integer cents. Monetary values are integers, never floats and never formatted strings.
\$499.00is49900.\$1,500.00is150000. Divide by 100 to get dollars. _centssuffix. The field name always ends in_cents(e.g.amount_cents,balance_cents,total_cents). If a field name does not end in_cents, it is not a monetary value.
_cents, or whose value is not an integer, treat it as a bug and report it.
Sign conventions:
- Income statement: revenue/income amounts are positive, expense amounts are negative. Summing every section’s
total_centsyields net income without sign-flipping. - Balance sheet:
balance_centscarries the natural-sign cumulative balance for that account at the report date. - Cash flow:
amount_centsis positive for cash inflows and negative for cash outflows.
Errors
The Finta API uses conventional HTTP status codes and returns every error in a consistent JSON envelope. Branch onerror.type and error.code to handle errors programmatically; treat error.message as human-readable only and do not parse it.
See Errors for the full list of error codes with resolution steps.
Making your first request
Verify your API key by pulling your company’s metadata:entity_type values), is in the Retrieve Company reference.
The id is included so you can cross-reference the company from other API responses, and as the disambiguator for the planned multi-company-keys feature; the endpoint is a singleton, so there is no GET /v1/company/{id}.
From here, try pulling one category total, your income statement, or the journal entries behind a report. GET /integrations is another good first call: it takes no parameters and tells you whether the data behind everything else is still flowing. GET /team also takes no parameters and returns the company’s members and pending invitations, and POST /team/invitations adds a new one. A pending invitation can then be changed with PATCH /team/invitations/{id}, sent again with POST /team/invitations/{id}/resend, or withdrawn with DELETE /team/invitations/{id}. To understand how journal entries, transactions, aggregations, and reports fit together, see Data Model.