API documentation
Authentication, endpoints, credit rates, and client setup.
Your first request
Sign in, reveal your project’s API key, and replace VIDEO_URL and YOUR_KEY in the example below.
curl 'https://api.fetchfox.net/youtube/transcript' \
--get --data-urlencode 'url=VIDEO_URL' \
-H 'x-access-key: YOUR_KEY'Base URL: https://api.fetchfox.net
Authentication
Send your project key in the x-access-key header. Keep it on your server. GET requests use query parameters for resource inputs; POST requests use JSON with the same input names. Passing access_key in a URL is deprecated: use the header so your key stays out of browser history and intermediary URL logs. Existing query-key clients remain compatible during migration.
The same project key uses x-access-key in REST and Authorization: Bearer YOUR_KEY in MCP. Rotating it immediately invalidates the previous key.
Credits & errors
Read /credits for your balance. The x-credits-used response header reports each request’s charge. Validation errors and failed processing do not incur a success charge. Successful requests use the operation’s normal credit rate, including cached responses.
| Operation | Credits |
|---|---|
| YouTube video or channel stats | 1 per request |
| YouTube search or channel/playlist videos | 1 up to 50 returned; 2 above 50 |
| YouTube transcript, including bulk | 1 per successful video |
| Instagram profile or post stats | 1 per request |
| Instagram posts or reels | 1 per 20 returned items |
| TikTok video stats or channel videos | 1 per request |
| YouTube, TikTok, Instagram or Facebook comments | 1 per 50 returned comments |
| TikTok search | 1 per 50 returned results |
Errors include an HTTP status, an error code, and retryability where applicable. Use bounded retries for transient errors and respect Retry-After; do not retry missing or private content indefinitely.
Error catalog
Check the HTTP status and success first. Extraction failures include message, errorCode and retryable; authentication, admission and validation failures may omit the latter two fields. Do not assume every failure has the same body.
{
"success": false,
"message": "No transcript is available for this content.",
"errorCode": "no_transcript",
"retryable": false
}| HTTP status | Code or condition | Retry? | Action |
|---|---|---|---|
| 400 | invalid_input (or validation error) | No | Correct the URL, input name or value. |
| 401 | Missing key; code may be absent | No | Send x-access-key for REST or a Bearer key for MCP. |
| 403 | Invalid key or insufficient_credits | No | Check the key and available balance; do not repeat unchanged requests. |
| 404 / 422 | content_unavailable, content_restricted, no_transcript | No | Check source access or choose another resource; follow retryable when present. |
| 422 | transcript_not_ready, media_not_ready | Not immediately | Wait for a live/upcoming recording to become available. |
| 429 | rate_limited (or capacity message) | Yes, after delay | Honor Retry-After; both rate and daily/concurrency limits can apply. |
| 500 / 502 / 503 / 504 | operation_failed or service failure | Bounded retries | Retry with backoff and a stopping limit; follow retryable when present. |
| 502 / 503 | instagram_login_required, instagram_media_unavailable, instagram_views_unavailable | Bounded retries | A signed-in browser view does not establish anonymous API access. |
Use exponential backoff, at most a few retries, and record the request ID. A timeout does not justify an unlimited retry loop. Validation bodies can also include framework fields such as statusCode, code and error.
Limits, latency, and freshness
| Limit | Current allowance |
|---|---|
| Free-plan rate | 40 authenticated requests per minute per project |
| Concurrent extraction | 2 per project; 4 across the public trial service |
| Daily extraction attempts | 50 per project; 100 across the public trial service; resets at 00:00 UTC |
| Monthly attempts | No separate monthly attempt allowance; successful work uses the 20 monthly credits |
| Anonymous preview | 10 attempts per public IP per hour; 20 uncached retrieval attempts per UTC day across visitors |
Failed extraction attempts and cache hits count toward authenticated admission limits. Failed processing uses no credits; successful cached requests use the normal credit rate. The service-wide limits are shared by all trial users; 429 and Retry-After are authoritative.
| Endpoint | Default | Maximum returned | Pagination |
|---|---|---|---|
| /youtube/transcript/bulk | 1–5 URLs | 5 URLs | POST only; sequential items under a shared deadline; inspect every item |
| /youtube/comments | 20 | 100 | One batch; no cursor |
| /tiktok/comments | 20 | 100 | Keep the same video with the returned cursor |
| /youtube/search | 20 | 100 | One bounded batch |
| /youtube/videos | 20 | 100 | Channel or playlist; one bounded batch |
| /instagram/comments | 10 | 100 | Keep the same post and sort order with the returned cursor |
| /facebook/comments | 10 | 100 | Keep the same post with the returned cursor |
| /instagram/channel-posts | 12 | 100 | Use the returned cursor for the next page |
| /instagram/channel-reels | 12 | 100 | Use the returned cursor for the next page |
| /tiktok/channel-videos | 30 | 100 | Use the returned cursor for the next page |
| /tiktok/search | 10 | 100 | Default request requires 1 available credit; larger limits require 1 per 20 requested results |
Use a positive integer from 1 to 100. Results can be fewer than requested. Limits outside this range are rejected before extraction.
For operations exposing country, use an uppercase two-letter country code (for example US, IN or GB). Recognized country-name aliases map to AU, BR, CA, CN, FR, DE, GR, HK, IT, IN, IL, JP, MX, NL, PL, PT, RO, SG, KR, ES, SE, TR, GB and US. The parser also accepts other two-letter codes; provider exit availability is not guaranteed or independently certified for every country. Omit country for the default routing. Country is not a language-selection option.
Responses report your rate window in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. 20 free credits per calendar month (UTC). No credit card required. There is no separate monthly request-attempt allowance. Operational rate, concurrency and daily safety limits apply; failed upstream attempts can count toward these limits even though they use no credits. HTTP 429 includes Retry-After. Back off before retrying and limit retries.
Requests may take several seconds or longer depending on platform access, retries and caching. There is no published latency or uptime SLA. Your request history records each request’s duration; the status page shows the latest reported operation state.
Source data is a snapshot at extraction time. Authenticated free-tier YouTube transcript results can be cached for five minutes. The anonymous homepage preview is a separate, truncated demo with a 15-minute cache and its own limits; source captions and public counts may change independently. Store your own retrieval time when building a dataset or comparing historical values. A successful response does not guarantee every optional field exists.
Only use content you are permitted to access and process. SnipBob does not grant rights to platform content or guarantee that a use complies with platform terms. Review our Terms and the source platform’s rules.
Give your agent access to public social data
Ask it to read a video transcript, compare creator profiles, or find TikTok videos. SnipBob exposes the same operations as MCP tools, using the same project key and credits as REST.
Add this to ~/.cursor/mcp.json. Replace YOUR_KEY with your project key and enable SnipBob in MCP settings.
{
"mcpServers": {
"fetchfox": {
"url": "https://mcp.fetchfox.net/mcp",
"headers": {
"Authorization": "Bearer YOUR_KEY"
}
}
}
}You need a SnipBob project key first. Keep it in personal configuration, outside shared repositories. REST uses x-access-key; MCP uses Authorization: Bearer with that same key. For Claude web or Desktop, follow the remote-connector guide below.
Set up Claude web or Desktop · Make workflow · LangChain integration
MCP tools and authenticationConnect with MCP
Connect a Streamable HTTP MCP client to the endpoint below and send Authorization: Bearer YOUR_KEY. Calls share your REST credit balance.
https://mcp.fetchfox.net/mcpDiscovery exposes 17 tools. Expand a platform to see the available tools.
YouTube7 tools
youtube_transcriptyoutube_transcript_bulkyoutube_statsyoutube_commentsyoutube_channel_statsyoutube_videosyoutube_search
TikTok4 tools
tiktok_statstiktok_commentstiktok_searchtiktok_channel_videos
Instagram5 tools
instagram_statsinstagram_commentsinstagram_channel_statsinstagram_channel_postsinstagram_channel_reels
Facebook1 tools
facebook_comments
Use your project API key to connect; OAuth is not enabled for this deployment.
Guides for each endpoint
Read inputs, credit costs, examples, and limitations for each live operation. Read the quickstart as Markdown, or browse workflow tutorials and integrations.
YouTube comments viewer API
Read available public YouTube comments and export the current batch as CSV or JSON. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesTikTok comments viewer API
Read available public TikTok comments and export the current batch as CSV or JSON. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesYouTube video stats checker API
Read available views, likes, comment counts and metadata for a public YouTube video. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesYouTube channel stats checker API
Look up available public subscriber counts, video counts and channel metadata. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesYouTube keyword search API
Find up to 20 public YouTube videos matching a keyword. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesYouTube channel and playlist videos API
List up to 20 available videos from a YouTube channel or playlist. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesBulk YouTube transcript extractor API
Extract available captions from a pasted list of up to 20 YouTube videos. Learn request limits, response fields and credit costs.
Read guide →Endpoint guidesInstagram comments API and CSV export
Retrieve available public Instagram comments with text, author fields, counts and opaque pagination. See credit pricing and collection limits.
Read guide →Endpoint guidesFacebook comments API and CSV export
Retrieve available public Facebook comments with text, author fields, counts and opaque pagination. See credit pricing and collection limits.
Read guide →Endpoint guidesYouTube transcript API with timestamps
Fetch a YouTube transcript as JSON with text, start times, and segment durations. See Python, JavaScript, curl, response fields, and credit costs.
Read guide →Endpoint guidesInstagram profile API for creator research
Get public Instagram profile data as JSON: username, bio, follower counts, and post counts. See the request, response example, and limitations.
Read guide →Endpoint guidesInstagram post & reel metrics API
Read public metrics and available metadata for one Instagram post or reel. Understand optional video views, strict view recovery, and credit charges.
Read guide →Endpoint guidesInstagram profile posts API
Retrieve recent public Instagram posts for a profile. Learn URL and limit inputs, per-result credit costs, and how to use a bounded feed snapshot.
Read guide →Endpoint guidesInstagram profile reels API
Get recent public reels from an Instagram profile as JSON. See request inputs, result limits, costs, and a workflow for comparing short-form content.
Read guide →Endpoint guidesTikTok video metrics API
Read public metrics and available metadata for a TikTok video URL. Build timestamped observations with the SnipBob REST API or MCP tools.
Read guide →Endpoint guidesTikTok channel videos API with pagination
List a public TikTok creator’s recent videos with a result limit and pagination cursor. Learn caching options, request costs, and safe pagination.
Read guide →Endpoint guidesTikTok keyword search API
Search public TikTok videos by keyword with a JSON API. See query and limit inputs, credit reservation, result handling, and monitoring guidance.
Read guide →Endpoint reference
Find an operation, then expand it for input details.
19 endpoints
GET/credits
Get the authenticated project’s remaining monthly and purchased credits. This request does not consume credits.
Inputs
{}Success response schema
{
"description": "Current credit balance",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"required": [
"totalRemaining",
"monthly",
"purchased"
],
"properties": {
"totalRemaining": {
"type": "number"
},
"monthly": {
"type": "object",
"required": [
"limit",
"used",
"remaining",
"cycleStart",
"resetAt"
],
"properties": {
"limit": {
"type": "number"
},
"used": {
"type": "number"
},
"remaining": {
"type": "number"
},
"cycleStart": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"resetAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
}
}
},
"purchased": {
"type": "object",
"required": [
"total",
"used",
"remaining"
],
"properties": {
"total": {
"type": "number"
},
"used": {
"type": "number"
},
"remaining": {
"type": "number"
}
}
}
}
}
}
}GET / POST/facebook/comments
Fetch top comments from a Facebook video or post.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"maxLength": 16384
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Comments retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"postUrl": {
"type": "string"
},
"commentCount": {
"type": "integer",
"nullable": true
},
"limit": {
"type": "integer"
},
"creditsUsed": {
"type": "integer"
},
"collectionStatus": {
"type": "string",
"enum": [
"partial",
"exhausted",
"unknown"
],
"description": "Exhausted describes the available upstream pagination, not all comments or replies."
},
"stopReason": {
"type": "string",
"enum": [
"requested_limit",
"upstream_exhausted",
"repeated_cursor",
"no_progress",
"page_limit",
"unknown"
]
},
"hasMore": {
"type": "boolean",
"description": "A safe continuation is available; false does not establish complete coverage."
},
"cursor": {
"type": "string",
"nullable": true,
"description": "Opaque continuation, possibly within an upstream page. Preserve the same post and sort order."
},
"comments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
},
"profilePicUrl": {
"type": "string"
},
"likes": {
"type": "integer",
"nullable": true
},
"replyCount": {
"type": "integer",
"nullable": true
},
"date": {
"type": "string"
},
"timestamp": {
"type": "integer"
},
"name": {
"type": "string"
},
"profileUrl": {
"type": "string"
},
"isAuthor": {
"type": "boolean"
}
}
}
}
}
}
}
}GET / POST/instagram/channel-posts
Get recent posts from an Instagram profile's feed.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"maxLength": 16384,
"description": "Opaque continuation from the previous response; pass unchanged."
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Channel posts retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"profileUrl": {
"type": "string"
},
"username": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"shortcode": {
"type": "string"
},
"url": {
"type": "string"
},
"type": {
"type": "string"
},
"caption": {
"type": "string"
},
"duration": {
"type": [
"number",
"null"
],
"description": "Duration in seconds, or null when unavailable."
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"views": {
"type": [
"integer",
"null"
],
"description": "Null when not supplied by the source; a reported zero is preserved."
},
"plays": {
"type": [
"integer",
"null"
]
},
"timestamp": {
"type": "integer"
},
"thumbnailUrl": {
"type": "string"
},
"imageCollection": {
"type": "object",
"required": [
"status",
"order",
"sourceMediaCount",
"items"
],
"properties": {
"status": {
"type": "string",
"enum": [
"complete",
"partial",
"unavailable",
"unknown",
"not_applicable"
],
"description": "Image metadata coverage, not a guarantee that temporary URLs remain retrievable."
},
"order": {
"type": "string",
"enum": [
"source",
"unknown"
]
},
"sourceMediaCount": {
"type": "integer",
"nullable": true,
"minimum": 1,
"description": "Original media count including videos, or null when unknown."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"position",
"url",
"status"
],
"properties": {
"id": {
"type": "string",
"nullable": true
},
"position": {
"type": "integer",
"nullable": true,
"minimum": 1,
"description": "One-based original slot, including skipped video slots; null when not provable."
},
"url": {
"type": "string",
"nullable": true,
"description": "Temporary upstream image URL, not permanent storage."
},
"status": {
"type": "string",
"enum": [
"available",
"unavailable"
]
}
}
}
}
}
},
"author": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"username": {
"type": "string"
},
"fullName": {
"type": "string"
},
"isVerified": {
"type": "boolean"
},
"profilePicUrl": {
"type": "string"
}
}
}
}
}
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"cursor": {
"type": [
"string",
"null"
]
}
}
}
}
}GET / POST/instagram/channel-reels
Get recent reels from an Instagram profile's reels tab.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"maxLength": 16384,
"description": "Opaque continuation from the previous response; pass unchanged."
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Channel reels retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"profileUrl": {
"type": "string"
},
"username": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"shortcode": {
"type": "string"
},
"url": {
"type": "string"
},
"caption": {
"type": "string"
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"views": {
"type": [
"integer",
"null"
],
"description": "Null when not supplied by the source; a reported zero is preserved."
},
"plays": {
"type": [
"integer",
"null"
]
},
"duration": {
"type": [
"number",
"null"
],
"description": "Duration in seconds, or null when unavailable."
},
"thumbnailUrl": {
"type": "string"
},
"author": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"username": {
"type": "string"
},
"fullName": {
"type": "string"
},
"isVerified": {
"type": "boolean"
},
"profilePicUrl": {
"type": "string"
}
}
}
}
}
},
"count": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"cursor": {
"type": [
"string",
"null"
]
}
}
}
}
}GET / POST/instagram/channel-stats
Get stats and metadata for an Instagram profile.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Profile stats retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"profileUrl": {
"type": "string"
},
"userId": {
"type": "string"
},
"username": {
"type": "string"
},
"nickname": {
"type": "string"
},
"verified": {
"type": "boolean",
"nullable": true,
"description": "Null when the source does not report verification."
},
"followers": {
"type": "integer"
},
"following": {
"type": "integer"
},
"totalPosts": {
"type": "integer"
},
"approximateFields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Counts derived from rounded public metadata rather than exact structured values."
},
"bio": {
"type": "string"
},
"avatar": {
"type": "string"
}
}
}
}
}GET / POST/instagram/comments
Fetch top comments from an Instagram post or reel.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"maxLength": 16384
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"sortBy": {
"type": "string",
"enum": [
"popular",
"recent"
]
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Comments retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"postUrl": {
"type": "string"
},
"shortcode": {
"type": "string"
},
"commentCount": {
"type": "integer",
"nullable": true
},
"limit": {
"type": "integer"
},
"creditsUsed": {
"type": "integer"
},
"collectionStatus": {
"type": "string",
"enum": [
"partial",
"exhausted",
"unknown"
],
"description": "Exhausted describes the available upstream pagination, not all comments or replies."
},
"stopReason": {
"type": "string",
"enum": [
"requested_limit",
"upstream_exhausted",
"repeated_cursor",
"no_progress",
"page_limit",
"unknown"
]
},
"hasMore": {
"type": "boolean",
"description": "A safe continuation is available; false does not establish complete coverage."
},
"cursor": {
"type": "string",
"nullable": true,
"description": "Opaque continuation, possibly within an upstream page. Preserve the same post and sort order."
},
"comments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
},
"profilePicUrl": {
"type": "string"
},
"likes": {
"type": "integer",
"nullable": true
},
"replyCount": {
"type": "integer",
"nullable": true
},
"date": {
"type": "string"
},
"timestamp": {
"type": "integer"
},
"username": {
"type": "string"
},
"fullName": {
"type": "string"
},
"verified": {
"type": "boolean"
},
"parentCommentId": {
"type": "string",
"nullable": true
}
}
}
}
}
}
}
}GET / POST/instagram/stats
Get engagement metrics and metadata for an Instagram post or reel. Views are optional by default: returns media immediately with null for unavailable views. Set requireViews=true to require a verified count; unavailable strict requests return 503 without a charge.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"requireViews": {
"enum": [
true,
false,
"true",
"false",
"1",
"0"
],
"description": "Require verified video views. Defaults to false; optional mode skips view-only recovery."
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Post stats retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"postUrl": {
"type": "string"
},
"id": {
"type": "string"
},
"shortcode": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"views": {
"type": "integer",
"nullable": true,
"description": "Null when unavailable or not applicable to this media type. A verified zero video count is preserved."
},
"videoUrl": {
"type": "string",
"description": "Temporary Instagram video CDN URL"
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"shares": {
"type": "integer",
"nullable": true,
"description": "Unavailable from the current Instagram extractor; returns null."
},
"publishedAt": {
"type": "string"
},
"author": {
"type": "string"
},
"authorLink": {
"type": "string"
},
"duration": {
"type": "string",
"nullable": true
},
"thumbnail": {
"type": "string"
},
"isVideo": {
"type": "boolean"
},
"contentType": {
"type": "string"
}
}
}
}
}GET/status
Get the latest reported status of each FetchFox operation; missing, stale or invalid observations are unknown and do not establish health.
Inputs
{}Success response schema
{
"description": "Current tool status",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"required": [
"overall",
"generatedAt",
"tools"
],
"properties": {
"overall": {
"type": "string",
"enum": [
"green",
"yellow",
"red",
"unknown"
]
},
"generatedAt": {
"type": "string",
"format": "date-time"
},
"tools": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"channel",
"name",
"status",
"message",
"updatedAt",
"freshness"
],
"properties": {
"id": {
"type": "string"
},
"channel": {
"type": "string"
},
"name": {
"type": "string"
},
"freshness": {
"type": "object",
"required": [
"state",
"ageSeconds"
],
"properties": {
"state": {
"type": "string",
"enum": [
"fresh",
"stale",
"missing",
"invalid"
]
},
"ageSeconds": {
"type": [
"number",
"null"
]
}
}
},
"status": {
"type": "string",
"enum": [
"green",
"yellow",
"red",
"unknown"
]
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"updatedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
}
}
}
}
}
}GET / POST/tiktok/channel-videos
Get recent TikTok videos with bounded recovery. Paid requests allow up to 120 seconds; failures use zero credits.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"maxLength": 16384,
"description": "Opaque continuation from the previous response; pass unchanged."
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"cache": {
"type": "boolean",
"description": "Opt in to successful response caching. Successful requests use the normal operation credit rate, including cached responses."
},
"cache_ttl": {
"type": "integer",
"minimum": 60,
"maximum": 2592000,
"description": "Maximum response age in seconds. Default 86400; no stale fallback."
},
"no_cache": {
"type": "boolean",
"description": "Bypass all extraction and result caches."
},
"country": {
"type": "string",
"description": "Residential exit country (two-letter code)."
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Channel videos retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"profileUrl": {
"type": "string"
},
"channelName": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"videoId": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"duration": {
"type": "number"
},
"createTime": {
"type": "string"
},
"durationSeconds": {
"type": [
"number",
"null"
]
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"publishedAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 timestamp, or null when unavailable."
},
"views": {
"type": "integer"
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"shares": {
"type": "integer"
},
"collects": {
"type": "integer"
}
}
}
},
"hasMore": {
"type": "boolean"
},
"cursor": {
"type": "string"
}
}
}
}
}GET / POST/tiktok/comments
Fetch top comments from a TikTok video.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"maxLength": 16384,
"description": "Opaque continuation from the previous response; pass unchanged."
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"includeShortShareUrl": {
"type": "boolean",
"description": "Add best-effort shortShareUrl (verified TikTok short link or null) to each comment. May add up to 10 seconds; no extra credits."
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Comments retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"collectionStatus": {
"type": "string"
},
"stopReason": {
"type": "string"
},
"creditsUsed": {
"type": "integer"
},
"videoId": {
"type": "string"
},
"comments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"author": {
"type": "string"
},
"username": {
"type": "string"
},
"text": {
"type": "string"
},
"likes": {
"type": "integer",
"nullable": true
},
"avatar": {
"type": "string"
},
"date": {
"type": "string",
"nullable": true
},
"replyCount": {
"type": "integer",
"nullable": true
},
"shareUrl": {
"type": "string",
"description": "Existing desktop comment link."
},
"shortShareUrl": {
"type": "string",
"nullable": true,
"description": "Present only when includeShortShareUrl=true. TikTok short link for app/browser handoff; null when unavailable. No guaranteed lifetime."
}
}
}
},
"commentCount": {
"type": "integer"
},
"hasMore": {
"type": "boolean"
},
"cursor": {
"type": "string",
"nullable": true
}
}
}
}
}GET / POST/tiktok/search
Search TikTok videos by keyword.
Inputs
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"query"
]
}Success response schema
{
"description": "Search results returned",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"desc": {
"type": "string"
},
"url": {
"type": "string"
},
"createTime": {
"type": "integer"
},
"durationSeconds": {
"type": [
"number",
"null"
]
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"publishedAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 timestamp, or null when unavailable."
},
"author": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"uniqueId": {
"type": "string"
},
"nickname": {
"type": "string"
},
"avatar": {
"type": "string"
},
"verified": {
"type": "boolean"
}
}
},
"stats": {
"type": "object",
"properties": {
"views": {
"type": "integer"
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"shares": {
"type": "integer"
},
"saves": {
"type": "integer"
}
}
}
}
}
},
"hasMore": {
"type": "boolean"
},
"cursor": {
"type": "string"
}
}
}
}
}GET / POST/tiktok/stats
Get engagement metrics and metadata for a TikTok video.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Video stats retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"videoId": {
"type": "string"
},
"title": {
"type": "string"
},
"channelName": {
"type": "string"
},
"channelLink": {
"type": "string"
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"collects": {
"type": "integer"
},
"shares": {
"type": "integer"
},
"views": {
"type": "integer"
},
"description": {
"type": "string"
},
"duration": {
"type": "string"
},
"thumbnailUrl": {
"type": [
"string",
"null"
]
},
"publishedAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 timestamp, or null when unavailable."
},
"durationSeconds": {
"type": [
"number",
"null"
],
"description": "Duration in seconds, or null when unavailable. Prefer this to the legacy duration field."
},
"contentType": {
"type": "string"
},
"isShortForm": {
"type": "boolean"
}
}
}
}
}GET / POST/youtube/channel-stats
Get stats and metadata for a YouTube channel.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Channel stats retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"profileUrl": {
"type": "string"
},
"username": {
"type": "string"
},
"nickname": {
"type": "string"
},
"bio": {
"type": "string"
},
"verified": {
"type": "boolean"
},
"avatar": {
"type": "string"
},
"totalViews": {
"type": "integer",
"nullable": true
},
"subscribers": {
"type": "integer",
"nullable": true
},
"totalVideos": {
"type": "integer",
"nullable": true
},
"bioLink": {
"type": "string"
},
"banner": {
"type": "string"
}
}
}
}
}GET / POST/youtube/comments
Fetch top comments from a YouTube video.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"sortBy": {
"type": "string",
"enum": [
"new",
"top"
]
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Comments retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"collectionStatus": {
"type": "string"
},
"stopReason": {
"type": "string"
},
"creditsUsed": {
"type": "integer"
},
"comments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"nullable": true
},
"relativeTime": {
"type": "string",
"nullable": true
},
"author": {
"type": "string"
},
"text": {
"type": "string"
},
"likes": {
"type": "integer",
"nullable": true
},
"date": {
"type": "string",
"nullable": true
},
"avatar": {
"type": "string"
},
"replyCount": {
"type": "integer",
"nullable": true
},
"position": {
"type": "integer"
}
}
}
}
}
}
}
}GET / POST/youtube/search
Search YouTube videos by keyword.
Inputs
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"sortBy": {
"type": "string",
"enum": [
"relevance",
"rating",
"date",
"views"
]
},
"uploadDate": {
"type": "string",
"enum": [
"hour",
"today",
"week",
"month",
"year"
]
},
"type": {
"type": "string",
"enum": [
"video",
"shorts"
]
}
},
"nullable": true,
"required": [
"query"
]
}Success response schema
{
"description": "Search results returned",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"videoId": {
"type": "string"
},
"title": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"channelName": {
"type": "string"
},
"channelId": {
"type": "string"
},
"channelUrl": {
"type": "string"
},
"publishedTime": {
"type": "string"
},
"duration": {
"type": "string"
},
"views": {
"type": "integer",
"nullable": true
},
"viewsFormatted": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"verified": {
"type": "boolean"
}
}
}
}
}
}
}
}GET / POST/youtube/stats
Get detailed metadata and engagement stats for a YouTube video.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Video stats retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"videoId": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"channelName": {
"type": "string"
},
"channelLink": {
"type": "string"
},
"channelHandle": {
"type": "string"
},
"views": {
"type": "integer",
"nullable": true
},
"likes": {
"type": "integer",
"nullable": true
},
"comments": {
"type": "integer",
"nullable": true
},
"duration": {
"type": "string"
},
"publishedAt": {
"type": [
"string",
"null"
]
},
"thumbnailUrl": {
"type": "string"
},
"contentType": {
"type": "string"
},
"isShortForm": {
"type": "boolean"
}
}
}
}
}GET / POST/youtube/transcript
Extract the full transcript (with timestamps) from a YouTube video or Short.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"no_cache": {
"type": "boolean",
"description": "Bypass extraction and response caches."
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Transcript extracted successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"videoId": {
"type": "string"
},
"transcript": {
"type": "string",
"description": "Full plain-text transcript"
},
"transcriptSegments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"start": {
"type": "number"
},
"duration": {
"type": "number"
},
"timestamp": {
"type": "string"
}
}
}
},
"wordCount": {
"type": "integer"
},
"segments": {
"type": "integer"
},
"language": {
"type": "string"
},
"durationSeconds": {
"type": "number"
},
"creditsUsed": {
"type": "number"
}
}
}
}
}POST/youtube/transcript/bulk
Bulk transcript for multiple youtube items.
Inputs
{
"anyOf": [
{
"type": "object",
"required": [
"requests"
],
"properties": {
"requests": {
"type": "array",
"minItems": 1,
"maxItems": 5,
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
}
},
"additionalProperties": true
}
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"additionalProperties": true
},
{
"type": "object",
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"minItems": 1,
"maxItems": 5,
"items": {
"type": "string"
},
"description": "List of URLs to process"
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
}
},
"additionalProperties": true
}
]
}Success response schema
{
"description": "Batch results returned",
"type": "object",
"required": [
"success",
"results",
"summary"
],
"properties": {
"success": {
"type": "boolean"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"url": {
"type": "string"
},
"error": {
"type": "string"
},
"errorCode": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"attempted": {
"type": "boolean"
},
"creditsUsed": {
"type": [
"integer",
"null"
]
},
"chargeStatus": {
"type": "string"
},
"retryAfter": {
"type": "integer"
},
"data": {
"type": "object",
"additionalProperties": true
}
}
}
},
"summary": {
"type": "object",
"required": [
"total",
"successful",
"failed",
"creditsUsed"
],
"properties": {
"total": {
"type": "integer"
},
"successful": {
"type": "integer"
},
"failed": {
"type": "integer"
},
"creditsUsed": {
"type": "number"
}
}
}
}
}GET / POST/youtube/videos
Get a list of videos from a YouTube channel or playlist.
Inputs
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL of the resource"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"access_key": {
"type": "string",
"description": "Deprecated: use the x-access-key header. Keys in URLs can leak through browser history and intermediary logs. Retained only for existing clients.",
"deprecated": true
},
"full_details": {
"type": "boolean",
"description": "When true, fill exact publishedAt + description for every returned video (not just the recent ones the channel feed covers) in a single request. Slower and higher bandwidth, so it's opt-in; enrichment is capped at 30 videos per request."
}
},
"nullable": true,
"required": [
"url"
]
}Success response schema
{
"description": "Channel videos retrieved successfully",
"type": "object",
"required": [
"success",
"data"
],
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"type": {
"type": "string",
"description": "'playlist' or 'channel'"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"videoId": {
"type": "string"
},
"title": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"channelName": {
"type": "string"
},
"duration": {
"type": "string"
},
"views": {
"type": "integer",
"nullable": true
},
"viewsFormatted": {
"type": "string"
},
"publishedTime": {
"type": "string",
"description": "Relative publish time, e.g. \"2 weeks ago\"."
},
"publishedAt": {
"type": [
"string",
"null"
],
"description": "Exact publish date in ISO 8601 (e.g. 2026-06-30T20:13:54.000Z). Available for a channel's recent videos; null for older/paginated items and playlists."
},
"description": {
"type": "string",
"description": "Video description. Available for a channel's recent videos; empty otherwise."
},
"url": {
"type": "string"
}
}
}
}
}
}
}
}