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.

At a glance
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 region like gb, 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.

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).

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, au and sg. Each region's list is made on local time for that audience, not cut from global.
  • 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.

CategoryWhat it covers
entertainmentTV, film, streaming, music, celebrities, reality shows, creators
memesInternet jokes, viral moments, challenges
sportsGames, matches, athletes, teams, results
fashion_beautyFashion, style, beauty, makeup, skincare
gaming_techVideo games, apps, gadgets, AI
lifestyleFood, travel, places, local events and festivals, wellbeing
politicsElections, governments, politicians, policy
newsCrime, 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".
  • category is null on a topic not categorised yet (usually minutes old). With any category filter set, those topics are left out.
  • With a filter set, ranking keeps 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
  • momentum is null until the first check. It stays null, sorted last, if fewer than 3 example videos can be re-checked.
  • After the 1st check, score is a 0.3 to 0.7 placeholder and views_per_hour is 0. The 2nd check measures both.
  • Until the 3rd check, status is 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/v1/topic-trends/today

Get today's topics

Returns one region's latest daily list. Replaces /v1/trends/digest.

Cost per request:$0.25
  • You get the newest list from the last 48 hours. Lists start at 7:00 local, so earlier you get yesterday's.
  • title shows today's date even on yesterday's list. Use local_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, data is 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. 0 makes 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.

You send
GET
/v1/topic-trends/today
curl -G https://api.virlo.ai/v1/topic-trends/today \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d region=au \
  -d exclude_category=politics,news
You get back
{
  "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 for au and sg. Use local_date.

  • Name
    local_date
    Type
    string | null
    Description

    The list's day in the region's timezone. null on global lists 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, description and category (one of the categories, or null until the topic is categorised).

  • Name
    momentum
    Type
    object | null
    Description

    See Momentum. Always present, null until 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: true when 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/v1/topic-trends/emerging

Get emerging topics

Returns only the new and rising topics from a region's latest list, highest momentum first.

Cost per request:$0.25
  • You get one flat list, not daily lists. Often fewer than limit, sometimes none (still $0.25).
  • Momentum comes as flat fields: status, momentum_score and views_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.

You send
GET
/v1/topic-trends/emerging
curl -G https://api.virlo.ai/v1/topic-trends/emerging \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d region=gb \
  -d limit=20
You get back
{
  "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, category and created_at (when Virlo first recorded the topic). It can be much older than detected_at.

  • Name
    status
    Type
    string
    Description

    new or rising. Before the first check it is estimated, so a just-found topic shows rising, not new.

  • 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 shows null. Topics with under 3 example videos keep it.

  • Name
    views_per_hour
    Type
    integer | null
    Description

    null before the first check.

GET/v1/topic-trends

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.

Cost per request:$0.25

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-14 or a UTC time like 2026-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.

You send
GET
/v1/topic-trends
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
You get back
{
  "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.

GET/v1/topic-trends/regions

List regions

Free. Returns every region code with its name and timezone. New regions get added, so check here. AU and au both work.

You send
GET
/v1/topic-trends/regions
curl https://api.virlo.ai/v1/topic-trends/regions \
  -H "Authorization: Bearer YOUR_API_KEY"
You get back
{
  "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" }
  ]
}

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 pathNew path
GET /v1/trendsGET /v1/topic-trends
GET /v1/trends/digestGET /v1/topic-trends/today
GET /v1/trends/emergingGET /v1/topic-trends/emerging
GET /v1/trends/regionsGET /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:

  • category and exclude_category filters on every list call.
  • limit (1 to 100) on /today. The old /digest accepted limit, start_date and end_date but ignored them; /today uses limit and 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). Use 2026-07-14.
    • limit below 1 or not a number. Decimals round down, except on emerging, where decimals and values over 50 fail.
    • top_exemplars outside 0 to 20, or not a whole number.
    • An unknown region (unknown_region).
    • An unknown category or exclude_category value.
    • start_date or end_date on /today.
    • A parameter these calls don't take, like platform.

    message is an array of strings, except for unknown_region.

  • 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_after seconds. 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; the X-RateLimit-Limit header shows yours.

More in Errors and Rate limits.

Was this page helpful?