curl --request POST \
--url https://www.closient.com/products/api/v1/recipes \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"gtins": [
"00850012345671"
],
"ingredients_list": "1 cup oat milk\n1/2 cup rolled oats",
"instructions": "Stir, cover and chill overnight.",
"title": "Overnight Oats"
}
'import requests
url = "https://www.closient.com/products/api/v1/recipes"
payload = {
"gtins": ["00850012345671"],
"ingredients_list": "1 cup oat milk
1/2 cup rolled oats",
"instructions": "Stir, cover and chill overnight.",
"title": "Overnight Oats"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
gtins: ['00850012345671'],
ingredients_list: '1 cup oat milk\n1/2 cup rolled oats',
instructions: 'Stir, cover and chill overnight.',
title: 'Overnight Oats'
})
};
fetch('https://www.closient.com/products/api/v1/recipes', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'gtins' => [
'00850012345671'
],
'ingredients_list' => '1 cup oat milk
1/2 cup rolled oats',
'instructions' => 'Stir, cover and chill overnight.',
'title' => 'Overnight Oats'
]),
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"
payload := strings.NewReader("{\n \"gtins\": [\n \"00850012345671\"\n ],\n \"ingredients_list\": \"1 cup oat milk\\n1/2 cup rolled oats\",\n \"instructions\": \"Stir, cover and chill overnight.\",\n \"title\": \"Overnight Oats\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://www.closient.com/products/api/v1/recipes")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"gtins\": [\n \"00850012345671\"\n ],\n \"ingredients_list\": \"1 cup oat milk\\n1/2 cup rolled oats\",\n \"instructions\": \"Stir, cover and chill overnight.\",\n \"title\": \"Overnight Oats\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/recipes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"gtins\": [\n \"00850012345671\"\n ],\n \"ingredients_list\": \"1 cup oat milk\\n1/2 cup rolled oats\",\n \"instructions\": \"Stir, cover and chill overnight.\",\n \"title\": \"Overnight Oats\"\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"
}Create recipe
Create a recipe and attach it to the listed products. Requires CONTRIBUTE on the organization. 404 if any GTIN isn’t a product the organization owns; nothing is created.
curl --request POST \
--url https://www.closient.com/products/api/v1/recipes \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"gtins": [
"00850012345671"
],
"ingredients_list": "1 cup oat milk\n1/2 cup rolled oats",
"instructions": "Stir, cover and chill overnight.",
"title": "Overnight Oats"
}
'import requests
url = "https://www.closient.com/products/api/v1/recipes"
payload = {
"gtins": ["00850012345671"],
"ingredients_list": "1 cup oat milk
1/2 cup rolled oats",
"instructions": "Stir, cover and chill overnight.",
"title": "Overnight Oats"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
gtins: ['00850012345671'],
ingredients_list: '1 cup oat milk\n1/2 cup rolled oats',
instructions: 'Stir, cover and chill overnight.',
title: 'Overnight Oats'
})
};
fetch('https://www.closient.com/products/api/v1/recipes', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'gtins' => [
'00850012345671'
],
'ingredients_list' => '1 cup oat milk
1/2 cup rolled oats',
'instructions' => 'Stir, cover and chill overnight.',
'title' => 'Overnight Oats'
]),
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"
payload := strings.NewReader("{\n \"gtins\": [\n \"00850012345671\"\n ],\n \"ingredients_list\": \"1 cup oat milk\\n1/2 cup rolled oats\",\n \"instructions\": \"Stir, cover and chill overnight.\",\n \"title\": \"Overnight Oats\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://www.closient.com/products/api/v1/recipes")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"gtins\": [\n \"00850012345671\"\n ],\n \"ingredients_list\": \"1 cup oat milk\\n1/2 cup rolled oats\",\n \"instructions\": \"Stir, cover and chill overnight.\",\n \"title\": \"Overnight Oats\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/recipes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"gtins\": [\n \"00850012345671\"\n ],\n \"ingredients_list\": \"1 cup oat milk\\n1/2 cup rolled oats\",\n \"instructions\": \"Stir, cover and chill overnight.\",\n \"title\": \"Overnight Oats\"\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
Body
Payload for POST /recipes.
Recipe title.
1 - 200^[^\x00]{1,200}$Ingredients, one per line.
1^[^\x00]{0,}$Preparation instructions.
1^[^\x00]{0,}$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}$Short description.
^[^\x00]{0,}$External image URL (http or https). Empty for none.
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 GTINs of the products to show the recipe on (8, 12, 13 or 14 digits). Each must be a product the recipe's organization owns, else 404 and nothing is created.
2008 - 14Response
Created
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).