Skip to main content
The Finta API gives you programmatic access to your company’s financial data: transactions, journal entries, categories, departments, integration status, financial reports, and your team directory. Most endpoints are read-only. There are five narrow writes: editing one transaction, and the four operations on a team invitation (create, change its access, resend it, revoke it).

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.
Each API key is tied to the user who created it and scoped to a single company. There is no company ID parameter; the key already knows which company it belongs to. If you manage multiple companies, create a separate key for each. If you are removed from a company, your key automatically loses access.

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 the 403 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 the Authorization 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 is finta_. 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:
Pass 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:
  1. Integer cents. Monetary values are integers, never floats and never formatted strings. \$499.00 is 49900. \$1,500.00 is 150000. Divide by 100 to get dollars.
  2. _cents suffix. 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.
There are no exceptions and no “summary” or “display” sibling field that returns the same amount in dollars or as a string. If you encounter a field that appears to hold a monetary value but does not end in _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_cents yields net income without sign-flipping.
  • Balance sheet: balance_cents carries the natural-sign cumulative balance for that account at the report date.
  • Cash flow: amount_cents is 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 on error.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:
The full schema, including all field types and enum values (e.g. the closed set of 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.