Dimensions
Overview
In accounting systems, financial transactions must be properly categorized for reporting and compliance. Transactions are assigned to GL accounts, departments, locations, projects, and other organizational segments based on a company’s accounting rules.
Ottimate represents these transaction classifications through dimensions. Each dimension links an Ottimate record to a corresponding entity in the client’s ERP/accounting system.
Key Characteristics:
- Dimensions are company-specific - each company maintains its own set of dimensions
- Dimensions must be synced from your ERP before invoices can be properly coded
- The
erp_dimension_idlinks Ottimate dimensions to your accounting system - Dimensions can be applied at both invoice header and line item level
Dimension Fields
Response Fields
Creation Fields
All fields below are required on both POST /v1/dimensions and POST /v1/dimensions/bulk.
Supported Dimension Types
The following dimension types are supported. The table shows equivalent entities across common ERP systems.
GL Account (account)
Classifies how a transaction will be recorded in the general ledger.
Example:
Location (location)
Represents geographic locations like offices, facilities, or warehouses.
Department (department)
Represents internal business units or functions.
Project (project)
Tracks transactions related to a specific initiative, job, or capital effort.
Task (task)
Represents specific tasks within a project.
Cost Type (cost_type)
Categorizes different types of costs within projects.
Item (item)
Represents goods and services purchased from vendors.
Sync Patterns
Ottimate-Hosted ERP Integrations
When you use an Ottimate-hosted integration (e.g., QuickBooks, NetSuite, Sage), Ottimate automatically syncs dimensions from your ERP:
- Initial sync happens during onboarding
- Ongoing sync keeps dimensions updated automatically
- No API calls needed - dimension management is handled by the integration
In this scenario, you primarily use the Dimensions API to read dimension data for reference or validation.
Custom ERP Integrations
If you’re building a custom integration with an unsupported ERP, you’re responsible for syncing dimensions:
- Extract dimension data from your ERP (chart of accounts, departments, etc.)
- Transform to Ottimate’s dimension format
- Load via the Dimensions API (
POST /v1/dimensionsorPOST /v1/dimensions/bulk) - Maintain ongoing sync as dimensions are added/updated in your ERP
Keep dimension data consistent between Ottimate and your ERP. Mismatched dimension IDs can cause issues during invoice export.
API Operations
List Dimensions
Retrieve all dimensions for a company, optionally filtered by ERP type:
Response:
Add detail=basic to shorten each item in the dimensions array to just id, name, erp_dimension_id, and erp_type — code, reference_id, ottimate_type, and ottimate_company_id are omitted. Use this when you only need enough information to display or match a dimension, not to re-submit it.
Get Single Dimension
Retrieve a specific dimension by ID:
Response:
Create Single Dimension
Create a new dimension. All fields shown below are required — including code.
Response (200 OK):
The created object is returned nested under a dimension key, matching the shape of the get-single-dimension response. There is no created_date or other timestamp field in the response.
Single-create does not upsert. Unlike the bulk endpoint, POST /v1/dimensions rejects a request whose reference_id + erp_type combination already exists for the company, with a 400 response:
To update an existing dimension, use the bulk endpoint below (which upserts by reference_id + erp_type).
Bulk Create/Update Dimensions
Create or update multiple dimensions in a single request. This endpoint uses upsert behavior - existing dimensions (matched by reference_id + erp_type) are updated, new dimensions are created. This is different from single-create (POST /v1/dimensions), which rejects duplicates instead of updating them — see the note above.
Response (200 OK):
created and updated each carry the full dimension object (the same fields as the single-create response), not just id and name.
Validation is all-or-nothing. If any item in the dimensions array is missing a required field or has a type that can’t be resolved, the entire request is rejected with 400 Bad Request and no dimensions are created or updated — not even the valid ones. For example, omitting code on one item out of ten fails the whole batch:
fail_count / failures in a 200 response are reserved for the rare case where an individual item passes validation but fails during the write itself (for example, a record-level conflict). Because validation is checked up front for every item, this happens far less often than the all-or-nothing case above — plan for the 400 case first.
Using Dimensions in Invoices
Dimensions are applied to invoices and line items to categorize transactions for proper GL coding.
Invoice Header Dimensions: Used for header-level coding that applies to the entire invoice (e.g., department, location).
Line Item Dimensions: Used for item-level coding when different line items should be coded to different accounts.
The dimension keys in the dimensions object are the display type names (e.g., “Account”, “Department”), and the values are the erp_dimension_id values.
Best Practices
- Sync dimensions before invoices - Ensure all required dimensions exist before creating invoices that reference them.
- Use the bulk endpoint for efficiency - When syncing your chart of accounts, use
POST /v1/dimensions/bulkto reduce API calls and to update existing dimensions in place. - Match ERP identifiers exactly - The
erp_dimension_idmust match your ERP’s identifier for successful invoice export. - Use consistent reference_ids - The
reference_idfield determines upsert matching on the bulk endpoint; use a consistent naming convention. - Cache dimension mappings - Fetch and cache the dimension list at integration startup to avoid repeated API calls.
- Handle validation errors - A single invalid item in a bulk request fails the entire batch (
400, nothing created). Validate your payload client-side before sending, and check thefailuresarray for any items reported in a200response.
Troubleshooting
”Dimension not found” when coding invoice
- Verify the dimension exists:
GET /v1/dimensions?ottimate_company_id=123&erp_type=Account - Check you’re using the correct
erp_dimension_idvalue - Ensure the dimension belongs to the same company as the invoice
Invoice export fails with dimension error
- Verify the
erp_dimension_idmatches exactly what’s in your ERP - Check that all required dimension types are populated on the invoice
Bulk create returns 400 for the whole batch
- One invalid item rejects every item in the request, including otherwise-valid ones. The response body identifies which array index failed and why.
- Common issues: missing
code, missingreference_id, missingerp_typeorottimate_type - Fix the flagged item(s) and resend the full batch
Dimensions not syncing from ERP
- For Ottimate-hosted integrations, check sync status in the dashboard
- For custom integrations, verify your API calls are succeeding

