Account Structure
Overview
Ottimate uses a tiered organizational hierarchy to manage accounts payable operations. Understanding this structure is essential for integration because every API request must be properly scoped to the correct company and location.
The hierarchy consists of:
- Account - The top-level organization (an Ottimate client)
- Company - A distinct accounting entity with its own chart of accounts and vendors
- Location - A subdivision within a company for invoice processing and approvals
Additionally, locations can be organized into Groups - optional labels that can span multiple companies in multi-company accounts.
Single-Company Account:
Multi-Company Account:
Key Principle: Data does not cross company boundaries. Each company has completely separate dimensions, vendors, and invoice workflows.
Identifier naming across endpoints
The Accounts API returns companies and locations with a plain id. That same value is what you pass on the other endpoints, where it is named for the entity it points at:
There is no ottimate_company_id or ottimate_location_id field in an Accounts API response — those names only ever appear in requests to other APIs.
Hierarchy Components
Client Accounts (racc_)
A client account represents an organization using Ottimate to automate accounts payable processes. This is the top-level entity that Ottimate provisions during onboarding.
Key Characteristics:
- Unique identifier format:
racc_prefix (e.g.,racc_90832490382904802384) - Contains one or more companies
- API credentials (Client ID, Client Secret) are scoped to an account
- Billing and subscription are managed at the account level
For API Integrators
Accounts are provisioned by Ottimate during the Onboarding process before you begin integration development. By the time you receive your API credentials, your account structure (account, companies, and locations) is already configured.
Structure is read-only, with one exception. You cannot create, rename, or delete accounts, companies, locations, or groups through the API, and you cannot move a location between companies or groups. For any of those, contact your Ottimate Partner Manager.
The one setting you can change is a location’s Basic Approval flag, via PATCH /v1/accounts/{id}/locations/{location_id}. Everything else on the structure is GET-only.
Listing the accounts you can reach:
Your credentials may be scoped to more than one account. GET /v1/accounts returns every account your API user can access, which is where an integration usually starts.
Response Fields:
Companies
A company is a distinct accounting entity within a client account. Each company maintains its own:
- Chart of accounts - Separate set of dimensions (GL accounts, departments, etc.)
- Vendor list - Vendors are company-specific
- Accounting rules - Separate coding and approval policies
- ERP connection - Each company connects to one ERP instance
When to Use Multiple Companies
Use separate companies when:
- Different ERP systems - Subsidiary A uses NetSuite, Subsidiary B uses QuickBooks
- Separate legal entities - Each entity files taxes separately and maintains separate books
- Distinct chart of accounts - Each entity has a completely different GL structure
- Separate vendor relationships - Vendors are managed independently between entities
Use a single company with multiple locations when:
- Same ERP system - All locations use the same accounting software
- Shared chart of accounts - Same GL structure across all locations
- Shared vendor list - Vendors serve multiple locations
- Centralized accounting - Single accounting team manages all locations
Examples
Multi-Company Scenario:
Single-Company Scenario:
Accessing Company Information
Companies are pre-configured during account onboarding. Use the companies endpoint to retrieve company IDs for your API calls:
List Companies Example:
Response:
Response Fields:
Pagination fields: List responses carry count, page, and limit only. There are no next or previous link fields — page through results by incrementing page until you have seen count records.
Locations
A location is a subdivision within a company used to organize invoice processing, permissions, and approval workflows. Locations share the same chart of accounts and vendor list as their parent company.
Key Characteristics:
- Belongs to exactly one company
- Shares the company’s dimensions and vendors
- Can have location-specific approval policies
- Can have location-specific user permissions
- Can have location-specific email to receive invoices
- Used to route invoices to appropriate approvers
Accessing Location Information
Locations are pre-configured during account onboarding. Use the locations endpoint to retrieve location IDs for invoice creation and filtering:
List Locations Example:
Response:
Response Fields:
Only active locations are returned. The active-only filter is applied server-side and cannot be turned off — there is no parameter for listing de-activated locations. If you cache this list (recommended, see Best Practices), treat a location that has disappeared from a later fetch as de-activated rather than deleted, and stop routing new invoices to it.
is_active for a single location is available on the response to PATCH /v1/accounts/{id}/locations/{location_id}.
Filtering by company: The locations endpoint returns all locations for an account across all companies, and has no server-side company filter. Use the company_id field in the response to select the locations for a specific company client-side. Prefer company_id over the company name for this — names are not guaranteed unique or stable.
API versioning
The Accounts API supports two versions, selected with the X-API-Version request header:
Every response echoes the version that rendered it in its top-level version field, so you can confirm which one you got.
An unrecognized version falls back to 1.0.0 silently — it is not an error. If you send X-API-Version: 2.0.0, you get the 1.0.0 response shape and "version": "1.0.0" in the body, with no warning. Check the version field rather than assuming your header was honored.
Migrating from group to location_group:
The two fields carry the same value, so migration is a rename: send the 1.1.0 header and read location_group. group is still returned for 1.0.0 and unversioned requests.
Groups
A group is an optional label applied to a location, used for reporting, permissions, and workflow management within Ottimate. Groups are not a scoping tier for the API: no request is scoped to a group, and nothing is inherited through one.
Key Characteristics:
- A group contains 1 or more locations
- A location can only belong to 1 group (or none)
- Groups are optional - locations can exist without being assigned to a group
- Groups are configured through the Ottimate Onboarding Tool, not the API
There is no Groups API. Groups are surfaced only as a name on the Location object — location_group (or the deprecated group) on GET /v1/accounts/{id}/locations. There is no endpoint that lists groups, and no group parameter on any endpoint to filter or scope by.
To work with groups, read the locations list and group the results client-side by location_group. To scope requests to a set of locations, pass the individual location IDs.
The PATCH locations endpoint additionally returns group_id and group_name for the single location it responds with — this is the only place a group ID is exposed.
Groups in Single-Company Accounts:
In a single-company account, groups organize locations within the same company:
- Regional organization - “North Region” and “South Region” groups organize stores by geography
- Department-based grouping - “Corporate Offices” vs “Warehouse Locations”
- Reporting - Track AP metrics by location grouping
Groups in Multi-Company Accounts (Cross-Company Groups):
In multi-company accounts, groups can span across companies, creating “cross-company groups”:
- Regional organization - “West Coast” group contains locations from multiple subsidiary companies
- Cross-company reporting - Track AP metrics across subsidiaries by region/division
- Shared management - A regional manager oversees locations from multiple legal entities

