---
title: "Save a workflow"
method: POST
path: "/api/v1/workflows"
tags: ["Automation"]
---

# Save a workflow

`POST /api/v1/workflows`

## Request

- Base URL: `https://philforms.com`
- URL: `https://philforms.com/api/v1/workflows`
- Auth: HTTP bearer

## Request body

- object
  - `name` string, required
  - `source` object: A source: { type: csv, text } · { type: xlsx, data (base64) } · { type: url, url, header? } · { type: sheet, url (a Google Sheets link shared "anyone with the link") } · { type: airtable, base_id, table, view?, token } · { type: supabase, url (https://<ref>.supabase.co), table, select?, key (a read-only role) } · { type: static, row }. Tokens, keys and auth headers are sealed on save and never returned.
  - `step` object[], required
  - `deliver` object
    - `webhook_url` string
  - `as_of` string

## Response `201`

{ workflow }

## Other responses

- `400`: A step or the source is not valid (the message names it)
- `404`: No such form
- `409`: 100 workflows already

---

[API](https://skmtc.dev/philforms/apis/philforms-api.md) · [All operations](https://skmtc.dev/philforms/apis/philforms-api/llms.txt) · [OpenAPI document](https://skmtc.dev/philforms/apis/philforms-api/revisions/a43bf313729c?raw)
