# Add User Recipe

This endpoint allows adding favorite recipe. This API available only for user access-token integration.

## Add User Recipe

<mark style="color:green;">`POST`</mark> `https://graph.whisk.com/v1/recipes`

#### Path Parameters

| Name   | Type  | Description                                                                                                 |
| ------ | ----- | ----------------------------------------------------------------------------------------------------------- |
| fields | array | Extra fields to return on the recipe Possible values: `normalizedIngredients`, `instructions`, `nutrition`. |

#### Request Body

| Name          | Type   | Description                                                                         |
| ------------- | ------ | ----------------------------------------------------------------------------------- |
| recipeId      | string | Identifier of a Recipe to add.                                                      |
| collectionIds | array  | Collections for this recipe. If not specified it will add recipe without collection |

{% tabs %}
{% tab title="200 " %}

```javascript
{
  "recipe": {
    "id": "1070c26c320ce194efca97093e72517b4e7",
    "name": "Home made pasta",
    "description": "Pasta with tomato souce",
    "ingredients": [
      {
        "text": "Pappardelle pasta"
      },
      {
        "text": "5 tomatoes"
      },
      {
        "text": "3tbs of olive oil"
      }
    ],
    "saved": {
      "value": true,
      "collectionIds": [
        "cd037513c9e149a1b707e85eab1fc7f6"
      ],
      "owner": true,
      "type": "manual"
    }
  },
  "status": "success"
}
```

{% endtab %}

{% tab title="400 Return a 400 error code if a limit of the allowed number of saved recipes is exceeded. The limit is 50 recipes per user." %}

```javascript
{
    "status": "bad request"
}
```

{% endtab %}
{% endtabs %}

### Sample Request

```bash
curl "https://graph.whisk.com/v1/recipes" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <Access-Token>" \
  -d '{
    "recipeId": "3d4fda8595114a3a9f7b12fd471a4169"
  }'
```

It will return a 400 error code if a limit of the allowed number of saved recipes is exceeded. The limit is 50 recipes per user.

## Partially added recipe

If the recipe was not successfully extracted from the site. It means Whisk was not able to understand at least name and recipe ingredients.

Whisk will create a recipe copy for this user. So a user will be able to finish up a recipe by himself.

Recipe state will be failed, in case if whisk was not able to parse recipe.

## Response

| ATTRIBUTE       | TYPE                 | DESCRIPTION                                                                      |
| --------------- | -------------------- | -------------------------------------------------------------------------------- |
| recipe          | ManualRecipeDetails  | Recipe details.                                                                  |
| partiallyParsed | PartialRecipeDetails | If parsing status is failed we can provide some fields whisk were able to parse. |
| status\*        | enum                 | Possible values: success, failure.                                               |

### RawIngredient

| ATTRIBUTE | TYPE   | DESCRIPTION |
| --------- | ------ | ----------- |
| text\*    | string |             |
| group     | string |             |

### NormalizedIngredient

| ATTRIBUTE | TYPE                     | DESCRIPTION |
| --------- | ------------------------ | ----------- |
| text\*    | string                   |             |
| group     | string                   |             |
| analysis  | RecipeIngredientAnalysis |             |

### RawIngredient

| ATTRIBUTE | TYPE   | DESCRIPTION |
| --------- | ------ | ----------- |
| text\*    | string |             |
| group     | string |             |

### RecipeIngredientAnalysis

| ATTRIBUTE       | TYPE   | DESCRIPTION |
| --------------- | ------ | ----------- |
| product\*       | string |             |
| canonicalName\* | string |             |
| quantity        | number |             |
| unit            | string |             |
| multiplier      | number |             |
| brand           | string |             |
| comment         | string |             |
| category        | string |             |

### RecipeInstruction

| ATTRIBUTE | TYPE                    | DESCRIPTION |
| --------- | ----------------------- | ----------- |
| text\*    | string                  |             |
| group     | string                  |             |
| images    | array \[ImageContainer] |             |

### RecipeInstructions

| ATTRIBUTE | TYPE                       | DESCRIPTION |
| --------- | -------------------------- | ----------- |
| steps\*   | array \[RecipeInstruction] |             |

### ProductCategory

| ATTRIBUTE | TYPE   | DESCRIPTION |
| --------- | ------ | ----------- |
| name\*    | string |             |

### ImageContainer

| ATTRIBUTE    | TYPE            | DESCRIPTION                                                       |
| ------------ | --------------- | ----------------------------------------------------------------- |
| url\*        | string          | original image url, depricated. Please use field original instead |
| original     | OriginalImage   | original image information, e.g. image url                        |
| responsive\* | ResponsiveImage |                                                                   |

### ResponsiveImage

| ATTRIBUTE | TYPE    | DESCRIPTION            |
| --------- | ------- | ---------------------- |
| url\*     | string  | Hosted url of an image |
| width\*   | integer | Image width            |
| height\*  | integer | Image height           |

### OriginalImage

| ATTRIBUTE | TYPE   | DESCRIPTION      |
| --------- | ------ | ---------------- |
| url\*     | string | URL of the image |

### VideoContainer

| ATTRIBUTE  | TYPE   | DESCRIPTION                                         |
| ---------- | ------ | --------------------------------------------------- |
| url        | string | URL to original video provider page                 |
| contentUrl | string | URL to video file. Actual bytes of the media object |
| embedUrl   | string | An embed format of video with player                |
| playerType | enum   | Possible values: flash, html5, silverlight.         |
| thumbnail  | string | A thumbnail image relevant to the Video             |
| duration   | number | The duration of the recording                       |
| height     | number | The height of the item                              |
| width      | number | The width of the item                               |

### RecipeSource

| ATTRIBUTE       | TYPE           | DESCRIPTION |
| --------------- | -------------- | ----------- |
| name\*          | string         |             |
| displayName     | string         |             |
| sourceRecipeUrl | string         |             |
| license         | string         |             |
| image           | ImageContainer |             |

### RecipeLabels

| ATTRIBUTE  | TYPE                 | DESCRIPTION |
| ---------- | -------------------- | ----------- |
| mealType\* | array \[RecipeLabel] |             |
| cuisine\*  | array \[RecipeLabel] |             |
| category\* | array \[RecipeLabel] |             |

### RecipeLabel

Some RecipeLabel description

| ATTRIBUTE     | TYPE   | DESCRIPTION |
| ------------- | ------ | ----------- |
| name\*        | string |             |
| displayName\* | string |             |

### RecipeDurations

| ATTRIBUTE | TYPE   | DESCRIPTION                 |
| --------- | ------ | --------------------------- |
| cookTime  | number | Cooking time in minutes     |
| prepTime  | number | Preparation time in minutes |
| totalTime | number | Total time in minutes       |

### RecipeConstraints

| ATTRIBUTE  | TYPE                  | DESCRIPTION                                |
| ---------- | --------------------- | ------------------------------------------ |
| violates\* | ConstraintsCollection | Constraints which are violated in a recipe |

### ConstraintsCollection

| ATTRIBUTE    | TYPE  | DESCRIPTION                                                                                                                                                         |
| ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| diets\*      | array | List of diets Possible values: lacto-vegetarian, ovo-vegetarian, ovo-lacto-vegetarian, pescatarian, vegan, vegetarian.                                              |
| avoidances\* | array | List of avoidances and intolerances Possible values: celery, crustacean, egg, fish, groundnut, milk, mollusc, mustard, sesame, soybean, sulphites, tree-nut, wheat. |

### RecipeSaved

| ATTRIBUTE     | TYPE            | DESCRIPTION                                    |
| ------------- | --------------- | ---------------------------------------------- |
| value         | boolean         | True if this recipe is saved to favorites      |
| collectionIds | array \[string] |                                                |
| owner         | boolean         | If current user is owner of the recipe         |
| type          | enum            | Recipe type Possible values: manual, imported. |

### RecipeAuthor

| ATTRIBUTE | TYPE           | DESCRIPTION |
| --------- | -------------- | ----------- |
| name      | string         |             |
| image     | ImageContainer |             |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.whisk.com/api/recipes/user-recipes-and-collections/add-user-recipe.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
