Recipes
Work with pre-built recipes that automate common data pipeline workflows.
Recipes are templated workflows that combine multiple API operations into reusable patterns. They simplify common tasks like:
- Setting up end-to-end data pipelines (source → extract → load → destination)
- Configuring multiple related extracts at once
- Applying best-practice configurations
Recipes accelerate implementation by providing proven patterns for common use cases.
Automated recipes have moved to v3.1. They are documented under
Automated Recipes, which is where new integrations should start.
The /api/v3/automated-recipe-templates/ and /api/v3/automated-recipes/ operations in
this tag are deprecated. They keep working until they are switched off, and we will
announce the date in advance. See Moving recipes to v3.1 for what
changes between the two versions, and Deploying recipes for the current flow.
Two operations in this tag are not automated recipes and are not deprecated:
List agency recipes (GET /api/v3/recipes/) and Enable recipe in a workspace
(POST /api/v3/workspaces/{id}/recipes). They use Basic authentication, work with the
recipes available to your agency rather than with automated recipes, and have no v3.1
replacement.
DEPRECATED List automated recipe templates
Deprecated: use GET /api/v3.1/automated-recipe-templates/. This version stays available until it is switched off; see Moving recipes to v3.1.
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 a paginated list of available automated recipe templates that can be used to create automated recipes.
query Parameters
pagePage number for pagination
page_sizeNumber of results per page (max 100)
searchSearch templates by name
data_sourcesFilter by data sources (comma-separated list, e.g., "google_analytics,facebook_ads")
DEPRECATED List automated recipe templates › Responses
List of automated recipe templates
countTotal number of templates
nextURL to the next page
previousURL to the previous page
DEPRECATED Get automated recipe template detail
Deprecated: use GET /api/v3.1/automated-recipe-templates/{template_id}/. This version stays available until it is switched off; see Moving recipes to v3.1.
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 template, including its tree structure and dependencies.
path Parameters
template_idAutomated recipe template ID
DEPRECATED Get automated recipe template detail › Responses
Automated recipe template details
idTemplate ID
titleTemplate title
descriptionTemplate description
List of data sources used by this template
levelDepth of this template in its own tree; 0 for a template you can deploy
Templates this one depends on, nested recursively. A recipe created from this template builds every node in the tree.
Schema of the table this template produces, available before you deploy anything. null when the template's output schema cannot be read - treat it as "unknown", not as "no columns".
dependencies_countNumber of dependencies in the template
created_atTemplate creation timestamp
updated_atTemplate last update timestamp
DEPRECATED List automated recipes
Deprecated: use GET /api/v3.1/automated-recipes/. This version stays available until it is switched off; see Moving recipes to v3.1.
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 a paginated list of automated recipes in the workspace.
query Parameters
template_idFilter by template ID
stateFilter by recipe state. The value is matched exactly and is case-sensitive: an unrecognized value returns 200 with an empty page rather than an error, so a filter written with different casing silently reports no recipes.
pagePage number for pagination
page_sizeNumber of results per page (max 100)
DEPRECATED List automated recipes › Responses
List of automated recipes
countTotal number of recipes
nextURL to the next page
previousURL to the previous page
DEPRECATED Create automated recipe
Deprecated: use POST /api/v3.1/automated-recipes/. This version stays available until it is switched off; see Moving recipes to v3.1.
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.
DEPRECATED Create automated recipe › Request Body
template_idID of the automated recipe template
titleRecipe name. If not specified, template name is used
DEPRECATED Create automated recipe › Responses
Automated recipe created successfully
recipe_idUnique recipe identifier (numeric string)
template_idID of the template this recipe was created from
titleRecipe title
stateInitial 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_idID 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.
DEPRECATED Get automated recipe detail
Deprecated: use GET /api/v3.1/automated-recipes/{recipe_id}/. This version stays available until it is switched off; see Moving recipes to v3.1.
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_idAutomated recipe ID (numeric string)
DEPRECATED Get automated recipe detail › Responses
Automated recipe details
recipe_idUnique recipe identifier (numeric string)
template_idID of the template this recipe was created from
datatable_idAssociated data table ID (null if not yet created)
titleRecipe title
stateCurrent 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_sourcesList of configured data source names
allowed_data_sourcesList of allowed data source names for this recipe
List of configured connections
sync_from_dateStart date for data synchronization
last_build_atLast 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.
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.
created_atRecipe creation timestamp
updated_atRecipe last update timestamp
DEPRECATED Update automated recipe configuration
Deprecated: use PUT /api/v3.1/automated-recipes/{recipe_id}/. This version stays available until it is switched off; see Moving recipes to v3.1.
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_idAutomated recipe ID (numeric string)
DEPRECATED Update automated recipe configuration › Request Body
data_sourcesList of data source names to include
List of connections with accounts
sync_from_dateStart date for data synchronization (YYYY-MM-DD)
DEPRECATED Update automated recipe configuration › Responses
Recipe configuration updated successfully (empty body)
DEPRECATED Delete automated recipe
Deprecated: use DELETE /api/v3.1/automated-recipes/{recipe_id}/. This version stays available until it is switched off; see Moving recipes to v3.1.
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.
Permanently deletes an automated recipe. This is a hard delete and it cannot be undone: the SQL views the recipe produced are dropped, its cells and configuration are removed, the data tables it created in the workspace are cleaned up, and the intermediate recipes it was built on are deleted with it.
The cascade follows the recipes this one reads from, not the ones that read it: a recipe built on top of this one is left in place and will break, and an intermediate recipe that another deployed recipe also reads is deleted just the same.
Deleting frees the template slot. One recipe per template per workspace is enforced on create, so after a delete the same template can be deployed again - which is how a failed deployment is retired, and how a recipe whose account set has to shrink is replaced, since configuration is append-only.
Returns 204 with an empty body. The 204 says the deletion was attempted, not that every recipe in the tree went away: they are deleted one by one and a per-recipe failure is logged rather than reported here. Before deploying the same template again, confirm with GET /api/v3/automated-recipes/?template_id= that nothing is left.
path Parameters
recipe_idAutomated recipe ID (numeric string)
DEPRECATED Delete automated recipe › Responses
Recipe deleted (empty body)
DEPRECATED Build automated recipe
Deprecated: use POST /api/v3.1/automated-recipes/{recipe_id}/build/. This version stays available until it is switched off; see Moving recipes to v3.1.
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.
Triggers the build process for an automated recipe. The recipe will transition through states (Extracting Data -> Building Dependencies -> Ready to work or Failed).
A 200 confirms that the build was started, not that it will succeed. The output table name is checked again for every table the recipe creates, immediately before each one is created, so a name that was free at start can be taken by the time the build reaches it. Such a failure arrives asynchronously: the recipe moves to Failed and the reason is in the error field of GET /api/v3/automated-recipes/{recipe_id}/.
The build waits for the extractions of the recipe and turns Ready to work on the ones that delivered. An extraction counts as delivered once one of its runs has completed, while the historical backfill may still be loading. Extractions that cannot deliver on their own - paused, or reused by a rebuild with nothing running - are not waited for, and the others only up to a limit; the ones left out can be missing from the output. A build with nothing to build from - no extraction delivered, or none for one extract template - fails.
path Parameters
recipe_idAutomated recipe ID (numeric string)
DEPRECATED Build automated recipe › Responses
Build started successfully
statusBuild operation status
messageHuman-readable status message
DEPRECATED Check the extraction tables a recipe reads
Deprecated: use GET /api/v3.1/automated-recipes/{recipe_id}/extractions/. This version stays available until it is switched off; see Moving recipes to v3.1.
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.
Reports the extraction tables the recipe reads and whether each one already exists in the workspace destination. Use it to decide when a build that failed for missing data is worth repeating: once every table_exists is true, the build can be started again.
The tables come from the cells of the recipe and of the intermediate recipes it is built on, narrowed to the selected data sources. The extraction ids are the ones the last build used - created or reused - so they are empty before the first build. Nothing here is cached - every call queries the destination once.
ready is true when every listed table exists. A recipe whose cells reference no extraction tables answers with ready: false and an empty sources list. A table exists once the first account's rows land in it, so ready does not mean that every account has delivered, and it can be true while the recipe is still Extracting Data; the recipe state is the readiness signal.
path Parameters
recipe_idAutomated recipe ID (numeric string)
DEPRECATED Check the extraction tables a recipe reads › Responses
The extraction tables the recipe reads
readyTrue when every table in sources exists in the destination. Not a sign that every account has delivered - see the recipe state.
One entry per extraction table the recipe reads, sorted by table name. A data source with more than one table appears once per table, so data_source is not unique - key this list by table. Empty when the recipe's cells reference no extraction tables.
DEPRECATED Reset an automated recipe from its template
Deprecated: use POST /api/v3.1/automated-recipes/{recipe_id}/resetup/. This version stays available until it is switched off; see Moving recipes to v3.1.
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.
Rebuilds the recipe from the template it was created from, and starts the build. Every recipe in the dependency tree is snapshotted first, then their cells are dropped and recreated from the current template.
This is how a fix made to a template reaches the recipes already deployed from it. The existing configuration - data sources, connections, accounts, sync_from_date - is preserved, and unlike a configuration PUT the build does not have to be triggered separately afterwards.
Takes no request body. A 200 means the reset was accepted and the build was started, not that the build will succeed - as with POST /build/, a failure arrives asynchronously in the error field of the recipe detail.
path Parameters
recipe_idAutomated recipe ID (numeric string)
DEPRECATED Reset an automated recipe from its template › Responses
Recipe reset from its template and the build started
statusReset operation status
recipe_idID of the recipe that was reset

