CSV Export API
The CSV Export API exposes REST endpoints under /api/export/v1/ that return Validio data as text/csv for reporting, archival, and ingestion into BI tools or data warehouses. The same endpoints back the Export buttons in the Validio UI.
Base URL
https://YOUR-INSTALLATION.validio.io/api/export/v1/Authentication
The CSV Export endpoints use the same Authorization header as the GraphQL API:
Authorization: <access-key>:<access-secret>Refer to Managing API Keys for how to create credentials. The API key needs the same per-resource permission you would need in the UI — for example, SOURCES_READ to export sources, or INCIDENTS_READ to export incident groups.
Endpoints
| Endpoint | Permission |
|---|---|
GET /api/export/v1/sources | SOURCES_READ |
GET /api/export/v1/validators | VALIDATORS_READ |
GET /api/export/v1/incident-groups | INCIDENTS_READ |
GET /api/export/v1/activities | Scoped per activity type |
GET /api/export/v1/incident-debug-records | INCIDENTS_WRITE + SQL_EXECUTION_WRITE |
GET /api/export/v1/sample-data | CATALOG_ASSETS_READ |
Response format
Each response is a CSV download with a header row followed by data rows. The Content-Disposition filename includes the resource, an optional entity name, and the time range (or today's date if the request has no time bounds), for example incident-groups-2026-03-01_2026-04-01.csv.
Responses are capped at 100,000 rows. Narrow the time range or split a filter into multiple requests when you need more.
Filters and sort
The list endpoints (sources, validators, incident-groups, activities) accept two URL-encoded JSON query parameters:
filter— narrows rows.sort— orders rows.
Both parameters use the same field shapes as the equivalent filter and sort inputs on the Validio UI; field names are documented per endpoint below.
Example, exporting incident groups in the production namespace for March 2026:
FILTER='{"namespace":["production"],"range":{"start":"2026-03-01T00:00:00Z","end":"2026-04-01T00:00:00Z"}}'
curl "https://YOUR-INSTALLATION.validio.io/api/export/v1/incident-groups?filter=$(printf '%s' "$FILTER" | jq -rR @uri)" \
-H "Authorization: $VALIDIO_ACCESS_KEY:$VALIDIO_SECRET_ACCESS_KEY" \
-o incident-groups-march.csvEndpoint reference
Sources
GET /api/export/v1/sources
| Column | Description |
|---|---|
ID | Source identifier. |
Name | Display name. |
Namespace | Namespace the source belongs to. |
Owner | Email of the source owner, if set. |
Tags | Comma-separated list of tag labels applied. |
Credential type | The credential type the source uses to connect. |
Validator count | Number of validators currently bound to the source. |
Created at | ISO-8601 timestamp. |
Validators
GET /api/export/v1/validators
| Column | Description |
|---|---|
ID | Validator identifier. |
Name | Display name. |
Namespace | Namespace the validator belongs to. |
Source | Name of the parent source. |
Segmentation | Name of the segmentation (or Unsegmented). |
Window | Name of the window. |
Type | Validator type. |
Owner | Email of the validator owner, if set. |
Tags | Comma-separated list of tag labels applied. |
Created at | ISO-8601 timestamp. |
Incident groups
GET /api/export/v1/incident-groups
| Column | Description |
|---|---|
ID | Incident group identifier. |
Status | Group lifecycle status, e.g. TRIAGE, RESOLVED. |
Priority | Group priority (LOW, MEDIUM, HIGH). |
Owner | Email of the group owner, if set. |
Source | Name of the related source. |
Validator | Name of the related validator. |
Validator Type | Validator type. |
Namespace | Namespace the group belongs to. |
First Seen | Timestamp of the first incident in the group. |
Last Seen | Timestamp of the most recent incident in the group. |
Last End Time | End time of the most recent incident. |
Created At | When the group was created. |
Incident Count | Number of individual incidents in the group. |
High Severity Count | Incident count at HIGH severity. |
Medium Severity Count | Incident count at MEDIUM severity. |
Low Severity Count | Incident count at LOW severity. |
Muted Until | Timestamp until which the group is muted, if applicable. |
Filter accepts range.start and range.end to time-bound the export.
Activities
GET /api/export/v1/activities
Visibility is scoped per activity type by the permissions on your API key — for example, SOURCES_READ lets the export include source-related activity entries. Filter fields: namespace, source, validator, timeRange.
| Column | Description |
|---|---|
Timestamp | ISO-8601 UTC timestamp. |
Action | Action verb (CREATED, UPDATED, DELETED, or a resource-specific verb). |
Activity type | Event type identifier. |
Entity name | Name of the affected resource at the time of the event. |
Entity ID | Identifier of the affected resource. |
Actor type | User, API key, or System. |
Actor | Email (for users) or API-key name (for API keys); empty for System. |
Namespace | Namespace the resource belonged to, where applicable. |
Description | Human-readable summary of the event. |
Activity rows for deleted resources stay in the export with their original name preserved, so audit records like "user X deleted source Y" remain visible after Y is removed.
Incident debug records
GET /api/export/v1/incident-debug-records?incidentId={id}
Returns the rows produced by debugging the given incident. Columns are determined by the debug query at runtime — there is no fixed schema.
Sample data
GET /api/export/v1/sample-data?assetId={id}&credentialId={id}&query={sql}
Returns the rows produced by running query against the catalog asset. Columns are determined by the query at runtime — there is no fixed schema.
Scheduling
Export endpoints are stateless GET requests — schedule them with any tool that can call a URL with an Authorization header (cron, Airflow, GitHub Actions, your data orchestrator of choice). Pass time bounds in the filter querystring so each run downloads only the new rows.
Retention
Validio retains incident, activity, and metric history for a finite window. To preserve data beyond that window:
- Schedule exports more frequently than the retention boundary. If retention is 90 days, run the export at least weekly with a 30-day rolling window so a missed run does not lose data.
- Use overlapping ranges and dedupe on the
IDcolumn when stitching consecutive exports together.
Updated 10 days ago