Vibe classify
What this does
Analyses one or more short text snippets and describes the feel of each: a named vibe (for example “Measured Clarity”), a list of mood tags, and five hex colours that match the tone. Built for brand, marketing, and creative teams who want consistent language about copy without manual mood boards.
This is the only fetch.li endpoint that uses AI (Anthropic Claude) on every request. It always requires an API key.
Who it is for
- Brand strategists scoring campaign lines
- Design tools suggesting palette starters from copy
- Content pipelines tagging drafts automatically
- Agencies batch-reviewing client messaging
Try it
There is no key-free demo for this endpoint. With a key, send JSON:
Request body (minimal):
{
"texts": [
"A rain-soaked Soho doorway, neon in the puddles, last orders ringing out.",
"We ship same-day across the UK. No fuss, just the parcel on your step."
]
}
Maximum 20 strings, each up to 8,000 characters. You may also send a raw JSON array of strings.
HTTP example
POST /v1/vibe/classify HTTP/1.1
Host: fetch.li
Authorization: Bearer ukdev_live_abc123xyz789
Content-Type: application/json
Accept: application/json
{
"texts": [
"Quiet luxury without the theatre."
]
}
curl
curl -sS https://fetch.li/v1/vibe/classify \
-H "Authorization: Bearer ukdev_live_abc123xyz789" \
-H "Content-Type: application/json" \
-d '{"texts":["Quiet luxury without the theatre."]}'
Alternate body shape (also accepted):
curl -sS https://fetch.li/v1/vibe/classify \
-H "Authorization: Bearer ukdev_live_abc123xyz789" \
-H "Content-Type: application/json" \
-d '["First line.", "Second line."]'
JavaScript fetch
const response = await fetch("https://fetch.li/v1/vibe/classify", {
method: "POST",
headers: {
Authorization: "Bearer ukdev_live_abc123xyz789",
"Content-Type": "application/json",
},
body: JSON.stringify({
texts: ["Quiet luxury without the theatre."],
}),
});
if (!response.ok) {
const err = await response.json();
throw new Error(err.error?.message);
}
const results = await response.json();
console.log(results[0].primary_vibe, results[0].color_palette);
Python requests
import requests
response = requests.post(
"https://fetch.li/v1/vibe/classify",
headers={
"Authorization": "Bearer ukdev_live_abc123xyz789",
"Content-Type": "application/json",
},
json={"texts": ["Quiet luxury without the theatre."]},
)
response.raise_for_status()
results = response.json()
print(results[0]["primary_vibe"], results[0]["mood_tags"])
Example JSON response
The response is a JSON array in the same order as your input strings. There is no wrapper object.
[
{
"primary_vibe": "Measured Clarity",
"mood_tags": ["focused", "editorial", "confident", "understated"],
"color_palette": [
"#0B1D2A",
"#1F6F8B",
"#7EE0C3",
"#F4F1EA",
"#C45C26"
]
}
]
Multiple inputs:
[
{
"primary_vibe": "Nocturnal Romance",
"mood_tags": ["cinematic", "moody", "urban-night", "intimate"],
"color_palette": ["#0B1020", "#1B3B6F", "#C45C26", "#E8D5B5", "#7EE0C3"]
},
{
"primary_vibe": "Practical Warmth",
"mood_tags": ["helpful", "direct", "trusted", "domestic"],
"color_palette": ["#14221B", "#3F7D5A", "#F4EFE4", "#C45C26", "#1A1F2B"]
}
]
Request body parameters
| Field | Required | Type | Description |
|---|---|---|---|
texts |
Yes* | string[] | 1–20 non-empty strings to classify |
| (root array) | Yes* | string[] | Alternative: send ["a","b"] instead of { "texts": [...] } |
items |
Yes* | string[] | Alternative key name, same as texts |
*Provide exactly one of: top-level array, texts, or items.
Response fields
| Field | Type | Description |
|---|---|---|
primary_vibe |
string | Short human label for the overall feel |
mood_tags |
string[] | Descriptive tags (lowercase, hyphenated where useful) |
color_palette |
string[] | Exactly five hex colours, including # |
Errors that can happen
| HTTP | error.code |
When |
|---|---|---|
| 400 | invalid_body |
Invalid JSON, empty strings, too many items, or string too long |
| 401 | unauthorized |
Missing or invalid Authorization: Bearer key |
| 403 | forbidden |
Key lacks permission for this product |
| 429 | rate_limited |
Key usage or rate limit exceeded |
| 502 | upstream_error |
Anthropic classification failed |
| 503 | unkey_unavailable |
Key verification temporarily unavailable |
| 500 | internal |
Unexpected server error |
Example auth error:
{
"error": {
"code": "unauthorized",
"message": "Send Authorization: Bearer <token> with a valid fetch.li API key."
}
}
Demo note
POST /v1/vibe/classify requires an API key. There is no anonymous demo. All GET tools (moon, VAT, weather, and the rest) work without a key on the public demo tier at 60 calls per hour per IP.
Never expose your key in browser JavaScript or public repositories. Call this endpoint from your server. See Authentication.