What's new on the Virlo API. New endpoints, pricing changes, performance work, deprecations, and fixes — newest first.
GET /v1/places and GET /v1/places/{id}/videos charge nothing for a call that returns no place or video. A call that returns results stays $0.05.
POST /v1/satellite/place now takes the place’s TikTok link (or its numeric id) as query, which names any TikTok place exactly. A name starts a lookup only when it picks out one place: one place named exactly that and no other carrying the name. Any other match returns free candidates, which now carry source, poi_id and tiktok_video_count. In the result, each post has counts_fresh (true when its views and engagement were read from TikTok on this lookup), sources.stored_refreshed counts the stored posts that were read again, and stats.velocity.comparable says when is_accelerating compares two full four-week windows. The price stays $0.50 per lookup started.
The same video within 6 hours now returns the saved check for free (cached: true), and a check that fails is refunded in full, shown as credits_refunded. It matches the other lookups. The price stays $0.50.
When a paid MCP tool is refused with a 402, the reply now carries a Stripe checkout link for enough balance to continue, so your AI app can hand it to you in the chat. Nothing is charged until you pay on that page. Once you have paid, ask again.
A finished check now includes comparison: where the video ranks among the recent videos of its creator, its engagement and length against their typical, hashtags they rarely use, their three most viewed videos, and key_findings, plain sentences you can quote. Same price. These are differences, not proven causes. [See what you get back](/docs/satellite/video-outlier#result).
Every example video on a Topic Trend is now checked against its topic, in all regions. top_exemplars holds videos that passed, one per creator, and exemplar_count counts them. A topic with too few gets a fresh search by its key names, and one that still has none stays out of the list until a later run finds some, so a list can be shorter than usual. momentum.views_per_hour now counts only videos measured at both of the last two checks, so a video joining or leaving the examples no longer reads as a spike or a collapse. momentum is null on a topic with fewer than 3 example videos, and /v1/topic-trends/emerging leaves out topics that dropped below 3. Example videos are now limited to those posted no more than 14 days before the topic was found. No fields were added or renamed.
POST /v1/satellite/place looks up one TikTok place by Virlo place_id, TikTok poi_id, or a name in query. You get the posts tagged there, read fresh from TikTok plus the ones Virlo already has, newest first, TikTok's own tag count, and a change block against your team's previous lookup of the place (video_count_change, new_since_previous). A query matching more than one place answers status: candidates and costs nothing. $0.50 per lookup started; the same place within 6 hours is free when you ask for as many posts or fewer, and failed lookups are refunded. Poll GET /v1/satellite/place/status/:job_id. TikTok places only. MCP: lookup_place. Guide: dev.virlo.ai/docs/satellite/places.
POST /v1/satellite/creator, /hashtag, /sound and /video start the same lookups as the existing routes with a JSON body, at the same price. The GET routes keep working. GET /v1/satellite/runs/:run_id/compare (free) shows what changed since an earlier run of the same subject: headline numbers before and after, new and dropped posts, and the biggest view gains. POST /v1/satellite/runs/:run_id/refresh repeats a saved lookup with its stored options at today's price. GET /v1/satellite/runs/:run_id/posts is another name for /videos. Guide: dev.virlo.ai/docs/satellite#compare-runs.
Trend analysis on creator, hashtag and sound lookups now reports method: trends-v2. The AI names the patterns; the numbers are computed. New fields: key_findings (up to 4 plain sentences with their numbers), corpus (the sample behind them), and on each trend share_of_corpus, performance (median views and engagement against the sample, views_lift, engagement_lift), recency (videos_last_30d, direction) and top_examples. confidence now measures evidence: 0.35 at 3 videos up to 0.95 at 20 or more. time_windows gains videos_with_views, and total_views, avg_views and total_shares are null when no video in the window reports them. No price change. Guide: dev.virlo.ai/docs/satellite/creators#trend-numbers.
signal_breakdown.coverage gives n, share_of_sample and margin_of_error_pts for age, gender, country, city and language. Every share is a share of n, not of sample_size. A distribution resting on fewer than 25 commenters is null with hidden_for_low_n: true. confidence_level now reads the median n behind the distributions shown instead of the raw sample, so some snapshots that read high now read medium. No price change. Guide: dev.virlo.ai/docs/satellite/creators#audience-coverage.
POST /v1/search/videos takes an optional content_types (video, slideshow, or both, default video). With slideshow the response adds data.slideshows with items, total, sort_used and not_applied. Without it the response is unchanged. The price stays $0.05 for a library page with results and free when empty. Guide: dev.virlo.ai/docs/search.
Two new GET routes: /v1/places finds places by name, suburb, postcode or country, most tagged first, and /v1/places/:id/videos lists the videos tagged at one place. Each costs $0.05 a call. POST /v1/search/videos gains places and near filters, every library video now carries location (or null), and the MCP server adds find_places plus places and near on find_videos. A place is the location tag a creator chose on a post, and about 7% of TikTok and Instagram videos have one. See [Places](/docs/places).
Topic Trends: what people are talking about right now, by region. Content Trends: video formats creators are copying. The topic feed formerly called Pop culture & News now has one name and its own paths: GET /v1/topic-trends (date range), GET /v1/topic-trends/today (replaces /v1/trends/digest, and takes an optional limit of 1 to 100), GET /v1/topic-trends/emerging and GET /v1/topic-trends/regions. Each topic now carries a category: entertainment, memes, sports, fashion_beauty, gaming_tech, lifestyle, politics or news (null for a topic only minutes old). It replaces trend_type, which was always content. Filter with category or exclude_category (comma list or repeated); for example GET /v1/topic-trends/today?region=au&exclude_category=politics,news is pop culture without politics. An unknown value is a 400. Group titles read Topic Trends for Nov 7. Prices and rate limits are unchanged ($0.25 a call, regions free). The old /v1/trends, /v1/trends/digest, /v1/trends/emerging and /v1/trends/regions keep working with their exact old response. They are marked deprecated in the OpenAPI spec and send Deprecation: true and a Link header to the new path. The webhook events trends.daily.completed and trends.region.completed keep their names. MCP: get_trends, get_trends_digest, get_emerging_trends and get_topic_trends keep their names and inputs, read the new paths, and take optional category and exclude_category. Guide: dev.virlo.ai/docs/topic-trends#moving-from-v1-trends.
Five new GET routes under /v1/raw/meta return live ads and advertisers from the public Meta Ad Library in one normalized schema: ads/search (q), ads/:ad_id, advertisers/search (q), and an advertiser's ads by page ID (advertisers/:page_id/ads) or by name (advertisers/ads?name=). Ad search and advertiser ads take country (ISO code or ALL, default ALL), status (active, inactive, all; default active) and media_type (all, image, video, meme, none; default all); advertiser search takes country. reach, spend and impressions are { lower, upper } ranges (spend adds currency) and are null unless the ad was shown in the EU or UK or is a political or issue ad. Advertiser ads return { data, advertiser, pagination }, where advertiser names the advertiser a name resolved to. Advertiser search returns { data } with no pagination. Lists page with cursor like the other raw routes, and a cursor only works with the same filters (400 invalid_cursor otherwise). Media links expire after a few days. Every call costs 1 credit ($0.01), including an empty result; 4xx and 5xx responses are free. See /docs/raw/meta-ads.
The two trend products now use the same names as the Virlo app. Pop culture & News (/v1/trends, /v1/trends/digest, /v1/trends/emerging, /v1/trends/regions; MCP get_trends, get_trends_digest, get_emerging_trends) is what people are talking about, by region. Use it to decide what to talk about. Content Trends (/v1/content-trends, /v1/content-trends/:id; MCP get_content_trends, get_content_trend) are video formats creators are copying right now. Use them to decide what to make. For a few hours on Oct 21 the docs called them Topic Trends and Format Trends. Only names and descriptions changed: routes, parameters, response fields, OpenAPI tags and schemas, MCP tool names and docs URLs are the same, so nothing needs updating on your side. See /docs/topic-trends and /docs/content-trends.
Two new GET routes serve Content Trends, the repeatable video formats creators are copying right now, found by the Virlo detector and reviewed by the Virlo team before they are published. /v1/content-trends lists the published formats with filters for lifecycle (new, rising, peaking, fading, archived; live stages by default), platform, made_with_ai_tool, is_sound_meme, brand_safety, language, region and client_fit (b2b_saas, clinic_healthcare, consumer_brand, local_business), a sort (default, newest, creators_7d, views) and examples (0 to 16 videos per trend, default 3), with page and limit and an exact total. /v1/content-trends/:id returns one trend with all its examples. Each trend carries its recipe, what stays the same and what creators swap in, its lifecycle stage, creators_7d against creators_prev_7d, a 30-day series (the last 7 days are partial while videos are still being found), client fit and example videos with is_paid and verified_fit. Data refreshes hourly. The list costs 25 credits ($0.25) and one trend 5 credits ($0.05). These are formats, not the news and culture topics of /v1/trends. MCP clients get two matching tools: get_content_trends and get_content_trend (65 tools total). See /docs/content-trends.
Seven new GET routes under /v1/raw/:platform return live, unprocessed data from the platform in one normalized schema, the same on tiktok, youtube and instagram: keyword search (q), hashtag/:hashtag, video (url or id), video/comments, video/transcript (TikTok and YouTube; Instagram returns 400 unsupported_platform), creator/:handle and creator/:handle/videos. YouTube search, hashtag and creator videos return Shorts only, and Instagram returns Reels only. Each call is synchronous and returns one page; lists carry pagination.next_cursor and has_more, and you pass cursor for the next page (no limit; cursors are opaque and short-lived, and a bad one returns 400 invalid_cursor). Every call costs 1 credit ($0.01), including an empty page; 4xx and 5xx responses are free. MCP clients get seven matching tools: raw_search, raw_hashtag, raw_video, raw_comments, raw_transcript, raw_creator and raw_creator_videos (62 tools total). See /docs/raw.
GET /v1/sounds/search now returns 400 with code validation_error when q has no run of 3 or more letters or digits (for example dj, a b or emoji only). Such queries could not use the title index and read every sound, taking several seconds. Add a word: dj snake works. This is the same rule GET /v1/hooks/search already uses.
GET /v1/sounds/by-creator/:platform/:handle matches display names whole and case-insensitively, and %, _ and \ are now ordinary characters instead of wildcards. A name containing them used to match other names too, and a name ending in \ returned an error. Lookups that took 5 to 35 seconds now take milliseconds. GET /v1/sounds/:sound_id and GET /v1/sounds/:sound_id/videos are also faster for sounds with many videos.
GET /v1/sounds/trending and GET /v1/sounds/breakout could take over 30 seconds and come back as a 503 that was still billed. Both now answer in well under a second, as do GET /v1/trends, GET /v1/trends/digest and the video digests. Sound windows are now whole UTC days (today and the 6 days before for 7 days). A request that runs longer than 27 seconds is stopped and returns 504 with code request_timeout, and is not charged. Any request whose reply never reaches you (your connection closed first) is not charged either. Calls billed after a timeout before this fix were refunded to the affected teams.
Every video from GET /v1/agents/:id/videos now carries duration: the video's length in whole seconds, or null when the platform didn't report one. It is separate from sound.duration, the length of the audio track. Add include_transcript=true to get each video's transcript: text, segments (start and end in seconds, plus text) and source. source: "platform" is the transcript TikTok or YouTube published, usually as text without timestamps (segments: null). source: "transcribed" is Virlo's own speech-to-text of the audio, always with timestamps. Virlo transcribes videos the platform didn't caption, on agents with Data Intelligence, so Instagram Reels have transcripts only on those agents. transcript is null when a video has no speech or hasn't been transcribed yet. The flag is free and applies to videos only; sending it to /slideshows returns 400. MCP clients can pass include_transcript to get_keyword_search_results and get_niche_monitor_data with data_type: "videos".
New recurring Content Research Agents now start with autopilot on, whether you create them through the API, over MCP, or in the Virlo app. There is no unlock step any more, so PUT /v1/agents/:id/autonomy no longer answers "Autopilot is locked". After each run, autopilot rewords the agent's searches, adds keywords (up to 15 in all), adds short-lived keywords for breaking stories in its niche, and widens collection after a thin run. It never removes a keyword or exclude term you set, and it never adds charges: the price per run is unchanged and it never starts an extra billed run. POST /v1/agents and PUT /v1/agents/:id take a new optional autopilot flag (default true), and autopilot: false keeps the configuration exactly as you send it. PUT /v1/agents/:id/autonomy accepts autopilot too. Agent responses add autopilot (true when on) and pinned_keywords (the keywords you set, which autopilot always keeps); autonomy_level and autopilot_unlocked are still returned but deprecated. Sending keywords or exclude_keywords on PUT /v1/agents/:id replaces the list and makes it the one autopilot keeps. The proposal review endpoints, GET /v1/agents/:id/proposals and POST /v1/agents/:id/proposals/:proposal_id/{apply,dismiss,revert}, are deprecated: they still work and send a Deprecation: true header. GET /v1/agents/:id/activity shows what autopilot changed and why. One-time agents are unaffected. MCP clients can pass autopilot to create_niche_monitor, update_niche_monitor, and set_niche_monitor_autonomy, and get_niche_monitor_proposals and review_niche_monitor_proposal are deprecated.
GET /v1/hooks/search now answers in well under a second (it could time out on common phrases) and returns results in tiers, each labelled with a new match_type: exact (the hook is your text, the reverse lookup), then contains (hooks using your phrase, strongest Virality Score first, so a phrase search surfaces the best-performing hooks built on it instead of short fragments), then similar (near-matches, only when needed). Phrase matching is whole-word and ignores punctuation, emoji and line breaks between words; q needs at least one word of 3+ letters or digits. Every hook row on trending, search and agent hooks now carries usage_count: identical hooks are collapsed to their strongest source, and usage_count says how many posts open with the same hook. GET /v1/agents/:id/hooks now returns each video once (videos found by several keywords used to repeat), coverage counts distinct videos, and pagination.total is exact. GET /v1/hooks/types adds median_weighted_score, strong_hit_rate (share of a hook type's videos scoring strong or better, the number to rank types by) and a sort parameter. category is now validated against the corpus vocabulary (an unknown value is a 400 listing the valid ones, instead of an empty result), trending and search serve the top 1,000 results (paging past that is a 400, not charged), and a query that runs too long returns 503 service_unavailable (not charged) instead of a 500. Prices are unchanged. See /docs/hooks.
A new endpoint family for the highest-leverage creative decision in short-form: the hook. Virlo’s analysis pipeline extracts every hook verbatim (a contiguous substring of the first ~6 seconds of speech, or the frame-1 on-screen text — never paraphrased) and classifies it on two orthogonal vocabularies: hook_type (17 values — question, bold_claim, tutorial_promise, pov_setup, …) and visual_hook_type (12 values — text_hook, person_speaking_to_camera, …). The corpus holds 600k+ video hooks and 350k+ TikTok-slideshow hooks, growing by thousands daily, each joined to its source post’s metrics and Virality Score. Endpoints: GET /v1/hooks/types (free — taxonomy + per-value effectiveness stats from a daily snapshot), GET /v1/hooks/trending (25 credits / $0.25 — top hooks over a 7/14/30-day window, filterable by platform, category, hook type, visual type, language, min views), GET /v1/hooks/search (25 credits / $0.25 — trigram + substring search over the full corpus, multilingual; also the hook→source-video reverse lookup), GET /v1/hooks/library (10 credits / $0.10 — 4,000+ hand-curated fill-in-the-blank templates with the psychology behind each) plus a free /categories helper, and GET /v1/agents/:id/hooks (25 credits / $0.25, waived to free when the agent has Data Intelligence — ranked hook extraction from your own agent’s collected videos, with coverage counts that distinguish "no hook data yet" from "no hooks in this niche"). MCP clients get five new tools: get_trending_hooks, search_hooks, get_hook_types, get_hook_library, and get_agent_hooks (55 tools total). Everything is additive; as always the authoritative charge is the X-Cost header. See /docs/hooks.
Recurring Content Research Agents now stay aware of what is happening in their topic. When an agent detects a breaking event in its niche — a death, record, launch, or controversy the space is suddenly talking about — via a burst in its own collected videos or a news scan, it surfaces the story and adds short-lived timely keywords to chase it. Read the detected events any time with the new free GET /v1/agents/:id/events: each event carries a title, summary, salience (0–10), lifecycle status (candidate / confirmed / dismissed / expired), the timely keywords, and evidence videos ([{ url, views, description }]), active events first. Subscribe to the new content_research_agent.event.detected webhook to get pushed the moment an event is confirmed — it fires between scheduled runs and carries the event plus what the agent did about it (action_taken: timely_keywords / collecting_early / breaking_ingest / none). MCP clients get a new get_niche_monitor_events tool. Everything is additive — existing agents, endpoints, and webhook payloads are unchanged, and one-shot agents are unaffected. See /docs/agents and /docs/webhooks.
Satellite gains a third lookup type: hashtags. GET /v1/satellite/hashtags/:platform/:hashtag (50 credits / $0.50) queues an async lookup of what is being posted under a tag on tiktok (native challenge feed), instagram (public Reels — best-effort coverage), or youtube (native hashtag page, Shorts only); poll GET /v1/satellite/hashtags/status/:job_id for free. Completed results carry the collected video corpus (max_videos 1–100, default 50; sort=top by views or recent by publish date) plus aggregate stats: view and engagement aggregates, posting velocity with an is_accelerating signal, duration_distribution, top_creators (10), related_hashtags (20 co-occurring tags), top_sounds (10), and a sample_quality corpus-health note. A depth query param scales the corpus: standard (default, the max_videos behavior), deep (~300 videos, +50 credits / $0.50 — $1.00 total; surcharge waived when combined with trend_analysis=true), or full (~500 videos, +150 credits / $1.50 — $2.00 total, $2.50 with trends) — TikTok and YouTube only; Instagram supports standard only and deeper tiers return 400 before billing. Add trend_analysis=true (+50 credits / $0.50 — $1.00 total) for LLM-detected content trends over a ~300-video deep fetch, identical in shape to sound-lookup trends. Repeating the same lookup within 6 hours returns the cached run free, and every lookup persists as a durable satellite run (type=hashtag_lookup) — re-read free forever via GET /v1/satellite/runs/:run_id. The satellite.lookup.completed webhook fires with data.type = "hashtag_lookup", and MCP clients get a new lookup_hashtag tool (49 tools total). See /docs/satellite.
GET /v1/trends/emerging now costs **$0.25** (25 credits) per call, the same as GET /v1/trends and GET /v1/trends/digest. It shipped as a free read on 2026-07-07 and became billable on 2026-07-30; several docs surfaces continued to describe it as free until 2026-08-02, and those have now been corrected. Per-plan rate limiting is unchanged, and GET /v1/trends/regions remains free. As always, the authoritative cost of any call is the X-Cost / X-Credits-Used response header. See /docs/credits.
Trends now carry a live momentum signal, and there is a new endpoint for what is heating up right now. Every trend on GET /v1/trends and GET /v1/trends/digest gains an additive momentum object (status — new / rising / steady / fading, a 0–1 score, views_per_hour, and updated_at). Momentum is refreshed by a background loop roughly every 2 hours (configurable per region) that re-reads only exemplar view/like counts — no re-clustering. The new GET /v1/trends/emerging returns a flat, momentum-ranked list of early-stage (new/rising) trends for a region, composable with region (e.g. region=gb for "what's emerging in the UK right now"). It reads maintained state so it responds fast, is a free read, and is rate-limited per plan for user-triggered in-product use. All fields are additive; existing integrations are unaffected. See /docs/topic-trends.
Trends now support regions. GET /v1/trends and GET /v1/trends/digest accept an optional region query param — us, gb, or au for country-specific trends detected from that region's own curated sources, refreshed three times per day in the region's local timezone. Omitting region (or passing global) returns the worldwide feed, preserving the exact historical behavior — existing integrations are unaffected. The new free endpoint GET /v1/trends/regions lists available codes; more regions (including sub-regions like major city hubs) will be added over time, so discover codes at runtime instead of hard-coding. Responses gain additive fields: region and local_date on each trend group, plus detected_at, last_seen_at, origin_region_codes, and global_confidence on each trend — the latter two identify trends independently detected in multiple countries and promoted into the global feed. See /docs/topic-trends.
Creating a recurring agent (POST /v1/agents with is_recurring: true) now accepts the "daily", "weekly", and "monthly" cadence shortcuts in addition to a raw cron expression — the shortcuts are normalized to their cron equivalents before scheduling, matching what the docs describe. Previously only a full cron expression was accepted and the shortcuts returned a 400 "Invalid cron expression". Cron expressions must still run at most once per day.
Orbit (one-shot search) and Comet (recurring monitoring) are unified into a single /v1/agents resource: POST /v1/agents with is_recurring: false for a one-shot search or is_recurring: true (+ cadence) for a recurring monitor. /v1/agents is a full superset of both legacy surfaces — every read lives at the same sub-path (/videos, /slideshows, /ads, /creators/outliers, /analysis[/latest], /trends[/latest], /hashtags, /benchmarks, /affinity, /creators/:creator_id/similar, /sounds) and legacy orbit_id/comet_id values are interchangeable with agent IDs, so reads work on either surface during migration. New capabilities on top: /runs history, an autonomy surface (/activity decision log, /proposals with apply/dismiss/revert, PUT /:id/autonomy for suggest vs autopilot), and a unified content_research_agent.run.completed webhook. Collection scope is system-managed (no min_views/time_range at creation) — filter by views/date/platform for free at read time on /videos. Discovery reads (hashtags, benchmarks, affinity, similar creators, trending sounds) now work for one-shot agents too, not just recurring monitors.
The /v1/orbit and /v1/comet endpoint families are deprecated in favor of the unified /v1/agents resource and will be removed on **August 3, 2026**. Until then they keep working unchanged, and because IDs are interchangeable, migration is a same-path rename (/v1/orbit/:id/videos → /v1/agents/:id/videos, etc.). Create-time min_views / time_range / time_period are accepted but ignored (collection is system-managed); move filtering to read-time query params. Legacy orbit.run.completed / comet.run.completed webhook events keep firing until removal — subscribe to content_research_agent.run.completed going forward. See the migration guide at /docs/agents.
Comet niche monitors gain a suite of free TikTok-genre discovery reads. GET /v1/comet/:id/hashtags returns per-hashtag analytics (volume, total/avg views, avg engagement, run-over-run growth + lifecycle, and top creators per tag; sort=volume|growth|avg_views). GET /v1/comet/:id/benchmarks returns genre norms (median engagement rate, followers, niche video count, and posting frequency) bucketed by follower tier (nano/micro/mid/macro). GET /v1/comet/:id/affinity (exploratory) returns genre adjacency — dominant creator topics plus co-occurring hashtags and sounds. GET /v1/comet/:id/creators/:creator_id/similar (exploratory) ranks niche creators by shared hashtags and sounds with a target creator. All are free reads, consistent with existing Comet sub-resources.
GET /v1/comet/:id/sounds now accepts sort=rising / growth_7d to rank sounds by run-over-run growth in niche usage (the "what sound is breaking out in this genre right now" signal); every row additionally carries growth_video_count, growth_views, and a new/rising/steady/fading lifecycle label. GET /v1/comet/:id/creators/outliers now accepts order_by=rising (true run-over-run velocity from per-run snapshots, transparently falling back to the weighted-outlier ranking on a young monitor) plus follower_tier (nano/micro/mid/macro) and category (topic substring) filters. Comet keywords now normalize hashtag-style tokens — #progressivehouse and progressive house resolve to the same keyword. All additive; existing calls are unchanged.
GET /v1/sounds/:sound_id now always returns a track_resolution object that maps a sound to its canonical recording — status (unresolved | pending | resolved | not_found), artist_name, isrc, spotify_track_id, spotify_artist_id, release_status, resolution_source, release_date, confidence, and resolved_at. Resolution is lazy: pass resolve=true to trigger an on-demand Spotify track match. A fresh resolution adds the sound_artist_resolution feature cost ($0.10); re-reads of an already-resolved sound stay free even with resolve=true.
GET /v1/sounds/trending now defaults to sort=videos_7d — sounds ranked by # videos published using each sound in the last 7 days, the recency-weighted "what is rising right now" signal. videos_30d is also available. The legacy sorts usage_count and video_count (all-time greatest hits) remain available for callers asking reach-not-momentum questions. Velocity sorts include a new videos_in_window field on each item, and the response echoes the sort mode at the top level.
New GET /v1/sounds/breakout ($0.25) surfaces sounds with the highest recent-burst ratio — rapidly rising from a small baseline. Distinct from /v1/sounds/trending: trending favours large absolute weekly volume (mature sounds still gaining lots of videos), while breakout favours sounds where almost all activity happened in the last 7 days. Score = videos_7d × (videos_7d / videos_90d). Each item carries videos_7d, videos_30d, videos_90d, burst_ratio, and breakout_score. Tunable via min_recent / min_baseline to control the noise floor.
Sound responses now expose the artist name on owner_nickname for music-label tracks (Espresso, Anti-Hero, Laxed, etc.) where TikTok does not assign an individual creator handle. Previously these fields were null because our normalizer only read TikTok's owner_handle/owner_nickname fields, which are empty for licensed music. We now also read the artist from matched_song.author (preferred) or author, populating owner_nickname for ~46K previously-unattributed TikTok sounds going forward, and via a one-time backfill for existing sounds.
Orbit and Comet requests with data_intelligence_enabled=true now charge 150 credits ($1.50) instead of 50 credits ($0.50) to reflect the additional AI analysis cost.
Reduced unnecessary top-up checks during high-volume bursts. Auto top-ups now fire at most every 5 minutes per account.
Optional AI analysis layer that surfaces topics, sentiment, demographic fit, and viral potential alongside Orbit and Comet results.
Audio intelligence is now first-class. New endpoints: GET /v1/sounds/trending, /v1/sounds/search, /v1/sounds/{id}, /v1/sounds/{id}/videos, /v1/sounds/usage-history, /v1/sounds/by-creator/{creator_id}. Sound metadata is also enriched into Orbit, Comet, Satellite, and Tracking video responses.
Subscribe to events with POST /v1/webhooks (also GET, PATCH, DELETE). Supports tracking cycle completion, outlier detection, paused events, creator post collection, and posting cadence analysis. Real-time integrations no longer need polling.
Analysis and trends endpoints have been normalized so that all sub-resources sit under /:entity/:id/:sub. The previous routes still resolve but new integrations should use the consistent shape.
Tracking and Comet responses now strictly enforce a public field allowlist; internal scoring/debug fields have been removed.
New endpoints: GET /v1/comet/{id}/trends, /v1/comet/{id}/trends/history, /v1/comet/{id}/analysis, /v1/comet/{id}/analysis/history (and the matching /v1/orbit/{id}/... set). Detail responses now expose analysis_data, analysis_batch_start, and analysis_batch_end.
Tracking event webhooks can now post directly to Slack with no glue code.
Orbit and Comet now return TikTok slideshows (multi-image carousels) alongside individual videos, with an is_slideshow flag for filtering.
Poll long-running batch creator lookups with GET /v1/satellite/creators/batch/{batch_id}.
Per-platform view counters were collapsed into one cross-platform total_views field for cleaner analytics.
New endpoints: POST/GET /v1/tracking/creators/{id}/posts (standard / deep / full collection tiers), /v1/tracking/creators/{id}/posting-cadence, and POST/GET /v1/satellite/creators/batch for bulk lookups with AI category tagging. Video responses now include is_duet and is_stitch.
New optional weighted_score field returned by Satellite, Orbit, and Comet responses. Combines engagement, growth, and audience size into a single ranking signal. Available as a sortBy value on outlier endpoints. (Renamed from "Virlo Score" prior to launch.)
Credit deduction is now method-aware — GET requests against credit-free endpoints are no longer charged.
Tracking and Comet now accept bi_weekly (14-day) and monthly (30-day) scrape cadences alongside the existing daily and weekly options.
Tracking responses now include delta_* fields showing change from the previous snapshot, and Tracking list endpoints accept a search query parameter for filtering by handle or title.
Check remaining credits programmatically with GET /v1/account/balance.
Replaced a full-table-scan RPC with a materialized view. Median hashtag stats latency dropped from ~6s to ~59ms.
Every billable response now includes X-Cost and X-Balance-Remaining headers. When credits run out, the API returns 402 Payment Required with a funding link in the error body.
TikTok data now arrives faster end to end and fails less often. TikTok transcripts are also ready sooner.
New endpoints: POST /v1/tracking/creators and POST /v1/tracking/videos for monitoring creators and videos over time, with snapshot history and outlier detection. Returns 402 Payment Required when account credits are insufficient before starting a job.
AI analysis is now generated automatically on every Tracking cycle, so the standalone POST .../report routes have been retired. Pull analysis from the regular detail endpoint instead.
All /v1 endpoints now publish full Swagger/OpenAPI type definitions, including nullable/array shapes — making MCP and AI-agent auto-generation work cleanly.
YouTube data now arrives faster and fails less often.
Legacy unversioned endpoints are now marked deprecated. They continue to work but new integrations should use the /v1 prefix. A removal date will be announced in advance.
The full Swagger/OpenAPI document is now exposed at GET /openapi.json for MCP servers and AI agents to discover the API automatically.
Responses now include an AI-derived intent field that classifies content by user intent (e.g. educate, sell, entertain) so customers can segment results by motivation.
Billable POST requests now trigger an account-level credit top-up check. Reduces the chance of mid-burst 402 errors for accounts with auto-recharge enabled.
Removed the implicit default to make timeframe explicit and avoid surprising aggregate windows. Pass time_period (e.g. 7d, 30d, 90d) on hashtag and video analytics calls.
Per-response credit accounting has moved to the X-Cost response header (added 2026-04-01). The legacy creditsUsed body field has been removed.
Instagram media thumbnails are now cached and rewritten to long-lived URLs, fixing the 24-hour image expiration that was breaking downstream storage.
New endpoint GET /v1/comet/{id}/video-outliers surfaces videos with anomalous engagement or growth within a Comet niche.
Run bulk creator profile lookups asynchronously and poll for results. Useful for ingesting large creator lists without hitting per-request rate limits.
Full rewrite of the video ingestion pipeline with a new queue architecture. Faster processing, better data quality, and dramatically fewer ingestion failures during traffic spikes.
New POST /v1/teams/* endpoints for creating teams, managing members, and inviting collaborators. Credits are now pooled at the team level so multiple API keys can share a single balance.
New endpoint GET /v1/satellite/creators/{handle} returns a single cross-platform profile (TikTok, Instagram, YouTube) with normalized stats, recent posts, and category tags.
Versioned API surface launched with standardized snake_case naming, consistent envelopes, and explicit schemas. New routes: /v1/hashtags, /v1/comet, /v1/orbit, /v1/videos, /v1/trends, plus per-platform /v1/{tiktok,instagram,youtube}/* endpoints.
New endpoints GET /v1/orbit/{id}/creator-outliers and GET /v1/comet/{id}/creator-outliers surface creators with abnormal growth or engagement spikes — useful for catching breakouts and flagging suspicious activity.
New endpoints: GET /hashtags/{id}/performance (per-hashtag time-series) and POST /comet/{id}/ads (Meta/Facebook ad creative discovery scoped to a Comet niche).
New endpoints POST /comet and GET /comet/{id} for analyzing custom creator niches and discovering opportunities. Customers can define their own niche definitions instead of being limited to preset categories — Comet then groups videos by AI-derived theme.
Orbit responses now include AI-generated keyword trend and creator insight summaries, powered by a new analysis service.
Video search responses now echo back the keyword that matched, so downstream pipelines can attribute results without re-tracking the query.
New endpoints POST /orbit/keyword-searches and GET /orbit/keyword-searches for discovering creators producing content around specific keywords across TikTok, Instagram, and YouTube.
Introduced a credit-based pricing model: each endpoint deducts a defined credit cost from the account balance. See the Pricing page for the full table.
Hashtag and video endpoints now accept a platform query param (tiktok, instagram, youtube) to scope results to a single network.
New endpoint GET /niches/{niche_id}/trends for niche-scoped trend discovery.
Public API launched with three core endpoints: GET /hashtags, GET /videos, GET /trends. Covers TikTok and Instagram at launch with YouTube to follow.
Looking for a specific change? Email us.