List workflows
Lists the workflows of the key's community, newest first, with each workflow's trigger, steps and current revision.
- Method
- GET
- Path
https://api.returning.ai / v1/ workflow-builder/ data-workflows - Permission
- workflowBuilder
- Retries
- Safe to retry at any time: it writes nothing.
When to use this
Use it to find a workflow id, to check deployment state before a change, or to confirm a delete or a copy.
Authentication#
- Header
Authorization: Bearer <API_KEY>- Permission
- workflowBuilder
The community comes from the key, so the list never spans communities and there is no community parameter to get wrong.
| Failure | Meaning | Recovery |
|---|---|---|
401 AUTHENTICATION_REQUIRED | No key, or an unknown key | Send a valid key. |
401 API_KEY_REQUIRED | A valid admin session was used | Use a community API key. |
403 API_KEY_PERMISSION_DENIED | The key authenticated without workflowBuilder | Grant the permission. |
Behaviour#
It returns workflows only. Runs, event ingests and credentials are separate calls, and every credential in the response is already replaced by the redaction marker.
Request#
Query parameters#
Headers#
Bearer <API_KEY>.EgBearer <API_KEY>
Watch for
- Every item is the full workflow detail, including every step's options. For a large community prefer a small
limit, thenGET /{workflowId}for the one workflow you need. statusfilters exactly one state. To see both drafts and deployed workflows, call twice or omit the filter.- A workflow with no trigger reads
trigger: null. That is not a broken row. meta.totalis the number of workflows matching the filter, not the number in this page.- Credentials are already redacted here. An
apiKey.valueof["__REDACTED__"]means a key is stored, not that the key is unset.
More examples and details
A populated page, then the same call for a community with no workflows.
curl --request GET \
--url "https://api.returning.ai/v1/workflow-builder/data-workflows?page=2&limit=10" \
--header "Authorization: Bearer <API_KEY>"
{
"data": [
{
"_id": "65f1a2b3c4d5e6f708192a3b",
"communityId": "65f1a2b3c4d5e6f708192a50",
"name": "VIP bonus",
"status": "deployed",
"outgoingWebhookUrl": null,
"createdAt": "2026-10-24T09:15:00.000Z",
"updatedAt": "2026-10-24T09:20:11.000Z",
"trigger": { "_id": "65f1a2b3c4d5e6f708192a41", "name": "Trade bonus trigger", "type": "webhook", "status": "idle", "options": { "tokenExchangeEnabled": false, "apiKey": { "enabled": true, "value": ["__REDACTED__"] } } },
"nodes": [],
"revision": "162af81f5de4ff2b557a4087de9a9a73a0ed4e621f737787e35a93614cb50d1c",
"redactedPaths": ["trigger.options.apiKey.value"]
}
],
"meta": { "page": 2, "limit": 10, "total": 11, "totalPages": 2 }
}
An empty result is a normal success, not an error:
{
"data": [],
"meta": { "page": 1, "limit": 20, "total": 0, "totalPages": 0 }
}
curl --request GET \
--url 'https://api.returning.ai/v1/workflow-builder/data-workflows?page=1&limit=20&status=deployed' \
--header 'Authorization: Bearer <API_KEY>'
Response#
HTTP 200 with data (an array) and meta (page, limit, total, totalPages). Each item carries the same fields as GET /{workflowId}, including its revision, so a list read can be the read half of a later write. The list is the readback that proves a rename, a copy or a delete: re-read it after the mutation and match by _id.
Paging is by page number, not a cursor. totalPages is 0 when nothing matches. Rows are ordered newest first by creation time, with the identifier as a tie-break, so a page can only repeat or skip a row if a workflow is created between two calls.
Eg[ ... ]
Eg"65f1a2b3c4d5e6f708192a3b"
Eg"65f1a2b3c4d5e6f708192a50"
Eg"VIP bonus"
draft, deployed or undeployed.Eg"draft"
RuleNullable
Egnull
Eg"2026-10-24T09:15:00.000Z"
Eg"2026-10-24T09:20:11.000Z"
null when the workflow has none.RuleNullable
Eg{ ... }
Eg"65f1a2b3c4d5e6f708192a41"
Eg"Trade bonus trigger"
Eg"webhook"
idle.Eg"idle"
RuleNullable
Eg{ ... }
Eg[ ... ]
Eg"65f1a2b3c4d5e6f708192a3c"
Eg"Read member XP"
Eg"platform-action"
Eg1
Egfalse
Egfalse
["__REDACTED__"].RuleNullable
Eg{ ... }
Eg"success"
workflowNodeIds and nestedNodes.If-Match; it also arrives as the ETag header.Eg"162af81f5de4ff2b557a4087de9a9a73a0ed4e621f737787e35a93614cb50d1c"
["__REDACTED__"].Eg[]
Eg{"page": 1, "limit": 20, "total": 2, "totalPages": 1}
Eg1
Eg20
Eg2
Eg1
{
"data": [
{
"_id": "65f1a2b3c4d5e6f708192a3b",
"communityId": "65f1a2b3c4d5e6f708192a50",
"name": "VIP bonus",
"status": "draft",
"outgoingWebhookUrl": null,
"createdAt": "2026-10-24T09:15:00.000Z",
"updatedAt": "2026-10-24T09:20:11.000Z",
"trigger": {
"_id": "65f1a2b3c4d5e6f708192a41",
"name": "Trade bonus trigger",
"type": "webhook",
"status": "idle",
"options": {
"tokenExchangeEnabled": false,
"apiKey": {
"enabled": false
},
"aesKey": {
"enabled": false
}
}
},
"nodes": [
{
"_id": "65f1a2b3c4d5e6f708192a3c",
"name": "Read member XP",
"type": "platform-action",
"order": 1,
"continueOnFailure": false,
"retryOnFailure": false,
"options": {
"action": "get-user-fields",
"selectUser": {
"type": "email",
"value": ["{{65f1a2b3c4d5e6f708192a41.email}}"]
},
"fields": [
{
"label": "Total XP",
"field": "total_xp"
}
]
}
}
],
"revision": "162af81f5de4ff2b557a4087de9a9a73a0ed4e621f737787e35a93614cb50d1c",
"redactedPaths": []
},
{
"_id": "65f1a2b3c4d5e6f708192a42",
"communityId": "65f1a2b3c4d5e6f708192a50",
"name": "Trade bonus",
"status": "deployed",
"outgoingWebhookUrl": null,
"createdAt": "2026-10-24T09:15:00.000Z",
"updatedAt": "2026-10-24T09:20:11.000Z",
"trigger": null,
"nodes": [],
"revision": "162af81f5de4ff2b557a4087de9a9a73a0ed4e621f737787e35a93614cb50d1c",
"redactedPaths": []
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 2,
"totalPages": 1
}
}
Errors#
Fix the request04
VALIDATION_FAILEDFix the requestlimit above 100, a non-numeric page, or an unknown status value. errors[].path names the query field. Fix the query value.AUTHENTICATION_REQUIREDFix the requestAPI_KEY_REQUIREDFix the requestAPI_KEY_PERMISSION_DENIEDFix the requestworkflowBuilder. Grant the permission.Retry with backoff02
RATE_LIMITEDRetry with backoffINTERNAL_ERRORRetry with backoffRetries
Safe to retry at any time: it writes nothing. A retry can return a different page if workflows were created or deleted in between, so treat a page as a snapshot rather than a fixed set. To enumerate a large community, page by page from 1 and stop when page > meta.totalPages; a page beyond the last one returns data: [].
{
"meta": {
"status": "error",
"statusCode": 400,
"code": "VALIDATION_FAILED",
"errors": [
{
"path": "params.workflowId",
"message": "Id must be a 24 character hex string"
}
],
"requestId": "3f4d0e8b-7a6c-4f1e-9b2d-5a7c8e1f0a3b"
},
"message": "API request rejected error.",
"detail": "The request body is not valid.",
"solution": "Read error detail and try again."
}