How do I create a report and export it?
Quick answer
Section titled “Quick answer”Open Reports, click “New report”, give it a name, choose the
object type, optionally a grouping, and the metric (Count,
Sum, or Average), then save with “Create report”. The result is shown
immediately as a grouped analysis with a Total value. Use “Export
CSV” to download the underlying records as CSV.
Prerequisites
Section titled “Prerequisites”Reports are a Pro feature (custom_fields). You need an object type
with records in the Catalog; for the Sum/Average
metrics you also need a number field on that object type.
-
Create a new report. In the Reports module, click “New report” and give it a name (e.g. “Contracts by status”).
Screenshot pendingberichte-erstellen-01Report builder with name, object type selection, grouping, and metricThe report builder: name, object type, grouping, and metric. -
Assemble the analysis. Choose:
- Object type — your own object type to analyze (e.g.
vertrag). - Grouping —
No groupingor a field to bundle results by (e.g.status). - Metric —
Count,Sum, orAverage. For Sum/Average you also choose the number field (e.g.kosten).
Click “Create report”.
- Object type — your own object type to analyze (e.g.
-
Read and export the result. The result appears as a table per group with a Total row and the number of records. Use “Export CSV” to download the raw records as CSV.
Screenshot pendingberichte-erstellen-02Executed report with groups, values, total row, and 'Export CSV' buttonThe report result with groups, total value, and CSV export.
Create a report: POST to /api/v1/reports. name and object_type are
required. The analysis logic lives in the config object: group_by,
metric (count | sum | avg), metric_field (for sum/avg), optional
filters, and columns for the CSV export.
curl -X POST https://demo.notory.io/api/v1/reports \ -H "Authorization: Bearer inv_dein_token" \ -H "Content-Type: application/json" \ -d '{ "name": "Verträge nach Status", "object_type": "vertrag", "config": { "group_by": "status", "metric": "count", "columns": ["name", "status", "kosten"] } }'Response HTTP 201 Created (abridged):
{ "id": "018f7d10-2a3b-7c4d-8e5f-6a7b8c9d0e1f", "name": "Verträge nach Status", "object_type": "vertrag", "config": { "group_by": "status", "metric": "count", "columns": ["name", "status", "kosten"] }, "schedule": null, "created_at": "2026-07-08T09:30:00Z", "updated_at": "2026-07-08T09:30:00Z"}Run it (compute current numbers):
curl -H "Authorization: Bearer inv_dein_token" \ https://demo.notory.io/api/v1/reports/018f7d10-2a3b-7c4d-8e5f-6a7b8c9d0e1f/run{ "groups": [ { "group": "aktiv", "value": 12, "count": 12 }, { "group": "gekündigt", "value": 3, "count": 3 } ], "total": 15, "row_count": 15}Export as CSV (the underlying records, columns per columns):
curl -H "Authorization: Bearer inv_dein_token" \ https://demo.notory.io/api/v1/reports/018f7d10-2a3b-7c4d-8e5f-6a7b8c9d0e1f/export.csv \ --output verträge-nach-status.csvPossible errors: 401 (token missing/invalid), 403 (custom_fields not
in the plan), 404 (report not found), 422 (missing name or
object_type).
What happens behind the scenes?
Section titled “What happens behind the scenes?”- Running evaluates live:
/runloads all matching records of the object type (from your tenant, excluding deleted ones) and aggregates them. Formetric = count, the value is the number of matches; forsum/avg, themetric_fieldis evaluated numerically — values that can’t be converted to numbers are skipped. - Empty group: Records without a value in the grouping field land in the
(none)bucket. - Filters (optional):
config.filtersuses the same condition matching as automation rules — this lets you narrow down the underlying data set. - CSV = raw data, not an aggregate: The CSV export contains the
individual records (columns per
columns; without it, all fields that occur), not the grouped totals. Multi-value fields (multiselect) are combined asa, b. - Only the definition is saved: The report only remembers the build definition; the numbers are recalculated on every call.