Skip to documentation
API reference

Developer docs

Trends data API for developers and AI agents.

View Markdown

Discover current trends and understand the context behind them, based on social conversations, aggregated across social platforms.

Keywords discovers trends gaining attention or prominent now, with related keywords, metrics, supporting context and source posts. Its structured output helps tools decide what to surface, create, or explore.

Answers explains what people are saying about a question, with supporting posts. Its output is prose for research or an agent’s context.

How to use gist

Topic
Area of gist coverage to search, such as travel.
Query
The subject or market segment to explore within that area, such as solo backpacking travellers.
Trend
Patterns and themes gaining attention in social conversations related to your query.
Keywords
Related terms people use around a trend. The numerical metrics belong to these terms.

Start with Keywords to discover trends: emerging finds what is gaining attention, while prevalent finds what is prominent now. Use Answers when you need more context or want to ask your own question. Keywords and Answers work independently; an Answers request does not require a preceding Keywords request.

Quickstart

The base URL is https://gist-api.the-alt.co.

Create an API key in the dashboard. Send it as a bearer token in the Authorization header.

Keep your key in a server-side environment variable; do not include it in browser code. Set GIST_KEY before running the requests below. See Choose a topic for available topic names.

Set your API keybash
export GIST_KEY="your_api_key"
1 · Ask for emerging trendsbash
curl -X POST https://gist-api.the-alt.co/v1/keywords/travel \
  -H "Authorization: Bearer $GIST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"solo backpacking travellers"}'
2 · Read the response (excerpt)json
{
  "signals": [{
    "label": "Autumn Golden Larch Hiking",
    "context": "Solo backpackers and hikers heading out during early October for peak fall foliage and larch season treks through mountain trails and national parks.",
    "keywords": ["golden larch"],
    "keywordStats": [{"phrase":"golden larch","shareOfVoice":2.2,"growth":28.1,"intent":null}]
  }]
}

Excerpt of the actual response: a trend, its context, and one related keyword with metrics. See the Keywords reference for the larger example with supporting posts and the full field descriptions.

Use gist in AI assistants (MCP)

gist is also a remote MCP server, so AI assistants such as Claude, ChatGPT, Cursor and VS Code can use Keywords and Answers directly, without writing code. Add this server URL to your assistant:

MCP server URLtext
https://gist-api.the-alt.co/mcp

The first time your assistant uses gist, it opens a gist sign-in page. Enter your email, open the sign-in link we send you, then review and allow access. The assistant then runs queries as your account, with the same plan and units as the API: each uncached call costs 1 unit. It stays connected as long as you use it at least once every 90 days.

Tools

ToolSame asDescription
keywordsKeywordsDiscovers trends gaining attention or prominent now, with signal scores, strength bands, related keywords with metrics and intent classifications, supporting context and source posts. Arguments · query, topic (default "all"), mode, geo, format
answersAnswersExplains what people are saying about a question, with supporting posts. Arguments · query, topic (default "all"), geo, weeks, content

Both tools return the same results as their endpoints, including noSignal, knowledgeCutoff and usage, so the rest of this reference applies to them too.

Add gist to your assistant

  • Claude (web and desktop): go to Customize → Connectors → Add → Add custom connector, and paste the server URL. On Team and Enterprise plans, an owner adds it under Organization settings → Connectors. See Claude’s guide.
  • ChatGPT: turn on developer mode, then add a custom MCP connector with the server URL and OAuth authentication. See OpenAI’s guide for where these settings are.
  • Claude Code, Cursor and VS Code: use the configuration below.
bash
claude mcp add --transport http gist https://gist-api.the-alt.co/mcp
# then run /mcp in Claude Code and choose gist to sign in

Clients that can’t sign you in, and automated agents, can send an API key in the Authorization header instead, as in the last tab. Keep the key out of config files you share or commit.

Keywords

POST/v1/keywords/{topic|all}

Keywords discovers trends gaining attention or prominent now, with related keywords, metrics, supporting context and source posts. Its structured output helps tools decide what to surface, create, or explore.

See the Keywords guide for a worked skincare example and a content pipeline using this endpoint.

Each trend includes context explaining what people are discussing and how it relates to your query. This helps AI agents interpret the related keywords and decide what to create or explore.

Each trend in signals has a name (label), an explanation (context), related keywords, keyword-level metrics in keywordStats, and supporting posts.

mode: "emerging" finds trends gaining attention in the latest week of available data; it is the default. mode: "prevalent" finds trends prominent in that week. A trend's related keywords do not all need positive growth: mountains has negative growth in the prevalent example below.

Understand the metrics

Share of Voice (shareOfVoice) estimates how much of the relevant social conversation is associated with a keyword in the latest week of available data. Higher values mean the keyword is more prominent in the conversation around your query.

Growth (growth) indicates whether a keyword is gaining or losing traction compared with recent weeks. Positive values mean rising, negative values mean declining, and 0 means roughly flat. This is a relative score, not a literal percentage change.

Together, these metrics help you understand how prominent a keyword is and whether it is gaining or losing attention. A keyword may not have enough measurement data, resulting in null. This does not mean zero.

Path parameters

ParameterTypeDescription
topicstringrequired · A coverage area you can access, such as "travel" or "recipes". Use "all" to have gist pick the most relevant topics your key can access for the query.

Body parameters

ParameterTypeDescription
querystringrequired · What to explore within the topic, such as "solo backpacking travellers" (max 400 characters).
geostringoptional · Filter by where authors or creators are based (max 120 characters). For example, "UAE" restricts results to UAE-based creators. More specific locations, such as "Dubai", are supported on a best-effort basis using creators’ stated locations. To explore a place as a subject, include it in query.
format"json" | "text"default json · "json" returns structured trends in signals. "text" returns prose in read, with signals empty. The response is JSON in both cases. Either format costs 1 unit when uncached, or 0 when cached.
mode"emerging" | "prevalent"default emerging · "emerging" finds trends gaining attention in the latest week of available data. "prevalent" finds trends prominent in the latest week of available data.

Response fields

FieldTypeDescription
topicsstring[]The topics searched.
querystringYour query, echoed back.
formatstringThe format used — "json" or "text".
modestringThe mode used — "emerging" or "prevalent".
knowledgeCutoffstringISO 8601 · The date and time through which the information behind the results is up to date.
noSignalbooleanTrue when there is not enough evidence to identify trends in the selected mode. This is a successful response, not an error.
signalsobject[]Trends related to your query. Empty for format "text" or when noSignal is true.
signals[].labelstringThe name of the trend, such as "Alpine and Mountain Trekking".
signals[].scoreinteger | null0–100 · Signal strength on an absolute scale, comparable across calls. It reflects how many distinct mentions carry the trend and how fast it’s moving. A higher score means a stronger signal. Null when the trend’s keywords could not be measured or when an older cached response has no score. Null does not mean zero.
signals[].strength"high" | "medium" | "low"Groups scored trends into three bands: high for 60–100, medium for 35–59, and low for 0–34.
signals[].contextstringA short explanation of the trend, grounded in conversation snippets retrieved and ranked for relevance to your query.
signals[].keywordsstring[]Related keywords within the trend. Use them to explore the language people use or build content briefs. Metrics for each keyword are in keywordStats.
signals[].keywordStatsobject[]Measurements and intent classifications for the related keywords, in the same order as keywords. Each entry names its phrase. This array may be empty for older cached responses.
signals[].keywordStats[].phrasestringThe keyword these measurements describe.
signals[].keywordStats[].shareOfVoicenumber | null0–100 · An estimate of how much of the relevant social conversation is associated with this keyword in the latest week of available data. Higher values mean it is more prominent around your query. A keyword without enough measurement data may return null; this does not mean zero.
signals[].keywordStats[].growthnumber | null-100 to +100, 0 = flat · Whether the keyword is gaining or losing traction compared with recent weeks. Positive means rising, negative means declining, and 0 is roughly flat. This is a relative score, not a literal percentage change. Null means there is not enough measurement data, not zero growth.
signals[].keywordStats[].intent"commercial" | "informational" | null"commercial" for finding or buying a product, "informational" for learning or understanding, or null when no classification is available. Use it to choose keywords relevant to your workflow and guide the content you create.
signals[].postsobject[]Supporting source posts, each with url and handle.
signals[].posts[].urlstringLink to the supporting post.
signals[].posts[].handlestringThe source account’s handle.
readstring | nullA prose explanation of the trends, for format "text". Null for format "json".
usage.cachedbooleanTrue when served from cache. Cached responses do not consume a unit.
usage.unitsRemainingnumberYour remaining units after this call.

Example: solo backpacking travellers

Both use the travel topic and the same query as Answers. Each response shows the first returned trend; additional trends and posts are omitted.

Emerging

Seasonal interest in autumn larch hiking.

bash
curl -X POST https://gist-api.the-alt.co/v1/keywords/travel \
  -H "Authorization: Bearer $GIST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"solo backpacking travellers","format":"json","mode":"emerging"}'

Prevalent

The broader prominence of alpine and mountain trekking.

bash
curl -X POST https://gist-api.the-alt.co/v1/keywords/travel \
  -H "Authorization: Bearer $GIST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"solo backpacking travellers","format":"json","mode":"prevalent"}'

Answers

POST/v1/search/{topic|all}

Answers explains what people are saying about a question, with supporting posts. Its output is prose for research or an agent’s context. Ask about a trend discovered through Keywords, or bring your own question.

Use the short summary or the fuller read as context in an AI tool or research workflow. annotations link passages in read to supporting posts.

Each annotation has start and end zero-based Unicode character offsets into read. In JavaScript, Array.from(read).slice(start, end).join('') gives you the passage that post supports: start is inclusive and end is exclusive. Apply offsets to the original text before formatting it. Multiple posts can support the same passage.

If there is not enough evidence to answer your question, the request succeeds with noSignal: true. Check notes for evidence gaps or limits, even when an answer is returned.

Path parameters

ParameterTypeDescription
topicstringrequired · A coverage area you can access, such as "travel" or "recipes". Use "all" to have gist pick the most relevant topics your key can access for the query.

Body parameters

ParameterTypeDescription
querystringrequired · What you want to understand within the topic. A question or subject, up to 400 characters.
geostringoptional · Filter by where authors or creators are based (max 120 characters). For example, "UAE" restricts results to UAE-based creators. More specific locations, such as "Dubai", are supported on a best-effort basis using creators’ stated locations. To explore a place as a subject, include it in query.
weeksintegerdefault 4 · How many recent complete weeks the answer draws on (1–12).
contentbooleandefault false · Also return contentRead, an explanation of how posts present the subject, such as formats, hooks and angles.

Response fields

FieldTypeDescription
topicsstring[]The topics searched.
querystringYour query, echoed back.
knowledgeCutoffstringISO 8601 · The date and time through which the information behind the results is up to date.
summarystringShort, prompt-ready synthesis.
readstringThe answer to your query, as clean prose. Citations are in annotations, not inline.
noSignalbooleanTrue when there is not enough evidence to answer your question. This is a successful response, not an error.
notesstringUseful context about the answer, including evidence gaps or limits. When noSignal is true, explains why.
annotationsobject[]Source posts for passages in read. start and end are character offsets: Array.from(read).slice(start, end).join("") returns the cited passage. Each annotation also includes url, platform and handle. Several posts can cite the same passage.
annotations[].startintegerZero-based start offset in the original read, inclusive.
annotations[].endintegerEnd offset in the original read, exclusive.
annotations[].urlstringLink to the supporting post.
annotations[].platformstringSource platform. May be an empty string when unavailable.
annotations[].handlestringThe source account’s handle.
contentReadstring | nullHow posts present the subject; null unless content:true was requested.
usage.cachedbooleanTrue when served from cache. Cached responses do not consume a unit.
usage.unitsRemainingnumberYour remaining units after this call.
bash
curl -X POST https://gist-api.the-alt.co/v1/search/travel \
  -H "Authorization: Bearer $GIST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"solo backpacking travellers"}'

Choose a topic

GET/v1/topics

Use this endpoint to find available topics. In the response’s topics array, topicName is the display name, topicId is the name to use in your request URL, and searchable: true identifies topics ready for Keywords and Answers. Use all to have gist pick the most relevant topics your key can access for the query.

List available topicsbash
curl https://gist-api.the-alt.co/v1/topics -H "Authorization: Bearer $GIST_KEY"

Request and response conventions

Both endpoints use a topic slug in the path to select one area of coverage. Use all to have gist pick the most relevant topics your key can access for the query. The response's topics array shows which were searched.

Use geo to filter by where authors or creators are based. For example, "geo": "UAE" restricts results to UAE-based creators. More specific locations, such as "Dubai", are supported on a best-effort basis using creators’ stated locations. To explore a place as a subject, include it in query.

knowledgeCutoff tells you how up to date the information behind the results is. For example, October 4 means the results draw on information through October 4.

An uncached successful request costs 1 unit. A cached response costs 0 units. A response with noSignal: true is still successful and costs 1 unit unless cached. Check usage.cached and usage.unitsRemaining for each response. Repeating a request does not guarantee a cache hit.

noSignal: true means there was not enough evidence to return supported results. Keywords returns an empty signals array; Answers uses notes to explain the evidence gap. An empty signals array alone does not mean no signal: Keywords also returns one for format: "text".

Handle a response

  1. Check the HTTP status. For an error, follow the guidance below.
  2. Check noSignal before displaying results; for Answers, also check notes.
  3. Use the trends or answer, and retain supporting source links.
  4. Keep knowledgeCutoff with the results and check the remaining units in usage.

Errors

Check the HTTP status first. Application errors use this JSON envelope:

Error response · application/jsonjson
{
  "error": {
    "code": "not_found",
    "message": "No current material for topic 'travel'."
  }
}

Authentication errors use a different shape. A missing or invalid key returns HTTP 401, for example:

Authentication error · application/jsonjson
{
  "statusCode": 401,
  "message": "Provide a valid API key or sign in.",
  "error": "Unauthorized"
}

An account setup failure can also return HTTP 403 with statusCode, message, and error fields.

StatusCodeWhen
400invalid_requestA parameter was malformed.
401—Missing, invalid, or revoked API key.
403forbiddenYou cannot read the topic you asked about.
403plan_requiredYour plan is inactive or does not provide access to this topic.
404not_foundA topic you named does not exist or is not searchable yet. A topic that exists but can't answer returns 200 with noSignal: true, not 404.
429rate_limitedPer-minute burst limit exceeded — retry shortly.
429quota_exceededCredit budget exhausted for your plan (POST /v1/search, POST /v1/keywords).
503engine_unavailableThe request could not be completed right now. Retry later.

For rate_limited or engine_unavailable, wait and retry, increasing the delay between attempts. For quota_exceeded, replenish your units before retrying. For 400, 401, or 403, correct the request, credentials, or access issue first.