SnipBob
Get started

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'

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.

API credit rates
OperationCredits
YouTube video or channel stats1 per request
YouTube search or channel/playlist videos1 up to 50 returned; 2 above 50
YouTube transcript, including bulk1 per successful video
Instagram profile or post stats1 per request
Instagram posts or reels1 per 20 returned items
TikTok video stats or channel videos1 per request
YouTube, TikTok, Instagram or Facebook comments1 per 50 returned comments
TikTok search1 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.

Extraction failure example
{
  "success": false,
  "message": "No transcript is available for this content.",
  "errorCode": "no_transcript",
  "retryable": false
}
HTTP statusCode or conditionRetry?Action
400invalid_input (or validation error)NoCorrect the URL, input name or value.
401Missing key; code may be absentNoSend x-access-key for REST or a Bearer key for MCP.
403Invalid key or insufficient_creditsNoCheck the key and available balance; do not repeat unchanged requests.
404 / 422content_unavailable, content_restricted, no_transcriptNoCheck source access or choose another resource; follow retryable when present.
422transcript_not_ready, media_not_readyNot immediatelyWait for a live/upcoming recording to become available.
429rate_limited (or capacity message)Yes, after delayHonor Retry-After; both rate and daily/concurrency limits can apply.
500 / 502 / 503 / 504operation_failed or service failureBounded retriesRetry with backoff and a stopping limit; follow retryable when present.
502 / 503instagram_login_required, instagram_media_unavailable, instagram_views_unavailableBounded retriesA 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

Public trial operational limits
LimitCurrent allowance
Free-plan rate40 authenticated requests per minute per project
Concurrent extraction2 per project; 4 across the public trial service
Daily extraction attempts50 per project; 100 across the public trial service; resets at 00:00 UTC
Monthly attemptsNo separate monthly attempt allowance; successful work uses the 20 monthly credits
Anonymous preview10 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.

List result limits
EndpointDefaultMaximum returnedPagination
/youtube/transcript/bulk1–5 URLs5 URLsPOST only; sequential items under a shared deadline; inspect every item
/youtube/comments20100One batch; no cursor
/tiktok/comments20100Keep the same video with the returned cursor
/youtube/search20100One bounded batch
/youtube/videos20100Channel or playlist; one bounded batch
/instagram/comments10100Keep the same post and sort order with the returned cursor
/facebook/comments10100Keep the same post with the returned cursor
/instagram/channel-posts12100Use the returned cursor for the next page
/instagram/channel-reels12100Use the returned cursor for the next page
/tiktok/channel-videos30100Use the returned cursor for the next page
/tiktok/search10100Default 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 authentication

Connect 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/mcp

Discovery exposes 17 tools. Expand a platform to see the available tools.

YouTube7 tools
  • youtube_transcript
  • youtube_transcript_bulk
  • youtube_stats
  • youtube_comments
  • youtube_channel_stats
  • youtube_videos
  • youtube_search
TikTok4 tools
  • tiktok_stats
  • tiktok_comments
  • tiktok_search
  • tiktok_channel_videos
Instagram5 tools
  • instagram_stats
  • instagram_comments
  • instagram_channel_stats
  • instagram_channel_posts
  • instagram_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.

Endpoint guides

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 guides

TikTok 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 guides

YouTube 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 guides

YouTube 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 guides

YouTube keyword search API

Find up to 20 public YouTube videos matching a keyword. Learn request limits, response fields and credit costs.

Read guide →
Endpoint guides

YouTube 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 guides

Bulk 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 guides

Instagram 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 guides

Facebook 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 guides

YouTube 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 guides

Instagram 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 guides

Instagram 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 guides

Instagram 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 guides

Instagram 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 guides

TikTok 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 guides

TikTok 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 guides

TikTok 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"
              }
            }
          }
        }
      }
    }
  }
}