01 What a niche is
A niche isn't a single hashtag search — it's a bundle of creators, sounds and hashtags we track together because they cluster around the same topic.
niche — a broad umbrella domain such as Fitness or Gaming, identified by niche_id.
subniche — a tracked content cluster inside an umbrella niche, identified by the stable topic_id used by the endpoints below.
tier — a size class for an entity, nano through xl, based on its own view/follower volume — so "rising" can mean "small but accelerating," not just "big."
Seeds vs. membership: A subniche is a named group of terms; its ID (topic_id) is a slug — sometimes a real hashtag, but not required. It starts with seeds — the defining entities (creator handles, hashtags, sounds, comments, search terms). Membership is the discovered output, much larger — videos that cluster with the seeds even if they weren't seeds themselves. Fitness has 742 seeds but 5,702 members. One term can live in many subniches by design.
GET /niches is the registry-visible subniche catalog. Canonical and legacy subniches are shared; a subniche minted by your client is visible to you; another client's private mint is returned as 404, just like an unknown ID. client_topics remains a follow-list for personalization and does not grant private-topic access.
POST /niches/from-description is client-callable. It first returns an action="matched" envelope when canonical subniches overlap the extracted terms; force_mint=true or no match runs the metered LLM/scrape path and returns action="minted" for a caller-owned subniche.
POST /niches/from-term is the LLM-free sibling: pass {term} (a single hashtag or short search term, no description) and it normalizes that one term straight into the same match-first / mint-fallback path — same matched / minted envelope, just without an extracted_seeds field since there's no LLM extraction step.
Every request on this page needs Authorization: Bearer <API_KEY>.
02 List & compare
Two ways to see your whole subniche portfolio at once, before you drill into any one of them.
GET /directory is the single niche → subniche tree. It returns each umbrella's display label, a deduplicated entity_count computed only from topics visible to you, and each subniche's curated term_count. Legacy and unassigned topics remain in a niche_id: null, label: null bucket. See the generated Reference for its full response contract.
topic_id — the key you pass everywhere else.
The starting point for your configured workspace — canonical, caller-owned, and legacy topic_id values plus coverage stats for each.
curl -s "https://api.metrix.ac/api/v1/niches" \
-H "Authorization: Bearer $TM_API_KEY"
{
"niches": [
{ "topic_id": "food_cooking", // ← pass this as {topic_id} below
"name": "Food & Cooking", "category": "food",
"seed_count": 123, "hashtag_count": 115,
"hashtag_seeds": 115, "creator_seeds": 8,
"video_count": 3587, "coverage": "good", "status": "ready" }
],
"total": 3
}
seed_count is the total across every seed type. hashtag_count is retained as a hashtag-specific field and equals hashtag_seeds; it is not the total.
One request, one screen: every niche you can see, its current 24h velocity, which way it's trending, and its single top mover — sorted by ?sort= (default velocity_24h; also velocity_delta, opportunity_count).
curl -s "https://api.metrix.ac/api/v1/niches/compare" \
-H "Authorization: Bearer $TM_API_KEY"
{
"total": 3,
"summaries": [
{ "topic_id": "food_cooking", "velocity_24h": 128541.43, "velocity_delta": 0.0,
"trend_direction": "flat", // ← up / down / flat since the last compute
"top_entity_id": "relationships", "top_entity_type": "hashtag", "opportunity_count": 0 }
]
}
Pass ?topic_ids= (comma-separated) to compare a subset of your registry-visible topics.
Seeds & affinity
The taxonomy's seed detail and affinity controls share the same registry scope as the list above. Unknown and foreign-private topic_id values both return 404.
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/seeds" \
-H "Authorization: Bearer $TM_API_KEY"
Unlike the directory's platform-validated term view, this response preserves all four configured seed types: hashtag, creator, sound, and comment_author.
curl -s -X POST "https://api.metrix.ac/api/v1/niches/food_cooking/affinity/recompute?entity_type=creator&min_evidence=1&limit=50" \
-H "Authorization: Bearer $TM_API_KEY"
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/affinity?entity_type=creator&min_affinity=0.5&limit=50" \
-H "Authorization: Bearer $TM_API_KEY"
03 Niche intel
Three velocity views inside a single niche: the full leaderboard, the small-and-accelerating list, and the entities that jumped size tiers outright.
Pass entity_type=ig_hashtag for Instagram hashtag trends. The three endpoints below (/trending, /rising, /breakouts) accept it alongside the TikTok types (hashtag, sound, creator) — same response shape, same windows, ranked the same way. It's scoped to the same niche topic_id: we map the niche's TikTok tags onto Instagram, so a niche you already see on TikTok gains an Instagram hashtag view for free. Coverage is thinner than TikTok (Instagram is hashtags only today — no Instagram sounds, creators, or videos yet), so expect fewer rows.
Same velocity leaderboard as the trending page, pre-scoped to one niche. entity_type is one of hashtag (default), sound, creator, or ig_hashtag (Instagram — see the note above); window defaults to 24h.
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/trending?limit=3" \
-H "Authorization: Bearer $TM_API_KEY"
# same niche, Instagram hashtag trends instead of TikTok
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/trending?entity_type=ig_hashtag&limit=3" \
-H "Authorization: Bearer $TM_API_KEY"
{
"entity_type": "hashtag",
"window": "24h",
"results": [
{ "entity_id": "relationships", "velocity": 128541.43, // ← the niche's #1 climber
"acceleration": -12262.94, "size_tier": "xl", "rank_velocity": 10 },
{ "entity_id": "icecream", "velocity": 53176.04, "size_tier": "medium", "consecutive_positive_windows": 2 }
]
}
Filters to entities with positive acceleration that have climbed for two consecutive windows in a row — this is the "still moving" list rather than the raw leaderboard above. It spans every size tier by default; pass ?tier=nano for a nano-only early-signal view.
curl -s "https://api.metrix.ac/api/v1/niches/fitness_health/rising?entity_type=hashtag&limit=5" \
-H "Authorization: Bearer $TM_API_KEY"
{
"entity_type": "hashtag",
"window": "24h",
"results": [
{ "entity_id": "dance", "velocity": 362601.65, "acceleration": 31530.58, // ← still climbing, not just big
"size_tier": "large", "consecutive_positive_windows": 4 }
]
}
Live-captured against fitness_health — food_cooking and brainrot_memes both came back empty for this window on every entity_type we tried. That's a real, expected result: this endpoint only surfaces entities with two straight windows of positive acceleration, and most windows most niches have none. Default entity_type is sound; we passed hashtag above to get a result to show.
Not a leaderboard sorted by a metric — a list of entities whose classified size_tier itself jumped by min_tier_jump or more steps (default 2) within the window. This is the closest thing to "went viral overnight" the API can point at directly.
curl -s "https://api.metrix.ac/api/v1/niches/brainrot_memes/breakouts?limit=5" \
-H "Authorization: Bearer $TM_API_KEY"
{
"topic_id": "brainrot_memes",
"min_tier_jump": 2,
"total": 1,
"breakouts": [
{ "entity_id": "dancecompetition", "entity_type": "hashtag",
"old_tier": "nano", "new_tier": "medium", // ← nano → medium in one window
"tier_jump": 4 }
]
}
Live-captured against brainrot_memes — food_cooking and fitness_health both came back with total: 0 for this window. A 2+ tier jump is genuinely rare; an empty result here is the common case, not a broken call.
04 Content gaps
Looks across every other niche you can see, finds entities that are trending there, and checks whether this niche has touched them at all. What comes back is a shortlist of formats or hashtags proven to work elsewhere that no one in this niche has tried.
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/content-gaps?limit=5" \
-H "Authorization: Bearer $TM_API_KEY"
{
"topic_id": "food_cooking",
"total": 3,
"results": [
{ "entity_id": "comedy", "entity_type": "hashtag", "max_velocity": 3389019.52, // ← untouched here, huge elsewhere
"source_niches": ["brainrot_memes", "fitness_health", "gaming", "sports"] }
]
}
source_niches can include niches outside your own subscription (they're the source of the trend, not something you're being shown data for) — trimmed above from 8 entries to 4.
05 People
affinity — how strongly a creator's actual posts overlap with this niche's signals, not just whether they've ever used one relevant hashtag. Higher affinity_score means more of their content genuinely belongs here.
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/creators?limit=3" \
-H "Authorization: Bearer $TM_API_KEY"
{
"topic_id": "food_cooking",
"total": 3,
"results": [
{ "creator_id": "ambreen_08", "affinity_score": 0.9999, // ← 0–1, how well they fit this niche
"confidence": 0.0174, "velocity": null, "size_tier": null }
]
}
confidence is separate from affinity_score — a low confidence (like 0.0174 above) means the score is based on a thin sample of that creator's posts, so treat a high-affinity/low-confidence creator as a lead to verify, not a settled fact. velocity/size_tier come back null when we haven't computed a velocity row for that creator yet.
06 Playbook
Two tactical answers for this niche: which hashtags to pair, and when to post.
Pairs of hashtags that keep showing up together on this niche's top-performing videos, ranked by the average view count of videos using both. min_video_count (default 3) filters out one-off coincidences.
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/hashtag-combos?limit=3" \
-H "Authorization: Bearer $TM_API_KEY"
{
"topic_id": "food_cooking",
"total": 3,
"results": [
{ "hashtag_a": "fyp", "hashtag_b": "unitedstates", "video_count": 17,
"avg_views": 188600000.0, // ← average views when both tags are used together
"max_views": 372600000 }
]
}
Every (day, hour) slot this niche has posted in, with how many videos and their average views — sorted by average views, so the first row is this niche's best-performing posting slot.
curl -s "https://api.metrix.ac/api/v1/niches/food_cooking/timing" \
-H "Authorization: Bearer $TM_API_KEY"
{
"topic_id": "food_cooking",
"total": 148,
"slots": [
{ "day_of_week": 1, "hour_of_day": 20, "video_count": 24, "avg_views": 36344860.5 }, // ← this niche's best slot
{ "day_of_week": 5, "hour_of_day": 23, "video_count": 35, "avg_views": 17705726.8 }
]
}
day_of_week follows Postgres' EXTRACT(DOW) convention: 0 = Sunday … 6 = Saturday. hour_of_day is UTC, not the creator's local time.