---
title: "DEPRECATED Update automated recipe configuration"
method: PUT
path: "/api/v3/automated-recipes/{recipe_id}/"
tags: ["Recipes"]
deprecated: true
---

# DEPRECATED Update automated recipe configuration

`PUT /api/v3/automated-recipes/{recipe_id}/`

## Request

- Base URL: `https://embedded.improvado.io`
- URL: `https://embedded.improvado.io/api/v3/automated-recipes/{recipe_id}/`
- 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/:recipe_id/put.ts> (a function with typed inputs; its response is checked against the schema)

> **Deprecated.**

Deprecated: use [`PUT /api/v3.1/automated-recipes/{recipe_id}/`](/api/automated-recipes#configure-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.

Supplies the configuration of an automated recipe: data sources, connections and accounts. A recipe created by POST is empty, so this call is a required step of every deployment, not an optional edit.

**The payload is the complete configuration, and it is append-only.** Send every data source, every connection and every account the recipe should have, including the ones it already has. Sending a delta fails: removing a data source, a connection or an account that is already configured returns 400 and nothing is saved. There is no way to remove an account, a connection or a data source from a recipe through this call. If the set has to shrink, delete the recipe with DELETE /api/v3/automated-recipes/{recipe_id}/ and deploy it again from the same template.

Returns 200 with an empty body. Read the recipe back with GET /api/v3/automated-recipes/{recipe_id}/ to confirm what was stored.

## Path parameters

- `recipe_id` string, required

## Request body

- AutomatedRecipeUpdateRequest: Request body for updating automated recipe configuration
  - `data_sources` string[], required: List of data source names to include
  - `connections` AutomatedRecipeConnection[], required: List of connections with accounts
    - `connection_id` integer, required: Connection id, scoped to the workspace. The same connector has a different `connection_id` in every workspace - resolve it per workspace with GET /api/v3/datasources/{datasource_name}/connections.
    - `connection_data_source` string, required: Data source name for this connection
    - `accounts` AutomatedRecipeConnectionAccount[], required: List of accounts for this connection. Must not be empty.
      - `id` integer, required: Internal account id, required. Resolve it per workspace with GET /api/v3/connections/{connection_id}/accounts - the same platform account has a different `id` in every workspace. In a request body this must be an object member - sending a bare string in place of the object returns 400 "Invalid data. Expected a dictionary, but got str."
      - `account_id` string: External account identifier as the platform knows it, for example "act_500105056677763". Optional, and the only identifier that is stable across workspaces - join on it when you deploy one template to many workspaces.
  - `sync_from_date` string, date: Start date for data synchronization (YYYY-MM-DD)

## Response `200`

Recipe configuration updated successfully (empty body)

## Other responses

- `400`: Bad Request
- `401`: Forbidden
- `404`: Not Found

---

[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)
