Identities and missing values
Resources use UUIDid values for joins (job-class IDs are their uppercase codes) and human-readable number or name values for display. Optional relationships are explicitly null. Embedded references include names for display without a separate lookup. Invoice lines have IDs; an allocation’s identity is its payment/invoice pair. A derived timesheet is identified by member ID and resolved period dates, with no persisted ID. Clients should preserve these identities and ignore unrecognized response fields. Enum values and meanings are documented in the schemas.
job_class preserves the recorded uppercase value, including legacy classes: SERVICE, MAINTENANCE, ESTIMATE_REPAIR, ESTIMATE_REPLACE, INSTALL, WARRANTY, CALLBACK, SALES, and UNKNOWN. It is not a broader reporting class group. A missing relationship produces null; the recorded value UNKNOWN remains a distinct value.
Money
All amounts ending in_cents are integer USD cents. Rates are fractions: 0.1 means 10%.
Preserve signed amounts, including credits and negative balances. A null value is unavailable or inapplicable according to its field definition; do not automatically turn it into zero.
Calendar dates and timestamps
Dates use years0001 through 9999 and must be valid calendar dates. Timestamp inputs must represent valid calendar instants and include Z or a UTC offset between -15:59 and +15:59; examples use Z. Percent-encode a positive offset’s + when placing it in a query string. Original microsecond precision is retained in timestamp filters, resource timestamps, and cursors. The request’s company timezone determines calendar date filters, report buckets, and aging. Calendar ranges include each local day in full, even when clocks change at midnight.
For September in the company’s timezone, use start_date=2026-09-01&end_date=2026-10-01. This includes September 30 and excludes October 1. Timestamp filters such as created_from instead need an offset, for example 2026-09-01T07:00:00Z for midnight in Los Angeles on that date.
Summary periods and segmentation
Date-based summaries requirestart_date and end_date, with an inclusive start and exclusive end. They support day, Monday-start week, calendar month, quarter, and year; the default is month. At most one group_by dimension is allowed alongside time. Business filters can be combined without adding groupings.
Summary rows contain the effective half-open period_start/period_end, clipped to the requested range at its edges. Invoice activity uses issue date; collections use each payment/refund occurrence date. Rows order by period start then group value, with null group values first. There is no zero-filling of absent periods or groups. An ungrouped row has group: null; an unknown business unit has a group object with a null value and label. data is pageable and contains no hidden grand-total row. Sum additive amounts/counts across returned rows; calculate an overall average from total amount and count, not an average of averages. All pages must succeed before using the result as complete.
Each report documents its own supported dimensions. For additional combinations, accumulate the detailed resources and group them in your reporting store. The API does not accept arbitrary SQL, grouping lists, or invented filters.