Prerequisites
Create a dedicated API token with the minimum abilities:workspaces-readworkflows-readworkflow-runs-output-readdocuments-readonly when at least one followed workflow exposes a persisteddocumentRef
documents-read so it supports both output types and scopes the token to the current workspace by default.
The token owner must be an administrator of every workflow workspace the integration follows. Do not grant workflow-agent and do not send workflow-agent headers.
The public output must expose the documents array described in Get Workflow Run Output. Each item may be a persisted documentRef or a temporary workflow-run fileRef with its SHA-256. Use a fileRef when external delivery happens promptly (for example, the standard CDJ Connect ZIP); use files.persistWorkspace only when a durable workspace document is also needed.
Activate a workflow feed
Send one bootstrap request in cursor mode. Ignore its runs, then store itsmeta.server_time as enabled_at and its meta.next_cursor as the initial cursor.
created_after equal to the stored enabled_at. This excludes runs created before activation while still discovering runs created after activation that take hours or days to complete.
Process one discovery page
For each returned run:- Request the run’s public output.
- Validate that
documentsis an array and every entry has a supportedtype,filename, non-negativesize, and a 64-character hexadecimalsha256. - For a
documentRef, validatedocumentIdand matchingworkspaceId; for afileRef, validateid. - Build the idempotency key
workflow_id:run_id:type:source_id. - Store one download event per output file.
- Commit the events and
meta.next_cursortogether. - Request the next page when
meta.has_more=true.
meta.has_more=true. After the last page, keep polling with its returned cursor; runs that complete later appear after the stored (completed_at, id) checkpoint.
Download an output file
Request a fresh signed URL with the document’sdocumentId, then stream the response to a temporary local file.
fileRef, request the workflow-run file URL instead:
size and sha256, flush the file to disk, and rename it atomically on the same volume. Request a new signed URL after expiration; never store a signed URL as durable state.
Reliability rules
- Keep
enabled_atimmutable. - Treat the cursor as opaque.
- Store the page cursor only after its events are durable.
- Use the
workflow_id:run_id:type:source_ididempotency key to absorb client or network retries safely. - Never advance past an invalid run output.
- Request the correct route for the output type: document URL for a
documentRef; run-file URL for afileRef. - A run
fileRefis temporary. Download it promptly and do not use it as a durable workspace document identifier.
