Custom Report Builder
Get Metadata (Domains, Entities, Columns)
Returns all available domains, entities, and columns that can be used to build a report definition. Use this to populate the report builder UI with selectable fields.
Run Ad-Hoc Report
Run a report definition without saving it. Use this for previewing results before saving a custom report.
List Custom Reports
List all custom reports for the authenticated user. Supports pagination, search by name, and filtering by domain.
Create Custom Report
Create a new saved custom report.
Get Custom Report
Get a single custom report by ID. The report must belong to or be shared with the authenticated user.
Update Custom Report
Update an existing custom report. Only the report owner can update it (returns 403 otherwise).
Delete Custom Report
Delete a custom report. Only the report owner can delete it (returns 403 otherwise). Also deletes associated shares.
Run Saved Report
Execute a saved custom report by ID. The report must belong to or be shared with the authenticated user.
Drill Down Into Aggregated Row
Execute a drill-down query for a row in an aggregated report. Pass the same `definition` used to produce the parent row along with a `drill_values` map of {dimension_alias: value} pairs to isolate the underlying detail records.
Validate Formula Expression
Validate a user-entered formula expression before saving. The formula is parsed via Symfony ExpressionLanguage against a whitelist of functions (IF, COALESCE, ROUND, NULLIF, etc.) and field references (`{field_name}`).
Get Distinct Field Values (Autocomplete)
Return distinct values for a given entity/field. Used to populate autocomplete dropdowns in the filter builder UI (e.g., distinct `order_status` values).
Search Share Recipients
Search for users that can be added as share recipients on a custom report. Limited to users in the same tenant. Returns up to 20 matches. Used to power the share dialog's user picker.
Duplicate Custom Report
Create a personal copy of a report. The duplicate is always owned by the authenticated caller with visibility='private' regardless of the original's visibility. Works on shared reports too (lets a user fork a shared report into their own workspace).
Toggle Favorite
Toggle the `is_favorited` flag on a report. Only the owner can toggle favorites on their own report (returns 403 otherwise). The Favorites tab on the Reports Hub filters by this flag.
Export Custom Report
Export a saved custom report. The response is a streamed/binary download in the requested format.
List Shares
List all explicit share grants for a report. Each entry includes the recipient user (eager-loaded) and the permission (`view` or `edit`). Returns 403 if the caller is not the report owner.
Add Share
Add a user as an explicit share recipient. Upserts (updateOrCreate) so calling twice with a different permission updates the existing record.
Remove Share
Revoke an explicit share grant for a specific user. Returns 204 on success. Returns 403 if the caller is not the report owner.
List Schedules
List all schedules for a report. Each entry includes the creating user (eager-loaded), frequency, time_of_day (H:i:s), timezone, export_format, recipients, is_active, last_sent_at, and next_run_at. Accessible to anyone who can read the report.
Create Schedule
Create a new schedule.
Update Schedule
Update an existing schedule. All fields are optional (`sometimes` validation). `time_of_day` accepts both `H:i` and `H:i:s`; the server round-trips the value as `H:i:s` on reads, so re-submitting an unchanged time_of_day value from a prior GET works without 422 errors.
Delete Schedule
Delete a schedule. Returns 204 on success. Returns 404 if the schedule does not belong to the URL's report. Returns 403 if the caller is not the report owner.