---
title: "DEPRECATED Create automated recipe"
method: POST
path: "/api/v3/automated-recipes/"
tags: ["Recipes"]
deprecated: true
---

# DEPRECATED Create automated recipe

`POST /api/v3/automated-recipes/`

## Request

- Base URL: `https://embedded.improvado.io`
- URL: `https://embedded.improvado.io/api/v3/automated-recipes/`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `dts_session_id`
- TypeScript: <https://skmtc.dev/improvado/apis/improvado-embedded-api-v3/docs/api/v3/automated-recipes/post.ts> (a function with typed inputs; its response is checked against the schema)

> **Deprecated.**

Deprecated: use [`POST /api/v3.1/automated-recipes/`](/api/automated-recipes#create-a-recipe). This version stays available until it is switched off; see [Moving recipes to v3.1](/recipes-migration).

When the recipes service fails, this version answers `500` with an HTML page, and an error in the `4xx` range can arrive with a body that is not JSON. It also repeats the request to the recipes service up to three times, create included, so a create can run twice. v3.1 does neither: every error is `{code, message, details}`, and a request is repeated only when it provably never reached the service.

Creates an automated recipe from a template. The recipe is created **empty** - no data sources, no connections, no accounts - so the next call must be PUT /api/v3/automated-recipes/{recipe_id}/.

**Only one recipe per template per workspace.** A second create from the same template returns 400 with `existing_recipe_ids`; treat that as "already deployed" and reuse one of the returned recipes.

**The output table name is derived from the template's title, not from `title` in this body.** `title` names the recipe in the UI and has no effect on the table. Two deployments of the same template with different titles produce the same table name. Uniqueness of that name is scoped to (agency, workspace), so the same name repeating across workspaces is expected and correct - do not try to make table names unique across your fleet. To learn the physical name, take `datatable_id` from this response and call GET /api/v3/data-tables/{data_table_id}, then read `sql_name`.

## Request body

- object
  - `template_id` integer, required: ID of the automated recipe template
  - `title` string: Recipe name. If not specified, template name is used

## Response `201`

Automated recipe created successfully

- AutomatedRecipeCreateResponse: Response after creating an automated recipe
  - `recipe_id` string: Unique recipe identifier (numeric string)
  - `template_id` integer: ID of the template this recipe was created from
  - `title` string: Recipe title
  - `state` 'Extracting Data' | 'Building Dependencies' | 'Ready to work' | 'Failed': Initial recipe state, always "Extracting Data". It is the model default written at creation and does not mean that anything is configured or running yet.
  - `datatable_id` integer, nullable: ID of the output data table. Resolve the physical table name with GET /api/v3/data-tables/{data_table_id} rather than deriving it from the recipe title.

## Other responses

- `400`: Bad Request
- `401`: Forbidden
- `403`: Forbidden

---

[API](https://skmtc.dev/improvado/apis/improvado-embedded-api-v3.md) - [All operations](https://skmtc.dev/improvado/apis/improvado-embedded-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/improvado/apis/improvado-embedded-api-v3/revisions/a881099bd6c4?raw)
