curl --request POST \
--url https://api.tastelabs.com/search \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"query": "dark brutalist developer tools",
"depth": "fast",
"top_k": 6
}
'import requests
url = "https://api.tastelabs.com/search"
payload = {
"query": "dark brutalist developer tools",
"depth": "fast",
"top_k": 6
}
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({query: 'dark brutalist developer tools', depth: 'fast', top_k: 6})
};
fetch('https://api.tastelabs.com/search', 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://api.tastelabs.com/search",
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([
'query' => 'dark brutalist developer tools',
'depth' => 'fast',
'top_k' => 6
]),
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://api.tastelabs.com/search"
payload := strings.NewReader("{\n \"query\": \"dark brutalist developer tools\",\n \"depth\": \"fast\",\n \"top_k\": 6\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://api.tastelabs.com/search")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"dark brutalist developer tools\",\n \"depth\": \"fast\",\n \"top_k\": 6\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tastelabs.com/search")
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 \"query\": \"dark brutalist developer tools\",\n \"depth\": \"fast\",\n \"top_k\": 6\n}"
response = http.request(request)
puts response.read_body{
"search_id": "<string>",
"depth": "fast",
"results": [
{
"url": "<string>",
"identity_paragraph": "<string>",
"brand_name": "<string>",
"match": "strong",
"reason": "<string>",
"badge": "discovery",
"tags": [
"<string>"
],
"palette": {},
"typography": {},
"screenshot_url": "<string>"
}
],
"query_tags": {
"industry": [
"<string>"
],
"page_type": [
"<string>"
],
"hue": [
"<string>"
],
"aesthetic": [
"<string>"
],
"style": "<string>"
}
}{
"detail": {
"error": "UNAUTHORIZED",
"message": "Bearer token or X-API-Key required"
}
}{
"detail": {
"error": "INSUFFICIENT_CREDITS",
"message": "Not enough credits for this request.",
"balance": 0,
"required": 1
}
}{
"detail": [
{
"loc": [
"body",
"url"
],
"msg": "Field required",
"type": "missing"
}
]
}"Internal Server Error"{
"detail": "Search failed."
}{
"detail": "<string>"
}Search brands
Searches the curated brand corpus for the aesthetic you describe in natural language, and returns ranked result cards.
Runs synchronously: there is nothing to poll. Consumes credits (more at deep depth), refunded if the search fails.
Results come from the corpus, not from your own submissions. To work with a result, extract it with POST /design/submissions.
An optional filters object narrows results as hard constraints (page_type, industry, hue, layout): every returned card satisfies them.
curl --request POST \
--url https://api.tastelabs.com/search \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"query": "dark brutalist developer tools",
"depth": "fast",
"top_k": 6
}
'import requests
url = "https://api.tastelabs.com/search"
payload = {
"query": "dark brutalist developer tools",
"depth": "fast",
"top_k": 6
}
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({query: 'dark brutalist developer tools', depth: 'fast', top_k: 6})
};
fetch('https://api.tastelabs.com/search', 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://api.tastelabs.com/search",
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([
'query' => 'dark brutalist developer tools',
'depth' => 'fast',
'top_k' => 6
]),
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://api.tastelabs.com/search"
payload := strings.NewReader("{\n \"query\": \"dark brutalist developer tools\",\n \"depth\": \"fast\",\n \"top_k\": 6\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://api.tastelabs.com/search")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"dark brutalist developer tools\",\n \"depth\": \"fast\",\n \"top_k\": 6\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tastelabs.com/search")
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 \"query\": \"dark brutalist developer tools\",\n \"depth\": \"fast\",\n \"top_k\": 6\n}"
response = http.request(request)
puts response.read_body{
"search_id": "<string>",
"depth": "fast",
"results": [
{
"url": "<string>",
"identity_paragraph": "<string>",
"brand_name": "<string>",
"match": "strong",
"reason": "<string>",
"badge": "discovery",
"tags": [
"<string>"
],
"palette": {},
"typography": {},
"screenshot_url": "<string>"
}
],
"query_tags": {
"industry": [
"<string>"
],
"page_type": [
"<string>"
],
"hue": [
"<string>"
],
"aesthetic": [
"<string>"
],
"style": "<string>"
}
}{
"detail": {
"error": "UNAUTHORIZED",
"message": "Bearer token or X-API-Key required"
}
}{
"detail": {
"error": "INSUFFICIENT_CREDITS",
"message": "Not enough credits for this request.",
"balance": 0,
"required": 1
}
}{
"detail": [
{
"loc": [
"body",
"url"
],
"msg": "Field required",
"type": "missing"
}
]
}"Internal Server Error"{
"detail": "Search failed."
}{
"detail": "<string>"
}Authorizations
API key issued by the Taste Engine. Create one in the dashboard at https://engine.tastelabs.com/app/api-keys.
Body
Natural-language description of the aesthetic you are looking for.
2 - 400"dark brutalist developer tools"
Search depth. fast returns in seconds. deep consumes more credits and can take up to ~3 minutes, for when result quality matters more than latency.
fast, deep Maximum number of results to return.
1 <= x <= 30Hard constraints on the results, not a ranking hint: every returned card satisfies them, and the list is never padded with out-of-filter lookalikes. Values are matched verbatim against the corpus vocabulary, so an unknown value returns no matches rather than an error.
Show child attributes
Show child attributes
Response
Ranked results for the query.
Identifier of this search, as recorded in your search history.
Search depth. fast returns in seconds. deep consumes more credits and can take up to ~3 minutes, for when result quality matters more than latency.
fast, deep Ranked results, best match first.
Show child attributes
Show child attributes
The engine's soft reading of the query, for display only. Never a constraint: results are not guaranteed to satisfy these. Only the request's filters narrow retrieval.
Show child attributes
Show child attributes
Was this page helpful?

