# Discover Workflow Starters

> Authenticate, list published starters, and read one versioned input and output contract before integration.

Canonical: https://entirefeed.com/docs/workflows/discover-starters

A Workflow Starter is a curated public contract for a multi-step result. Discovery returns only starters that can accept public inputs, produce the published output, and provide an estimate before a run.

Use the returned `slug`, `version`, schemas, requirements, and links as the integration contract. Do not construct workflow definitions or depend on identifiers that are not present in the response.

Continue with [Estimate and run](/docs/workflows/estimate-and-run) after validating the selected starter's current input schema.

## Authenticate every starter request

Send `Authorization: Bearer $ENTIREFEED_API_KEY` on list, detail, estimate, run, lifecycle, webhook, and billing requests. Create and revoke organization API keys in Console; never expose a key in client-side code.

## List published starters

List the currently published starter contracts:

### cURL

```bash
curl https://api.entirefeed.com/v1/workflow-starters \
  -X GET \
  -H "Authorization: Bearer $ENTIREFEED_API_KEY"
```

### TypeScript

```typescript
const response = await fetch("https://api.entirefeed.com/v1/workflow-starters", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.ENTIREFEED_API_KEY}`,
  },
});

if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
```

### Python

```python
import os
import requests

response = requests.request(
    "GET",
    "https://api.entirefeed.com/v1/workflow-starters",
    headers={"Authorization": f"Bearer {os.environ['ENTIREFEED_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

```json
{
  "data": [
    {
      "id": "text-to-video-basic",
      "object": "workflow_starter",
      "slug": "text-to-video-basic",
      "title": "Text to Video Basic",
      "description": "Turn one video idea into a finished video.",
      "category": "video",
      "version": "st_0123456789abcdef01234567",
      "input_schema": {
        "type": "object",
        "properties": {
          "video_idea": {
            "type": "string",
            "title": "Video idea",
            "description": "Describe the video to create, including subject, action, and visual direction.",
            "minLength": 1,
            "maxLength": 10000
          }
        },
        "required": [
          "video_idea"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "video": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "type": {
                "const": "video"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "mime_type": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "expires_at": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              }
            },
            "required": [
              "id",
              "type",
              "url"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "video"
        ],
        "additionalProperties": false
      },
      "requirements": [],
      "links": {
        "self": "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic",
        "estimate": "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic/estimate",
        "runs": "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic/runs"
      }
    }
  ]
}
```

## Read one versioned contract

Read the selected starter before constructing inputs. Validate against `input_schema`, plan for `output_schema`, preserve `version`, and follow the returned links:

### cURL

```bash
curl https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic \
  -X GET \
  -H "Authorization: Bearer $ENTIREFEED_API_KEY"
```

### TypeScript

```typescript
const response = await fetch("https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.ENTIREFEED_API_KEY}`,
  },
});

if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
```

### Python

```python
import os
import requests

response = requests.request(
    "GET",
    "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic",
    headers={"Authorization": f"Bearer {os.environ['ENTIREFEED_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

```json
{
  "id": "text-to-video-basic",
  "object": "workflow_starter",
  "slug": "text-to-video-basic",
  "title": "Text to Video Basic",
  "description": "Turn one video idea into a finished video.",
  "category": "video",
  "version": "st_0123456789abcdef01234567",
  "input_schema": {
    "type": "object",
    "properties": {
      "video_idea": {
        "type": "string",
        "title": "Video idea",
        "description": "Describe the video to create, including subject, action, and visual direction.",
        "minLength": 1,
        "maxLength": 10000
      }
    },
    "required": [
      "video_idea"
    ],
    "additionalProperties": false
  },
  "output_schema": {
    "type": "object",
    "properties": {
      "video": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "const": "video"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "mime_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "type",
          "url"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "video"
    ],
    "additionalProperties": false
  },
  "requirements": [],
  "links": {
    "self": "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic",
    "estimate": "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic/estimate",
    "runs": "https://api.entirefeed.com/v1/workflow-starters/text-to-video-basic/runs"
  }
}
```

A version changes when the public contract or its execution behavior changes. Re-read the starter and revalidate inputs instead of guessing around a version mismatch.
