> For the complete documentation index, see [llms.txt](https://developer.celigo.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.celigo.com/api/api-reference/monitoring/event-reports.md).

# Event Reports

Event reports capture flow execution event data over a time window and produce a downloadable CSV once generation completes. Use them for compliance auditing, SLA reporting, and bulk error analysis.

The typical lifecycle is: create a report with target flow IDs and a time range, poll until status reaches `completed`, then download the CSV via a time-limited signed URL.

### Event report schema

## The EventReport object

```json
{"openapi":"3.2.0","info":{"title":"Event Reports","version":"1.0.0"},"components":{"schemas":{"EventReport":{"type":"object","required":["_id","type","_flowIds","startTime","status","createdAt"],"description":"An event report captures flow execution event data for a set of flows over\na specified time window. Once generation completes, the report can be\ndownloaded as a CSV via a time-limited signed URL.\n\n**Status lifecycle:** `queued` -> `running` -> `completed` | `canceled`\n\nThe `reportGenerationErrors` array may contain per-flow errors even when the overall status\nis `completed`. The `_requestedByUserId` field only appears on the POST create response;\nGET endpoints return `requestedByUser` (with `name` and `email`) instead.\n","allOf":[{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_requestedByUserId":{"type":"string","format":"objectId","readOnly":true,"description":"The user ID of the person who requested the report."},"type":{"type":"string","description":"The type of event report. Currently only `flow_events` is supported.\n","enum":["flow_events"]},"_flowIds":{"type":"array","description":"Array of flow IDs whose events are included in the report. At least\none flow ID is required.\n","minItems":1,"items":{"type":"string","format":"objectId"}},"startTime":{"type":"string","format":"date-time","description":"Start of the time window for the report. Must be within the last\n30 days. ISO 8601 format.\n"},"endTime":{"type":"string","format":"date-time","description":"End of the time window for the report. Defaults to the current time\nif omitted. The span between `startTime` and `endTime` must not\nexceed 3 days.\n"},"status":{"type":"string","readOnly":true,"description":"Current status of the report generation.","enum":["queued","running","completed","canceled"]},"reportGenerationErrors":{"type":"array","readOnly":true,"description":"Errors encountered during report generation. May contain entries even\nwhen the overall status is `completed` (e.g. a single flow failed\nwhile others succeeded).\n","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error description."}}}},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation began. Present once the report enters `running` status."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation finished. Only present on `completed` reports."},"requestedByUser":{"type":"object","readOnly":true,"description":"The user who requested the report. Present on GET responses\nbut not on the POST create response (which returns\n`_requestedByUserId` instead).\n","properties":{"name":{"type":"string","description":"Display name of the requesting user."},"email":{"type":"string","format":"email","description":"Email address of the requesting user."}}}}}]},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]}}}}
```

## List event reports

> Returns all event report objects for the account. No pagination or\
> filtering is supported — query parameters like \`eventReportId\`,\
> \`\_limit\`, and \`status\` are accepted but silently ignored.

```json
{"openapi":"3.2.0","info":{"title":"Event Reports","version":"1.0.0"},"tags":[{"name":"Event Reports","description":"Event reports capture flow execution event data over a time window and\nproduce a downloadable CSV once generation completes. Use them for\ncompliance auditing, SLA reporting, and bulk error analysis.\n\nThe typical lifecycle is: create a report with target flow IDs and a\ntime range, poll until status reaches `completed`, then download the\nCSV via a time-limited signed URL.\n\n## Event report schema\n\n{% openapi-schemas spec=\"eventreport\" schemas=\"EventReport\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"EventReport":{"type":"object","required":["_id","type","_flowIds","startTime","status","createdAt"],"description":"An event report captures flow execution event data for a set of flows over\na specified time window. Once generation completes, the report can be\ndownloaded as a CSV via a time-limited signed URL.\n\n**Status lifecycle:** `queued` -> `running` -> `completed` | `canceled`\n\nThe `reportGenerationErrors` array may contain per-flow errors even when the overall status\nis `completed`. The `_requestedByUserId` field only appears on the POST create response;\nGET endpoints return `requestedByUser` (with `name` and `email`) instead.\n","allOf":[{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_requestedByUserId":{"type":"string","format":"objectId","readOnly":true,"description":"The user ID of the person who requested the report."},"type":{"type":"string","description":"The type of event report. Currently only `flow_events` is supported.\n","enum":["flow_events"]},"_flowIds":{"type":"array","description":"Array of flow IDs whose events are included in the report. At least\none flow ID is required.\n","minItems":1,"items":{"type":"string","format":"objectId"}},"startTime":{"type":"string","format":"date-time","description":"Start of the time window for the report. Must be within the last\n30 days. ISO 8601 format.\n"},"endTime":{"type":"string","format":"date-time","description":"End of the time window for the report. Defaults to the current time\nif omitted. The span between `startTime` and `endTime` must not\nexceed 3 days.\n"},"status":{"type":"string","readOnly":true,"description":"Current status of the report generation.","enum":["queued","running","completed","canceled"]},"reportGenerationErrors":{"type":"array","readOnly":true,"description":"Errors encountered during report generation. May contain entries even\nwhen the overall status is `completed` (e.g. a single flow failed\nwhile others succeeded).\n","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error description."}}}},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation began. Present once the report enters `running` status."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation finished. Only present on `completed` reports."},"requestedByUser":{"type":"object","readOnly":true,"description":"The user who requested the report. Present on GET responses\nbut not on the POST create response (which returns\n`_requestedByUserId` instead).\n","properties":{"name":{"type":"string","description":"Display name of the requesting user."},"email":{"type":"string","format":"email","description":"Email address of the requesting user."}}}}}]},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/eventreports":{"get":{"operationId":"listEventReports","tags":["Event Reports"],"summary":"List event reports","description":"Returns all event report objects for the account. No pagination or\nfiltering is supported — query parameters like `eventReportId`,\n`_limit`, and `status` are accepted but silently ignored.","responses":{"200":{"description":"Array of event report objects.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventReport"}}}}},"401":{"$ref":"#/components/responses/401-unauthorized"}}}}}}
```

## Create an event report

> Queues generation of a new event report for the specified flows and time window. The report\
> is created in \`queued\` status and transitions through \`running\` to \`completed\` (or \`canceled\`).\
> \
> \`startTime\` must be within the last 30 days and the span to \`endTime\` must not exceed 3 days.\
> If \`endTime\` is omitted, the server defaults it to the current time. Poll\
> \`GET /v1/eventreports/{\_id}\` until \`status\` is \`completed\`, then download the CSV via\
> \`GET /v1/eventreports/{\_id}/signedURL\`; generation can take several minutes. The create\
> response includes \`\_requestedByUserId\`; subsequent GET responses replace this with the\
> \`requestedByUser\` object (name + email).

```json
{"openapi":"3.2.0","info":{"title":"Event Reports","version":"1.0.0"},"tags":[{"name":"Event Reports","description":"Event reports capture flow execution event data over a time window and\nproduce a downloadable CSV once generation completes. Use them for\ncompliance auditing, SLA reporting, and bulk error analysis.\n\nThe typical lifecycle is: create a report with target flow IDs and a\ntime range, poll until status reaches `completed`, then download the\nCSV via a time-limited signed URL.\n\n## Event report schema\n\n{% openapi-schemas spec=\"eventreport\" schemas=\"EventReport\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"EventReportCreateRequest":{"type":"object","description":"Request body for creating a new event report. `startTime` must be within the last 30 days\nand the span to `endTime` must not exceed 3 days. If `endTime` is omitted, the server\ndefaults it to the current time.\n","properties":{"type":{"type":"string","description":"The type of event report to generate. Currently only `flow_events`\nis supported.\n","enum":["flow_events"]},"_flowIds":{"type":"array","description":"Array of flow IDs whose events should be included in the report.\nAt least one flow ID is required.\n","minItems":1,"items":{"type":"string","format":"objectId"}},"startTime":{"type":"string","format":"date-time","description":"Start of the time window. Must be within the last 30 days.\nISO 8601 format.\n"},"endTime":{"type":"string","format":"date-time","description":"End of the time window. Defaults to the current time if omitted.\nThe total span (`endTime - startTime`) must not exceed 3 days.\n"}},"required":["type","startTime","_flowIds"]},"EventReport":{"type":"object","required":["_id","type","_flowIds","startTime","status","createdAt"],"description":"An event report captures flow execution event data for a set of flows over\na specified time window. Once generation completes, the report can be\ndownloaded as a CSV via a time-limited signed URL.\n\n**Status lifecycle:** `queued` -> `running` -> `completed` | `canceled`\n\nThe `reportGenerationErrors` array may contain per-flow errors even when the overall status\nis `completed`. The `_requestedByUserId` field only appears on the POST create response;\nGET endpoints return `requestedByUser` (with `name` and `email`) instead.\n","allOf":[{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_requestedByUserId":{"type":"string","format":"objectId","readOnly":true,"description":"The user ID of the person who requested the report."},"type":{"type":"string","description":"The type of event report. Currently only `flow_events` is supported.\n","enum":["flow_events"]},"_flowIds":{"type":"array","description":"Array of flow IDs whose events are included in the report. At least\none flow ID is required.\n","minItems":1,"items":{"type":"string","format":"objectId"}},"startTime":{"type":"string","format":"date-time","description":"Start of the time window for the report. Must be within the last\n30 days. ISO 8601 format.\n"},"endTime":{"type":"string","format":"date-time","description":"End of the time window for the report. Defaults to the current time\nif omitted. The span between `startTime` and `endTime` must not\nexceed 3 days.\n"},"status":{"type":"string","readOnly":true,"description":"Current status of the report generation.","enum":["queued","running","completed","canceled"]},"reportGenerationErrors":{"type":"array","readOnly":true,"description":"Errors encountered during report generation. May contain entries even\nwhen the overall status is `completed` (e.g. a single flow failed\nwhile others succeeded).\n","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error description."}}}},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation began. Present once the report enters `running` status."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation finished. Only present on `completed` reports."},"requestedByUser":{"type":"object","readOnly":true,"description":"The user who requested the report. Present on GET responses\nbut not on the POST create response (which returns\n`_requestedByUserId` instead).\n","properties":{"name":{"type":"string","description":"Display name of the requesting user."},"email":{"type":"string","format":"email","description":"Email address of the requesting user."}}}}}]},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/eventreports":{"post":{"operationId":"createEventReport","tags":["Event Reports"],"summary":"Create an event report","description":"Queues generation of a new event report for the specified flows and time window. The report\nis created in `queued` status and transitions through `running` to `completed` (or `canceled`).\n\n`startTime` must be within the last 30 days and the span to `endTime` must not exceed 3 days.\nIf `endTime` is omitted, the server defaults it to the current time. Poll\n`GET /v1/eventreports/{_id}` until `status` is `completed`, then download the CSV via\n`GET /v1/eventreports/{_id}/signedURL`; generation can take several minutes. The create\nresponse includes `_requestedByUserId`; subsequent GET responses replace this with the\n`requestedByUser` object (name + email).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventReportCreateRequest"}}}},"responses":{"201":{"description":"Event report created and queued for generation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventReport"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"422":{"description":"The window is out of bounds -- `startTime` more than 30 days back, `endTime` before\n`startTime`, or a span over 3 days -- or `_flowIds` is empty. No report is created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Get an event report

> Returns a single event report by ID. Check \`status\` for \`completed\` before attempting to\
> download via the signed URL. The \`reportGenerationErrors\` array may contain per-flow errors\
> even when the overall status is \`completed\`.

```json
{"openapi":"3.2.0","info":{"title":"Event Reports","version":"1.0.0"},"tags":[{"name":"Event Reports","description":"Event reports capture flow execution event data over a time window and\nproduce a downloadable CSV once generation completes. Use them for\ncompliance auditing, SLA reporting, and bulk error analysis.\n\nThe typical lifecycle is: create a report with target flow IDs and a\ntime range, poll until status reaches `completed`, then download the\nCSV via a time-limited signed URL.\n\n## Event report schema\n\n{% openapi-schemas spec=\"eventreport\" schemas=\"EventReport\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"EventReport":{"type":"object","required":["_id","type","_flowIds","startTime","status","createdAt"],"description":"An event report captures flow execution event data for a set of flows over\na specified time window. Once generation completes, the report can be\ndownloaded as a CSV via a time-limited signed URL.\n\n**Status lifecycle:** `queued` -> `running` -> `completed` | `canceled`\n\nThe `reportGenerationErrors` array may contain per-flow errors even when the overall status\nis `completed`. The `_requestedByUserId` field only appears on the POST create response;\nGET endpoints return `requestedByUser` (with `name` and `email`) instead.\n","allOf":[{"$ref":"#/components/schemas/ResourceResponse"},{"type":"object","properties":{"_requestedByUserId":{"type":"string","format":"objectId","readOnly":true,"description":"The user ID of the person who requested the report."},"type":{"type":"string","description":"The type of event report. Currently only `flow_events` is supported.\n","enum":["flow_events"]},"_flowIds":{"type":"array","description":"Array of flow IDs whose events are included in the report. At least\none flow ID is required.\n","minItems":1,"items":{"type":"string","format":"objectId"}},"startTime":{"type":"string","format":"date-time","description":"Start of the time window for the report. Must be within the last\n30 days. ISO 8601 format.\n"},"endTime":{"type":"string","format":"date-time","description":"End of the time window for the report. Defaults to the current time\nif omitted. The span between `startTime` and `endTime` must not\nexceed 3 days.\n"},"status":{"type":"string","readOnly":true,"description":"Current status of the report generation.","enum":["queued","running","completed","canceled"]},"reportGenerationErrors":{"type":"array","readOnly":true,"description":"Errors encountered during report generation. May contain entries even\nwhen the overall status is `completed` (e.g. a single flow failed\nwhile others succeeded).\n","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error description."}}}},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation began. Present once the report enters `running` status."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When report generation finished. Only present on `completed` reports."},"requestedByUser":{"type":"object","readOnly":true,"description":"The user who requested the report. Present on GET responses\nbut not on the POST create response (which returns\n`_requestedByUserId` instead).\n","properties":{"name":{"type":"string","description":"Display name of the requesting user."},"email":{"type":"string","format":"email","description":"Email address of the requesting user."}}}}}]},"ResourceResponse":{"type":"object","description":"Response","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Unique identifier for the resource. Format is a 24-character hexadecimal string."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was created. Set automatically and cannot be modified."},"lastModified":{"type":"string","format":"date-time","readOnly":true,"description":"Timestamp when the resource was last updated. Changes whenever any property is modified."},"deletedAt":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Timestamp when the resource was soft-deleted. When null or absent, the resource is active."}},"required":["_id"]},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"400-bad-request":{"description":"Bad request. The server could not understand the request because of malformed syntax or invalid parameters.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/eventreports/{_id}":{"get":{"operationId":"getEventReportById","tags":["Event Reports"],"summary":"Get an event report","description":"Returns a single event report by ID. Check `status` for `completed` before attempting to\ndownload via the signed URL. The `reportGenerationErrors` array may contain per-flow errors\neven when the overall status is `completed`.","parameters":[{"name":"_id","in":"path","required":true,"description":"Event report ID.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"The event report record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventReport"}}}},"400":{"$ref":"#/components/responses/400-bad-request"},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get signed URL for an event report

> Returns a pre-signed S3 URL for downloading the completed event report as a CSV file.\
> The URL is valid for approximately 15 minutes. Only works when the report \`status\` is\
> \`completed\` -- requesting it in any other status returns 400. If the URL has expired,\
> call this endpoint again to get a fresh one.\
> \
> The file is served with \`Content-Encoding: gzip\`, so download it with a client that decodes\
> it (\`curl --compressed\`) or gunzip it afterwards. Its columns start \`traceKey\`, \`time\`,\
> \`type\`, \`timeTaken\`, \`\_flowJobId\`.

```json
{"openapi":"3.2.0","info":{"title":"Event Reports","version":"1.0.0"},"tags":[{"name":"Event Reports","description":"Event reports capture flow execution event data over a time window and\nproduce a downloadable CSV once generation completes. Use them for\ncompliance auditing, SLA reporting, and bulk error analysis.\n\nThe typical lifecycle is: create a report with target flow IDs and a\ntime range, poll until status reaches `completed`, then download the\nCSV via a time-limited signed URL.\n\n## Event report schema\n\n{% openapi-schemas spec=\"eventreport\" schemas=\"EventReport\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"EventReportSignedUrlResponse":{"type":"object","description":"Response containing a pre-signed S3 URL for downloading the completed\nevent report CSV. The URL is valid for approximately 15 minutes and\nshould be consumed immediately. Only returned when the report `status`\nis `completed`.\n","properties":{"signedURL":{"type":"string","format":"uri","description":"Pre-signed S3 URL for downloading the report CSV. Valid for\napproximately 15 minutes from generation.\n"}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/eventreports/{_id}/signedURL":{"get":{"operationId":"getEventReportSignedUrl","tags":["Event Reports"],"summary":"Get signed URL for an event report","description":"Returns a pre-signed S3 URL for downloading the completed event report as a CSV file.\nThe URL is valid for approximately 15 minutes. Only works when the report `status` is\n`completed` -- requesting it in any other status returns 400. If the URL has expired,\ncall this endpoint again to get a fresh one.\n\nThe file is served with `Content-Encoding: gzip`, so download it with a client that decodes\nit (`curl --compressed`) or gunzip it afterwards. Its columns start `traceKey`, `time`,\n`type`, `timeTaken`, `_flowJobId`.","parameters":[{"name":"_id","in":"path","required":true,"description":"Event report ID.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"Signed URL for CSV download.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventReportSignedUrlResponse"}}}},"400":{"description":"The report is not in `completed` status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Cancel an event report

> Cancels a queued or running event report. The report's \`status\` transitions to \`canceled\`.\
> No request body is needed. Idempotent for reports already in \`canceled\` status. A \`completed\`\
> report cannot be canceled, and canceled reports cannot be resumed -- create a new one instead.

```json
{"openapi":"3.2.0","info":{"title":"Event Reports","version":"1.0.0"},"tags":[{"name":"Event Reports","description":"Event reports capture flow execution event data over a time window and\nproduce a downloadable CSV once generation completes. Use them for\ncompliance auditing, SLA reporting, and bulk error analysis.\n\nThe typical lifecycle is: create a report with target flow IDs and a\ntime range, poll until status reaches `completed`, then download the\nCSV via a time-limited signed URL.\n\n## Event report schema\n\n{% openapi-schemas spec=\"eventreport\" schemas=\"EventReport\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}}},"paths":{"/v1/eventreports/{_id}/cancel":{"put":{"operationId":"cancelEventReport","tags":["Event Reports"],"summary":"Cancel an event report","description":"Cancels a queued or running event report. The report's `status` transitions to `canceled`.\nNo request body is needed. Idempotent for reports already in `canceled` status. A `completed`\nreport cannot be canceled, and canceled reports cannot be resumed -- create a new one instead.","parameters":[{"name":"_id","in":"path","required":true,"description":"Event report ID to cancel.","schema":{"type":"string","format":"objectId"}}],"responses":{"204":{"description":"Event report canceled successfully."},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"},"422":{"description":"The report is in `completed` status and cannot be canceled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```
