> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eachlabs.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# List Workflows

> List the workflows in your organization, with filtering, sorting, and pagination.

## Endpoint

```
GET https://api.eachlabs.ai/v1/workflows
```

Returns the workflows visible to your organization, newest first.

## Query Parameters

| Parameter        | Type    | Required | Description                                                      |
| ---------------- | ------- | -------- | ---------------------------------------------------------------- |
| `limit`          | integer | No       | Page size. Defaults to 50, capped at 100                         |
| `offset`         | integer | No       | Page start. Defaults to 0                                        |
| `category`       | string  | No       | Keep only workflows carrying this category slug                  |
| `keyword`        | string  | No       | Free-text match on the workflow name                             |
| `sort_key`       | string  | No       | `name`, `created_at`, `updated_at`, `trigger_count`, or `status` |
| `sort_direction` | string  | No       | `asc` or `desc`                                                  |
| `node_based`     | boolean | No       | Keep only workflows whose `node_based` flag matches              |

<Note>
  `sort_key` and `sort_direction` only take effect together — sending one without the other leaves the default ordering in place.
</Note>

## Code Examples

<CodeGroup>
  ```bash cURL theme={"dark"}
  curl "https://api.eachlabs.ai/v1/workflows?limit=20&category=image-generation" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```python Python theme={"dark"}
  import requests

  response = requests.get(
      "https://api.eachlabs.ai/v1/workflows",
      params={"limit": 20, "category": "image-generation"},
      headers={"Authorization": "Bearer YOUR_API_KEY"}
  )
  page = response.json()
  for workflow in page["workflows"]:
      print(f"{workflow['workflow_id']} | {workflow['name']}")
  print(f"{page['total_count']} workflows total")
  ```

  ```javascript JavaScript theme={"dark"}
  const params = new URLSearchParams({ limit: "20", category: "image-generation" });
  const response = await fetch(
    `https://api.eachlabs.ai/v1/workflows?${params}`,
    { headers: { "Authorization": "Bearer YOUR_API_KEY" } }
  );
  const page = await response.json();
  page.workflows.forEach((w) => console.log(`${w.workflow_id} | ${w.name}`));
  console.log(`${page.total_count} workflows total`);
  ```
</CodeGroup>

## Response

```json theme={"dark"}
{
  "workflows": [
    {
      "workflow_id": "50741f40-8621-4d46-8a91-dff4d873be98",
      "slug": "text-to-image-generator",
      "name": "Text to Image Generator",
      "categories": ["image-generation"],
      "tags": ["demo"],
      "status": "active",
      "trigger_count": 42,
      "clone_count": 3,
      "is_public": false,
      "production": false,
      "node_based": false,
      "created_at": "2025-12-01T10:00:00Z",
      "updated_at": "2025-12-07T15:30:00Z"
    }
  ],
  "offset": 20,
  "total_count": 231
}
```

### Response Fields

| Field         | Type      | Description                                                    |
| ------------- | --------- | -------------------------------------------------------------- |
| `workflows`   | object\[] | The page of workflows                                          |
| `offset`      | integer   | Start of the **next** page; present while pages come back full |
| `total_count` | integer   | Full result-set size for the applied filters                   |

### Workflow Fields

| Field           | Type      | Description                                                       |
| --------------- | --------- | ----------------------------------------------------------------- |
| `workflow_id`   | string    | Workflow UUID                                                     |
| `slug`          | string    | URL-friendly workflow identifier                                  |
| `name`          | string    | Human-readable workflow name                                      |
| `categories`    | string\[] | Category slugs                                                    |
| `tags`          | string\[] | Free-form workflow tags                                           |
| `status`        | string    | `active`, `archived`, or `deleted`                                |
| `trigger_count` | integer   | Total executions triggered across all versions                    |
| `clone_count`   | integer   | Number of times the workflow has been cloned                      |
| `is_public`     | boolean   | Whether the workflow appears in public listings                   |
| `production`    | boolean   | Whether this is a production workflow                             |
| `node_based`    | boolean   | Whether the workflow's latest active version runs as a node graph |
| `created_at`    | string    | RFC3339 creation timestamp                                        |
| `updated_at`    | string    | RFC3339 update timestamp                                          |

<Note>
  Rows carry summary fields only. Use [Get Workflow](/workflows/endpoints/get-workflow) for a workflow's versions and definition.
</Note>

## Pagination

`offset` in the response is the start of the next page, not an echo of the offset you sent. It is present whenever the page came back full, so a full final page still carries one — page until a page returns fewer than `limit` rows:

```python theme={"dark"}
LIMIT = 100
offset, workflows = 0, []
while True:
    page = requests.get(
        "https://api.eachlabs.ai/v1/workflows",
        params={"limit": LIMIT, "offset": offset},
        headers={"Authorization": "Bearer YOUR_API_KEY"}
    ).json()
    workflows.extend(page["workflows"])
    if len(page["workflows"]) < LIMIT:
        break
    offset = page["offset"]
```

## Error Responses

| Status | Body                                      | Description            |
| ------ | ----------------------------------------- | ---------------------- |
| `401`  | `{"error": "Invalid or missing API key"}` | Authentication failure |
