# Content Trends

> Content Trends: video formats creators are copying right now, reviewed by the Virlo team. Each comes with its recipe, lifecycle stage, weekly creator counts, a 30-day history, client fit and example videos.

Source: https://dev.virlo.ai/docs/content-trends
Markdown: https://dev.virlo.ai/docs/content-trends.md
Section: Explore data

## About the Virlo API (applies to every page)

- Base URL: `https://api.virlo.ai/v1`. Every request needs the header `Authorization: Bearer YOUR_API_KEY` (keys start with `virlo_tkn_`).
- Responses are JSON inside a `data` field, except the `/v1/webhooks` endpoints, which return the object or array directly. Field names are snake_case.
- Prices are in US dollars from a prepaid balance. 1 credit = $0.01. The `X-Cost` response header on each successful response is the exact charge. Errors are free.
- Slow jobs return an ID. Check its status every 15 seconds (or whatever `retry_after_seconds` says) until `finalized` is `true`.
- All docs pages: https://dev.virlo.ai/llms.txt. Every page in one file: https://dev.virlo.ai/llms-full.txt. MCP server for AI assistants: https://dev.virlo.ai/api/mcp/mcp.

---

Video formats creators are copying right now. Each one comes with a recipe you can follow, how fast it is spreading, and real examples. Use Content Trends to decide what to make.

**At a glance**

- **What it does:** Lists the formats creators are copying on TikTok, Instagram and YouTube, with what stays the same, what each creator swaps in, and who it fits.
- **You send:** Nothing required. Optionally filters such as stage, platform, client type or brand safety.
- **You get back:** Within seconds, a ranked list of formats with their stage, creator counts, a 30-day history and example videos.
- **Cost:** $0.25 for the list and $0.05 for one trend, even when nothing matches. Failed requests are free.

## Content Trends or Pop culture & News?

- **Content Trends** (this page, `/v1/content-trends`) are **formats**: a structure creators repeat with their own subject, like a meme template, a sound with a set visual gag, or an AI-tool effect. Use them to decide what to make.
- **[Pop culture & News](https://dev.virlo.ai/docs/trends)** (`/v1/trends`) are **topics**: news and pop culture moments many people are posting about, by region. Use them to decide what to talk about.

If someone asks "what formats, memes or templates are people copying?", call Content Trends. If they ask "what is everyone talking about?", call [Pop culture & News](https://dev.virlo.ai/docs/trends).

## How the data works

- **Curated.** Virlo's detector finds candidate formats, and the Virlo team reviews each one before it is published. Only published trends are returned, so the catalog is small: a few dozen trends, not thousands.
- **Hourly.** The data refreshes every hour at :07 UTC, and responses are cached for up to 5 minutes. `meta.updated_at` is the last refresh.
- **One order, same as the app.** By default, live trends come first, the most creators in the last 7 days first, then by stage (new, rising, peaking, fading). Archived trends come last, most recent activity first.
- **Example videos** are ranked: ones the Virlo team pinned first, then recent videos that passed the recipe check, then other videos that passed it, then recent ones, then the rest. One video per creator, up to 16. Paid posts (`is_paid`) are listed after organic ones.
- **Recipe check.** `verified_fit: true` means the video really does the format, not just the sound. `videos_verified` counts those videos.

## Lifecycle

Every trend has a `lifecycle` stage, re-computed at every refresh. `lifecycle_since` says when it entered that stage.

- `new`: first spotted in the last 7 days.
- `rising`: 10 or more creators this week and at least 1.3 times last week.
- `peaking`: between rising and fading.
- `fading`: under 0.7 times last week.
- `archived`: no posts in 14 days, or fewer than 5 creators in a week once it is older than 7 days.

"This week" is `creators_7d`, the creators who posted it in the last 7 days. "Last week" is `creators_prev_7d`, the 7 days before that **as they were counted a week ago**, so both weeks had the same time to be found and the comparison is fair. Quote both numbers when you describe momentum.

## The series and partial days

`series` counts the creators who posted the format on each of the last 30 days, by **posting date**. Videos are found a few days after they go up (the median delay is about 4 days), so the most recent days keep rising for a while after you read them.

The last 7 points carry `partial: true`. **Never read a dip in partial days as a decline.** Compare full days with full days, or use `creators_7d` against `creators_prev_7d`.

---

## List content trends

**Endpoint:** `GET https://api.virlo.ai/v1/content-trends`

The published content trends, filtered, sorted and paged. Each trend includes its series and a few example videos.

Cost per request: $0.25

### Query parameters

All optional. An unknown parameter returns `400`.

- `lifecycle` (string, optional): Comma-separated stages: `new`, `rising`, `peaking`, `fading`, `archived`. Default `new,rising,peaking,fading` (live only). Pass `archived` to get the archive.
- `platform` (string, optional): `tiktok`, `instagram` or `youtube`. Keeps trends with at least one linked video on that platform.
- `made_with_ai_tool` (boolean, optional): `true` for formats made with an AI tool (`tool_name` says which), `false` for the rest.
- `is_sound_meme` (boolean, optional): `true` for formats built around a sound (`sound_title` names it), `false` for the rest.
- `brand_safety` (string, optional): `safe` or `caution`. Trends without a rating are left out when you set it.
- `language` (string, optional): ISO 639-1 code, like `en`.
- `region` (string, optional): ISO 3166 alpha-2 code (`US`, `GB`, `BR`, `PH`, `NG`) or `mixed`. Not case-sensitive.
- `client_fit` (string, optional): `b2b_saas`, `clinic_healthcare`, `consumer_brand` or `local_business`. Keeps trends whose fit for that client type is `yes` or `maybe`.
- `sort` (string, optional): `default` (the app's order, see [How the data works](https://dev.virlo.ai/docs/content-trends#how-the-data-works)), `newest` (most recently spotted first), `creators_7d` (most creators in the last 7 days first) or `views` (most total views first).
- `examples` (integer, optional): Example videos per trend, 0 to 16. Default 3. [One trend](https://dev.virlo.ai/docs/content-trends#get-content-trend) always returns all of them.
- `page` (integer, optional): Default 1.
- `limit` (integer, optional): Default 20, maximum 100.

`pagination.total` is exact.

**cURL request:**

```bash
curl "https://api.virlo.ai/v1/content-trends?client_fit=consumer_brand&brand_safety=safe&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

**Response:**

```json
{
  "data": [
    {
      "id": 6,
      "name": "Things I'd never buy again",
      "recipe": "Quick cuts of products the creator regrets buying, each with a one-line verdict on screen, over the same trending sound.",
      "constant_part": "The 'never again' framing, the sound and the verdict captions",
      "swapped_part": "The products and the niche",
      "lifecycle": "rising",
      "lifecycle_since": "2026-10-18T04:07:12Z",
      "spotted_on": "2026-10-09",
      "first_seen_on": "2026-10-02",
      "last_seen_on": "2026-10-20",
      "peak_on": "2026-10-17",
      "peak_creators": 41.3,
      "creators_3d_avg": 37.0,
      "creators_7d": 212,
      "creators_prev_7d": 140,
      "creators_total": 618,
      "videos_total": 744,
      "videos_verified": 301,
      "views_total": 182340000,
      "top_views": 9100000,
      "platforms": { "tiktok": 690, "instagram": 40, "youtube": 14 },
      "made_with_ai_tool": false,
      "tool_name": null,
      "is_sound_meme": true,
      "sound_title": "original sound",
      "language": "en",
      "region": "US",
      "audience_tags": ["shoppers", "gen z"],
      "brand_safety": "safe",
      "effort": "low",
      "tone": "funny",
      "people": "One person, talking to camera",
      "client_fit": {
        "consumer_brand": { "fit": "yes", "how": "Flip it: things customers would buy again." },
        "b2b_saas": { "fit": "no", "how": null }
      },
      "series": [
        { "date": "2026-10-13", "creators": 29, "partial": false },
        { "date": "2026-10-20", "creators": 31, "partial": true }
      ],
      "examples": [
        {
          "video_id": "8f0c1a52-4d7e-4b8e-9a51-2f1f6f0b3c11",
          "url": "https://www.tiktok.com/@creator/video/7561234567890123456",
          "platform": "tiktok",
          "views": 1234567,
          "likes": 89000,
          "comments": 1200,
          "thumbnail_url": "https://storage.virlo.ai/thumbnails/abc123.jpg",
          "publish_date": "2026-10-14",
          "author": {
            "username": "creator",
            "avatar_url": "https://storage.virlo.ai/avatars/def456.jpg",
            "verified": false,
            "followers": 15400
          },
          "is_paid": false,
          "verified_fit": true
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 5,
    "total": 12,
    "total_pages": 3,
    "has_next_page": true,
    "has_prev_page": false
  },
  "meta": { "updated_at": "2026-10-21T03:08:00Z" }
}
```

The series is cut to two points here; real responses have 30.

---

## Get one content trend

**Endpoint:** `GET https://api.virlo.ai/v1/content-trends/{id}`

One published trend with all its example videos (up to 16) and its full 30-day series. Use it to read a trend from the list without paging the list again.

Cost per request: $0.05

### Path parameters

- `id` (integer, required): The trend's `id` from the list.

An unknown or unpublished `id` returns `404` `not_found`. When the Virlo team merges a trend into another one, its old `id` returns `404` with `merged_into` set to the `id` to read instead.

**cURL request:**

```bash
curl "https://api.virlo.ai/v1/content-trends/6" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

**Response:**

```json
{
  "data": {
    "id": 6,
    "name": "Things I'd never buy again",
    "lifecycle": "rising",
    "creators_7d": 212,
    "creators_prev_7d": 140,
    "series": [
      { "date": "2026-10-20", "creators": 31, "partial": true }
    ],
    "examples": [
      {
        "video_id": "8f0c1a52-4d7e-4b8e-9a51-2f1f6f0b3c11",
        "platform": "tiktok",
        "views": 1234567,
        "is_paid": false,
        "verified_fit": true
      }
    ]
  },
  "meta": { "updated_at": "2026-10-21T03:08:00Z" }
}
```

Shortened: `data` has every field from the list.

---

## Fields

Each content trend has:

- `id` (integer, optional): Stable id. Use it with [one content trend](https://dev.virlo.ai/docs/content-trends#get-content-trend).
- `name` (string, optional): Short name of the format.
- `recipe` (string, optional): How to make it.
- `constant_part` (string | null, optional): What stays the same in every video.
- `swapped_part` (string | null, optional): What each creator swaps in.
- `lifecycle` (string, optional): `new`, `rising`, `peaking`, `fading` or `archived`. See [Lifecycle](https://dev.virlo.ai/docs/content-trends#lifecycle).
- `lifecycle_since` (string | null, optional): When the trend entered its current stage (ISO 8601).
- `spotted_on` (string | null, optional): The date the detector first spotted it.
- `first_seen_on, last_seen_on, peak_on` (string | null, optional): Dates of the first post, the latest post and the peak day.
- `peak_creators` (number | null, optional): The best 3-day average of new creators per day.
- `creators_3d_avg` (number | null, optional): New creators per day, averaged over the last 3 days.
- `creators_7d` (integer, optional): Creators who posted it in the last 7 days.
- `creators_prev_7d` (integer, optional): Creators in the 7 days before that, as counted a week ago.
- `creators_total, videos_total` (integer, optional): All creators and videos linked to the trend.
- `videos_verified` (integer, optional): Videos that passed the recipe check.
- `views_total, top_views` (integer, optional): Total views of its videos, and the views of the biggest one.
- `platforms` (object, optional): Video counts per platform: `tiktok`, `instagram`, `youtube`.
- `made_with_ai_tool, tool_name` (boolean, string | null, optional): Whether the format is made with an AI tool, and which one.
- `is_sound_meme, sound_title` (boolean, string | null, optional): Whether the format is built around a sound, and its title.
- `language, region` (string | null, optional): ISO 639-1 language and ISO 3166 alpha-2 region (or `mixed`).
- `audience_tags` (string[], optional): Who the format speaks to.
- `brand_safety` (string | null, optional): `safe`, `caution` or `null` (not rated).
- `effort, tone, people` (string | null, optional): Free text: how hard it is to make, its tone, and who appears in it.
- `client_fit` (object, optional): Keyed by client type (`b2b_saas`, `clinic_healthcare`, `consumer_brand`, `local_business`). Each value has `fit` (`yes`, `maybe` or `no`) and `how` (how that client could use it).
- `series` (array, optional): `{ date, creators, partial }` per day for the last 30 days. See [partial days](https://dev.virlo.ai/docs/content-trends#series-partial-days).
- `examples` (array, optional): Example videos, ranked as described in [How the data works](https://dev.virlo.ai/docs/content-trends#how-the-data-works).

Each example video has `video_id`, `url`, `platform` (`tiktok`, `instagram` or `youtube`), `views`, `likes`, `comments`, `thumbnail_url` (a full URL), `publish_date`, `author` (`username`, `avatar_url`, `verified`, `followers`, or `null`), `is_paid` and `verified_fit`.

- `is_paid: true` marks paid distribution: an ad, a boosted post, a paid partnership, or a caption that discloses one (such as `#ad`). Its views come partly from ad spend, so treat it as an ad, not proof the format spreads on its own.
- `verified_fit: true` means the video passed the recipe check: it does the format, not just the sound.

## Costs and errors

- **Charges.** The list costs $0.25 (25 credits) and one trend $0.05 (5 credits), even when nothing matches. Errors are never charged. `X-Cost` shows the charge in dollars and `X-Credits-Used` in credits.
- **Read one, don't re-list.** After a list call, read a single trend with [one content trend](https://dev.virlo.ai/docs/content-trends#get-content-trend) instead of paging the list again.

Errors come back with `message`, `error`, `statusCode` and `code` ([more on errors](https://dev.virlo.ai/docs/errors)):

- `400`: a bad value or an unknown parameter. The message lists valid values.
- `401`: missing or invalid API key.
- `402`: your balance is too low. [Add funds](https://dev.virlo.ai/dashboard/billing).
- `404`: the trend is unknown or not published, or it was merged (`merged_into` names the trend to read instead).
- `429`: too many requests. Wait `retry_after` seconds. The `X-RateLimit-Limit` header shows your limit ([rate limits](https://dev.virlo.ai/docs/rate-limits)).

---

More in Explore data:

- [Pop culture & News](https://dev.virlo.ai/docs/trends.md)
- [Sounds](https://dev.virlo.ai/docs/sounds.md)
- [Hooks](https://dev.virlo.ai/docs/hooks.md)
- [Hashtags](https://dev.virlo.ai/docs/hashtags.md)
- [Videos](https://dev.virlo.ai/docs/videos.md)
- [Raw data](https://dev.virlo.ai/docs/raw.md)
