Public REST API
Automate compliance workflows, sync run data to external systems, and build custom dashboards using scoped API keys and a standard REST interface.
Create an API key
Go to Settings → Integrations and create a new key. Select only the scopes your integration requires.
Make a request
Include the key in the Authorization: Bearer header. The base URL is https://api.cadenio.com/v1.
Handle the response
All responses are JSON with snake_case fields. Errors include a machine-readable code field.
Authentication
All API requests must include a valid API key in the Authorization header using the Bearer scheme. Keys are prefixed with sk_live_ and are available to Enterprise organizations under Settings → Integrations.
Required header
AuthorizationstringrequiredMust be Bearer followed by your sk_live_ API key.
Content-TypestringoptionalRequired for POST and PATCH requests. Set to application/json.
curl https://api.cadenio.com/v1/runs \
-H "Authorization: Bearer sk_live_a1b2c3..." \
-H "Content-Type: application/json"Scopes
Each API key carries a set of scopes that define exactly what operations it can perform. Session-based (UI) requests are always permitted regardless of scope configuration. Scope enforcement applies only to API key requests.
| Scope | Description |
|---|---|
runs:read | Read run list and run details |
runs:write | Update tasks within a run |
runs:execute | Launch new runs from a template |
templates:read | Read template list and template details |
templates:write | Create and update templates |
templates:publish | Publish a template draft |
files:read | Download files attached to runs |
files:write | Upload files to attach to run tasks |
data-sources:read | Read data source records |
data-sources:write | Create and update data source records |
users:read | Read organization member list |
webhooks:manage | Create, list, and delete webhook endpoints |
Rate limits
Rate limits are applied per API key — not per organization. Each key has its own independent quota.
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 594
X-RateLimit-Reset: 1746000060HTTP/1.1 429 Too Many Requests
Retry-After: 8
{
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 8 seconds."
}Error codes
All errors return a JSON body with a code field (machine-readable) and a message field (human-readable). The HTTP status code reflects the error class.
| Status | Code / description |
|---|---|
| 400 | INVALID_REQUESTMalformed JSON or missing required field |
| 401 | UNAUTHORIZEDMissing or invalid API key |
| 401 | KEY_EXPIREDAPI key has passed its expiry date |
| 401 | KEY_REVOKEDAPI key has been revoked |
| 403 | MISSING_SCOPEKey does not have the required scope for this action |
| 403 | PLAN_REQUIREDFeature requires a higher-tier plan |
| 404 | NOT_FOUNDResource does not exist or is not accessible |
| 409 | CONFLICTState conflict — e.g. run already completed |
| 422 | UNPROCESSABLESemantically invalid request — e.g. invalid scope value |
| 429 | RATE_LIMITEDRate limit exceeded. Check Retry-After header |
| 500 | INTERNAL_ERRORUnexpected server error. Contact support if persistent |
HTTP/1.1 403 Forbidden
{
"code": "MISSING_SCOPE",
"message": "This action requires the 'runs:write' scope.",
"required_scope": "runs:write"
}Runs
A run is an execution instance of a template. It represents an in-progress or completed process with assigned tasks, deadlines, and a full audit trail.
/v1/runsruns:readReturns a paginated list of runs for the organization. Results are ordered by creation date, newest first. Use query parameters to filter by status, template, or assignee.
Parameters
statusstringoptionalFilter by run status. One of: IN_PROGRESS, COMPLETED, OVERDUE, CANCELLED.
template_idstringoptionalFilter runs launched from a specific template.
assignee_idstringoptionalFilter by the user assigned as run owner.
limitintegeroptionalNumber of runs per page. Default: 20, max: 100.
cursorstringoptionalPagination cursor from the previous response's next_cursor field.
curl -G https://api.cadenio.com/v1/runs \
-H "Authorization: Bearer sk_live_..." \
-d status=IN_PROGRESS \
-d limit=20{
"data": [
{
"id": "run_abc123",
"name": "Vendor Onboarding — ACME Corp",
"status": "IN_PROGRESS",
"template_id": "tmpl_def456",
"assignee_id": "usr_ghi789",
"due_date": "2026-05-01T00:00:00Z",
"created_at": "2026-04-10T14:22:00Z",
"completed_at": null
}
],
"next_cursor": "cur_xyz",
"has_more": true
}/v1/runsruns:executeCreates a new run from a published template. The run opens immediately in IN_PROGRESS status with all tasks generated from the template definition. The plain_key field in the response is the only time you receive the full key value.
Parameters
template_idstringrequiredID of the template to launch.
namestringoptionalCustom display name for this run. Defaults to the template name.
assignee_idstringoptionalUser ID to assign as the run owner.
due_datedatetimeoptionalISO 8601 timestamp for the run SLA deadline.
form_dataobjectoptionalKey-value map of form field IDs to pre-populate on run creation.
curl -X POST https://api.cadenio.com/v1/runs \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"template_id": "tmpl_def456",
"name": "Vendor Onboarding — ACME Corp",
"assignee_id": "usr_ghi789",
"due_date": "2026-05-01T00:00:00Z"
}'HTTP/1.1 201 Created
{
"id": "run_abc123",
"name": "Vendor Onboarding — ACME Corp",
"status": "IN_PROGRESS",
"template_id": "tmpl_def456",
"assignee_id": "usr_ghi789",
"due_date": "2026-05-01T00:00:00Z",
"created_at": "2026-04-10T14:22:00Z"
}/v1/runs/:id/tasks/:taskIdruns:writeUpdates the status, value, assignee, or deadline of a single task within a run. Completing the last required task in a run automatically transitions the run status to COMPLETED.
Parameters
statusstringoptionalSet task status. One of: COMPLETED, SKIPPED.
valueanyoptionalForm field value for the task. Type depends on the field definition.
assignee_idstringoptionalReassign the task to a different user.
due_datedatetimeoptionalUpdate the per-task SLA deadline.
curl -X PATCH \
https://api.cadenio.com/v1/runs/run_abc123/tasks/task_jkl012 \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"status": "COMPLETED",
"value": "Approved by legal review on 2026-04-10"
}'HTTP/1.1 200 OK
{
"id": "task_jkl012",
"run_id": "run_abc123",
"status": "COMPLETED",
"value": "Approved by legal review on 2026-04-10",
"completed_at": "2026-04-10T16:05:00Z",
"completed_by": "usr_ghi789"
}Templates
Templates are process blueprints. A template defines the task sequence, assignment rules, form fields, and approval criteria that each run inherits.
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/templates | templates:read | List all published templates |
| GET | /v1/templates/:id | templates:read | Get a single template |
| POST | /v1/templates | templates:write | Create a template draft |
| PATCH | /v1/templates/:id | templates:write | Update a template draft |
| POST | /v1/templates/:id/publish | templates:publish | Publish a template draft |
Webhooks
Webhooks deliver real-time event notifications to your system. Each payload includes an X-Cadenio-Signature header with an HMAC-SHA256 signature for validation.
/v1/webhookswebhooks:manageRegisters a new webhook endpoint. Cadenio will send POST requests to the specified URL when the subscribed events occur. Verify the X-Cadenio-Signature header to ensure payloads originate from Cadenio.
Parameters
urlstringrequiredHTTPS endpoint to deliver event payloads to.
eventsstring[]requiredList of events to subscribe. Use ["*"] to subscribe to all events.
run.completedrun.overduetask.completedrun.createddescriptionstringoptionalHuman-readable label for this webhook endpoint.
secretstringoptionalSigning secret used to verify payload authenticity via HMAC-SHA256.
curl -X POST https://api.cadenio.com/v1/webhooks \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-system.com/hooks/cadenio",
"events": ["run.completed", "run.overdue"],
"description": "Sync to ERP on run completion"
}'POST https://your-system.com/hooks/cadenio
X-Cadenio-Signature: sha256=...
{
"event": "run.completed",
"timestamp": "2026-04-10T16:05:00Z",
"data": {
"run_id": "run_abc123",
"template_id": "tmpl_def456",
"completed_at": "2026-04-10T16:05:00Z"
}
}Files
Upload and download files attached to run tasks. Files are scoped to the organization and accessible only via runs that belong to it.
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/files/:id | files:read | Download a file attachment |
| POST | /v1/files | files:write | Upload a file (multipart/form-data) |
Data sources
Read and write records in organizational data sources. Data sources are structured tables used to populate form fields and drive conditional logic in templates.
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/data-sources | data-sources:read | List data sources |
| GET | /v1/data-sources/:id/records | data-sources:read | List records |
| POST | /v1/data-sources/:id/records | data-sources:write | Create a record |
| PATCH | /v1/data-sources/:id/records/:rid | data-sources:write | Update a record |
Users
Read the organization member list. Use member IDs to assign runs and tasks via the Runs API.
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/users | users:read | List organization members |
API key management
API keys are created and revoked from Settings → Integrations. Each key has a name, a set of scopes, an optional expiry date, and a resource mode (all resources or a selected subset of templates and folders). Organization owners and admins can manage keys. Each key is shown in full only once at creation.
Endpoints
/v1/api-keysList active API keys/v1/api-keysCreate a new API key/v1/api-keys/:idRevoke an API keycurl -X POST https://api.cadenio.com/v1/api-keys \
-H "Authorization: Bearer <session-token>" \
-H "Content-Type: application/json" \
-d '{
"name": "ERP Sync Integration",
"scopes": ["runs:read", "runs:execute"],
"resource_mode": "ALL"
}'HTTP/1.1 201 Created
{
"id": "key_mno345",
"name": "ERP Sync Integration",
"plain_key": "sk_live_a1b2c3d4e5f6...",
"key_prefix": "sk_live_...a1b2",
"scopes": ["runs:read", "runs:execute"],
"resource_mode": "ALL",
"expires_at": null,
"created_at": "2026-04-10T12:00:00Z"
}
// plain_key is shown only once — store it securely.API keys, scoped permissions, and programmatic access to run data are available on the Enterprise plan. Talk to us to enable it for your organization.