Topic Trends
What people are talking about right now, by region: shows, celebrities, memes, sports moments, local events and news. Use Topic Trends to decide what to talk about, and post while a topic is still growing.
- What it does
- Shows the topics trending on TikTok, YouTube and Instagram, worldwide or in one country, each with a category.
- You send
- Nothing required. Optionally a
regionlikegb, categories to keep or leave out, or dates to see past days. - You get back
- Within seconds, a ranked list of topics, each with a summary, category, momentum label and example videos.
- Cost
- $0.25 per request, even when nothing matches. Listing regions and failed requests are free.
Topic Trends: what people are talking about right now, by region. Content Trends: video formats creators are copying. Topic Trends (/v1/topic-trends) are subjects; Content Trends (/v1/content-trends) are structures you can make with your own subject.
Start with today's topics. Emerging topics shows only new and rising ones, and topics by date covers past days. Topic Trends used to live at /v1/trends under the name Pop culture & News; those paths still work (see Moving from /v1/trends).
How Topic Trends work
A topic is a subject many people are posting about, like a news moment, a show or a meme. Each region gets one ranked daily list (a "trend group" in the API), usually 15 to 20 topics.
- Regions are
global(the default),us,gb,auandsg. Each region's list is made on local time for that audience, not cut fromglobal. - Virlo finds new topics at 7:00, 13:00 and 19:00 local time. The 7:00 run starts the day's list.
- About every 2 hours, Virlo re-checks momentum and re-sorts the list, so rankings shift.
- Virlo drops topics that still have no example videos and, beyond the top 20, the coldest ones. Topics under 6 hours old are never dropped. So a topic can vanish mid-day.
- Active topics carry over to the next day.
- Two topics can occasionally cover the same story.
Topics can be filtered by category, but not by platform, niche or keyword. For one niche, use a Content Research Agent.
Example videos are the all-time most viewed, often months or years old. Check publish_date.
Categories
Every topic has a category. Pass category to keep only some categories, or exclude_category to leave some out. Both take a comma list (category=sports,memes) or the parameter repeated (category=sports&category=memes), on every list call.
| Category | What it covers |
|---|---|
entertainment | TV, film, streaming, music, celebrities, reality shows, creators |
memes | Internet jokes, viral moments, challenges |
sports | Games, matches, athletes, teams, results |
fashion_beauty | Fashion, style, beauty, makeup, skincare |
gaming_tech | Video games, apps, gadgets, AI |
lifestyle | Food, travel, places, local events and festivals, wellbeing |
politics | Elections, governments, politicians, policy |
news | Crime, courts and trials, accidents, disasters, business, world events |
- An unknown value is a
400. - New categories can be added. Existing ones are never renamed. Treat a value you don't know as "other".
categoryisnullon a topic not categorised yet (usually minutes old). With any category filter set, those topics are left out.- With a filter set,
rankingkeeps the topic's place in the full list, so numbers can skip.
Pop culture without politics in Australia:
curl -G https://api.virlo.ai/v1/topic-trends/today \
-H "Authorization: Bearer YOUR_API_KEY" \
-d region=au \
-d exclude_category=politics,news
Momentum
Momentum shows how fast a topic is growing. Each topic has a momentum object:
- Name
status- Type
- string
- Description
new: first spotted less than 8 hours ago.rising: views growing more than 15% faster than in the previous 2 hours.steady: about the same speed.fading: more than 15% slower.
- Name
score- Type
- number
- Description
0 to 1. About 1,000 views an hour scores 0.6, 10,000 scores 0.8, and 100,000 or more scores 1.
- Name
views_per_hour- Type
- integer
- Description
Combined hourly view growth of the example videos between the last two checks.
- Name
updated_at- Type
- string
- Description
Time of the last check (UTC).
A new topic's numbers are rough until the 3rd check, usually within 6 hours.
Details for developers
momentumisnulluntil the first check. It staysnull, sorted last, if fewer than 3 example videos can be re-checked.- After the 1st check,
scoreis a 0.3 to 0.7 placeholder andviews_per_houris0. The 2nd check measures both. - Until the 3rd check,
statusis estimated from how many videos on the topic were posted the day before Virlo found it. - Only the newest list gets updates. Past days keep their last reading.
Get today's topics
Returns one region's latest daily list. Replaces /v1/trends/digest.
- You get the newest list from the last 48 hours. Lists start at 7:00 local, so earlier you get yesterday's.
titleshows today's date even on yesterday's list. Uselocal_date.- Lists under 15 topics get filled to 15 with earlier days' topics. These come last, with their old
trend_group_id. - If the newest list is empty, you get the latest one with topics, even an older one. With no list in 48 hours,
datais empty.
- Name
region- Type
- string
- Description
Region code. Default
global.
- Name
limit- Type
- integer
- Description
Most topics to return, in ranking order, 1 to 100. Higher counts as 100. Default: every topic on today's list.
- Name
top_exemplars- Type
- integer
- Description
Example videos per topic, 0 to 20. Default 5.
0makes the response much smaller.
- Name
category- Type
- string
- Description
Keep only these categories. Comma list or repeated.
- Name
exclude_category- Type
- string
- Description
Leave out these categories. Comma list or repeated.
start_date and end_date are not accepted here (400). For past days, use topics by date.
curl -G https://api.virlo.ai/v1/topic-trends/today \
-H "Authorization: Bearer YOUR_API_KEY" \
-d region=au \
-d exclude_category=politics,news
{
"data": [
{
"id": "7cf7a841-e7a7-4844-8ac4-ed9823615bae",
"title": "Topic Trends for Sep 25",
"region": "au",
"local_date": "2026-09-24",
"trends": [
{
"ranking": 9,
"trend": {
"id": "745ff63d-09d7-483b-94e2-3c7a6bf5c527",
"name": "AFL Grand Final training buzz: Freo, Lions, and imminent crowd energy",
"description": "On September 23, 2026, thousands of Fremantle Dockers fans gathered at Cockburn ARC for an open training session ahead of the AFL Grand Final against the Brisbane Lions...",
"category": "sports"
},
"momentum": {
"score": 0.6456,
"status": "fading",
"views_per_hour": 1690,
"updated_at": "2026-09-24T16:00:01.056Z"
},
"velocity_today_count": 0,
"velocity_median_views": 0,
"detected_at": "2026-09-23T21:06:49.273+00:00",
"last_seen_at": "2026-09-23T21:06:49.273+00:00",
"origin_region_codes": null,
"global_confidence": null,
"exemplar_count": 6,
"scrape_status": "success",
"id": "04a9f0c1-988c-4f38-844a-3e15e9a80b4e",
"trend_id": "745ff63d-09d7-483b-94e2-3c7a6bf5c527",
"trend_group_id": "7cf7a841-e7a7-4844-8ac4-ed9823615bae",
"top_exemplars": [
{
"video_id": "411eabfc-1074-4c5a-b04c-c4deb43174b6",
"url": "https://www.tiktok.com/@9news/video/7687586729653783815",
"platform": "tiktok",
"views": 457017,
"thumbnail_url": "https://auth.virlo.ai/storage/v1/object/public/thumbnails/c3cdffed0e38dd1c3ac48e836c169367feaca911cc77fb2708bf40fd328663f0.jpg",
"publish_date": "2026-09-20T12:02:55",
"author": {
"username": "9news",
"avatar_url": "https://auth.virlo.ai/storage/v1/object/public/avatars/efb8c840b5308a468320874e1f818cfb2214455b4b9afa8e4ea31828454f902f.heic",
"verified": false
},
"is_paid": false
}
]
}
]
}
]
}
Full field reference
Times are UTC. Each daily list has id, region, trends and:
- Name
title- Type
- string
- Description
Display text, like
Topic Trends for Sep 25. Topics by date shows the UTC start date, a day early forauandsg. Uselocal_date.
- Name
local_date- Type
- string | null
- Description
The list's day in the region's timezone.
nullongloballists before July 7, 2026, and a few from August 2026.
Each topic has:
- Name
ranking- Type
- integer
- Description
1 has the most momentum.
- Name
trend- Type
- object
- Description
id,name,descriptionandcategory(one of the categories, ornulluntil the topic is categorised).
- Name
momentum- Type
- object | null
- Description
See Momentum. Always present,
nulluntil the first check.
- Name
top_exemplars- Type
- array
- Description
Example videos, most-viewed first, with paid ones after the organic ones. Each has
is_paid:truewhen the post is an ad, a paid partnership, or its caption discloses sponsorship (such as#ad). A paid exemplar's views come partly from ad spend, so treat it as an ad, not proof the topic is going viral on its own.
- Name
exemplar_count- Type
- integer
- Description
Total example videos linked.
Each example video has video_id, url, platform (tiktok, youtube or instagram), views, thumbnail_url, publish_date (can be much older than the topic) and author (username, avatar_url, verified).
Get emerging topics
Returns only the new and rising topics from a region's latest list, highest momentum first.
- You get one flat list, not daily lists. Often fewer than
limit, sometimes none (still $0.25). - Momentum comes as flat fields:
status,momentum_scoreandviews_per_hour.
- Name
region- Type
- string
- Description
Region code. Default
global.
- Name
limit- Type
- integer
- Description
Most topics to return, a whole number from 1 to 50. Default 20.
- Name
top_exemplars- Type
- integer
- Description
Example videos per topic, 0 to 20. Default 5.
- Name
category- Type
- string
- Description
Keep only these categories. Comma list or repeated.
- Name
exclude_category- Type
- string
- Description
Leave out these categories. Comma list or repeated.
curl -G https://api.virlo.ai/v1/topic-trends/emerging \
-H "Authorization: Bearer YOUR_API_KEY" \
-d region=gb \
-d limit=20
{
"region": "gb",
"generated_at": "2026-09-24T17:26:34.614Z",
"data": [
{
"ranking": 1,
"trend": {
"id": "d968f93c-be19-4598-9100-cad47a732a4c",
"name": "Drama & memes around Rory Stewart BBC Newsnight moment",
"description": "On September 18, 2026, former MP Rory Stewart appeared on BBC's Newsnight, where he dramatically spun in his chair to stare at Ailbhe Rea...",
"created_at": "2026-09-24T06:05:44.925004+00:00",
"category": "memes"
},
"status": "rising",
"momentum_score": 1,
"views_per_hour": 257371,
"region": "gb",
"detected_at": "2026-09-24T06:05:45.122+00:00",
"last_seen_at": "2026-09-24T12:06:30.905+00:00",
"exemplar_count": 13,
"id": "8ff9f920-2804-4f6a-91ec-08cddfa5d7db",
"trend_id": "d968f93c-be19-4598-9100-cad47a732a4c",
"top_exemplars": [
{
"video_id": "367da5d1-5510-4e73-b9a5-fd6207e9915e",
"url": "https://www.tiktok.com/@thesun/video/7688710703854767392",
"platform": "tiktok",
"views": 5050311,
"thumbnail_url": "https://auth.virlo.ai/storage/v1/object/public/thumbnails/5f78a37402cb781959c245240f08b7ea1672b0867346cf35771adb32f177e612.jpg",
"publish_date": "2026-09-23T12:44:27",
"author": {
"username": "thesun",
"avatar_url": "https://auth.virlo.ai/storage/v1/object/public/avatars/7a926491c16af666224735afecb62c829a4e11f774fd221b2514238a4ef6a231.webp",
"verified": false
}
}
]
}
]
}
Full field reference
Top level: region, generated_at, data. Each topic has region, id, trend_id, detected_at, last_seen_at, exemplar_count and top_exemplars as on today's topics (emerging exemplars have no is_paid and are not reordered), plus:
- Name
ranking- Type
- integer
- Description
Position in the full daily list, so numbers can skip.
- Name
trend- Type
- object
- Description
id,name,description,categoryandcreated_at(when Virlo first recorded the topic). It can be much older thandetected_at.
- Name
status- Type
- string
- Description
neworrising. Before the first check it is estimated, so a just-found topic showsrising, notnew.
- Name
momentum_score- Type
- number
- Description
Like
momentum.score. Before the first check it is an estimate (0.7 or 0.9) where the daily list showsnull. Topics with under 3 example videos keep it.
- Name
views_per_hour- Type
- integer | null
- Description
nullbefore the first check.
Get topics by date
Returns one region's daily lists in a date range, newest first. With no dates, you get the last 24 hours: normally today's list, topped up to 15. Date-range lists are not topped up.
How the dates work
Dates match each list's 7:00 local start, in UTC, and a plain date means midnight UTC. So for global, us and gb, set end_date to the day after your last day. au and sg lists start the evening before in UTC, so set start_date to the day before your first day instead.
History starts September 15, 2025 for global, July 6, 2026 for us and gb, July 7 for au and July 29 for sg. Before July 7, 2026, global lists have no local_date, and a day can have two. Read the day from title and tell them apart by id.
- Name
region- Type
- string
- Description
Region code. Default
global.
- Name
start_date- Type
- string
- Description
2026-07-14or a UTC time like2026-07-14T00:00:00Z. Default 24 hours ago.
- Name
end_date- Type
- string
- Description
Same format. Default now.
- Name
limit- Type
- integer
- Description
Most topics to return in total, counted across all daily lists (newest list first, topics in rank order), 1 to 100. Default 50. Higher counts as 100. A list the cap leaves empty is left out.
- Name
top_exemplars- Type
- integer
- Description
Example videos per topic, 0 to 20. Default 5.
- Name
category- Type
- string
- Description
Keep only these categories. Comma list or repeated.
- Name
exclude_category- Type
- string
- Description
Leave out these categories. Comma list or repeated.
This gets UK lists for July 14 to 16.
curl -G https://api.virlo.ai/v1/topic-trends \
-H "Authorization: Bearer YOUR_API_KEY" \
-d region=gb \
-d start_date=2026-07-14 \
-d end_date=2026-07-17
{
"data": [
{
"id": "8108e2f4-3a40-4f85-9f2a-3c9ec1ccf79c",
"title": "Topic Trends for Jul 16th",
"region": "gb",
"local_date": "2026-07-16",
"trends": [
{
"ranking": 1,
"trend": {
"id": "7002bfb2-8261-4c64-9921-c6797533e8ba",
"name": "World Cup Final Tease & Pre-Show Buzz (Banner & Flags)",
"description": "Ahead of the 2026 FIFA World Cup final on July 19, 2026, excitement is building as Argentina, led by Lionel Messi, prepares to face Spain...",
"category": "sports"
},
"momentum": {
"score": 1,
"status": "rising",
"views_per_hour": 2617163,
"updated_at": "2026-07-17T05:00:00.708Z"
},
"velocity_today_count": 96,
"velocity_median_views": 329031,
"detected_at": "2026-07-16T12:05:34.855+00:00",
"last_seen_at": "2026-07-16T12:05:34.855+00:00",
"origin_region_codes": null,
"global_confidence": null,
"exemplar_count": 144,
"scrape_status": "success",
"id": "2460d76e-5641-43a0-afb7-82f4e0cd33f7",
"trend_id": "7002bfb2-8261-4c64-9921-c6797533e8ba",
"trend_group_id": "8108e2f4-3a40-4f85-9f2a-3c9ec1ccf79c",
"top_exemplars": [
{
"video_id": "a4397cf9-35b9-45ec-a4e3-7ab414c2aadf",
"url": "https://www.tiktok.com/@fifaworldcup/video/7662504667452099862",
"platform": "tiktok",
"views": 154919730,
"thumbnail_url": "https://auth.virlo.ai/storage/v1/object/public/thumbnails/2fdf43d6-0a47-4616-a21f-0c7dc51c67b8.jpg",
"publish_date": "2026-07-14T21:51:39",
"author": {
"username": "fifaworldcup",
"avatar_url": "https://auth.virlo.ai/storage/v1/object/public/avatars/ccd523186bc6d0b89762cb4bb4c9c7d60bc6266497dc5ddedb24ae3c5b50e0f5.heic",
"verified": false
},
"is_paid": false
}
]
},
{
"ranking": 9,
"trend": {
"id": "1e15ebc7-7b09-4118-a092-c5788cc3728d",
"name": "New Music from ROLE MODEL",
"description": "On July 10, 2026, Role Model (Tucker Pillsbury) released his new single 'Joy,' the second track from his upcoming album...",
"category": "entertainment"
},
"momentum": null,
"velocity_today_count": 0,
"velocity_median_views": 0,
"detected_at": "2026-07-16T06:04:53.03+00:00",
"last_seen_at": "2026-07-16T06:04:53.03+00:00",
"origin_region_codes": null,
"global_confidence": null,
"exemplar_count": 2,
"scrape_status": "success",
"id": "70a03e12-4624-4641-a84b-37a0a10ca6fc",
"trend_id": "1e15ebc7-7b09-4118-a092-c5788cc3728d",
"trend_group_id": "8108e2f4-3a40-4f85-9f2a-3c9ec1ccf79c",
"top_exemplars": [
{
"video_id": "6d6bd156-c88f-4de0-bc9a-54ef6493506c",
"url": "https://www.tiktok.com/@popgirly.era/video/7660846467308916000",
"platform": "tiktok",
"views": 136426,
"thumbnail_url": "https://auth.virlo.ai/storage/v1/object/public/thumbnails/8ca67ff9-a8e5-4af5-af10-e6111b615ba9.jpg",
"publish_date": "2026-07-10T10:36:58",
"author": {
"username": "popgirly.era",
"avatar_url": "https://auth.virlo.ai/storage/v1/object/public/avatars/fd82bc9bebdbb037c7162c4c33a8f1702e6e3d356df52436d0eaa04af19ddc7c.webp",
"verified": false
},
"is_paid": false
}
]
}
]
}
]
}
The fields match Get today's topics.
List regions
Free. Returns every region code with its name and timezone. New regions get added, so check here. AU and au both work.
curl https://api.virlo.ai/v1/topic-trends/regions \
-H "Authorization: Bearer YOUR_API_KEY"
{
"data": [
{ "code": "au", "name": "Australia", "timezone": "Australia/Sydney" },
{ "code": "gb", "name": "United Kingdom", "timezone": "Europe/London" },
{ "code": "global", "name": "Global", "timezone": "America/New_York" },
{ "code": "sg", "name": "Singapore", "timezone": "Asia/Singapore" },
{ "code": "us", "name": "United States", "timezone": "America/New_York" }
]
}
Moving from /v1/trends
Topic Trends used to be served at /v1/trends and called Pop culture & News. The old paths keep working with their exact old response, at the same price and rate limits. They are marked deprecated in the OpenAPI spec and send Deprecation: true and a Link header that points to the new path.
| Old path | New path |
|---|---|
GET /v1/trends | GET /v1/topic-trends |
GET /v1/trends/digest | GET /v1/topic-trends/today |
GET /v1/trends/emerging | GET /v1/topic-trends/emerging |
GET /v1/trends/regions | GET /v1/topic-trends/regions |
The only shape change: each trend object has category instead of trend_type. On current topics trend_type was always content, so it told you nothing; category says what the topic is about. Group titles read Topic Trends for Nov 7 instead of Trends for Nov 7.
New on the new paths:
categoryandexclude_categoryfilters on every list call.limit(1 to 100) on/today. The old/digestacceptedlimit,start_dateandend_datebut ignored them;/todayuseslimitand rejects the two dates.
The webhook events trends.daily.completed and trends.region.completed keep their names. They fire when a Topic Trends list updates. See Webhooks.
Errors
Failed requests count toward your rate limit.
- Name
400 Bad Request- Description
- A bad date (
invalid_date_range). Use2026-07-14. limitbelow 1 or not a number. Decimals round down, except on emerging, where decimals and values over 50 fail.top_exemplarsoutside 0 to 20, or not a whole number.- An unknown
region(unknown_region). - An unknown
categoryorexclude_categoryvalue. start_dateorend_dateon/today.- A parameter these calls don't take, like
platform.
messageis an array of strings, except forunknown_region.- A bad date (
- Name
401 Unauthorized- Description
Missing or invalid API key.
- Name
402 Payment Required- Description
Balance too low. Add funds.
- Name
429 Too Many Requests- Description
Wait
retry_afterseconds. Today's topics and topics by date each allow 50 a minute, 500 an hour and 5,000 a day. Emerging allows 60, 600 and 6,000. Some accounts have lower limits; theX-RateLimit-Limitheader shows yours.
More in Errors and Rate limits.

