Overview
The Admin API provisions a customer in a fixed order — later steps depend on resources created earlier. Plan to complete the six steps in sequence.Prerequisites
- Complete Authentication and obtain an admin-scoped Bearer token.
- Decide on an
externalSourceIdfor the organization — your own identifier you’ll use to address it across syncs (e.g.org-acme-123). - Identify a template organization to provision from. Templates carry default categories, branding, and settings. Your Findity contact can supply the template’s internal id.
Key concepts
API endpoints
The Admin API uses two stage hosts. Examples in this guide use the stage environment — switch to the corresponding production host (expense.findity.com and api.findity.com) only when you’re ready to go live.
Required headers
Include these on every request:Step 1 — Create a customer organization
An organization is the top-level entity representing your customer. Create one before configuring dimensions, accounts, or users. The new organization inherits its categories, branding, and settings from a template organization.POST /organizations/externalid/{externalId}/
The {externalId} in the path is the new organization’s externalSourceId — pick it ahead of time and reuse it across all Step 1–6 calls.
Request body fields
cURL
JSON
The response object also contains branding, services, accounting numbers, categories, payment types, and
representation types. The example above is abbreviated for readability. Keep the
id value — Step 4
(chart of accounts) needs it.Step 2 — Configure dimension fields
Dimension fields define the categories your customer uses to classify expenses — cost centers, projects, departments, clients, legal entities. Configure the fields first, then populate them with values in Step 3.PUT /organizations/externalid/{externalId}/customdimensions/
Request body fields
cURL
JSON
Step 3 — Add dimension values
Once a list-type dimension exists, populate it with the specific values users can select. Wrap the values in a top-level"values" array — a bare top-level array is rejected.
PUT /organizations/externalid/{externalId}/customdimensions/{definitionExternalId}/list/
{definitionExternalId} is the externalSourceId you set on the dimension in Step 2 (here, dim-costcenter).
Query parameters
Request body fields
cURL
JSON
listKey for the dimension’s value list and the timestamp of the update. It does not echo the submitted values — to read them back, call the corresponding GET on the same path.
Step 4 — Set up chart of accounts
The chart of accounts defines the account codes used for expense categorization and financial reporting. Map each account to the ledger codes your customer’s accounting system expects.POST /organizations/{organizationId}/accounts
This step uses the v1 admin host (
stage-api.findity.com/api/v1/admin), not the legacy host used by the other
steps. The path also takes the internal organizationId (the 32-character hex id from Step 1’s response), not
the externalSourceId.Request body fields
cURL
201 Created)
JSON
meta is reserved for future use and is currently null on every response.
Step 5 — Add users
Create user accounts for the employees who will submit, review, or approve expenses. The endpoint is an upsert — supply a stableexternalSourceId per person to allow re-syncing from your HR system.
PUT /organizations/externalid/{externalId}/users/
Query parameters
Request body fields
The body is an array of user objects. Key fields:### With
sendInvitationMail=true, an email is sent immediately. Use false during initial testing.cURL
JSON
GET /organizations/externalid/org-acme-123/users/.
Step 6 — Create approval structure with dimensions
Approvers are assigned to specific dimension values. When a user submits an expense tagged with a value, the report routes automatically to the assigned approver.PUT /organizations/externalid/{externalId}/customdimensions/{definitionExternalId}/list/approvers/
Request body fields
Top-level shape:{ "values": [ { "id": "<list-value-id>", "approvers": [ { ... } ] } ] }.
Each approver object:
The approver must be a real user on the organization. If no user with the supplied
personExternalSourceId
exists, the request returns 400 "failed to update custom field list" and no assignment is created.cURL
Marketing expenses, and a two-step chain (John Doe then Carol Park) for Engineering.
Example response
JSON
GET /organizations/externalid/{externalId}/customdimensions/{definitionExternalId}/list/approvers/
It returns each list value with its approvers array populated, including each approver’s personId, personName, personEmail, and personExternalSourceId.
Common integration patterns
Initial customer onboarding. Run Steps 1–6 once per new customer, in order. Pre-stage the dimension definitions and chart of accounts in your provisioning script so each new org starts identically. Nightly ERP sync. After onboarding, re-run Step 3 (dimension values) withclearBeforeUpdate=true on a schedule to mirror your ERP’s current state. Values removed in the ERP are also removed from Findity.
Multi-organization rollouts. Use cascade=true on the Step 3 PUT to push the same value set to every sub-organization under the target. Useful for shared catalogues (cost centers, projects) managed centrally.
Error handling
Findity returns a JSON envelope on errors:JSON

