curl --request PATCH \
--url https://www.closient.com/products/api/v1/recipes/{recipe_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"difficulty": "easy",
"servings": 2
}
'import requests
url = "https://www.closient.com/products/api/v1/recipes/{recipe_id}"
payload = {
"difficulty": "easy",
"servings": 2
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({difficulty: 'easy', servings: 2})
};
fetch('https://www.closient.com/products/api/v1/recipes/{recipe_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.closient.com/products/api/v1/recipes/{recipe_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'difficulty' => 'easy',
'servings' => 2
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.closient.com/products/api/v1/recipes/{recipe_id}"
payload := strings.NewReader("{\n \"difficulty\": \"easy\",\n \"servings\": 2\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://www.closient.com/products/api/v1/recipes/{recipe_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"difficulty\": \"easy\",\n \"servings\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/recipes/{recipe_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"difficulty\": \"easy\",\n \"servings\": 2\n}"
response = http.request(request)
puts response.read_body{
"cooking_time_minutes": 0,
"created": "2026-09-30T09:00:00Z",
"description": "A make-ahead breakfast.",
"difficulty": "easy",
"id": "F5n5NdW6dTbvPYkgnLNjte",
"image_url": "https://example.com/oats.jpg",
"ingredients_list": "1 cup oat milk\n1/2 cup rolled oats",
"instructions": "Stir, cover and chill overnight.",
"modified": "2026-09-30T09:00:00Z",
"organization_id": "9fHkqR2aXcVbNmLpQwErTy",
"preparation_time_minutes": 5,
"products": [
{
"gtin": "00850012345671",
"id": "SBjSX6xUJPPHQKUXBpYX2C",
"product_name": "Oatly Oat Milk 946ml"
}
],
"servings": 1,
"title": "Overnight Oats"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Update recipe
Partial update: only the keys in the body are applied. gtins, when present, replaces the attached products. Requires CONTRIBUTE on the owning organization.
curl --request PATCH \
--url https://www.closient.com/products/api/v1/recipes/{recipe_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"difficulty": "easy",
"servings": 2
}
'import requests
url = "https://www.closient.com/products/api/v1/recipes/{recipe_id}"
payload = {
"difficulty": "easy",
"servings": 2
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({difficulty: 'easy', servings: 2})
};
fetch('https://www.closient.com/products/api/v1/recipes/{recipe_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.closient.com/products/api/v1/recipes/{recipe_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'difficulty' => 'easy',
'servings' => 2
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.closient.com/products/api/v1/recipes/{recipe_id}"
payload := strings.NewReader("{\n \"difficulty\": \"easy\",\n \"servings\": 2\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://www.closient.com/products/api/v1/recipes/{recipe_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"difficulty\": \"easy\",\n \"servings\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/recipes/{recipe_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"difficulty\": \"easy\",\n \"servings\": 2\n}"
response = http.request(request)
puts response.read_body{
"cooking_time_minutes": 0,
"created": "2026-09-30T09:00:00Z",
"description": "A make-ahead breakfast.",
"difficulty": "easy",
"id": "F5n5NdW6dTbvPYkgnLNjte",
"image_url": "https://example.com/oats.jpg",
"ingredients_list": "1 cup oat milk\n1/2 cup rolled oats",
"instructions": "Stir, cover and chill overnight.",
"modified": "2026-09-30T09:00:00Z",
"organization_id": "9fHkqR2aXcVbNmLpQwErTy",
"preparation_time_minutes": 5,
"products": [
{
"gtin": "00850012345671",
"id": "SBjSX6xUJPPHQKUXBpYX2C",
"product_name": "Oatly Oat Milk 946ml"
}
],
"servings": 1,
"title": "Overnight Oats"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Authorizations
Path Parameters
Id of the recipe.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Body
Payload for PATCH /recipes/{recipe_id}. Only the keys present are applied.
Recipe title.
1 - 200^[^\x00]{1,200}$Short description.
^[^\x00]{0,}$Ingredients, one per line.
1^[^\x00]{0,}$Preparation instructions.
1^[^\x00]{0,}$External image URL (http or https).
200^([Hh][Tt][Tt][Pp][Ss]?://[^\x00-\x20\x7f/?#][^\x00-\x20\x7f]{0,191})?$Preparation time in minutes.
0 <= x <= 2147483647Cooking time in minutes.
0 <= x <= 2147483647Number of servings the recipe makes.
1 <= x <= 2147483647How hard the recipe is.
easy, medium, hard Replace the set of products the recipe is shown on. Each must be a product the recipe's organization owns, else 404 and nothing changes. Omit to leave the attachments alone.
2008 - 14Response
OK
A recipe with the products it is attached to.
URL-safe 22-character shortuuid encoding of the row's UUID primary key. Stable across the row's lifetime; suitable for sharing in URLs, log lines, and external SDK clients. Accepted on input as either the shortuuid form or the canonical UUID form (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$The organization that owns this recipe.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Recipe title.
Short description. Empty string when unset.
Ingredients, one per line.
Preparation instructions.
External image URL. Empty string when unset.
Preparation time in minutes.
Cooking time in minutes.
Number of servings the recipe makes.
How hard the recipe is to prepare.
easy, medium, hard The products this recipe is shown on, by GTIN.
Show child attributes
Show child attributes
Server-side ISO 8601 timestamp of creation (UTC).
Server-side ISO 8601 timestamp of last modification (UTC).