---
title: "DEPRECATED Get automated recipe detail"
method: GET
path: "/api/v3/automated-recipes/{recipe_id}/"
tags: ["Recipes"]
deprecated: true
---

# DEPRECATED Get automated recipe detail

`GET /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/get.ts> (a function with typed inputs; its response is checked against the schema)

> **Deprecated.**

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

Returns detailed information about a specific automated recipe, including its configuration and connections.

## Path parameters

- `recipe_id` string, required

## Response `200`

Automated recipe details

- AutomatedRecipeDetail: Detailed automated recipe with full configuration
  - `recipe_id` string: Unique recipe identifier (numeric string)
  - `template_id` integer: ID of the template this recipe was created from
  - `datatable_id` integer, nullable: Associated data table ID (null if not yet created)
  - `title` string: Recipe title
  - `state` 'Extracting Data' | 'Building Dependencies' | 'Ready to work' | 'Failed': Current recipe state. `Ready to work` means the last build was built on the extractions that delivered; extractions that could not deliver on their own or in time were left out, so rows of some accounts can be missing. See Build automated recipe.
  - `data_sources` string[]: List of configured data source names
  - `allowed_data_sources` string[]: List of allowed data source names for this recipe
  - `connections` AutomatedRecipeConnection[]: List of configured connections
    - `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, nullable: Start date for data synchronization
  - `last_build_at` string, date-time, nullable: Last time the recipe's setup row changed. Despite the name it is not a build stamp: it moves when the configuration is written and on most build state transitions, but not when POST /build/ is accepted and not when a build failure is recorded. Do not use it to decide whether, or when, a build ran.
  - `error` AutomatedRecipeBuildError, nullable: Why the last build failed. `null` unless the most recent build failed - the field is cleared when the configuration is written, when a build starts and when a build succeeds. This is the only machine-readable place the failure reason appears: POST /build/ has already returned by the time a build fails.
    - `message` string: Human-readable reason, stripped of internal identifiers
    - `stage` 'extraction' | 'transformation_build' | 'final_build' | 'null', nullable: Which phase of the build failed. Null on failures recorded without a stage.
    - `data_source` string, nullable: Always null today - the public error carries no build context. Reserved.
  - `created_at` string, date-time: Recipe creation timestamp
  - `updated_at` string, date-time: Recipe last update timestamp

## Other responses

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