Developer Guides
Build with the Culture Graph API
Predictive trend metrics and real-time velocity scoring for memes, slang, and internet culture — delivered as a single, consistent JSON API. These guides take you from your first request to production-ready error handling.
Quickstart
- Choose a plan on the pricing page — your API key is issued immediately after checkout and is always available in your dashboard.
- Send the key as a bearer token on every request.
- Call a term endpoint and read the metrics from the response.
curl "https://internet-culture.vercel.app/api/v1/terms/brainrot" \
-H "Authorization: Bearer cg_live_your_api_key"const response = await fetch("https://internet-culture.vercel.app/api/v1/terms/brainrot", {
headers: { Authorization: "Bearer cg_live_your_api_key" },
});
if (!response.ok) {
const { error } = await response.json();
throw new Error(`${error.code}: ${error.message}`);
}
const { data } = await response.json();
console.log(data.velocityIndex, data.decayTracker, data.originMapping);import requests
response = requests.get(
"https://internet-culture.vercel.app/api/v1/terms/brainrot",
headers={"Authorization": "Bearer cg_live_your_api_key"},
timeout=10,
)
response.raise_for_status()
data = response.json()["data"]
print(data["velocityIndex"], data["decayTracker"])Authentication
Authenticate every request with your API key in the Authorization header. Keys are stored only as one-way hashes — the full key is shown once at creation. If a key is exposed, rotate it from your dashboard; the previous key is revoked immediately.
Authorization: Bearer cg_live_your_api_keyTerm lookup
GET /api/v1/terms/:slug returns the complete intelligence profile for one term: velocity scoring, lifecycle decay, cross-platform origin timeline, and structured template data. Use GET /api/v1/terms to search and browse slugs.
Batch lookup
POST /api/v1/terms/batch resolves up to 20 slugs in a single round trip, which counts as one request against your burst limit. Unknown slugs never fail the request — they are returned as { "found": false } next to the successful results, so one typo cannot discard a whole batch.
curl -X POST "https://internet-culture.vercel.app/api/v1/terms/batch" \
-H "Authorization: Bearer cg_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "slugs": ["rizz", "aura", "not-a-real-term"] }'{
"success": true,
"data": [
{ "slug": "rizz", "found": true, "term": { "term": "Rizz", "velocityIndex": "4.2%" } },
{ "slug": "aura", "found": true, "term": { "term": "Aura", "velocityIndex": "-1.3%" } },
{ "slug": "not-a-real-term", "found": false }
],
"meta": { "requested": 3, "found": 2 }
}Response schema
velocityIndex— real-time velocity score: the recent change in interest, as a signed percentage.decayTracker— lifecycle decay index and saturation status, for forecasting how long a trend stays relevant.originMapping— chronological, cross-platform origin timeline from first appearance to current stage.templateData— structured classification and virality preference score for programmatic use.
Metrics are computed from Internet Culture Hub’s editorial scoring model and tracked platform data. They are an analytical layer, not third-party telemetry.
{
"success": true,
"data": {
"term": "Brainrot",
"definition": "...",
"category": "slang",
"velocityIndex": "12.5%",
"decayTracker": {
"cringeStatus": "Rising",
"decayIndex": 0.42
},
"originMapping": [
{ "platform": "tiktok", "stage": "Origin", "date": "2023-06-01" },
{ "platform": "tiktok", "stage": "Current", "date": "2026-08-01" }
],
"templateData": {
"name": "slang term",
"status": "Established",
"viralPreferenceScore": 74
},
"relatedSlugs": ["skibidi-toilet", "gyatt"]
}
}Rate limits & quotas
| Plan | Monthly quota | Burst limit |
|---|---|---|
| Starter — $19.99/mo | 25,000 requests | 100 req/min |
| Pro — $49.99/mo | 250,000 requests | 1,000 req/min |
Every response reports your remaining capacity in X-RateLimit-Limit, X-RateLimit-Remaining, X-Quota-Limit, and X-Quota-Remaining. Exceeding either limit returns 429.
Errors
Every endpoint under /api/v1 returns errors in one shape, so a single handler covers your whole integration:
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Please slow down and try again shortly.",
"status": 429
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_INPUT | A parameter failed validation. The response includes an issues array with per-field detail. |
| 401 | UNAUTHORIZED | API key missing, malformed, or revoked. |
| 404 | NOT_FOUND | No term exists for that slug. |
| 429 | RATE_LIMITED | Burst limit or monthly quota exceeded. |
| 500 | INTERNAL_ERROR | Unexpected server error. Safe to retry with backoff. |
Recommended retry pattern
async function getTerm(slug, attempt = 0) {
const res = await fetch(`https://internet-culture.vercel.app/api/v1/terms/${slug}`, {
headers: { Authorization: "Bearer cg_live_your_api_key" },
});
// Back off on burst limiting; fail fast on everything else.
if (res.status === 429 && attempt < 3) {
await new Promise((r) => setTimeout(r, 2 ** attempt * 1000));
return getTerm(slug, attempt + 1);
}
if (!res.ok) throw new Error((await res.json()).error.code);
return (await res.json()).data;
}Live demo
Query the Culture Graph API from your browser — no key required for these sample terms. See exactly what your application will receive.
Culture Graph API
Try it live
Pick a term and see a real (teaser) response from the API — velocity, decay tracking, origin mapping, and template data.
Pick a term and hit run.
Limited to 5 requests/day per visitor and truncated to 2 items per field. Upgrade for full, unlimited access.
Need every parameter and schema? Open the API Reference.