Skip to content

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.

Related pages