Social media intelligence for short-form video — Bloomberg for viral content.
Homepage: https://dev.virlo.ai
Source: https://github.com/CalciferFriend/virlo-skill
Full API docs: https://dev.virlo.ai/docs | Playground: https://dev.virlo.ai/docs/playground
Set VIRLO_API_KEY environment variable. Your API key has the format virlo_tkn_ and can be obtained from the Virlo dashboard.
The Virlo API provides cross-platform analytics across YouTube, TikTok, and Instagram. Key capabilities:
All endpoints use base URL https://api.virlo.ai/v1, snake_case naming, and return data in a { "data": ... } envelope.
Use curl directly with the VIRLO_API_KEY environment variable:
# GET request
curl -s -X GET "https://api.virlo.ai<endpoint>" \
-H "Authorization: Bearer ${VIRLO_API_KEY}" \
-H "Content-Type: application/json"
# POST request with JSON body
curl -s -X POST "https://api.virlo.ai<endpoint>" \
-H "Authorization: Bearer ${VIRLO_API_KEY}" \
-H "Content-Type: application/json" \
-d '<json-body>'
# List top hashtags
curl -s -X GET "https://api.virlo.ai/v1/hashtags" \
-H "Authorization: Bearer ${VIRLO_API_KEY}" \
-H "Content-Type: application/json"
# Top 10 viral videos
curl -s -X GET "https://api.virlo.ai/v1/videos?limit=10" \
-H "Authorization: Bearer ${VIRLO_API_KEY}" \
-H "Content-Type: application/json"
# Daily trend digest
curl -s -X GET "https://api.virlo.ai/v1/trends" \
-H "Authorization: Bearer ${VIRLO_API_KEY}" \
-H "Content-Type: application/json"
# Create an Orbit search
curl -s -X POST "https://api.virlo.ai/v1/orbit" \
-H "Authorization: Bearer ${VIRLO_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"name":"AI research","keywords":["artificial intelligence","AI tools"]}'
All requests require a Bearer token:
Authorization: Bearer virlo_tkn_<your_key>
Never commit API keys to version control. Regenerate compromised keys from the dashboard.
All responses use a { "data": ... } envelope. List endpoints include pagination metadata:
{
"data": {
"total": 500,
"limit": 50,
"offset": 0,
"items": [ ... ]
}
}
List endpoints use offset-based pagination via limit and page query parameters:
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------- |
| limit | integer | 50 | Items per page (1-100) |
| page | integer | 1 | Page number (1-indexed) |
Maximum of 1000 total results accessible via pagination.
Many video-related endpoints support these filters:
| Parameter | Type | Description |
| ------------ | ------- | ------------------------------------------------- |
| min_views | integer | Minimum view count threshold |
| platforms | string | Comma-separated: youtube, tiktok, instagram |
| start_date | string | ISO 8601 date filter (earliest publish date) |
| end_date | string | ISO 8601 date filter (latest publish date) |
| order_by | string | Sort field (varies per endpoint) |
| sort | string | Sort direction: asc or desc (default: desc) |
youtube — YouTube Shorts and videos
tiktok — TikTok videos
instagram — Instagram Reels
Virlo tracks 500K+ hashtags ranked by usage count and total views.
GET /v1/hashtags
Standard pagination (limit, page).
Response:
{
"data": [
{
"hashtag": "#shorts",
"count": 10926,
"total_views": 869912593
}
]
}
| Field | Type | Description |
| ------------- | ------- | --------------------------------------------- |
| hashtag | string | The hashtag text (may or may not include #) |
| count | integer | Number of videos using this hashtag |
| total_views | integer | Sum of views across all videos with this tag |
Daily curated trending topics updated at 1am UTC.
GET /v1/trends
Standard pagination (limit, page).
Response:
{
"data": [
{
"id": "b88c0c23-8501-4975-a1e9-b7c1160c6342",
"title": "Trends for Oct 15th",
"trends": [
{
"id": "132ea402-804d-4515-b706-f3ff9c698c5e",
"trend_id": "8ab75d1a-cb50-4885-b9b3-2e4ede2a3620",
"trend_group_id": "b88c0c23-8501-4975-a1e9-b7c1160c6342",
"ranking": 1,
"trend": {
"id": "8ab75d1a-cb50-4885-b9b3-2e4ede2a3620",
"name": "NBA Season Opening Night",
"description": "The 2025-26 NBA season officially tipped off...",
"trend_type": "content"
}
}
]
}
]
}
| Field | Type | Description |
| -------- | ------ | ------------------------------------------------ |
| id | string | UUID of the trend group |
| title | string | Display title (e.g., "Trends for Oct 15th") |
| trends | array | Array of ranked trend entries |
Trend entry fields: id, trend_id, trend_group_id, ranking, trend (object with id, name, description, trend_type).
2M+ viral videos across YouTube, TikTok, and Instagram.
GET /v1/videos
| Parameter | Type | Description |
| ------------ | ------- | ------------------------------------------------- |
| limit | integer | Items per page (1-100, default 50) |
| page | integer | Page number (1-indexed, default 1) |
| min_views | integer | Minimum view count filter |
| platforms | string | Comma-separated: youtube, tiktok, instagram |
| start_date | string | ISO 8601 earliest publish date |
| end_date | string | ISO 8601 latest publish date |
| order_by | string | publish_date, views, created_at |
| sort | string | asc or desc (default: desc) |
GET /v1/youtube-videos
GET /v1/tiktok-videos
GET /v1/instagram-videos
Same parameters and response shape as /v1/videos, filtered to a single platform.
| Field | Type | Description |
| -------------------- | ------------ | ------------------------------------------ |
| id | string | Virlo UUID |
| url | string | Original video URL |
| publish_date | string | ISO 8601 publish timestamp |
| views | integer | View count |
| number_of_likes | integer | Like count |
| number_of_comments | integer | Comment count |
| description | string | Video description |
| thumbnail_url | string | Thumbnail image URL |
| hashtags | string[] | Extracted hashtags |
| type | string | Platform: youtube, tiktok, instagram |
| niche | string | Content niche category |
| author_id | string | UUID of the video author |
| bookmarks | integer | Bookmark/save count |
| external_id | string | Platform-specific video ID |
| region | string/null | Geographic region code |
| duration | integer | Duration in seconds |
| transcript_raw | string/null | Raw video transcript (when available) |
Queue keyword-based video discovery jobs that search across platforms. Supports async analysis, Meta ads collection, and creator outlier detection.
POST /v1/orbit
| Field | Type | Required | Description |
| ------------------------- | -------- | -------- | -------------------------------------------------------------- |
| name | string | Yes | Descriptive name for the search job |
| keywords | string[] | Yes | Keywords to search (1-10) |
| platforms | string[] | No | Platforms: youtube, tiktok, instagram. Default: all |
| min_views | integer | No | Minimum view count threshold |
| time_period | string | No | today, this_week, this_month, this_year |
| run_analysis | boolean | No | Enable AI social intelligence analysis (default: false) |
| enable_meta_ads | boolean | No | Enable Meta ads collection (default: false) |
| exclude_keywords | string[] | No | Keywords to exclude from results |
| exclude_keywords_strict | boolean | No | Also check transcripts for exclusions (default: false) |
GET /v1/orbit
Paginated list of all search jobs. Standard limit/page parameters.
GET /v1/orbit/:orbit_id
Poll until job completes. When run_analysis: true, includes AI analysis report.
Query params: order_by (views, likes, shares, comments, bookmarks, publish_date, author.followers), sort (asc/desc).
Response fields: name, keywords, analysis (markdown AI report when ready), results (contains total_videos, platform counts, trends, videos, ads, creators).
GET /v1/orbit/:orbit_id/videos
Standard pagination plus min_views, platforms, start_date, end_date, order_by, sort.
GET /v1/orbit/:orbit_id/ads
Meta ads collected (requires enable_meta_ads: true). Pagination plus order_by (created_at, page_like_count), sort.
GET /v1/orbit/:orbit_id/creators/outliers
Creators outperforming their follower count. High outlier_ratio = content reaching far beyond follower base. Standard pagination.
Create niche configs that automatically discover videos, ads, and creator outliers on a schedule.
POST /v1/comet
| Field | Type | Required | Description |
| ------------------------- | -------- | -------- | ------------------------------------------------------ |
| name | string | Yes | Descriptive name (e.g., "Tech Reviews") |
| keywords | string[] | Yes | Keywords to search (1-20) |
| platforms | string[] | Yes | Platforms: youtube, tiktok, instagram |
| cadence | string | Yes | daily, weekly, monthly, or cron expression |
| min_views | integer | Yes | Minimum view count threshold |
| time_range | string | Yes | today, this_week, this_month, this_year |
| is_active | boolean | No | Default: true. Set false to create paused |
| meta_ads_enabled | boolean | No | Enable Meta ads collection (default: false) |
| exclude_keywords | string[] | No | Keywords to exclude |
| exclude_keywords_strict | boolean | No | Also check transcripts for exclusions (default: false) |
GET /v1/comet
Add ?include_inactive=true to include deactivated configs.
GET /v1/comet/:id
PUT /v1/comet/:id # Full replacement — all required fields must be provided
DELETE /v1/comet/:id # Soft-delete, returns 204
GET /v1/comet/:id/videos
Standard pagination plus min_views, platforms, start_date, end_date, order_by, sort.
GET /v1/comet/:id/ads
Requires meta_ads_enabled: true. Standard pagination plus order_by (created_at, page_like_count), sort.
GET /v1/comet/:id/creators/outliers
Standard pagination.
| Code | Name | Description |
| ---- | --------------------- | ------------------------------------- |
| 200 | OK | Request processed successfully |
| 201 | Created | Resource created |
| 202 | Accepted | Async job queued (e.g., Orbit search) |
| 204 | No Content | Successful deletion |
| 400 | Bad Request | Invalid request parameters |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | Insufficient permissions |
| 404 | Not Found | Resource not found |
| 422 | Unprocessable Entity | Valid syntax but cannot process |
| 429 | Too Many Requests | Rate limit exceeded |
| 500 | Internal Server Error | Server error |
Error response format:
{
"error": {
"type": "validation_error",
"message": "keywords is required",
"param": "keywords"
}
}
limit per request: 100 items
429, back off and retry after the retry_after value (in seconds)
共 1 个版本