{
  "schema_version": 1,
  "product": {
    "name": "SocialTap",
    "tagline": "Public social media data. One API, one schema.",
    "description": "SocialTap returns public social media data from the major platforms, normalized into one JSON schema per resource. One API key, one credit balance, and you only pay for requests that succeed.",
    "coverage": "Available now: ads on Facebook; comments on Rumble, TikTok and YouTube; posts on Facebook, Instagram, Rumble, TikTok and YouTube; profiles on Instagram, Rumble, Threads, TikTok and YouTube; transcripts on Facebook, Instagram, Rumble, TikTok and YouTube.",
    "mark": {
      "viewbox": 32,
      "parts": [
        {
          "role": "top",
          "path": "M16 2.4L27.03 8.77L16 15.13L4.97 8.77Z"
        },
        {
          "role": "left",
          "path": "M4.22 10.07L15.25 16.43L15.25 29.17L8.9 25.5L4.22 28L4.22 17.4Z"
        },
        {
          "role": "right",
          "path": "M27.78 10.07L27.78 22.8L16.75 29.17L16.75 16.43Z"
        }
      ],
      "small": [
        {
          "role": "top",
          "path": "M16 2.1L26.84 8.36L16 14.61L5.16 8.36Z"
        },
        {
          "role": "left",
          "path": "M3.96 10.44L14.8 16.69L14.8 29.21L8.81 25.75L3.96 27.95L3.96 17.35Z"
        },
        {
          "role": "right",
          "path": "M28.04 10.44L28.04 22.95L17.2 29.21L17.2 16.69Z"
        }
      ],
      "colors": {
        "left": {
          "light": "#2B2E35",
          "dark": "#ECECF1"
        },
        "right": {
          "light": "#5B606B",
          "dark": "#A9AEB8"
        },
        "top": {
          "light": "#0B0B0D",
          "dark": "#8C929D"
        }
      }
    },
    "url": "https://staging-fly.socialtap.dev",
    "api_url": "https://staging-fly.socialtap.dev",
    "support_email": "",
    "signup_url": "https://staging-fly.socialtap.dev/signup/",
    "legal": {
      "terms_path": "/terms/",
      "privacy_path": "/privacy/"
    },
    "featured_endpoint": "tiktok.profile",
    "test_key_prefix": "st_test_",
    "live_key_prefix": "st_live_",
    "free_credits": 100,
    "test_balance": 10000,
    "docs_test_key": "st_test_docs_mZkmkl5JiSWvVgL4v3DLolbtSsjxXm11",
    "turnstile_site_key": "0x4AAAAAAFpCzthri2tVb5ui",
    "sdks": {
      "go": {
        "published": false
      },
      "python": {
        "published": false
      },
      "typescript": {
        "published": false
      }
    },
    "packs": [
      {
        "id": "20k",
        "credits": 20000,
        "price_cents": 2900
      },
      {
        "id": "80k",
        "credits": 80000,
        "price_cents": 9900
      },
      {
        "id": "400k",
        "credits": 400000,
        "price_cents": 39900
      },
      {
        "id": "2m",
        "credits": 2000000,
        "price_cents": 149900
      }
    ],
    "plans": [
      {
        "id": "payg",
        "name": "Pay as you go",
        "monthly_credits": 0,
        "price_cents": 0,
        "public": true
      }
    ],
    "billing": {
      "failed_requests_free": true,
      "cache_hits_free": true,
      "credits_expire": false
    },
    "credit_price": {
      "min_usd": 0.0007495,
      "min_pack": "2m",
      "max_usd": 0.00145,
      "max_pack": "20k"
    },
    "planned_platforms": [
      {
        "name": "X",
        "logo": {
          "path": "M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z",
          "color": "#000000"
        }
      },
      {
        "name": "LinkedIn",
        "logo": {
          "path": "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z",
          "color": "#0A66C2"
        }
      },
      {
        "name": "Reddit",
        "logo": {
          "path": "M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z",
          "color": "#FF4500"
        }
      }
    ]
  },
  "platforms": [
    {
      "id": "facebook",
      "name": "Facebook",
      "website": "https://www.facebook.com",
      "summary": "Public Facebook posts, photos, videos and reels with their counts, video transcripts, and keyword search over Meta's public Ad Library.",
      "logo": {
        "path": "M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z",
        "color": "#0866FF"
      },
      "endpoints": [
        "facebook.post",
        "facebook.search_ads",
        "facebook.transcript"
      ],
      "url_forms": [
        {
          "kind": "video",
          "example": "https://www.facebook.com/reel/1803909017420449"
        },
        {
          "kind": "video",
          "example": "https://fb.watch/abcDEF123/"
        },
        {
          "kind": "video",
          "example": "https://www.facebook.com/share/v/1AbCdEfGh/"
        },
        {
          "kind": "hashtag",
          "example": "https://www.facebook.com/hashtag/cooking"
        },
        {
          "kind": "post",
          "example": "https://www.facebook.com/NASA/posts/pfbid02abc"
        },
        {
          "kind": "post",
          "example": "https://www.facebook.com/share/p/1AbCdEfGh/"
        },
        {
          "kind": "post",
          "example": "https://www.facebook.com/1515533333772646"
        },
        {
          "kind": "profile",
          "example": "https://www.facebook.com/NASA"
        }
      ]
    },
    {
      "id": "instagram",
      "name": "Instagram",
      "website": "https://www.instagram.com",
      "summary": "Public Instagram profiles, posts, reels and carousels, and transcripts of reels and video posts.",
      "logo": {
        "path": "M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077",
        "color": "#FF0069"
      },
      "endpoints": [
        "instagram.post",
        "instagram.posts",
        "instagram.profile",
        "instagram.transcript"
      ],
      "url_forms": [
        {
          "kind": "video",
          "example": "https://www.instagram.com/reel/De1S3KpCXf0/"
        },
        {
          "kind": "post",
          "example": "https://www.instagram.com/p/C0AbCdEfGhI/"
        },
        {
          "kind": "hashtag",
          "example": "https://www.instagram.com/explore/tags/cooking/"
        },
        {
          "kind": "profile",
          "example": "https://www.instagram.com/natgeo/"
        },
        {
          "kind": "profile",
          "example": "https://www.instagram.com/_u/natgeo"
        },
        {
          "kind": "profile",
          "example": "https://www.instagram.com/stories/natgeo/"
        }
      ]
    },
    {
      "id": "rumble",
      "name": "Rumble",
      "website": "https://rumble.com",
      "summary": "Public Rumble channel and user profiles, posts (videos, shorts and livestreams), comments and transcripts.",
      "logo": {
        "path": "M14.4528 13.5458c.8064-.6542.9297-1.8381.2756-2.6445a1.8802 1.8802 0 0 0-.2756-.2756 21.2127 21.2127 0 0 0-4.3121-2.776c-1.066-.51-2.256.2-2.4261 1.414a23.5226 23.5226 0 0 0-.14 5.5021c.116 1.23 1.292 1.964 2.372 1.492a19.6285 19.6285 0 0 0 4.5062-2.704v-.008zm6.9322-5.4002c2.0335 2.228 2.0396 5.637.014 7.8723A26.1487 26.1487 0 0 1 8.2946 23.846c-2.6848.6713-5.4168-.914-6.1662-3.5781-1.524-5.2002-1.3-11.0803.17-16.3045.772-2.744 3.3521-4.4661 6.0102-3.832 4.9242 1.174 9.5443 4.196 13.0764 8.0121v.002z",
        "color": "#85C742"
      },
      "endpoints": [
        "rumble.comments",
        "rumble.post",
        "rumble.posts",
        "rumble.profile",
        "rumble.search_posts",
        "rumble.transcript"
      ],
      "url_forms": [
        {
          "kind": "video",
          "example": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
        },
        {
          "kind": "video",
          "example": "https://rumble.com/v79xhhm"
        },
        {
          "kind": "video",
          "example": "https://rumble.com/shorts/v7hgv02"
        },
        {
          "kind": "video",
          "example": "https://rumble.com/share/v79xhhm"
        },
        {
          "kind": "video",
          "example": "https://rumble.com/embed/v77qthe/"
        },
        {
          "kind": "profile",
          "example": "https://rumble.com/c/Bongino"
        },
        {
          "kind": "profile",
          "example": "https://rumble.com/user/vivafrei"
        },
        {
          "kind": "profile",
          "example": "https://rumble.com/Bongino"
        }
      ]
    },
    {
      "id": "threads",
      "name": "Threads",
      "website": "https://www.threads.com",
      "summary": "Public Threads profiles: account name, bio, links and follower counts.",
      "logo": {
        "path": "M12.186 24h-.007c-3.581-.024-6.334-1.205-8.184-3.509C2.35 18.44 1.5 15.586 1.472 12.01v-.017c.03-3.579.879-6.43 2.525-8.482C5.845 1.205 8.6.024 12.18 0h.014c2.746.02 5.043.725 6.826 2.098 1.677 1.29 2.858 3.13 3.509 5.467l-2.04.569c-1.104-3.96-3.898-5.984-8.304-6.015-2.91.022-5.11.936-6.54 2.717C4.307 6.504 3.616 8.914 3.589 12c.027 3.086.718 5.496 2.057 7.164 1.43 1.783 3.631 2.698 6.54 2.717 2.623-.02 4.358-.631 5.8-2.045 1.647-1.613 1.618-3.593 1.09-4.798-.31-.71-.873-1.3-1.634-1.75-.192 1.352-.622 2.446-1.284 3.272-.886 1.102-2.14 1.704-3.73 1.79-1.202.065-2.361-.218-3.259-.801-1.063-.689-1.685-1.74-1.752-2.964-.065-1.19.408-2.285 1.33-3.082.88-.76 2.119-1.207 3.583-1.291a13.853 13.853 0 0 1 3.02.142c-.126-.742-.375-1.332-.75-1.757-.513-.586-1.308-.883-2.359-.89h-.029c-.844 0-1.992.232-2.721 1.32L7.734 7.847c.98-1.454 2.568-2.256 4.478-2.256h.044c3.194.02 5.097 1.975 5.287 5.388.108.046.216.094.321.142 1.49.7 2.58 1.761 3.154 3.07.797 1.82.871 4.79-1.548 7.158-1.85 1.81-4.094 2.628-7.277 2.65Zm1.003-11.69c-.242 0-.487.007-.739.021-1.836.103-2.98.946-2.916 2.143.067 1.256 1.452 1.839 2.784 1.767 1.224-.065 2.818-.543 3.086-3.71a10.5 10.5 0 0 0-2.215-.221z",
        "color": "#000000"
      },
      "endpoints": [
        "threads.profile"
      ],
      "url_forms": [
        {
          "kind": "post",
          "example": "https://www.threads.com/@zuck/post/DeZtp-TkQHh"
        },
        {
          "kind": "profile",
          "example": "https://www.threads.com/@zuck"
        }
      ]
    },
    {
      "id": "tiktok",
      "name": "TikTok",
      "website": "https://www.tiktok.com",
      "summary": "Public TikTok profiles with exact follower counts, posts (a video or photo post with its media, sound and engagement counts, or an account's posts), comments on public videos, and transcripts of public videos from creator captions, auto-captions or the audio.",
      "logo": {
        "path": "M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z",
        "color": "#000000"
      },
      "endpoints": [
        "tiktok.comments",
        "tiktok.post",
        "tiktok.posts",
        "tiktok.profile",
        "tiktok.transcript"
      ],
      "url_forms": [
        {
          "kind": "video",
          "example": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
        },
        {
          "kind": "post",
          "example": "https://www.tiktok.com/@nasa/photo/7310000000000000000"
        },
        {
          "kind": "hashtag",
          "example": "https://www.tiktok.com/tag/cooking"
        },
        {
          "kind": "profile",
          "example": "https://www.tiktok.com/@scout2015"
        },
        {
          "kind": "profile",
          "example": "https://www.tiktok.com/share/user/6745191554350760966"
        },
        {
          "kind": "video",
          "example": "https://vm.tiktok.com/ZMhdWxvaW/"
        },
        {
          "kind": "video",
          "example": "https://www.tiktok.com/t/ZSgAbqM38/"
        }
      ]
    },
    {
      "id": "youtube",
      "name": "YouTube",
      "website": "https://www.youtube.com",
      "summary": "Channel profiles, posts (a video's details with exact counts, or a channel's videos, shorts and live streams), and transcripts and comments of public YouTube videos, shorts and live streams.",
      "logo": {
        "path": "M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z",
        "color": "#FF0000"
      },
      "endpoints": [
        "youtube.comments",
        "youtube.post",
        "youtube.posts",
        "youtube.profile",
        "youtube.transcript"
      ],
      "url_forms": [
        {
          "kind": "video",
          "example": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
        },
        {
          "kind": "video",
          "example": "https://www.youtube.com/shorts/dQw4w9WgXcQ"
        },
        {
          "kind": "video",
          "example": "https://youtu.be/dQw4w9WgXcQ"
        },
        {
          "kind": "playlist",
          "example": "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI"
        },
        {
          "kind": "hashtag",
          "example": "https://www.youtube.com/hashtag/cooking"
        },
        {
          "kind": "profile",
          "example": "https://www.youtube.com/@RickAstleyYT"
        },
        {
          "kind": "profile",
          "example": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw"
        },
        {
          "kind": "profile",
          "example": "https://www.youtube.com/c/RickAstleyYT"
        },
        {
          "kind": "profile",
          "example": "https://www.youtube.com/user/RickAstleyVEVO"
        },
        {
          "kind": "profile",
          "example": "https://www.youtube.com/pewdiepie"
        }
      ]
    }
  ],
  "resources": [
    {
      "id": "ad",
      "name": "Ad",
      "plural": "Ads",
      "summary": "A public ad library entry: advertiser, creatives, run dates, placements and, where disclosed, reach and spend ranges.",
      "status": "live",
      "errors": [
        "not_found"
      ],
      "fields": [
        {
          "path": "platform",
          "type": "string",
          "nullable": false,
          "description": "Library owner's platform ID (facebook for Meta's library, tiktok, google, linkedin)."
        },
        {
          "path": "id",
          "type": "string",
          "nullable": false,
          "description": "Library ad ID (string)."
        },
        {
          "path": "url",
          "type": "string",
          "format": "uri",
          "nullable": false,
          "description": "Public library page of the ad."
        },
        {
          "path": "advertiser",
          "type": "object",
          "nullable": false,
          "description": "The advertising page, business or account."
        },
        {
          "path": "advertiser.id",
          "type": "string",
          "nullable": true,
          "description": "Platform-native account ID; null when only the handle is known."
        },
        {
          "path": "advertiser.username",
          "type": "string",
          "nullable": true,
          "description": "Handle without the @; null when the account has none."
        },
        {
          "path": "advertiser.display_name",
          "type": "string",
          "nullable": true,
          "description": "Display name shown on the profile."
        },
        {
          "path": "advertiser.url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Canonical profile URL."
        },
        {
          "path": "advertiser.avatar_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Profile picture URL. Platform CDN URLs can expire within hours."
        },
        {
          "path": "advertiser.is_verified",
          "type": "boolean",
          "nullable": true,
          "description": "Platform verification badge; null where the platform has no badge."
        },
        {
          "path": "paid_by",
          "type": "string",
          "nullable": true,
          "description": "Disclosed payer (\"Paid for by\")."
        },
        {
          "path": "is_active",
          "type": "boolean",
          "nullable": true,
          "description": "True while the ad is running."
        },
        {
          "path": "first_shown_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "First delivery, RFC 3339 UTC (often date-only: see approximate_fields)."
        },
        {
          "path": "last_shown_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "Last delivery, RFC 3339 UTC; null while active."
        },
        {
          "path": "type",
          "type": "string",
          "nullable": false,
          "description": "Creative shape. New values may be added; treat unknown values as other.",
          "enum": [
            "image",
            "video",
            "carousel",
            "text",
            "dynamic",
            "other"
          ]
        },
        {
          "path": "publisher_platforms",
          "type": "string[]",
          "nullable": false,
          "description": "Where it ran, lowercase IDs (facebook, instagram, messenger, audience_network, youtube, …); [] if not disclosed."
        },
        {
          "path": "creatives",
          "type": "object[]",
          "nullable": false,
          "description": "The ad's creatives: one per card of a carousel and per variation of a dynamic or catalog ad, else one for the ad itself; [] if none are shown."
        },
        {
          "path": "creatives[].title",
          "type": "string",
          "nullable": true,
          "description": "Headline."
        },
        {
          "path": "creatives[].body",
          "type": "string",
          "nullable": true,
          "description": "Primary text."
        },
        {
          "path": "creatives[].link_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Destination URL."
        },
        {
          "path": "creatives[].link_description",
          "type": "string",
          "nullable": true,
          "description": "Link description text."
        },
        {
          "path": "creatives[].cta_text",
          "type": "string",
          "nullable": true,
          "description": "Call-to-action label (e.g. Shop now)."
        },
        {
          "path": "creatives[].media",
          "type": "object[]",
          "nullable": false,
          "description": "Images and videos of this creative; [] if none."
        },
        {
          "path": "creatives[].media[].type",
          "type": "string",
          "nullable": false,
          "description": "Kind of file. New values may be added; treat unknown values as other.",
          "enum": [
            "image",
            "video",
            "audio",
            "gif"
          ]
        },
        {
          "path": "creatives[].media[].url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Direct file URL; null when the platform withholds it, or when the link would only work from SocialTap's network or with a login. Often signed and expiring: see expires_at."
        },
        {
          "path": "creatives[].media[].expires_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When url stops working, RFC 3339 UTC, read from the platform's signed URL; null when unknown or when it does not expire."
        },
        {
          "path": "creatives[].media[].thumbnail_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Poster or preview image URL."
        },
        {
          "path": "creatives[].media[].width",
          "type": "integer",
          "nullable": true,
          "description": "Width in pixels."
        },
        {
          "path": "creatives[].media[].height",
          "type": "integer",
          "nullable": true,
          "description": "Height in pixels."
        },
        {
          "path": "creatives[].media[].duration_ms",
          "type": "integer",
          "nullable": true,
          "description": "Duration in milliseconds (video and audio only)."
        },
        {
          "path": "creatives[].media[].alt_text",
          "type": "string",
          "nullable": true,
          "description": "Accessibility text provided by the author or platform."
        },
        {
          "path": "languages",
          "type": "string[]",
          "nullable": false,
          "description": "BCP-47 languages of the ad; [] if not disclosed."
        },
        {
          "path": "country_codes",
          "type": "string[]",
          "nullable": false,
          "description": "ISO 3166-1 alpha-2 countries where it was shown; [] if not disclosed."
        },
        {
          "path": "is_political",
          "type": "boolean",
          "nullable": true,
          "description": "Categorized as a political or social-issue ad; false when the library files it under another category, null when it shows none."
        },
        {
          "path": "impressions",
          "type": "object",
          "nullable": true,
          "description": "Impressions or times shown range; null when not disclosed."
        },
        {
          "path": "impressions.lower_bound",
          "type": "integer",
          "nullable": false,
          "description": "Inclusive lower bound."
        },
        {
          "path": "impressions.upper_bound",
          "type": "integer",
          "nullable": true,
          "description": "Inclusive upper bound; null when open-ended (e.g. \">1M\"). Equal to lower_bound when exact."
        },
        {
          "path": "reach",
          "type": "object",
          "nullable": true,
          "description": "Unique users reached range; null when not disclosed."
        },
        {
          "path": "reach.lower_bound",
          "type": "integer",
          "nullable": false,
          "description": "Inclusive lower bound."
        },
        {
          "path": "reach.upper_bound",
          "type": "integer",
          "nullable": true,
          "description": "Inclusive upper bound; null when open-ended (e.g. \">1M\"). Equal to lower_bound when exact."
        },
        {
          "path": "audience_size",
          "type": "object",
          "nullable": true,
          "description": "Estimated target audience size range; null when not disclosed."
        },
        {
          "path": "audience_size.lower_bound",
          "type": "integer",
          "nullable": false,
          "description": "Inclusive lower bound."
        },
        {
          "path": "audience_size.upper_bound",
          "type": "integer",
          "nullable": true,
          "description": "Inclusive upper bound; null when open-ended (e.g. \">1M\"). Equal to lower_bound when exact."
        },
        {
          "path": "spend",
          "type": "object",
          "nullable": true,
          "description": "Spend range; null when not disclosed."
        },
        {
          "path": "spend.lower_bound",
          "type": "integer",
          "nullable": false,
          "description": "Inclusive lower bound, in whole units of currency."
        },
        {
          "path": "spend.upper_bound",
          "type": "integer",
          "nullable": true,
          "description": "Inclusive upper bound in whole units of currency; null when open-ended."
        },
        {
          "path": "spend.currency",
          "type": "string",
          "nullable": false,
          "description": "ISO 4217 currency code, uppercase (USD)."
        },
        {
          "path": "platform_specific",
          "type": "object",
          "nullable": false,
          "description": "Fields only this platform has, under its ID (platform_specific.<platform>); each null when unknown."
        },
        {
          "path": "approximate_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of values that are rounded, date-only or parsed from display text. A list path (external_links) means the list may be incomplete. [] when all exact."
        },
        {
          "path": "unknown_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of lists whose [] means unknown rather than none (a source that cannot see them); null already means unknown for every other field. [] when every list is known."
        }
      ],
      "endpoints": [
        "facebook.search_ads"
      ],
      "icon": "M2.75 6.25v3.5h2l5 3v-10l-5 3.5h-2zM12 6a2.4 2.4 0 0 1 0 4"
    },
    {
      "id": "comment",
      "name": "Comment",
      "plural": "Comments",
      "summary": "A public comment or reply on a post, with its author, thread position and like/reply counts.",
      "status": "live",
      "errors": [
        "not_found",
        "private_or_unavailable"
      ],
      "fields": [
        {
          "path": "platform",
          "type": "string",
          "nullable": false,
          "description": "Platform ID (tiktok, youtube, …)."
        },
        {
          "path": "id",
          "type": "string",
          "nullable": false,
          "description": "Platform-native comment ID (string; Reddit without t1_)."
        },
        {
          "path": "post_id",
          "type": "string",
          "nullable": false,
          "description": "ID of the post commented on (equals post.id)."
        },
        {
          "path": "parent_id",
          "type": "string",
          "nullable": true,
          "description": "ID of the comment this replies to; null for top-level comments."
        },
        {
          "path": "url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Permalink, when the platform has one."
        },
        {
          "path": "text",
          "type": "string",
          "nullable": false,
          "description": "Comment body as plain text."
        },
        {
          "path": "author",
          "type": "object",
          "nullable": false,
          "description": "The commenting account."
        },
        {
          "path": "author.id",
          "type": "string",
          "nullable": true,
          "description": "Platform-native account ID; null when only the handle is known."
        },
        {
          "path": "author.username",
          "type": "string",
          "nullable": true,
          "description": "Handle without the @; null when the account has none."
        },
        {
          "path": "author.display_name",
          "type": "string",
          "nullable": true,
          "description": "Display name shown on the profile."
        },
        {
          "path": "author.url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Canonical profile URL."
        },
        {
          "path": "author.avatar_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Profile picture URL. Platform CDN URLs can expire within hours."
        },
        {
          "path": "author.is_verified",
          "type": "boolean",
          "nullable": true,
          "description": "Platform verification badge; null where the platform has no badge."
        },
        {
          "path": "published_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When the comment was posted, RFC 3339 UTC. Where the platform shows only a relative time (\"3 weeks ago\"), the latest time that label allows (the fetch time minus the stated amount), listed in approximate_fields."
        },
        {
          "path": "edited_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When the comment was last edited, RFC 3339 UTC; null when never edited or when the platform marks edits without a time (see is_edited)."
        },
        {
          "path": "is_edited",
          "type": "boolean",
          "nullable": true,
          "description": "The comment was edited after posting (the platform's edited mark); null when the platform does not say."
        },
        {
          "path": "is_pinned",
          "type": "boolean",
          "nullable": true,
          "description": "Pinned by the post's author."
        },
        {
          "path": "is_liked_by_author",
          "type": "boolean",
          "nullable": true,
          "description": "Liked or hearted by the post's author."
        },
        {
          "path": "is_by_post_author",
          "type": "boolean",
          "nullable": true,
          "description": "Written by the post's author (the creator's own comment, marked as such by the platform)."
        },
        {
          "path": "metrics",
          "type": "object",
          "nullable": false,
          "description": "Counts at fetch time; null = hidden or not exposed, 0 = zero."
        },
        {
          "path": "metrics.like_count",
          "type": "integer",
          "nullable": true,
          "description": "Likes or upvotes; never negative."
        },
        {
          "path": "metrics.reply_count",
          "type": "integer",
          "nullable": true,
          "description": "Direct replies."
        },
        {
          "path": "platform_specific",
          "type": "object",
          "nullable": false,
          "description": "Fields only this platform has, under its ID (platform_specific.<platform>); each null when unknown."
        },
        {
          "path": "platform_specific.tiktok",
          "type": "object",
          "nullable": true,
          "description": "TikTok's own comment fields."
        },
        {
          "path": "platform_specific.tiktok.language",
          "type": "string",
          "nullable": true,
          "description": "The comment's language as TikTok detected it, an ISO 639-1 code (en, fr); null when TikTok could not tell (emoji, a name) or does not say."
        },
        {
          "path": "platform_specific.rumble",
          "type": "object",
          "nullable": true,
          "description": "Rumble's own comment fields."
        },
        {
          "path": "platform_specific.rumble.dislike_count",
          "type": "integer",
          "nullable": true,
          "description": "Thumbs-down votes on the comment. Exact below 1,000; from 1,000 Rumble shows a label such as \"1.31K\", taken to be cut to three significant digits as Rumble's other counts are (not checked against an exact count), and listed in approximate_fields."
        },
        {
          "path": "platform_specific.rumble.author_badges",
          "type": "string[]",
          "nullable": false,
          "description": "The badges Rumble shows beside the commenter's name, by their label as Rumble writes it (seen: Verified, Admin, Moderator, Supporter, Supporter+, Supporter++, Sub, Locals Supporter; new labels may appear). [] when none."
        },
        {
          "path": "approximate_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of values rounded by the platform or parsed from display text. A list path (external_links) means the list may be incomplete. [] when all exact."
        },
        {
          "path": "unknown_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of lists whose [] means unknown rather than none (a source that cannot see them); null already means unknown for every other field. [] when every list is known."
        }
      ],
      "endpoints": [
        "rumble.comments",
        "tiktok.comments",
        "youtube.comments"
      ],
      "icon": "M2.75 3.25h10.5v7H7.5l-3 2.5v-2.5H2.75z"
    },
    {
      "id": "post",
      "name": "Post",
      "plural": "Posts",
      "summary": "A public post (video, reel, short, photo, carousel, tweet or text) with its author, media and engagement metrics.",
      "status": "live",
      "errors": [
        "not_found",
        "private_or_unavailable"
      ],
      "fields": [
        {
          "path": "platform",
          "type": "string",
          "nullable": false,
          "description": "Platform ID (tiktok, youtube, …)."
        },
        {
          "path": "id",
          "type": "string",
          "nullable": false,
          "description": "Platform-native post ID (string; Instagram shortcode, Reddit without t3_)."
        },
        {
          "path": "url",
          "type": "string",
          "format": "uri",
          "nullable": false,
          "description": "Canonical post URL."
        },
        {
          "path": "type",
          "type": "string",
          "nullable": false,
          "description": "Normalized content shape. New values may be added; treat unknown values as other.",
          "enum": [
            "video",
            "image",
            "carousel",
            "text",
            "link",
            "audio"
          ]
        },
        {
          "path": "platform_type",
          "type": "string",
          "nullable": true,
          "description": "The platform's own product label, lowercase (reel, short, story, live, tweet, …)."
        },
        {
          "path": "title",
          "type": "string",
          "nullable": true,
          "description": "Headline (YouTube title, Reddit title); null on caption-only platforms."
        },
        {
          "path": "text",
          "type": "string",
          "nullable": true,
          "description": "Caption, description or body as plain text."
        },
        {
          "path": "language",
          "type": "string",
          "nullable": true,
          "description": "BCP-47 language of text, when the platform states it."
        },
        {
          "path": "published_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When the post went public, RFC 3339 UTC."
        },
        {
          "path": "author",
          "type": "object",
          "nullable": false,
          "description": "The posting account."
        },
        {
          "path": "author.id",
          "type": "string",
          "nullable": true,
          "description": "Platform-native account ID; null when only the handle is known."
        },
        {
          "path": "author.username",
          "type": "string",
          "nullable": true,
          "description": "Handle without the @; null when the account has none."
        },
        {
          "path": "author.display_name",
          "type": "string",
          "nullable": true,
          "description": "Display name shown on the profile."
        },
        {
          "path": "author.url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Canonical profile URL."
        },
        {
          "path": "author.avatar_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Profile picture URL. Platform CDN URLs can expire within hours."
        },
        {
          "path": "author.is_verified",
          "type": "boolean",
          "nullable": true,
          "description": "Platform verification badge; null where the platform has no badge."
        },
        {
          "path": "coauthors",
          "type": "object[]",
          "nullable": false,
          "description": "Other accounts credited as co-authors of the post (Instagram and Facebook collabs, YouTube collaborations), in the platform's order, author excluded; [] if none."
        },
        {
          "path": "coauthors[].id",
          "type": "string",
          "nullable": true,
          "description": "Platform-native account ID; null when only the handle is known."
        },
        {
          "path": "coauthors[].username",
          "type": "string",
          "nullable": true,
          "description": "Handle without the @; null when the account has none."
        },
        {
          "path": "coauthors[].display_name",
          "type": "string",
          "nullable": true,
          "description": "Display name shown on the profile."
        },
        {
          "path": "coauthors[].url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Canonical profile URL."
        },
        {
          "path": "coauthors[].avatar_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Profile picture URL. Platform CDN URLs can expire within hours."
        },
        {
          "path": "coauthors[].is_verified",
          "type": "boolean",
          "nullable": true,
          "description": "Platform verification badge; null where the platform has no badge."
        },
        {
          "path": "duration_ms",
          "type": "integer",
          "nullable": true,
          "description": "Length of the primary video or audio in milliseconds; null for other posts."
        },
        {
          "path": "thumbnail_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Cover or poster image URL."
        },
        {
          "path": "media",
          "type": "object[]",
          "nullable": false,
          "description": "Attachments in display order (carousel items); [] for text posts."
        },
        {
          "path": "media[].type",
          "type": "string",
          "nullable": false,
          "description": "Kind of file. New values may be added; treat unknown values as other.",
          "enum": [
            "image",
            "video",
            "audio",
            "gif"
          ]
        },
        {
          "path": "media[].url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Direct file URL; null when the platform withholds it, or when the link would only work from SocialTap's network or with a login. Often signed and expiring: see expires_at."
        },
        {
          "path": "media[].expires_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When url stops working, RFC 3339 UTC, read from the platform's signed URL; null when unknown or when it does not expire."
        },
        {
          "path": "media[].thumbnail_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Poster or preview image URL."
        },
        {
          "path": "media[].width",
          "type": "integer",
          "nullable": true,
          "description": "Width in pixels."
        },
        {
          "path": "media[].height",
          "type": "integer",
          "nullable": true,
          "description": "Height in pixels."
        },
        {
          "path": "media[].duration_ms",
          "type": "integer",
          "nullable": true,
          "description": "Duration in milliseconds (video and audio only)."
        },
        {
          "path": "media[].alt_text",
          "type": "string",
          "nullable": true,
          "description": "Accessibility text provided by the author or platform."
        },
        {
          "path": "hashtags",
          "type": "string[]",
          "nullable": false,
          "description": "Hashtags without #, case kept; [] if none."
        },
        {
          "path": "mentions",
          "type": "string[]",
          "nullable": false,
          "description": "Mentioned or tagged usernames without @; [] if none."
        },
        {
          "path": "is_pinned",
          "type": "boolean",
          "nullable": true,
          "description": "Pinned to the author's profile."
        },
        {
          "path": "is_sponsored",
          "type": "boolean",
          "nullable": true,
          "description": "Labeled as a paid partnership or branded content."
        },
        {
          "path": "is_nsfw",
          "type": "boolean",
          "nullable": true,
          "description": "Marked adult or sensitive by the platform."
        },
        {
          "path": "metrics",
          "type": "object",
          "nullable": false,
          "description": "Counts at fetch time; null = hidden or not exposed, 0 = zero."
        },
        {
          "path": "metrics.view_count",
          "type": "integer",
          "nullable": true,
          "description": "Views or plays."
        },
        {
          "path": "metrics.like_count",
          "type": "integer",
          "nullable": true,
          "description": "Likes, hearts, total reactions or upvotes; never negative. Null when hidden by the owner."
        },
        {
          "path": "metrics.comment_count",
          "type": "integer",
          "nullable": true,
          "description": "Comments and replies."
        },
        {
          "path": "metrics.share_count",
          "type": "integer",
          "nullable": true,
          "description": "Shares or sends (not reposts)."
        },
        {
          "path": "metrics.repost_count",
          "type": "integer",
          "nullable": true,
          "description": "Reposts, retweets or reshares."
        },
        {
          "path": "metrics.quote_count",
          "type": "integer",
          "nullable": true,
          "description": "Quote posts."
        },
        {
          "path": "metrics.save_count",
          "type": "integer",
          "nullable": true,
          "description": "Saves, bookmarks or favorites."
        },
        {
          "path": "platform_specific",
          "type": "object",
          "nullable": false,
          "description": "Fields only this platform has, under its ID (platform_specific.<platform>); each null when unknown."
        },
        {
          "path": "platform_specific.tiktok",
          "type": "object",
          "nullable": true,
          "description": "A TikTok post's own fields."
        },
        {
          "path": "platform_specific.tiktok.author_sec_uid",
          "type": "string",
          "nullable": true,
          "description": "The author's secUid, TikTok's account key that survives a rename."
        },
        {
          "path": "platform_specific.tiktok.country_code",
          "type": "string",
          "nullable": true,
          "description": "ISO 3166-1 alpha-2 country TikTok registers the post to (not the viewer's)."
        },
        {
          "path": "platform_specific.tiktok.is_ad",
          "type": "boolean",
          "nullable": true,
          "description": "The post runs as a TikTok ad."
        },
        {
          "path": "platform_specific.tiktok.is_ai_generated",
          "type": "boolean",
          "nullable": true,
          "description": "TikTok labels the post AI-generated."
        },
        {
          "path": "platform_specific.tiktok.location",
          "type": "object",
          "nullable": true,
          "description": "The tagged place; null when none."
        },
        {
          "path": "platform_specific.tiktok.location.id",
          "type": "string",
          "nullable": true,
          "description": "Place ID."
        },
        {
          "path": "platform_specific.tiktok.location.name",
          "type": "string",
          "nullable": true,
          "description": "Place name."
        },
        {
          "path": "platform_specific.tiktok.location.address",
          "type": "string",
          "nullable": true,
          "description": "Address line."
        },
        {
          "path": "platform_specific.tiktok.location.city",
          "type": "string",
          "nullable": true,
          "description": "City."
        },
        {
          "path": "platform_specific.tiktok.location.category",
          "type": "string",
          "nullable": true,
          "description": "Top-level place category."
        },
        {
          "path": "platform_specific.tiktok.music",
          "type": "object",
          "nullable": true,
          "description": "The post's sound."
        },
        {
          "path": "platform_specific.tiktok.music.id",
          "type": "string",
          "nullable": true,
          "description": "Sound ID."
        },
        {
          "path": "platform_specific.tiktok.music.title",
          "type": "string",
          "nullable": true,
          "description": "Sound title."
        },
        {
          "path": "platform_specific.tiktok.music.author_name",
          "type": "string",
          "nullable": true,
          "description": "Who TikTok credits for the sound."
        },
        {
          "path": "platform_specific.tiktok.music.is_original",
          "type": "boolean",
          "nullable": true,
          "description": "An original sound a creator uploaded (false: a catalogue track)."
        },
        {
          "path": "platform_specific.tiktok.music.duration_ms",
          "type": "integer",
          "nullable": true,
          "description": "Sound length in milliseconds."
        },
        {
          "path": "platform_specific.tiktok.music.cover_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Sound cover image URL."
        },
        {
          "path": "platform_specific.tiktok.music.play_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Audio file URL, signed and expiring."
        },
        {
          "path": "platform_specific.youtube",
          "type": "object",
          "nullable": true,
          "description": "A YouTube video's own fields."
        },
        {
          "path": "platform_specific.youtube.category",
          "type": "string",
          "nullable": true,
          "description": "YouTube category (Music, Gaming, …), in English."
        },
        {
          "path": "platform_specific.youtube.keywords",
          "type": "string[]",
          "nullable": false,
          "description": "The uploader's tags; [] when none."
        },
        {
          "path": "platform_specific.youtube.chapters",
          "type": "object[]",
          "nullable": false,
          "description": "Chapters in playback order; [] when none."
        },
        {
          "path": "platform_specific.youtube.chapters[].title",
          "type": "string",
          "nullable": true,
          "description": "Chapter title."
        },
        {
          "path": "platform_specific.youtube.chapters[].start_ms",
          "type": "integer",
          "nullable": true,
          "description": "Start, in ms from the beginning."
        },
        {
          "path": "platform_specific.youtube.description_links",
          "type": "string[]",
          "nullable": false,
          "description": "Links in the description, in order, deduplicated; [] when none."
        },
        {
          "path": "platform_specific.youtube.is_unlisted",
          "type": "boolean",
          "nullable": true,
          "description": "Unlisted: watchable by link, not listed on the channel or in search."
        },
        {
          "path": "platform_specific.youtube.is_age_restricted",
          "type": "boolean",
          "nullable": true,
          "description": "Viewers must sign in to confirm their age; null when the answer does not tell."
        },
        {
          "path": "platform_specific.youtube.is_paywalled",
          "type": "boolean",
          "nullable": true,
          "description": "Must be bought or rented (movies, paid content)."
        },
        {
          "path": "platform_specific.youtube.is_live_now",
          "type": "boolean",
          "nullable": true,
          "description": "A live stream on air now."
        },
        {
          "path": "platform_specific.youtube.live_started_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When a live stream or premiere went on air; null if never live."
        },
        {
          "path": "platform_specific.youtube.live_ended_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When a live stream or premiere ended; null while live or if never live."
        },
        {
          "path": "platform_specific.youtube.scheduled_start_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When a scheduled stream or premiere is due to start; null otherwise."
        },
        {
          "path": "platform_specific.youtube.author_subscriber_count",
          "type": "integer",
          "nullable": true,
          "description": "The channel's subscriber count, rounded by YouTube (in approximate_fields); null when hidden."
        },
        {
          "path": "platform_specific.rumble",
          "type": "object",
          "nullable": true,
          "description": "A Rumble video's own fields."
        },
        {
          "path": "platform_specific.rumble.embed_id",
          "type": "string",
          "nullable": true,
          "description": "The video's embed player ID (rumble.com/embed/<embed_id>/): its own namespace, not id."
        },
        {
          "path": "platform_specific.rumble.embed_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "The embeddable player URL."
        },
        {
          "path": "platform_specific.rumble.numeric_id",
          "type": "string",
          "nullable": true,
          "description": "Rumble's numeric video ID, which its own services use."
        },
        {
          "path": "platform_specific.rumble.dislike_count",
          "type": "integer",
          "nullable": true,
          "description": "Thumbs-down votes. Exact in Rumble's JSON (shorts, grid lists); a video's page and the older HTML cards cut it to three significant digits from 1,000 (in approximate_fields)."
        },
        {
          "path": "platform_specific.rumble.category",
          "type": "string",
          "nullable": true,
          "description": "Rumble's primary category (News, Podcasts, …)."
        },
        {
          "path": "platform_specific.rumble.secondary_category",
          "type": "string",
          "nullable": true,
          "description": "Rumble's secondary category; null when none."
        },
        {
          "path": "platform_specific.rumble.keywords",
          "type": "string[]",
          "nullable": false,
          "description": "The uploader's tags; [] when none."
        },
        {
          "path": "platform_specific.rumble.caption_tracks",
          "type": "object[]",
          "nullable": false,
          "description": "Caption tracks (WebVTT); [] when none."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].language",
          "type": "string",
          "nullable": true,
          "description": "Language code (en, es, …)."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].label",
          "type": "string",
          "nullable": true,
          "description": "Rumble's label (\"English (auto)\")."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "WebVTT file URL."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].is_auto_generated",
          "type": "boolean",
          "nullable": true,
          "description": "Generated by Rumble's speech recognition."
        },
        {
          "path": "platform_specific.rumble.files",
          "type": "object[]",
          "nullable": false,
          "description": "Every file and stream Rumble's player offers, largest video first; [] when none."
        },
        {
          "path": "platform_specific.rumble.files[].kind",
          "type": "string",
          "nullable": true,
          "description": "video (picture and sound), audio (sound only) or preview (the seek bar's low-resolution video, no sound). New values may be added.",
          "enum": [
            "video",
            "audio",
            "preview"
          ]
        },
        {
          "path": "platform_specific.rumble.files[].format",
          "type": "string",
          "nullable": true,
          "description": "mp4 or webm file, hls playlist (all qualities), tar (one HLS quality packed in one file; url is its playlist) or aac audio. New values may be added.",
          "enum": [
            "mp4",
            "webm",
            "hls",
            "tar",
            "aac"
          ]
        },
        {
          "path": "platform_specific.rumble.files[].url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "File or playlist URL."
        },
        {
          "path": "platform_specific.rumble.files[].width",
          "type": "integer",
          "nullable": true,
          "description": "Width in pixels; null for audio and playlists."
        },
        {
          "path": "platform_specific.rumble.files[].height",
          "type": "integer",
          "nullable": true,
          "description": "Height in pixels; null for audio and playlists."
        },
        {
          "path": "platform_specific.rumble.files[].bitrate_kbps",
          "type": "integer",
          "nullable": true,
          "description": "Bitrate in kbit/s."
        },
        {
          "path": "platform_specific.rumble.files[].size_bytes",
          "type": "integer",
          "nullable": true,
          "description": "File size in bytes; null when Rumble does not state it."
        },
        {
          "path": "platform_specific.rumble.is_live_now",
          "type": "boolean",
          "nullable": true,
          "description": "A live stream on air now."
        },
        {
          "path": "platform_specific.rumble.live_started_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When a live stream went on air; null if never live."
        },
        {
          "path": "platform_specific.rumble.scheduled_start_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "When a scheduled live stream is due to start; null otherwise."
        },
        {
          "path": "platform_specific.rumble.concurrent_viewer_count",
          "type": "integer",
          "nullable": true,
          "description": "Viewers watching a live stream now; null when not live."
        },
        {
          "path": "platform_specific.rumble.is_age_restricted",
          "type": "boolean",
          "nullable": true,
          "description": "Viewers must confirm their age to watch; null when the source does not show it."
        },
        {
          "path": "platform_specific.rumble.author_follower_count",
          "type": "integer",
          "nullable": true,
          "description": "The channel's or user's follower count. Exact in Rumble's JSON (shorts, lists); a video's page cuts it to three significant digits (in approximate_fields)."
        },
        {
          "path": "platform_specific.instagram",
          "type": "object",
          "nullable": true,
          "description": "An Instagram post's own fields (core/post_instagram.go)."
        },
        {
          "path": "platform_specific.instagram.is_ai_generated",
          "type": "boolean",
          "nullable": true,
          "description": "Instagram shows its AI label (made or edited with AI); false when it shows none."
        },
        {
          "path": "platform_specific.facebook",
          "type": "object",
          "nullable": true,
          "description": "A Facebook post's own fields."
        },
        {
          "path": "platform_specific.facebook.feedback_id",
          "type": "string",
          "nullable": true,
          "description": "Facebook's feedback ID of the post: the thread its comments and reactions hang on."
        },
        {
          "path": "platform_specific.facebook.video_id",
          "type": "string",
          "nullable": true,
          "description": "The video's ID (facebook.com/reel/<video_id>) on a video or reel post; null on other posts."
        },
        {
          "path": "platform_specific.facebook.reactions",
          "type": "object[]",
          "nullable": false,
          "description": "Reactions by type, most first, as Facebook lists them under the post; [] when none."
        },
        {
          "path": "platform_specific.facebook.reactions[].type",
          "type": "string",
          "nullable": false,
          "description": "Reaction type. New values may be added.",
          "enum": [
            "like",
            "love",
            "care",
            "haha",
            "wow",
            "sad",
            "angry"
          ]
        },
        {
          "path": "platform_specific.facebook.reactions[].count",
          "type": "integer",
          "nullable": true,
          "description": "How many people reacted with it."
        },
        {
          "path": "platform_specific.facebook.shared_post",
          "type": "object",
          "nullable": true,
          "description": "The post this one reshares; null when it is not a reshare."
        },
        {
          "path": "platform_specific.facebook.shared_post.id",
          "type": "string",
          "nullable": true,
          "description": "Its post ID."
        },
        {
          "path": "platform_specific.facebook.shared_post.url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Its URL."
        },
        {
          "path": "platform_specific.facebook.shared_post.author",
          "type": "object",
          "nullable": false,
          "description": "Its author."
        },
        {
          "path": "platform_specific.facebook.shared_post.author.id",
          "type": "string",
          "nullable": true,
          "description": "Platform-native account ID; null when only the handle is known."
        },
        {
          "path": "platform_specific.facebook.shared_post.author.username",
          "type": "string",
          "nullable": true,
          "description": "Handle without the @; null when the account has none."
        },
        {
          "path": "platform_specific.facebook.shared_post.author.display_name",
          "type": "string",
          "nullable": true,
          "description": "Display name shown on the profile."
        },
        {
          "path": "platform_specific.facebook.shared_post.author.url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Canonical profile URL."
        },
        {
          "path": "platform_specific.facebook.shared_post.author.avatar_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Profile picture URL. Platform CDN URLs can expire within hours."
        },
        {
          "path": "platform_specific.facebook.shared_post.author.is_verified",
          "type": "boolean",
          "nullable": true,
          "description": "Platform verification badge; null where the platform has no badge."
        },
        {
          "path": "platform_specific.facebook.link",
          "type": "object",
          "nullable": true,
          "description": "The link card a post shares (an article, a site); null when none."
        },
        {
          "path": "platform_specific.facebook.link.url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "The linked page, as the author shared it (Facebook's l.facebook.com redirect removed)."
        },
        {
          "path": "platform_specific.facebook.link.title",
          "type": "string",
          "nullable": true,
          "description": "The card's headline."
        },
        {
          "path": "platform_specific.facebook.link.image_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "The card's image."
        },
        {
          "path": "approximate_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of values rounded by the platform or parsed from display text. A list path (external_links) means the list may be incomplete. [] when all exact."
        },
        {
          "path": "unknown_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of lists whose [] means unknown rather than none (a source that cannot see them); null already means unknown for every other field. [] when every list is known."
        }
      ],
      "endpoints": [
        "facebook.post",
        "instagram.post",
        "instagram.posts",
        "rumble.post",
        "rumble.posts",
        "rumble.search_posts",
        "tiktok.post",
        "tiktok.posts",
        "youtube.post",
        "youtube.posts"
      ],
      "icon": "M2.75 3.25h10.5v9.5H2.75zM2.75 10.25l3-3 3 3 1.75-1.75 2.75 2.75"
    },
    {
      "id": "profile",
      "name": "Profile",
      "plural": "Profiles",
      "summary": "A public account (creator, channel, page, company or community) with its bio, links and follower metrics.",
      "status": "live",
      "errors": [
        "not_found",
        "private_or_unavailable"
      ],
      "fields": [
        {
          "path": "platform",
          "type": "string",
          "nullable": false,
          "description": "Platform ID (tiktok, youtube, …)."
        },
        {
          "path": "id",
          "type": "string",
          "nullable": false,
          "description": "Platform-native account ID (string; YouTube UC…, Reddit without t2_)."
        },
        {
          "path": "username",
          "type": "string",
          "nullable": true,
          "description": "Handle without the @; null when the account has none."
        },
        {
          "path": "display_name",
          "type": "string",
          "nullable": true,
          "description": "Display name, channel title or page name; null when empty or not exposed."
        },
        {
          "path": "url",
          "type": "string",
          "format": "uri",
          "nullable": false,
          "description": "Canonical profile URL."
        },
        {
          "path": "type",
          "type": "string",
          "nullable": false,
          "description": "Coarse account kind, as the platform labels it; unknown when it does not (TikTok labels organizations only). New values may be added; treat unknown values as unknown.",
          "enum": [
            "person",
            "organization",
            "community",
            "unknown"
          ]
        },
        {
          "path": "bio",
          "type": "string",
          "nullable": true,
          "description": "Profile bio, channel description or page about text; null when empty or not exposed."
        },
        {
          "path": "avatar_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Profile picture URL (largest available). Platform CDN URLs can expire within hours."
        },
        {
          "path": "banner_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "Header or cover image URL."
        },
        {
          "path": "is_verified",
          "type": "boolean",
          "nullable": true,
          "description": "Platform verification badge; null where the platform has no badge."
        },
        {
          "path": "is_private",
          "type": "boolean",
          "nullable": true,
          "description": "True when the account's posts are not public."
        },
        {
          "path": "category",
          "type": "string",
          "nullable": true,
          "description": "Platform category label (e.g. Musician, Media & Entertainment), as shown; not normalized. Often set only for business or creator accounts."
        },
        {
          "path": "external_links",
          "type": "object[]",
          "nullable": false,
          "description": "Links in the bio or channel links; [] if none or not exposed."
        },
        {
          "path": "external_links[].url",
          "type": "string",
          "format": "uri",
          "nullable": false,
          "description": "Link target, absolute (https:// is added where the platform stores the link without a scheme)."
        },
        {
          "path": "external_links[].title",
          "type": "string",
          "nullable": true,
          "description": "Link label shown by the platform."
        },
        {
          "path": "location",
          "type": "string",
          "nullable": true,
          "description": "Self-declared location text."
        },
        {
          "path": "country_code",
          "type": "string",
          "nullable": true,
          "description": "ISO 3166-1 alpha-2 country the platform states for the account."
        },
        {
          "path": "created_at",
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "Account creation or join date, RFC 3339 UTC (some platforms give only the day: see approximate_fields)."
        },
        {
          "path": "metrics",
          "type": "object",
          "nullable": false,
          "description": "Counts at fetch time; null = hidden or not exposed, 0 = zero."
        },
        {
          "path": "metrics.follower_count",
          "type": "integer",
          "nullable": true,
          "description": "Followers or subscribers."
        },
        {
          "path": "metrics.following_count",
          "type": "integer",
          "nullable": true,
          "description": "Accounts this profile follows."
        },
        {
          "path": "metrics.post_count",
          "type": "integer",
          "nullable": true,
          "description": "Posts or videos as the platform counts them on the profile (for a private account, posts the caller cannot see)."
        },
        {
          "path": "metrics.total_like_count",
          "type": "integer",
          "nullable": true,
          "description": "Likes received across all of the profile's posts (not likes given)."
        },
        {
          "path": "metrics.total_view_count",
          "type": "integer",
          "nullable": true,
          "description": "Lifetime views across all of the profile's posts."
        },
        {
          "path": "platform_specific",
          "type": "object",
          "nullable": false,
          "description": "Fields only this platform has, under its ID (platform_specific.<platform>); each null when unknown."
        },
        {
          "path": "platform_specific.youtube",
          "type": "object",
          "nullable": true,
          "description": "A YouTube channel's own fields (core/profile_youtube.go)."
        },
        {
          "path": "platform_specific.youtube.keywords",
          "type": "string[]",
          "nullable": false,
          "description": "The channel's keywords as its owner wrote them, a quoted phrase as one keyword; [] when it has none (listed in unknown_fields when the source cannot see them)."
        },
        {
          "path": "platform_specific.youtube.is_official_artist_channel",
          "type": "boolean",
          "nullable": true,
          "description": "True for an Official Artist Channel (the note badge after its name), false for any other channel; null when the page shows no badge row (YouTube's built-in channels)."
        },
        {
          "path": "platform_specific.youtube.is_subscriber_count_hidden",
          "type": "boolean",
          "nullable": true,
          "description": "True when the channel hides its subscriber count (metrics.follower_count is then null; neither its About panel nor its header shows one), false when YouTube shows it; null when that cannot be told (no About panel or header seen)."
        },
        {
          "path": "platform_specific.youtube.is_business_email_listed",
          "type": "boolean",
          "nullable": true,
          "description": "True when the channel lists a business email (shown to signed-in users only; the address is not returned); null otherwise, since YouTube shows nothing for a channel without one."
        },
        {
          "path": "platform_specific.instagram",
          "type": "object",
          "nullable": true,
          "description": "An Instagram account's own fields (core/profile_instagram.go)."
        },
        {
          "path": "platform_specific.instagram.fbid",
          "type": "string",
          "nullable": true,
          "description": "The account's Meta-wide ID (17841…), the one Meta's Instagram Graph API uses; id is Instagram's own user ID. Null when the source does not show it."
        },
        {
          "path": "platform_specific.instagram.is_memorialized",
          "type": "boolean",
          "nullable": true,
          "description": "True when Instagram has memorialized the account (its owner has died), false otherwise; null when unknown."
        },
        {
          "path": "platform_specific.instagram.is_story_live",
          "type": "boolean",
          "nullable": true,
          "description": "True when the account has a story up now (stories last 24 hours), false when it has none; null when unknown (Instagram does not say for private accounts)."
        },
        {
          "path": "platform_specific.instagram.is_highlights_shown",
          "type": "boolean",
          "nullable": true,
          "description": "True when the profile shows story highlights, false when it shows none; null when unknown (private accounts, or a source that does not show them)."
        },
        {
          "path": "platform_specific.instagram.pronouns",
          "type": "string[]",
          "nullable": false,
          "description": "The pronouns the owner chose to show on the profile, as shown; [] when none (listed in unknown_fields when the source cannot see them)."
        },
        {
          "path": "platform_specific.rumble",
          "type": "object",
          "nullable": true,
          "description": "A Rumble channel's or user's own fields (core/profile_rumble.go)."
        },
        {
          "path": "platform_specific.rumble.account_type",
          "type": "string",
          "nullable": true,
          "description": "channel for a Rumble channel (rumble.com/c/<name>), user for a Rumble user (rumble.com/user/<name>: the account that uploads, which can own channels). Null when unknown. New values may be added; treat unknown values as unknown.",
          "enum": [
            "channel",
            "user"
          ]
        },
        {
          "path": "platform_specific.rumble.numeric_id",
          "type": "string",
          "nullable": true,
          "description": "Rumble's numeric ID of the channel or the user, in decimal (the channel's is the number in its rumble.com/c/c-<id> link). Channels and users are numbered separately, so the same number can name a channel and a user: id is the unambiguous reference. Null when unknown."
        },
        {
          "path": "platform_specific.rumble.user_id",
          "type": "string",
          "nullable": true,
          "description": "The id of the Rumble user that owns the channel (_u…, the id this endpoint answers for that user); for a user, its own id. Channels of one owner share it. Null when the page does not show it."
        },
        {
          "path": "platform_specific.threads",
          "type": "object",
          "nullable": true,
          "description": "A Threads account's own fields (core/profile_threads.go)."
        },
        {
          "path": "platform_specific.threads.interest_tags",
          "type": "string[]",
          "nullable": false,
          "description": "Topic labels Threads shows on the profile, as shown; [] when it shows none (listed in unknown_fields when the source cannot see them)."
        },
        {
          "path": "platform_specific.threads.verified_link_urls",
          "type": "string[]",
          "nullable": false,
          "description": "The external_links URLs Threads marks as verified, in the same form; [] when none is marked (listed in unknown_fields when the source cannot see the links)."
        },
        {
          "path": "approximate_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of values rounded by the platform or parsed from display text (e.g. metrics.follower_count). A list path (external_links) means the list may be incomplete. [] when all exact."
        },
        {
          "path": "unknown_fields",
          "type": "string[]",
          "nullable": false,
          "description": "JSON paths of lists whose [] means unknown rather than none (a source that cannot see them); null already means unknown for every other field. [] when every list is known."
        }
      ],
      "endpoints": [
        "instagram.profile",
        "rumble.profile",
        "threads.profile",
        "tiktok.profile",
        "youtube.profile"
      ],
      "icon": "M8 7.75a2.6 2.6 0 1 0 0-5.2 2.6 2.6 0 0 0 0 5.2ZM3 13.5c.55-2.3 2.55-3.6 5-3.6s4.45 1.3 5 3.6"
    },
    {
      "id": "transcript",
      "name": "Transcript",
      "plural": "Transcripts",
      "summary": "Timed transcript of a public video: the platform's caption track, or speech-to-text on its audio when there is none.",
      "status": "live",
      "errors": [
        "not_found",
        "private_or_unavailable",
        "no_transcript"
      ],
      "fields": [
        {
          "path": "platform",
          "type": "string",
          "nullable": false,
          "description": "Platform the media is hosted on."
        },
        {
          "path": "id",
          "type": "string",
          "nullable": false,
          "description": "Platform-native ID of the post (equals post.id)."
        },
        {
          "path": "url",
          "type": "string",
          "format": "uri",
          "nullable": false,
          "description": "Canonical URL of the post."
        },
        {
          "path": "language",
          "type": "string",
          "nullable": true,
          "description": "BCP-47 language of the returned transcript; null when unknown."
        },
        {
          "path": "source",
          "type": "string",
          "nullable": false,
          "description": "captions = platform caption track; asr = speech-to-text on the audio. New values may be added.",
          "enum": [
            "captions",
            "asr"
          ]
        },
        {
          "path": "is_auto_generated",
          "type": "boolean",
          "nullable": false,
          "description": "True when the track was machine-generated (platform auto-captions or ASR)."
        },
        {
          "path": "available_languages",
          "type": "string[]",
          "nullable": false,
          "description": "BCP-47 caption languages the platform offers for this post; [] if none or not listed."
        },
        {
          "path": "duration_ms",
          "type": "integer",
          "nullable": true,
          "description": "Media duration in milliseconds; null when unknown."
        },
        {
          "path": "segments",
          "type": "object[]",
          "nullable": false,
          "description": "Timed cues in order; never empty on success."
        },
        {
          "path": "segments[].start_ms",
          "type": "integer",
          "nullable": false,
          "description": "Start time in milliseconds from the beginning of the media."
        },
        {
          "path": "segments[].end_ms",
          "type": "integer",
          "nullable": false,
          "description": "End time in milliseconds from the beginning of the media."
        },
        {
          "path": "segments[].text",
          "type": "string",
          "nullable": false,
          "description": "Cue text, whitespace-normalized."
        },
        {
          "path": "text",
          "type": "string",
          "nullable": false,
          "description": "Full transcript: segment texts joined with single spaces."
        },
        {
          "path": "platform_specific",
          "type": "object",
          "nullable": false,
          "description": "Fields only this platform has, under its ID (platform_specific.<platform>); each null when unknown."
        },
        {
          "path": "platform_specific.rumble",
          "type": "object",
          "nullable": true,
          "description": "A Rumble transcript's own fields."
        },
        {
          "path": "platform_specific.rumble.track_label",
          "type": "string",
          "nullable": true,
          "description": "Rumble's label of the caption track used (\"English (auto)\"); null for speech-to-text."
        },
        {
          "path": "platform_specific.rumble.caption_url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "The WebVTT file of the caption track used; null for speech-to-text."
        },
        {
          "path": "platform_specific.rumble.caption_tracks",
          "type": "object[]",
          "nullable": false,
          "description": "Every caption track Rumble offers for the video (WebVTT); [] when none."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].language",
          "type": "string",
          "nullable": true,
          "description": "Language code (en, es, …)."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].label",
          "type": "string",
          "nullable": true,
          "description": "Rumble's label (\"English (auto)\")."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].url",
          "type": "string",
          "format": "uri",
          "nullable": true,
          "description": "WebVTT file URL."
        },
        {
          "path": "platform_specific.rumble.caption_tracks[].is_auto_generated",
          "type": "boolean",
          "nullable": true,
          "description": "Generated by Rumble's speech recognition."
        }
      ],
      "endpoints": [
        "facebook.transcript",
        "instagram.transcript",
        "rumble.transcript",
        "tiktok.transcript",
        "youtube.transcript"
      ],
      "icon": "M3 4h10M3 7h10M3 10h7M3 13h4.5"
    }
  ],
  "endpoints": [
    {
      "id": "facebook.post",
      "platform": "facebook",
      "name": "post",
      "resource": "post",
      "list": null,
      "path": "/v1/facebook/post",
      "method": "GET",
      "operation_id": "facebook.post.get",
      "status": "beta",
      "title": "Facebook Post API",
      "summary": "Facebook post, photo, video or reel with exact counts",
      "description": "Returns a public Facebook post, photo, video or reel: its text with hashtags and mentions, the author with their verification badge, the publish time, every photo of an album and the video's file, thumbnail, size and duration, the shared link card or reshared post, and the exact reaction, comment, share and view counts with the reactions by type. Accepts post, permalink, photo, reel, watch, video, fb.watch and share links or a numeric ID.",
      "use_cases": [
        "Track engagement on page and creator posts",
        "Monitor competitors' campaigns and reels",
        "Collect post text and links for social listening",
        "Archive post media and metadata"
      ],
      "notes": [
        "Counts are exact, as Facebook's page states them. view_count is set on videos and reels; share_count on posts and photos (Facebook's video page shows none logged out).",
        "Media URLs are Facebook CDN links that expire: media[].expires_at says when; download what you need before then.",
        "Posts that are private, limited to friends or a group, or deleted return private_or_unavailable: logged out, Facebook answers them all alike. They are not charged.",
        "If the post's page is unavailable, the answer comes from Facebook's embedded post: counts as displayed (large ones rounded, see approximate_fields), and no view count, reactions by type, feedback ID or reshared post, nor a video's file and length (partial_data warning).",
        "Past and current live broadcasts are platform_type live, with their title."
      ],
      "faq": [
        {
          "q": "What is id for a video or reel?",
          "a": "The post ID, like every other post; the video's own ID (the one in /reel/<id>) is platform_specific.facebook.video_id. A video a page uploaded to its videos tab without a post of its own (a live broadcast's, for one) has no post ID on its page: there id is the video's ID."
        },
        {
          "q": "Is like_count only likes?",
          "a": "It is every reaction (like, love, care, haha, wow, sad, angry), as Facebook counts them; platform_specific.facebook.reactions splits it by type."
        }
      ],
      "keywords": [
        "facebook post api",
        "facebook reel scraper",
        "facebook post likes and comments api",
        "facebook video downloader api"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Facebook post, photo, video or reel URL: /<page>/posts/<id>, permalink.php and story.php links, /photo/?fbid= and /<page>/photos/… links, reel, watch, video.php and /<page>/videos/… links, fb.watch and /share/p|v|r/ share links (m., mbasic. and web. hosts too), or a numeric post, photo or video ID.",
          "example": "https://www.facebook.com/reel/4075684206061398/",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://www.facebook.com/reel/4075684206061398/"
        },
        "response": {
          "data": {
            "approximate_fields": [],
            "author": {
              "avatar_url": "https://scontent-atl3-2.xx.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s80x80&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_nc_ss=7b…",
              "display_name": "NASA - National Aeronautics and Space Administration",
              "id": "100044561550831",
              "is_verified": true,
              "url": "https://www.facebook.com/NASA",
              "username": "NASA"
            },
            "coauthors": [],
            "duration_ms": 39381,
            "hashtags": [],
            "id": "1670768087751894",
            "is_nsfw": null,
            "is_pinned": null,
            "is_sponsored": null,
            "language": null,
            "media": [
              {
                "alt_text": null,
                "duration_ms": 39381,
                "expires_at": "2026-10-25T18:00:00Z",
                "height": 2160,
                "thumbnail_url": "https://scontent-atl3-2.xx.fbcdn.net/v/t15.5256-10/877658791_1832631854542515_4430770165954872904_n.jpg?stp=dst-jpg_tt6&cstp=mx1920x1080&ctp=s960x960&_nc_cat=101&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_n…",
                "type": "video",
                "url": "https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m366/AQMS1Kmor5hpvEHAtxe3lVPcxOt4prhHPFgKMLcPxvBSvELFTPbkpMPfDvKx8gg5c4VOCCZrgCV0tzqv9ahLzz1s3O0N2Cdf2DaUFGeUSO0WTA.mp4?_nc_cat=106&_nc_sid=SCRUBBED&_nc_ht=video-atl3-1.xx.fbcdn.net&_nc_ohc=SCRUBBED&efg=SCRUBBED&ccb=SCRUBBED&vs=SCRUBBE…",
                "width": 3840
              }
            ],
            "mentions": [
              "CanadianSpaceAgency",
              "ISS"
            ],
            "metrics": {
              "comment_count": 55,
              "like_count": 574,
              "quote_count": null,
              "repost_count": null,
              "save_count": null,
              "share_count": null,
              "view_count": 52713
            },
            "platform": "facebook",
            "platform_specific": {
              "facebook": {
                "feedback_id": "ZmVlZGJhY2s6MTY3MDc2ODA4Nzc1MTg5NA==",
                "link": null,
                "reactions": [
                  {
                    "count": 476,
                    "type": "like"
                  },
                  {
                    "count": 70,
                    "type": "love"
                  },
                  {
                    "count": 13,
                    "type": "care"
                  }
                ],
                "shared_post": null,
                "video_id": "4075684206061398"
              }
            },
            "platform_type": "reel",
            "published_at": "2026-10-29T11:48:37Z",
            "text": "NASA astronaut Anil Menon and Canadian Space Agency astronaut Joshua Kutryk are getting ready to head out of the International Space Station!\n \nAt this point, they have donned spacesuits called Extravehicular Mobility Units (EMUs), which contain all the protections and life suppo…",
            "thumbnail_url": "https://scontent-atl3-2.xx.fbcdn.net/v/t15.5256-10/877658791_1832631854542515_4430770165954872904_n.jpg?stp=dst-jpg_tt6&cstp=mx1920x1080&ctp=s960x960&_nc_cat=101&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_n…",
            "title": null,
            "type": "video",
            "unknown_fields": [],
            "url": "https://www.facebook.com/reel/4075684206061398/"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "facebook",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "1670768087751894",
              "url": "https://www.facebook.com/reel/4075684206061398/"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "reel with exact views",
          "params": {
            "url": "https://www.facebook.com/reel/4075684206061398"
          },
          "tags": [
            "video",
            "reel"
          ]
        },
        {
          "name": "page photo post",
          "params": {
            "url": "https://www.facebook.com/cnn/posts/pfbid0zVcLXuYcv5N8D5oZn9NMU3R116cECPXJiKY6QyxiZGTA7eRDZb3zv3NkVwgC1GVdl"
          },
          "tags": [
            "image",
            "post"
          ]
        },
        {
          "name": "album of two photos",
          "params": {
            "url": "https://www.facebook.com/9gag/posts/pfbid0HCdcCAZwvriYCAKpD9htRSvmQU64KVd5EiFWhVPGPe7EQGXtnYM4wdfa8QXqkDnCl"
          },
          "tags": [
            "carousel",
            "post"
          ]
        },
        {
          "name": "link card post",
          "params": {
            "url": "https://www.facebook.com/BillGates/posts/pfbid02Bg6iC7XFjU15gErSDkVqmC79VSsj6FzpahPUYaEZaRQVPypC1KUn1XcDbGCw275Ql"
          },
          "tags": [
            "link",
            "post"
          ]
        },
        {
          "name": "text post by a person",
          "params": {
            "url": "https://www.facebook.com/zuck/posts/pfbid0E4UD7MJyFS496try46EVky6BTQ8kuMFPVBs87iqjKUv4DT5gG4QDWpmt5KmM6SjXl"
          },
          "tags": [
            "text",
            "post"
          ]
        },
        {
          "name": "photo link",
          "params": {
            "url": "https://www.facebook.com/photo/?fbid=1629624498532920&set=a.416660999829282"
          },
          "tags": [
            "image",
            "photo"
          ]
        },
        {
          "name": "bare post ID resolves",
          "params": {
            "url": "1515533333772646"
          },
          "tags": [
            "bare_id"
          ]
        },
        {
          "name": "reel share link resolves",
          "params": {
            "url": "https://www.facebook.com/share/r/1CfnJ9UQoT/"
          },
          "tags": [
            "share_link",
            "video"
          ]
        },
        {
          "name": "unavailable post",
          "params": {
            "url": "https://www.facebook.com/cnn/posts/1515533333772645"
          },
          "tags": [
            "private"
          ]
        },
        {
          "name": "profile link is not a post",
          "params": {
            "url": "https://www.facebook.com/NASA"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "post",
        "video"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "facebook.search_ads",
      "platform": "facebook",
      "name": "search_ads",
      "resource": "ad",
      "list": {
        "page_max": 10,
        "cursor_ttl_s": 3600,
        "order": "most impressions first"
      },
      "path": "/v1/facebook/search_ads",
      "method": "GET",
      "operation_id": "facebook.search_ads.list",
      "status": "beta",
      "title": "Facebook Ad Library Search API",
      "summary": "Search Meta's Ad Library by keyword",
      "description": "Searches Meta's public Ad Library by keyword and returns the matching ads that ran on Facebook, Instagram, Messenger, Threads and the Audience Network: the advertiser's page, the days the ad first and last ran, whether it is still active, where it ran, and each creative's headline, text, link, call to action, images and videos. Political and social-issue ads also carry the disclosed payer and Meta's impressions, reach and spend ranges. Filter by country, language, active status and the day an ad first ran; results come in the Ad Library's own order, most impressions first.",
      "use_cases": [
        "Monitor competitors' ad creatives and offers",
        "Research ad copy in a market or niche",
        "Track political and issue ad spending",
        "Find the advertisers running ads on a topic"
      ],
      "notes": [
        "Payer, impressions, reach and spend are disclosed only for political and social-issue ads; they are null for other ads.",
        "Dates are whole days (Meta reports the day an ad first and last ran, US Pacific time), so they are listed in approximate_fields.",
        "since and until return the ads that ran during the window (first ran before until, and still running or last ran at or after since), whole days as Meta reports them; a filtered page can hold fewer ads than the page size, and that is not the end of the list.",
        "Ads that share one creative are grouped by Meta; each ad of a group is returned as its own item.",
        "Languages, targeting and EU reach by country are not part of the search results; those fields are empty or null."
      ],
      "faq": [
        {
          "q": "How do I search for an exact phrase?",
          "a": "Wrap the query in double quotes, for example \"cold brew\"; without quotes every word must appear, in any order."
        },
        {
          "q": "Which ads does it find?",
          "a": "Every ad in Meta's public Ad Library whose text matches the query: active and inactive ads on all of Meta's apps, from any advertiser."
        }
      ],
      "keywords": [
        "meta ad library api",
        "facebook ad library scraper",
        "facebook ads search api",
        "instagram ad library api",
        "competitor ads api"
      ],
      "params": [
        {
          "name": "query",
          "type": "string",
          "required": true,
          "description": "Keywords matched against the ad's text, in any order. Wrap the query in double quotes (\"cold brew\") to match an exact phrase.",
          "example": "coffee",
          "max_length": 200
        },
        {
          "name": "country",
          "type": "string",
          "required": false,
          "description": "Region: an ISO 3166-1 alpha-2 country code such as US or BR (case-insensitive). Only ads delivered in this country. All countries when omitted.",
          "example": "US",
          "format": "iso3166-1-alpha-2",
          "vocabulary": "country"
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Only ads whose text Meta detects as this language (the primary subtag counts: pt-BR searches pt). All languages when omitted.",
          "example": "en",
          "format": "bcp47",
          "vocabulary": "lang"
        },
        {
          "name": "status",
          "type": "string",
          "required": false,
          "description": "Only items that are still running (active), only items that stopped (inactive), or both (all). Default: all.",
          "example": "active",
          "enum": [
            "active",
            "inactive",
            "all"
          ],
          "default": "all",
          "vocabulary": "status"
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Ads count when they ran during the window: an ad that last ran (last_shown_at) before since is left out; active ads ran until today.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Ads count when they ran during the window: an ad that first ran (first_shown_at) at or after until is left out.",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        }
      ],
      "sources": [
        "api"
      ],
      "pricing": [
        {
          "kind": "api",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "country": "US",
          "query": "coffee",
          "status": "all"
        },
        "response": {
          "data": [
            {
              "advertiser": {
                "avatar_url": "https://scontent-atl3-2.xx.fbcdn.net/v/t39.35426-6/739782028_1533198008291919_1079542453788497101_n.jpg?stp=dst-jpg_s60x60_tt6&_nc_cat=104&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED&…",
                "display_name": "American Health Support Community",
                "id": "966175593248497",
                "is_verified": null,
                "url": "https://www.facebook.com/61588018263996",
                "username": null
              },
              "approximate_fields": [
                "first_shown_at"
              ],
              "audience_size": null,
              "country_codes": [],
              "creatives": [
                {
                  "body": "My aunt called me a creep for putting a camera in Nana’s living room.\n\nNana called me practical.\n\nThen the camera caught something worse than a fall.\n\nI need to be clear about one thing before anyone decides what kind of grandson I am.\n\nNana asked for the camera.\n\nNot me.\n\nNot my…",
                  "cta_text": "Learn more",
                  "link_description": null,
                  "link_url": "https://shop.pipitea.com/hbt/kd/sp-nm",
                  "media": [
                    {
                      "alt_text": null,
                      "duration_ms": null,
                      "expires_at": "2026-10-25T18:00:00Z",
                      "height": null,
                      "thumbnail_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/742001725_2100792434176297_9060645049521596104_n.jpg?stp=dst-jpg_s600x600_tt6&_nc_cat=100&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBE…",
                      "type": "image",
                      "url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/742501415_1706621370582971_4085631001896338504_n.jpg?_nc_cat=103&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED&oe=F2A52380",
                      "width": null
                    }
                  ],
                  "title": "Natural Relief in Weeks"
                }
              ],
              "first_shown_at": "2026-07-18T07:00:00Z",
              "id": "2619351891814847",
              "impressions": null,
              "is_active": true,
              "is_political": false,
              "languages": [],
              "last_shown_at": null,
              "paid_by": null,
              "platform": "facebook",
              "platform_specific": {},
              "publisher_platforms": [
                "facebook",
                "instagram",
                "audience_network"
              ],
              "reach": null,
              "spend": null,
              "type": "image",
              "unknown_fields": [],
              "url": "https://www.facebook.com/ads/library/?id=2619351891814847"
            },
            {
              "advertiser": {
                "avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/712623693_1599994994434095_1320701223312676781_n.jpg?stp=dst-jpg_s60x60_tt6&_nc_cat=110&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED&…",
                "display_name": "American Health Support Community",
                "id": "966175593248497",
                "is_verified": null,
                "url": "https://www.facebook.com/61588018263996",
                "username": null
              },
              "approximate_fields": [
                "first_shown_at"
              ],
              "audience_size": null,
              "country_codes": [],
              "creatives": [
                {
                  "body": "I almost looked past the woman who saved my husband's life. She was seventy-nine, sitting alone at the booth next to ours at the Cracker Barrel off Highway 31. A glass of milk in front of her. She kept stirring it. She wasn't eating.\n\nIf I'd known, the night I leaned over and ask…",
                  "cta_text": "Learn more",
                  "link_description": "\"I've tried everything to support my kidney function naturally. Fish oil, CoQ10, cutting protein, stressing about every meal. Nothing moved the needle enough to satisfy my doctor. Hibiscus tea is the first thing that actually showed up in my numbers. It's been 3 months and my eGF…",
                  "link_url": "https://shop.pipitea.com/hbt/kd/sp",
                  "media": [
                    {
                      "alt_text": null,
                      "duration_ms": null,
                      "expires_at": "2026-10-25T18:00:00Z",
                      "height": null,
                      "thumbnail_url": "https://scontent-atl3-2.xx.fbcdn.net/v/t39.35426-6/711729685_1717035472767079_186136568392095276_n.jpg?stp=dst-jpg_s600x600_tt6&_nc_cat=104&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED…",
                      "type": "image",
                      "url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/713729791_868879862958547_7409366389733397444_n.jpg?_nc_cat=107&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED&oe=F2A52380",
                      "width": null
                    }
                  ],
                  "title": "Natural Relief in Weeks"
                }
              ],
              "first_shown_at": "2026-06-01T07:00:00Z",
              "id": "1923645134954720",
              "impressions": null,
              "is_active": true,
              "is_political": false,
              "languages": [],
              "last_shown_at": null,
              "paid_by": null,
              "platform": "facebook",
              "platform_specific": {},
              "publisher_platforms": [
                "facebook",
                "instagram",
                "audience_network"
              ],
              "reach": null,
              "spend": null,
              "type": "image",
              "unknown_fields": [],
              "url": "https://www.facebook.com/ads/library/?id=1923645134954720"
            },
            {
              "advertiser": {
                "avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/712025330_1303417705276292_736671271727941526_n.jpg?stp=dst-jpg_s60x60_tt6&_nc_cat=103&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED&o…",
                "display_name": "American Health Support Community",
                "id": "966175593248497",
                "is_verified": null,
                "url": "https://www.facebook.com/61588018263996",
                "username": null
              },
              "approximate_fields": [
                "first_shown_at"
              ],
              "audience_size": null,
              "country_codes": [],
              "creatives": [
                {
                  "body": "I almost looked past the woman who saved my husband's life. She was seventy-nine, sitting alone at the booth next to ours at the Cracker Barrel off Highway 31. A glass of milk in front of her. She kept stirring it. She wasn't eating.\n\nIf I'd known, the night I leaned over and ask…",
                  "cta_text": "Learn more",
                  "link_description": "\"I've tried everything to support my kidney function naturally. Fish oil, CoQ10, cutting protein, stressing about every meal. Nothing moved the needle enough to satisfy my doctor. Hibiscus tea is the first thing that actually showed up in my numbers. It's been 3 months and my eGF…",
                  "link_url": "https://shop.pipitea.com/hbt/kd/sp",
                  "media": [
                    {
                      "alt_text": null,
                      "duration_ms": null,
                      "expires_at": "2026-10-25T18:00:00Z",
                      "height": null,
                      "thumbnail_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/711737708_4485707625086258_2353150069319301753_n.jpg?stp=dst-jpg_s600x600_tt6&_nc_cat=109&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBE…",
                      "type": "image",
                      "url": "https://scontent-atl3-2.xx.fbcdn.net/v/t39.35426-6/710755472_911440771966686_1736050619245168045_n.jpg?_nc_cat=111&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED&oe=F2A52380",
                      "width": null
                    }
                  ],
                  "title": "Natural Relief in Weeks"
                }
              ],
              "first_shown_at": "2026-06-01T07:00:00Z",
              "id": "2140497416496021",
              "impressions": null,
              "is_active": true,
              "is_political": false,
              "languages": [],
              "last_shown_at": null,
              "paid_by": null,
              "platform": "facebook",
              "platform_specific": {},
              "publisher_platforms": [
                "facebook",
                "instagram",
                "audience_network"
              ],
              "reach": null,
              "spend": null,
              "type": "image",
              "unknown_fields": [],
              "url": "https://www.facebook.com/ads/library/?id=2140497416496021"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "facebook",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": null,
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "coffee ads in the US",
          "params": {
            "country": "US",
            "query": "coffee"
          },
          "tags": [
            "keyword",
            "country",
            "constants:facebook.ad_library_search"
          ]
        },
        {
          "name": "exact phrase, active ads only",
          "params": {
            "country": "US",
            "query": "\"cold brew\"",
            "status": "active"
          },
          "tags": [
            "exact_phrase",
            "active"
          ]
        },
        {
          "name": "political ads with disclosed spend",
          "params": {
            "country": "US",
            "query": "voting information center"
          },
          "tags": [
            "political"
          ]
        },
        {
          "name": "ads that ran in September 2026",
          "params": {
            "country": "US",
            "query": "coffee",
            "since": "2026-09-01",
            "until": "2026-10-01"
          },
          "tags": [
            "window"
          ]
        },
        {
          "name": "German-language ads",
          "params": {
            "lang": "de",
            "query": "kaffee",
            "status": "active"
          },
          "tags": [
            "lang"
          ]
        },
        {
          "name": "Japanese keywords",
          "params": {
            "country": "JP",
            "query": "コーヒー"
          },
          "tags": [
            "non_english"
          ]
        },
        {
          "name": "no matching ads",
          "params": {
            "country": "US",
            "query": "zzqxjvbnmqwplkk"
          },
          "tags": [
            "no_results"
          ]
        },
        {
          "name": "country the Ad Library does not cover",
          "params": {
            "country": "XX",
            "query": "coffee"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "query",
      "accepts": [],
      "accepted_params": [
        "query",
        "country",
        "lang",
        "status",
        "since",
        "until",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "facebook.transcript",
      "platform": "facebook",
      "name": "transcript",
      "resource": "transcript",
      "list": null,
      "path": "/v1/facebook/transcript",
      "method": "GET",
      "operation_id": "facebook.transcript.get",
      "status": "beta",
      "title": "Facebook Video Transcript API",
      "summary": "Facebook video transcript",
      "description": "Returns the timed transcript of a public Facebook video or reel: the uploaded or auto-generated caption track when Facebook has one, otherwise speech-to-text on the video's audio. Accepts reel, watch, page video, video.php, fb.watch and share links, or a numeric video ID.",
      "use_cases": [
        "Analyze public page and creator videos",
        "Make Facebook video content searchable",
        "Repurpose reels and videos into text",
        "Feed video content into LLM pipelines"
      ],
      "notes": [
        "Videos that Facebook only serves to logged-in users return private_or_unavailable."
      ],
      "faq": [],
      "keywords": [
        "facebook video captions api",
        "facebook reels transcript",
        "facebook transcript scraper"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Facebook video URL (reel, watch, page video, video.php, m./mbasic./web. hosts, fb.watch and share/v|r links) or a numeric video ID.",
          "example": "https://www.facebook.com/reel/1803909017420449",
          "max_length": 2048
        }
      ],
      "sources": [
        "captions",
        "asr"
      ],
      "pricing": [
        {
          "kind": "captions",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "asr",
          "credits": 2,
          "per": 2,
          "unit": {
            "id": "media_minute",
            "name": "started minute of media",
            "plural": "started minutes of media",
            "max": 60
          },
          "max": 122,
          "label": "2 credits + 2 per started minute of media"
        }
      ],
      "min_credits": 1,
      "max_credits": 122,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "no_transcript",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://www.facebook.com/reel/1803909017420449/"
        },
        "response": {
          "data": {
            "available_languages": [
              "en-US"
            ],
            "duration_ms": 59861,
            "id": "1803909017420449",
            "is_auto_generated": false,
            "language": "en-US",
            "platform": "facebook",
            "platform_specific": {},
            "segments": [
              {
                "end_ms": 4000,
                "start_ms": 33,
                "text": "But the standard that we should continuously aspire to exceed,"
              },
              {
                "end_ms": 7166,
                "start_ms": 4000,
                "text": "which is why we are bringing that intensity, that discipline, that"
              },
              {
                "end_ms": 11400,
                "start_ms": 7166,
                "text": "engineering ownership back to NASA, because great nations do not remain great"
              }
            ],
            "source": "captions",
            "text": "But the standard that we should continuously aspire to exceed, which is why we are bringing that intensity, that discipline, that engineering ownership back to NASA, because great nations do not remain great by being caretakers of history, but by continuously making history. We h…",
            "url": "https://www.facebook.com/reel/1803909017420449/"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "facebook",
            "source": "captions",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 1517,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "1803909017420449",
              "url": "https://www.facebook.com/reel/1803909017420449/"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "reel with uploaded captions",
          "params": {
            "url": "https://www.facebook.com/reel/1803909017420449"
          },
          "tags": [
            "short",
            "captions"
          ]
        },
        {
          "name": "page video with uploaded captions (long)",
          "params": {
            "url": "https://www.facebook.com/NASA/videos/1408202287429345/"
          },
          "tags": [
            "long",
            "captions"
          ]
        },
        {
          "name": "watch url with auto-generated captions",
          "params": {
            "url": "https://www.facebook.com/watch/?v=1755978666533018"
          },
          "tags": [
            "auto_captions"
          ]
        },
        {
          "name": "share link resolves",
          "params": {
            "url": "https://www.facebook.com/share/r/1CfnJ9UQoT/"
          },
          "tags": [
            "share_link"
          ]
        },
        {
          "name": "login-required video",
          "params": {
            "url": "https://www.facebook.com/video.php?v=637842556329505"
          },
          "tags": [
            "private"
          ]
        },
        {
          "name": "garbage url",
          "params": {
            "url": "https://www.facebook.com/NASA/posts/123456789"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": {
        "requests": 26,
        "success_rate": 0.6538,
        "p50_ms": 1517,
        "p95_ms": 2437
      },
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "instagram.post",
      "platform": "instagram",
      "name": "post",
      "resource": "post",
      "list": null,
      "path": "/v1/instagram/post",
      "method": "GET",
      "operation_id": "instagram.post.get",
      "status": "beta",
      "title": "Instagram Post API",
      "summary": "Instagram post, reel or carousel with media and metrics",
      "description": "Returns a public Instagram post, reel or carousel: the caption with its hashtags and mentions, the author and any collaborators, the publish time, every carousel item's image or video URL with its size, duration and alt text, and the like, comment and (for single videos) view counts. Accepts post, reel, tv, instagr.am and share links or a raw shortcode.",
      "use_cases": [
        "Track engagement on influencer and brand posts",
        "Monitor competitors' reels and campaigns",
        "Collect captions, hashtags and tags for social listening",
        "Archive post media and metadata",
        "Verify sponsored-post deliverables"
      ],
      "notes": [
        "Media URLs are Instagram CDN links that expire: media[].expires_at says when; download what you need before then.",
        "view_count is set for single videos and reels only (Instagram shows no view count for photos and carousels). like_count and view_count are null when the owner hides them. When Instagram's embed page, the only logged-out source of the view count, fails or omits it, the post is still returned with view_count null and a partial_data warning in meta.warnings.",
        "Instagram does not expose share or save counts, pinned state, sponsorship labels or the caption's language to logged-out visitors: those fields are null.",
        "Private, age-restricted and deleted posts return private_or_unavailable or not_found and are not charged."
      ],
      "faq": [
        {
          "q": "Does it return every image of a carousel?",
          "a": "Yes: media[] has one entry per carousel item, in display order, each with its own URL, size and, for videos, duration."
        },
        {
          "q": "Who is in mentions?",
          "a": "Accounts @mentioned in the caption, then accounts tagged in the media, without duplicates. Collaborators of a collab post are in coauthors."
        }
      ],
      "keywords": [
        "instagram post api",
        "instagram reel scraper",
        "instagram carousel downloader api",
        "instagram likes and comments api"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Instagram post, reel or carousel URL (instagram.com/p/…, /reel/…, /reels/…, /tv/…, /<username>/p/…, m.instagram.com, instagr.am, instagram.com/share/… links) or a raw shortcode. Tracking params and img_index are ignored: the whole post is returned.",
          "example": "https://www.instagram.com/reel/De1S3KpCXf0/",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
        },
        "response": {
          "data": {
            "approximate_fields": [],
            "author": {
              "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-19/683576066_18653628823019133_9051036240972105113_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_gid=S…",
              "display_name": "National Geographic",
              "id": "787132",
              "is_verified": true,
              "url": "https://www.instagram.com/natgeo/",
              "username": "natgeo"
            },
            "coauthors": [
              {
                "avatar_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.2885-19/293493364_162817252949028_8275460966213229030_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=108&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-1.cdninstagram.com&_nc_ss=7b6…",
                "display_name": "National Geographic Society",
                "id": "4757225830",
                "is_verified": true,
                "url": "https://www.instagram.com/natgeosociety/",
                "username": "natgeosociety"
              },
              {
                "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/11419091_505296402966021_797003013_a.jpg?_nc_cat=101&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689&oh=SCRUBBED&oe=F2A52380",
                "display_name": "Joel Sartore- Photo Ark",
                "id": "225429667",
                "is_verified": true,
                "url": "https://www.instagram.com/joelsartore/",
                "username": "joelsartore"
              },
              {
                "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-19/681945023_18592998970017301_7811445524976503069_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_gid=S…",
                "display_name": "National Geographic Animals",
                "id": "1029649300",
                "is_verified": true,
                "url": "https://www.instagram.com/natgeoanimals/",
                "username": "natgeoanimals"
              }
            ],
            "duration_ms": 23744,
            "hashtags": [
              "PhotoArk"
            ],
            "id": "De1S3KpCXf0",
            "is_nsfw": null,
            "is_pinned": null,
            "is_sponsored": null,
            "language": null,
            "media": [
              {
                "alt_text": "Video by National Geographic on October 23, 2026. May be an image of snail and text.",
                "duration_ms": 23744,
                "expires_at": "2026-10-25T18:00:00Z",
                "height": 1920,
                "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/862543567_18711062458019133_8845814561108513720_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=105&ig_cache_key=NDAxNDE5NzU5ODcwNDk5MDE5NjE4NzExMDYyNDUyMDE5MTMz.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=…",
                "type": "video",
                "url": "https://scontent-atl3-1.cdninstagram.com/o1/v/t2/f2/m86/AQO0Zc3E_eoYHXxPOVvPDNzjiHnCGoREl8vxeookIy4831a0VLAN6T9CITX0dyH2cQS6Dy0fs5SGxYC42fWpG2JeAvlnP9yrsgmHUk8.mp4?_nc_cat=106&_nc_sid=SCRUBBED&_nc_ht=scontent-atl3-1.cdninstagram.com&_nc_ohc=SCRUBBED&efg=SCRUBBED&ccb=SCRUBBED&vs=S…",
                "width": 1080
              }
            ],
            "mentions": [
              "joelsartore",
              "natgeoanimals",
              "natgeosociety"
            ],
            "metrics": {
              "comment_count": 238,
              "like_count": 68253,
              "quote_count": null,
              "repost_count": null,
              "save_count": null,
              "share_count": null,
              "view_count": 759188
            },
            "platform": "instagram",
            "platform_specific": {
              "instagram": {
                "is_ai_generated": null
              }
            },
            "platform_type": "reel",
            "published_at": "2026-10-23T10:01:35Z",
            "text": "Warning—looking at nudibranchs may cause excessive awe. @joelsartore loves these little creatures, and so do we. 💛🧡🩷\n\nWe’re celebrating 20 years of the National Geographic #PhotoArk, an audacious project documenting the world's incredible biodiversity and highlighting the importa…",
            "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/862543567_18711062458019133_8845814561108513720_n.jpg?stp=dst-jpg_e35_s640x640_tt6&_nc_cat=105&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc…",
            "title": null,
            "type": "video",
            "unknown_fields": [],
            "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "instagram",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "post",
              "id": "De1S3KpCXf0",
              "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "reel with collaborators (natgeo)",
          "params": {
            "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
          },
          "tags": [
            "reel",
            "collab",
            "english"
          ]
        },
        {
          "name": "carousel of photos and videos (garyvee)",
          "params": {
            "url": "https://www.instagram.com/p/DexcKhDDno3/?img_index=2"
          },
          "tags": [
            "carousel",
            "mixed",
            "img_index"
          ]
        },
        {
          "name": "single photo (natgeo)",
          "params": {
            "url": "https://www.instagram.com/p/DeuOR-CjKE9/"
          },
          "tags": [
            "image"
          ]
        },
        {
          "name": "long reel from 2022 (garyvee)",
          "params": {
            "url": "https://www.instagram.com/reel/ChdZ_3UALgB/"
          },
          "tags": [
            "reel",
            "long",
            "old"
          ]
        },
        {
          "name": "share link (resolves to DI-yIpNu17J)",
          "params": {
            "url": "https://www.instagram.com/share/reel/_oDaXMUlS/"
          },
          "tags": [
            "share_link",
            "reel",
            "non_english"
          ]
        },
        {
          "name": "deleted / nonexistent post",
          "params": {
            "url": "https://www.instagram.com/reel/De1S3KpCXf1/"
          },
          "tags": [
            "deleted",
            "expected_error"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "post",
        "video"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "instagram.posts",
      "platform": "instagram",
      "name": "posts",
      "resource": "post",
      "list": {
        "page_max": 12,
        "cursor_ttl_s": 86400,
        "order": "newest first"
      },
      "path": "/v1/instagram/posts",
      "method": "GET",
      "operation_id": "instagram.posts.list",
      "status": "beta",
      "title": "Instagram Posts API",
      "summary": "A public Instagram account's posts, reels and carousels",
      "description": "Returns a public Instagram account's posts, reels and carousels as they appear on its profile grid, newest first, page by page: caption with hashtags and mentions, publish time, author and collaborators, every carousel item's image or video with its size and duration, tagged accounts, pinned posts, and like, comment and (for videos) view counts. Accepts a username or any profile link.",
      "use_cases": [
        "Monitor an account's new posts and reels since a date",
        "Benchmark engagement across creators and brands",
        "Collect captions, hashtags and tagged accounts for social listening",
        "Archive an account's posts and media",
        "Find an influencer's collaborations and brand tags"
      ],
      "notes": [
        "Pinned posts lead the first page, whatever their age. Instagram does not mark pins for logged-out visitors: is_pinned is inferred from the order, and null for a leading post the order cannot tell.",
        "view_count is set for videos; like_count and view_count are null when the owner hides them. If Instagram's view counts fail on a later page, it is returned without them and with a partial_data warning.",
        "Media URLs are Instagram CDN links that expire: media[].expires_at says when.",
        "Share and save counts and the caption's language are not public logged out: those fields are null."
      ],
      "faq": [
        {
          "q": "How far back can I page?",
          "a": "Through the account's whole grid: every page returns a next_cursor until its oldest post. Use since to stop at a date: paging ends there, so older pages are not fetched or charged."
        },
        {
          "q": "Who is in coauthors?",
          "a": "The other accounts of a collab post. A collab another account published appears on this account's grid with that account as author and this one among the coauthors."
        }
      ],
      "keywords": [
        "instagram posts api",
        "instagram user posts api",
        "instagram profile posts scraper",
        "instagram reels api",
        "instagram feed json"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "Instagram username with or without the @, or a profile URL (instagram.com/nasa, m.instagram.com, instagr.am, a /reels/ or /tagged/ tab, an instagram.com/_u/ app link). Numeric user IDs are not accepted: Instagram does not resolve them logged out.",
          "example": "nasa",
          "max_length": 2048
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "nasa"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689&…",
                "display_name": "NASA",
                "id": "528817151",
                "is_verified": true,
                "url": "https://www.instagram.com/nasa/",
                "username": "nasa"
              },
              "coauthors": [
                {
                  "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/93880139_247576663101568_4560165171292536832_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689&…",
                  "display_name": "NASA Solar System Exploration",
                  "id": "1611722079",
                  "is_verified": true,
                  "url": "https://www.instagram.com/nasasolarsystem/",
                  "username": "nasasolarsystem"
                },
                {
                  "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-19/670016304_18577283653042671_4689932669633757619_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_gid=S…",
                  "display_name": "NASA Artemis",
                  "id": "1104426670",
                  "is_verified": true,
                  "url": "https://www.instagram.com/nasaartemis/",
                  "username": "nasaartemis"
                }
              ],
              "duration_ms": 43767,
              "hashtags": [
                "NASA",
                "ArtemisII",
                "Artemis"
              ],
              "id": "DeTUk4sDSp-",
              "is_nsfw": null,
              "is_pinned": true,
              "is_sponsored": false,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 43767,
                  "expires_at": "2026-10-25T18:00:00Z",
                  "height": 1908,
                  "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/842191580_18656578867049152_4200499629839780998_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=111&ig_cache_key=NDAwNDYzNDk4OTM2MjQ4OTk4MjE4NjU2NTc4ODYxMDQ5MTUy.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=…",
                  "type": "video",
                  "url": "https://scontent-atl3-2.cdninstagram.com/o1/v/t2/f2/m86/AQNUvreb47JFAC3mKM7kF_weYHzhiVF-MfERm99CfyBTok0ezeRdbVW8cH5NXn4mxO8gVi6j1GQ2RU9i4ByvKCLVPHdDruUpsCKYDQI.mp4?_nc_cat=105&_nc_sid=SCRUBBED&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ohc=SCRUBBED&efg=SCRUBBED&ccb=SCRUBBED&vs=S…",
                  "width": 1074
                }
              ],
              "mentions": [
                "nasaartemis",
                "nasasolarsystem"
              ],
              "metrics": {
                "comment_count": 7628,
                "like_count": 755597,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": 11075076
              },
              "platform": "instagram",
              "platform_specific": {
                "instagram": {
                  "is_ai_generated": false
                }
              },
              "platform_type": "reel",
              "published_at": "2026-10-10T15:15:02Z",
              "text": "POV: you're watching the Earth set\n\nWe just released hundreds of new images and hours of new audio from our Artemis II mission around the Moon this spring. Check out our link in bio for the Artemis II Preliminary Lunar Science Report.\n\n#NASA #ArtemisII #Artemis",
              "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/842191580_18656578867049152_4200499629839780998_n.jpg?stp=c0.417.1074.1074a_dst-jpg_e15_tt6&_nc_cat=111&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-2.cdninstagra…",
              "title": null,
              "type": "video",
              "unknown_fields": [],
              "url": "https://www.instagram.com/reel/DeTUk4sDSp-/"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/432029380_939863124412845_4074172309041694202_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689…",
                "display_name": "NASA Webb Telescope",
                "id": "549313808",
                "is_verified": true,
                "url": "https://www.instagram.com/nasawebb/",
                "username": "nasawebb"
              },
              "coauthors": [
                {
                  "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/437785305_1498177207718392_5285428334541669140_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=105&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b…",
                  "display_name": "NASA Universe",
                  "id": "65495240044",
                  "is_verified": true,
                  "url": "https://www.instagram.com/nasauniverse/",
                  "username": "nasauniverse"
                },
                {
                  "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689&…",
                  "display_name": "NASA",
                  "id": "528817151",
                  "is_verified": true,
                  "url": "https://www.instagram.com/nasa/",
                  "username": "nasa"
                }
              ],
              "duration_ms": null,
              "hashtags": [],
              "id": "DeJ28eTxo4s",
              "is_nsfw": null,
              "is_pinned": true,
              "is_sponsored": false,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": null,
                  "expires_at": "2026-10-25T18:00:00Z",
                  "height": 1872,
                  "thumbnail_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/838879752_18633093571001809_7013098794556155636_n.jpg?stp=c64.0.1872.1872a_dst-jpg_e35_s1080x1080_sh2.08_tt6&_nc_cat=109&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-a…",
                  "type": "image",
                  "url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/838879752_18633093571001809_7013098794556155636_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=109&ig_cache_key=NDAwMTk3MTM5NDExOTYzNDQ3Ng%3D%3D.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=…",
                  "width": 2000
                }
              ],
              "mentions": [
                "NASAWebb",
                "nasa",
                "nasauniverse"
              ],
              "metrics": {
                "comment_count": 1027,
                "like_count": 290040,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": null
              },
              "platform": "instagram",
              "platform_specific": {
                "instagram": {
                  "is_ai_generated": false
                }
              },
              "platform_type": "post",
              "published_at": "2026-10-06T13:10:11Z",
              "text": "Brewing up new stars 🪄\n \n@NASAWebb’s unique view of the stellar nursery known as NGC 7129 reveals numerous stars formerly hidden in this cosmic cauldron. \n \nStars begin their life in cold, dense regions of dust and gas, hiding from view of most telescopes. Webb’s high degree of i…",
              "thumbnail_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/838879752_18633093571001809_7013098794556155636_n.jpg?stp=c64.0.1872.1872a_dst-jpg_e35_s1080x1080_sh2.08_tt6&_nc_cat=109&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-a…",
              "title": null,
              "type": "image",
              "unknown_fields": [],
              "url": "https://www.instagram.com/p/DeJ28eTxo4s/"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689&…",
                "display_name": "NASA",
                "id": "528817151",
                "is_verified": true,
                "url": "https://www.instagram.com/nasa/",
                "username": "nasa"
              },
              "coauthors": [],
              "duration_ms": null,
              "hashtags": [
                "NASA",
                "Space",
                "Stars"
              ],
              "id": "DeAYvsnn4la",
              "is_nsfw": null,
              "is_pinned": true,
              "is_sponsored": false,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": null,
                  "expires_at": "2026-10-25T18:00:00Z",
                  "height": 1350,
                  "thumbnail_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/831222439_18653890615049152_5346150317938845760_n.jpg?stp=c0.135.1080.1080a_dst-jpg_e15_s1080x1080_tt6&_nc_cat=110&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-1.…",
                  "type": "image",
                  "url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/831222439_18653890615049152_5346150317938845760_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=110&ig_cache_key=Mzk5OTMwNDc1ODAwMTk1MzE5OA%3D%3D.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=…",
                  "width": 1080
                },
                {
                  "alt_text": null,
                  "duration_ms": null,
                  "expires_at": "2026-10-25T18:00:00Z",
                  "height": 1350,
                  "thumbnail_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/830418338_18653890612049152_312587861543217627_n.jpg?stp=c0.135.1080.1080a_dst-jpg_e15_s1080x1080_tt6&_nc_cat=100&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-1.c…",
                  "type": "image",
                  "url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/830418338_18653890612049152_312587861543217627_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=100&ig_cache_key=Mzk5OTMwNDc1ODM0NjExNzEyOA%3D%3D.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=2…",
                  "width": 1080
                },
                {
                  "alt_text": null,
                  "duration_ms": null,
                  "expires_at": "2026-10-25T18:00:00Z",
                  "height": 1350,
                  "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/831354642_18653890627049152_4381034991606753149_n.jpg?stp=c0.135.1080.1080a_dst-jpg_e15_s1080x1080_tt6&_nc_cat=104&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-2.…",
                  "type": "image",
                  "url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/831354642_18653890627049152_4381034991606753149_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=104&ig_cache_key=Mzk5OTMwNDc2MDcwMzExNzQxOA%3D%3D.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=…",
                  "width": 1080
                }
              ],
              "mentions": [
                "NASAWebb"
              ],
              "metrics": {
                "comment_count": 5550,
                "like_count": 1353320,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": null
              },
              "platform": "instagram",
              "platform_specific": {
                "instagram": {
                  "is_ai_generated": false
                }
              },
              "platform_type": "post",
              "published_at": "2026-10-02T20:52:45Z",
              "text": "Swipe for countless stars\n\nSagittarius B2 is the most massive and most active star-forming region in the Milky Way. It produces half of the stars in our home galaxy’s core.\n\nThis image of Sagittarius B2 was taken by our @NASAWebb telescope.\n\n#NASA #Space #Stars",
              "thumbnail_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-15/831222439_18653890615049152_5346150317938845760_n.jpg?stp=c0.135.1080.1080a_dst-jpg_e15_s1080x1080_tt6&_nc_cat=110&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-1.…",
              "title": null,
              "type": "carousel",
              "unknown_fields": [],
              "url": "https://www.instagram.com/p/DeAYvsnn4la/"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "instagram",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "528817151",
              "url": "https://www.instagram.com/nasa/"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "NASA's posts, walked",
          "params": {
            "handle": "nasa"
          },
          "tags": [
            "handle",
            "collabs",
            "carousels",
            "reels",
            "constants:instagram.profile_grid",
            "constants:instagram.owner_timeline",
            "constants:instagram.web_client"
          ]
        },
        {
          "name": "National Geographic by its reels tab link, pins first",
          "params": {
            "handle": "https://www.instagram.com/natgeo/reels/"
          },
          "tags": [
            "url",
            "pinned",
            "reels"
          ]
        },
        {
          "name": "Cristiano Ronaldo by @username",
          "params": {
            "handle": "@Cristiano"
          },
          "tags": [
            "at_handle",
            "creator",
            "large_counts"
          ]
        },
        {
          "name": "posts since a date stop the walk",
          "params": {
            "handle": "nasa",
            "since": "2099-01-01"
          },
          "tags": [
            "since",
            "end"
          ]
        },
        {
          "name": "a private account",
          "params": {
            "handle": "vogue"
          },
          "tags": [
            "private",
            "constants:instagram.profile_root"
          ]
        },
        {
          "name": "an age-restricted brand",
          "params": {
            "handle": "budweiser"
          },
          "tags": [
            "restricted"
          ]
        },
        {
          "name": "an unknown username",
          "params": {
            "handle": "zzq9x81nouser"
          },
          "tags": [
            "not_found"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "since",
        "until",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "instagram.profile",
      "platform": "instagram",
      "name": "profile",
      "resource": "profile",
      "list": null,
      "path": "/v1/instagram/profile",
      "method": "GET",
      "operation_id": "instagram.profile.get",
      "status": "beta",
      "title": "Instagram Profile API",
      "summary": "Public Instagram profile with exact follower counts",
      "description": "Returns a public Instagram account: user ID, username, display name, bio, the links in its bio with their titles, profile picture, verification badge, whether the account is private, and exact follower, following and post counts, plus Instagram's own fields (Meta-wide ID, memorialized, live story, highlights, pronouns). Accepts a username with or without the @ or any instagram.com profile link.",
      "use_cases": [
        "Track creator and brand growth over time",
        "Vet influencers before a campaign",
        "Enrich CRM or lead lists with Instagram accounts and their bio links",
        "Resolve a post author to a full profile"
      ],
      "notes": [
        "Private accounts return their profile with is_private true: name, bio, links and counts as Instagram shows them logged out.",
        "metrics.post_count is exact; on the rare answer where only a rounded count was available it is listed in approximate_fields.",
        "category, location, country_code, created_at, banner_url, metrics.total_like_count and metrics.total_view_count are always null and type is unknown: Instagram does not show them to logged-out visitors. Business email and phone are not returned.",
        "avatar_url is Instagram's 150-pixel profile picture, a CDN link that expires within days.",
        "When the profile page is unavailable the answer comes from Instagram's embed page: bio and following count are then null, and external_links is [] listed in unknown_fields.",
        "Unknown, deactivated and banned accounts answer not_found; restricted ones (age-restricted brands) private_or_unavailable. Numeric user IDs are not accepted: a bare number is read as a username."
      ],
      "faq": [],
      "keywords": [
        "instagram profile api",
        "instagram follower count api",
        "instagram user info api",
        "instagram profile scraper",
        "instagram bio link scraper"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "Instagram username with or without the @ (natgeo, @natgeo), or a profile link (instagram.com/natgeo, with or without a tab such as /reels/ or /tagged/, m.instagram.com, instagr.am, instagram.com/_u/natgeo, instagram.com/stories/natgeo/, with any query such as ?igsh=…). Usernames are case-insensitive. A bare number is a username: numeric user IDs are not accepted.",
          "example": "natgeo",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "https://www.instagram.com/natgeo/"
        },
        "response": {
          "data": {
            "approximate_fields": [],
            "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-19/683576066_18653628823019133_9051036240972105113_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_gid=S…",
            "banner_url": null,
            "bio": "Step into wonder and find your inner explorer with National Geographic 🌎",
            "category": null,
            "country_code": null,
            "created_at": null,
            "display_name": "National Geographic",
            "external_links": [
              {
                "title": null,
                "url": "http://visitstore.bio/natgeo"
              },
              {
                "title": "Subscribe Here!",
                "url": "https://ngmdomsubs.nationalgeographic.com/servlet/OrdersGateway?cds_mag_code=NGM&cds_page_id=283562&cds_response_key=I5FX10002"
              }
            ],
            "id": "787132",
            "is_private": false,
            "is_verified": true,
            "location": null,
            "metrics": {
              "follower_count": 268266804,
              "following_count": 195,
              "post_count": 32123,
              "total_like_count": null,
              "total_view_count": null
            },
            "platform": "instagram",
            "platform_specific": {
              "instagram": {
                "fbid": "17841400573960012",
                "is_highlights_shown": true,
                "is_memorialized": false,
                "is_story_live": true,
                "pronouns": []
              }
            },
            "type": "unknown",
            "unknown_fields": [],
            "url": "https://www.instagram.com/natgeo/",
            "username": "natgeo"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "instagram",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "787132",
              "url": "https://www.instagram.com/natgeo/"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "National Geographic by username",
          "params": {
            "handle": "natgeo"
          },
          "tags": [
            "handle",
            "verified",
            "rounded_posts"
          ]
        },
        {
          "name": "Nike by profile URL",
          "params": {
            "handle": "https://www.instagram.com/nike/"
          },
          "tags": [
            "url",
            "brand"
          ]
        },
        {
          "name": "Creator by @username, any case",
          "params": {
            "handle": "@Cristiano"
          },
          "tags": [
            "at_handle",
            "creator"
          ]
        },
        {
          "name": "Profile tab link",
          "params": {
            "handle": "https://www.instagram.com/nasa/reels/"
          },
          "tags": [
            "tab_url"
          ]
        },
        {
          "name": "Private account",
          "params": {
            "handle": "msite"
          },
          "tags": [
            "private"
          ]
        },
        {
          "name": "Age-restricted brand",
          "params": {
            "handle": "budweiser"
          },
          "tags": [
            "restricted"
          ]
        },
        {
          "name": "Account that does not exist",
          "params": {
            "handle": "zzq9x81nouser"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "Reel link is refused",
          "params": {
            "handle": "https://www.instagram.com/reel/De1S3KpCXf0/"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "instagram.transcript",
      "platform": "instagram",
      "name": "transcript",
      "resource": "transcript",
      "list": null,
      "path": "/v1/instagram/transcript",
      "method": "GET",
      "operation_id": "instagram.transcript.get",
      "status": "beta",
      "title": "Instagram Reels Transcript API",
      "summary": "Instagram reel / video transcript",
      "description": "Returns the timed transcript of a public Instagram reel or video post. Instagram rarely exposes caption tracks to logged-out clients, so most transcripts are speech-to-text on the post's audio. Accepts reel, post, tv, instagr.am and share links or a raw shortcode; for carousels, img_index selects the item.",
      "use_cases": [
        "Turn reels into searchable text",
        "Monitor influencer and competitor content",
        "Repurpose reels into captions, blogs and posts",
        "Feed reels into LLM analysis"
      ],
      "notes": [
        "Most results come from speech-to-text (meta.source = asr) and are priced per minute.",
        "Image posts return invalid_input; videos without speech return no_transcript."
      ],
      "faq": [],
      "keywords": [
        "instagram reels transcript",
        "instagram video to text api",
        "instagram transcript scraper"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Instagram reel/post URL (instagram.com/reel/…, /reels/…, /p/…, /tv/…, instagr.am, instagram.com/share/… links) or a raw shortcode. For carousel posts, ?img_index=N selects the item; default is the first video.",
          "example": "https://www.instagram.com/reel/De1S3KpCXf0/",
          "max_length": 2048
        }
      ],
      "sources": [
        "captions",
        "asr"
      ],
      "pricing": [
        {
          "kind": "captions",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "asr",
          "credits": 2,
          "per": 2,
          "unit": {
            "id": "media_minute",
            "name": "started minute of media",
            "plural": "started minutes of media",
            "max": 60
          },
          "max": 122,
          "label": "2 credits + 2 per started minute of media"
        }
      ],
      "min_credits": 1,
      "max_credits": 122,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "no_transcript",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://www.instagram.com/p/De1S3KpCXf0/"
        },
        "response": {
          "data": {
            "available_languages": [],
            "duration_ms": 23745,
            "id": "De1S3KpCXf0",
            "is_auto_generated": true,
            "language": "en",
            "platform": "instagram",
            "platform_specific": {},
            "segments": [
              {
                "end_ms": 3580,
                "start_ms": 0,
                "text": "You are looking at nudibranchs. You ever seen anything that crazy looking?"
              },
              {
                "end_ms": 9220,
                "start_ms": 3800,
                "text": "Every color in the rainbow. These are marine snails basically that have lost their shells"
              },
              {
                "end_ms": 13480,
                "start_ms": 9220,
                "text": "over time and developed these elaborate colors. Usually brightly colored animals are toxic."
              }
            ],
            "source": "asr",
            "text": "You are looking at nudibranchs. You ever seen anything that crazy looking? Every color in the rainbow. These are marine snails basically that have lost their shells over time and developed these elaborate colors. Usually brightly colored animals are toxic. Some of these are, some…",
            "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "instagram",
            "source": "asr",
            "is_cached": false,
            "credits_charged": 4,
            "latency_ms": 4125,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "De1S3KpCXf0",
              "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
            },
            "credits_remaining": 9996,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "reel en short (natgeo, 24s)",
          "params": {
            "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
          },
          "tags": [
            "short",
            "reel",
            "english"
          ]
        },
        {
          "name": "silent audio track, ASR skipped (bbcnews, 35s)",
          "params": {
            "url": "https://www.instagram.com/reel/De6q2K4lYUd/"
          },
          "tags": [
            "no_speech",
            "silent",
            "expected_error"
          ]
        },
        {
          "name": "username-prefixed URL (natgeo, 10s)",
          "params": {
            "url": "https://www.instagram.com/natgeo/reel/De4MvD0gWju/"
          },
          "tags": [
            "short",
            "user_path"
          ]
        },
        {
          "name": "german (tagesschau, 18s)",
          "params": {
            "url": "https://www.instagram.com/reel/De3-c3llKm7/"
          },
          "tags": [
            "non_english",
            "german"
          ]
        },
        {
          "name": "share link reel (resolves to DI-yIpNu17J)",
          "params": {
            "url": "https://www.instagram.com/share/reel/_oDaXMUlS/"
          },
          "tags": [
            "share_link"
          ]
        },
        {
          "name": "image post",
          "params": {
            "url": "https://www.instagram.com/p/DeuOR-CjKE9/"
          },
          "tags": [
            "image",
            "expected_error"
          ]
        },
        {
          "name": "deleted / nonexistent post",
          "params": {
            "url": "https://www.instagram.com/reel/De1S3KpCXf1/"
          },
          "tags": [
            "deleted",
            "expected_error"
          ]
        }
      ],
      "stats": {
        "requests": 53,
        "success_rate": 0.9811,
        "p50_ms": 4125,
        "p95_ms": 9203
      },
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video",
        "post"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "rumble.comments",
      "platform": "rumble",
      "name": "comments",
      "resource": "comment",
      "list": {
        "page_max": 500,
        "cursor_ttl_s": 86400,
        "order": "newest first",
        "orders": {
          "newest": "newest first",
          "popular": "Rumble's Sort by likes order of comments, each followed by its replies"
        }
      },
      "path": "/v1/rumble/comments",
      "method": "GET",
      "operation_id": "rumble.comments.list",
      "status": "beta",
      "title": "Rumble Comments API",
      "summary": "Comments and replies of a Rumble video",
      "description": "Returns the public comments of a Rumble video, short or live stream, replies included, a page at a time: text, the commenter's username, name, avatar and badges, posting time, likes and dislikes, reply count, the comment each reply answers, a permalink, and whether the video's own channel wrote it. Sort newest first (the default, which also supports since and until) or in Rumble's Sort by likes order, and follow page.next_cursor for more. Accepts every Rumble video link form, embed links included, or a bare video ID.",
      "use_cases": [
        "Track audience reactions to Rumble videos and streams",
        "Monitor new comments since a date",
        "Analyze whole discussion threads, replies included",
        "Build datasets of public comments for research"
      ],
      "notes": [
        "Replies are included: parent_id names the comment a reply answers. Sorted newest, comments and replies are interleaved by time; sorted popular, each comment is followed by its replies.",
        "Rumble shows comment times to the minute: published_at is exact to the minute and listed in approximate_fields.",
        "Rumble's comment count for a video (on its page and in rumble.post) includes comments it no longer lists, so a full walk can return fewer.",
        "metrics.reply_count is Rumble's own count of a comment's replies and can exceed the replies returned: Rumble counts replies it no longer lists.",
        "author.id is null: Rumble's comments name the commenter by username only (author.username, user/<name>, joins with rumble.profile).",
        "Videos whose comments Rumble shows only to signed-in viewers or buyers return private_or_unavailable."
      ],
      "faq": [],
      "keywords": [
        "rumble comments api",
        "rumble comment scraper",
        "rumble comments export",
        "rumble comments json",
        "rumble replies"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Rumble video, short or live stream URL (rumble.com/v…-title.html, /shorts/v…, /share/v…, /embed/v…/) or a video ID (v…).",
          "example": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
          "max_length": 2048
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "Order of the results. newest (default): every comment and reply, newest first. popular: Rumble's Sort by likes order of comments, each followed by its replies.",
          "enum": [
            "newest",
            "popular"
          ],
          "default": "newest",
          "vocabulary": "sort"
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Compared with published_at, which Rumble shows to the minute. Replies count as items: on newest the walk stops at the first comment or reply older than since.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        }
      ],
      "sources": [
        "api"
      ],
      "pricing": [
        {
          "kind": "api",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://rumble.com/shorts/v7h29za"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [
                "published_at"
              ],
              "author": {
                "avatar_url": "https://hugh.cdn.rumble.cloud/video/z0/e/b/M/g/ebMgr.asF.1-4qu5ac-tnkdxy.jpeg",
                "display_name": "inshallakhan",
                "id": null,
                "is_verified": false,
                "url": "https://rumble.com/user/inshallakhan",
                "username": "user/inshallakhan"
              },
              "edited_at": null,
              "id": "620403472",
              "is_by_post_author": false,
              "is_edited": null,
              "is_liked_by_author": null,
              "is_pinned": null,
              "metrics": {
                "like_count": 0,
                "reply_count": 0
              },
              "parent_id": null,
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_badges": [],
                  "dislike_count": 0
                }
              },
              "post_id": "v7h29za",
              "published_at": "2026-10-23T03:31:00Z",
              "text": "oh 😯😯",
              "unknown_fields": [],
              "url": "https://rumble.com/shorts/v7h29za#comment-620403472"
            },
            {
              "approximate_fields": [
                "published_at"
              ],
              "author": {
                "avatar_url": "https://hugh.cdn.rumble.cloud/video/z0/C/E/l/b/CElbr.asF-4pzq1o-ti0cx0.jpeg",
                "display_name": "CassandraB89",
                "id": null,
                "is_verified": false,
                "url": "https://rumble.com/user/CassandraB89",
                "username": "user/CassandraB89"
              },
              "edited_at": null,
              "id": "620356964",
              "is_by_post_author": false,
              "is_edited": null,
              "is_liked_by_author": null,
              "is_pinned": null,
              "metrics": {
                "like_count": 0,
                "reply_count": 0
              },
              "parent_id": null,
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_badges": [],
                  "dislike_count": 0
                }
              },
              "post_id": "v7h29za",
              "published_at": "2026-10-22T13:01:00Z",
              "text": "🐈👌🏻🧡",
              "unknown_fields": [],
              "url": "https://rumble.com/shorts/v7h29za#comment-620356964"
            },
            {
              "approximate_fields": [
                "published_at"
              ],
              "author": {
                "avatar_url": null,
                "display_name": "SkyeWalker0504",
                "id": null,
                "is_verified": false,
                "url": "https://rumble.com/user/SkyeWalker0504",
                "username": "user/SkyeWalker0504"
              },
              "edited_at": null,
              "id": "620301964",
              "is_by_post_author": false,
              "is_edited": null,
              "is_liked_by_author": null,
              "is_pinned": null,
              "metrics": {
                "like_count": 1,
                "reply_count": 0
              },
              "parent_id": null,
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_badges": [],
                  "dislike_count": 0
                }
              },
              "post_id": "v7h29za",
              "published_at": "2026-10-21T15:29:00Z",
              "text": "Looks like a Minecraft cat.",
              "unknown_fields": [],
              "url": "https://rumble.com/shorts/v7h29za#comment-620301964"
            }
          ],
          "page": {
            "has_more": false,
            "next_cursor": null,
            "next_cursor_expires_at": null,
            "end_reason": "end"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "rumble",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "v7h29za",
              "url": "https://rumble.com/v7h29za"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "comments of a news video, walked five at a time",
          "params": {
            "limit": "5",
            "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
          },
          "tags": [
            "url",
            "walk"
          ]
        },
        {
          "name": "Sort by likes, replies after their comment",
          "params": {
            "limit": "100",
            "sort": "popular",
            "url": "v7hicbc"
          },
          "tags": [
            "popular",
            "replies"
          ]
        },
        {
          "name": "embed link",
          "params": {
            "url": "https://rumble.com/embed/v77qthe/"
          },
          "tags": [
            "embed_link"
          ]
        },
        {
          "name": "24/7 live stream, thousands of comments",
          "params": {
            "limit": "10",
            "url": "https://rumble.com/v35waq4-rt-news-livestream-247.html"
          },
          "tags": [
            "live",
            "large"
          ]
        },
        {
          "name": "short without comments",
          "params": {
            "url": "https://rumble.com/shorts/v7hgv02"
          },
          "tags": [
            "short",
            "empty"
          ]
        },
        {
          "name": "unknown embed ID",
          "params": {
            "url": "https://rumble.com/embed/vzzzzzz/"
          },
          "tags": [
            "not_found"
          ]
        },
        {
          "name": "unknown video ID",
          "params": {
            "url": "vaaaaaa"
          },
          "tags": [
            "not_found",
            "raw_id"
          ]
        },
        {
          "name": "channel link",
          "params": {
            "url": "https://rumble.com/c/Bongino"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "sort",
        "since",
        "until",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "rumble.post",
      "platform": "rumble",
      "name": "post",
      "resource": "post",
      "list": null,
      "path": "/v1/rumble/post",
      "method": "GET",
      "operation_id": "rumble.post.get",
      "status": "beta",
      "title": "Rumble Video API",
      "summary": "Rumble video, short or live stream with votes and files",
      "description": "Returns a public Rumble video, short or live stream: title, full description, publish time, duration, thumbnail, the channel with its avatar, badge and follower count, views, likes and dislikes, Rumble's categories and tags, every video and audio file with its size, the caption tracks, and for live streams whether they are on air, when they started or are scheduled, and how many people are watching. Accepts every Rumble video link form, embed links included, or a bare video ID.",
      "use_cases": [
        "Track views, likes and dislikes on Rumble videos over time",
        "Monitor live streams and their concurrent viewers",
        "Collect caption files and media links for analysis",
        "Enrich Rumble links with titles, channels and thumbnails"
      ],
      "notes": [
        "On a video's page Rumble cuts dislikes, comment and follower counts to three significant digits once they reach thousands (a cut label is a floor: the real count is at most one unit in its last digit higher; listed in approximate_fields); likes are made exact from the rating bar when the dislikes are exact; views, and every count of a short, are exact.",
        "metrics.comment_count on a video is the count its page shows, which can run below the total Rumble's own lists give for the same video; null when the page shows none.",
        "platform_specific.rumble.embed_id is the player's ID: /embed/ links use it, and it differs from id.",
        "platform_type is short, live (streams on air, scheduled or past) or video."
      ],
      "faq": [],
      "keywords": [
        "rumble video api",
        "rumble scraper",
        "rumble livestream api",
        "rumble views likes dislikes",
        "rumble video metadata"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Rumble video, short or live stream URL (rumble.com/v…-title.html, /shorts/v…, /share/v…, /embed/v…/) or a video ID (v…).",
          "example": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
        },
        "response": {
          "data": {
            "approximate_fields": [
              "platform_specific.rumble.author_follower_count"
            ],
            "author": {
              "avatar_url": "https://hugh.cdn.rumble.cloud/video/z8/g/D/5/d/gD5da.baa.2-GGreenwald-rml416.png",
              "display_name": "Glenn Greenwald",
              "id": "_c1021766",
              "is_verified": true,
              "url": "https://rumble.com/c/GGreenwald",
              "username": "GGreenwald"
            },
            "coauthors": [],
            "duration_ms": 1678000,
            "hashtags": [],
            "id": "v79xhhm",
            "is_nsfw": null,
            "is_pinned": null,
            "is_sponsored": null,
            "language": null,
            "media": [
              {
                "alt_text": null,
                "duration_ms": 1678000,
                "expires_at": null,
                "height": 1080,
                "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/1/k/V/p/o/kVpoA.qR4e-small-DISCOVERY-Why-Glenn-WANTS-I..jpg",
                "type": "video",
                "url": "https://rumble.com/hls-vod/vjXafkcCce8/playlist.m3u8",
                "width": 1920
              }
            ],
            "mentions": [],
            "metrics": {
              "comment_count": 22,
              "like_count": 209,
              "quote_count": null,
              "repost_count": null,
              "save_count": null,
              "share_count": null,
              "view_count": 25366
            },
            "platform": "rumble",
            "platform_specific": {
              "rumble": {
                "author_follower_count": 584000,
                "caption_tracks": [
                  {
                    "is_auto_generated": true,
                    "label": "English (auto)",
                    "language": "en",
                    "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/11/k/V/p/o/kVpoA.fn8Si.1.vtt"
                  }
                ],
                "category": "News",
                "concurrent_viewer_count": null,
                "dislike_count": 4,
                "embed_id": "v77qthe",
                "embed_url": "https://rumble.com/embed/v77qthe/",
                "files": [
                  {
                    "bitrate_kbps": 2142,
                    "format": "tar",
                    "height": 720,
                    "kind": "video",
                    "size_bytes": 449566720,
                    "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/2/k/V/p/o/kVpoA.gaa.tar?r_file=chunklist.m3u8&r_type=application%2Fvnd.apple.mpegurl&r_range=449539072-449555872",
                    "width": 1280
                  },
                  {
                    "bitrate_kbps": 1059,
                    "format": "tar",
                    "height": 480,
                    "kind": "video",
                    "size_bytes": 222300160,
                    "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/2/k/V/p/o/kVpoA.caa.tar?r_file=chunklist.m3u8&r_type=application%2Fvnd.apple.mpegurl&r_range=222280704-222297420",
                    "width": 854
                  },
                  {
                    "bitrate_kbps": 679,
                    "format": "tar",
                    "height": 360,
                    "kind": "video",
                    "size_bytes": 142510080,
                    "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/2/k/V/p/o/kVpoA.baa.tar?r_file=chunklist.m3u8&r_type=application%2Fvnd.apple.mpegurl&r_range=142485504-142502129",
                    "width": 640
                  }
                ],
                "is_age_restricted": null,
                "is_live_now": false,
                "keywords": [],
                "live_started_at": null,
                "numeric_id": "436271810",
                "scheduled_start_at": null,
                "secondary_category": "Politics"
              }
            },
            "platform_type": "video",
            "published_at": "2026-05-16T11:31:27Z",
            "text": "Follow Glenn Greenwald's writing and other journalism at Substack, where you can become a member: https://greenwald.substack.com/\n\nAll videos now available as a podcast! Find full episodes here: https://linktr.ee/systemupdate_\n\nFollow Glenn:\nTwitter: https://twitter.com/ggreenwal…",
            "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/1/k/V/p/o/kVpoA.qR4e-small-DISCOVERY-Why-Glenn-WANTS-I..jpg",
            "title": "DISCOVERY: Why Glenn WANTS Israel to Sue The New York Times",
            "type": "video",
            "unknown_fields": [],
            "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "rumble",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "v79xhhm",
              "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "video by its link",
          "params": {
            "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
          },
          "tags": [
            "video",
            "url"
          ]
        },
        {
          "name": "short by its shorts link",
          "params": {
            "url": "https://rumble.com/shorts/v7hgv02"
          },
          "tags": [
            "short",
            "shorts_url"
          ]
        },
        {
          "name": "24/7 live stream on air",
          "params": {
            "url": "https://rumble.com/v35waq4-rt-news-livestream-247.html"
          },
          "tags": [
            "live",
            "live_now"
          ]
        },
        {
          "name": "past live stream by video ID",
          "params": {
            "url": "v7hicbc"
          },
          "tags": [
            "live",
            "past_stream",
            "raw_id"
          ]
        },
        {
          "name": "embed link",
          "params": {
            "url": "https://rumble.com/embed/v77qthe/?pub=4"
          },
          "tags": [
            "video",
            "embed_url"
          ]
        },
        {
          "name": "video uploaded by a user account, by share link",
          "params": {
            "url": "https://rumble.com/share/v7hirte?src=canary"
          },
          "tags": [
            "video",
            "share_link",
            "user_account"
          ]
        },
        {
          "name": "video that does not exist",
          "params": {
            "url": "vzzzzzz"
          },
          "tags": [
            "not_found"
          ]
        },
        {
          "name": "a category name shaped like a video ID",
          "params": {
            "url": "viral"
          },
          "tags": [
            "not_found",
            "raw_id"
          ]
        },
        {
          "name": "channel link sent to the video endpoint",
          "params": {
            "url": "https://rumble.com/c/GGreenwald"
          },
          "tags": [
            "invalid_input"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "rumble.posts",
      "platform": "rumble",
      "name": "posts",
      "resource": "post",
      "list": {
        "page_max": 25,
        "cursor_ttl_s": 3600,
        "order": "Rumble's upload order (newest uploads first, not strictly by published_at)",
        "orders": {
          "newest": "Rumble's upload order (newest uploads first, not strictly by published_at)",
          "popular": "Rumble's View count order (most viewed first)"
        },
        "free_filtered_pages": true
      },
      "path": "/v1/rumble/posts",
      "method": "GET",
      "operation_id": "rumble.posts.list",
      "status": "beta",
      "title": "Rumble Channel Videos API",
      "summary": "A Rumble channel's or user's videos, shorts and live streams",
      "description": "Returns the public uploads of a Rumble channel or user a page at a time: its videos, its shorts or its live streams (on air now, scheduled and past), newest or most viewed first. Each carries its link, title, thumbnail, exact upload time and length, exact views, likes, dislikes, comments and reposts, the video file, the channel with its exact follower count and badge, and for streams whether they are on air, the viewer count and when they started or are due. Accepts a channel or user name, any channel or user link, or a channel's ID.",
      "use_cases": [
        "Monitor a Rumble channel for new uploads and live streams",
        "Export a creator's full Rumble catalog",
        "Find a channel's most viewed videos or shorts",
        "Track a creator's scheduled and past live streams"
      ],
      "notes": [
        "tab=live lists Rumble's Livestreams tab: streams on air now (platform_specific.rumble.is_live_now, concurrent_viewer_count), scheduled ones (scheduled_start_at, no duration or views yet) and past ones. tab=videos holds the other uploads, tab=shorts the shorts.",
        "sort=newest is Rumble's upload order, newest first but not strictly by date: some older uploads sit among newer ones, so read published_at rather than the position.",
        "A user's tabs (user/<name>) list its own uploads and those of the channels it owns; each post's author says which account published it.",
        "List results carry no description: text is null and hashtags and mentions are listed in unknown_fields. Fetch the video (rumble.post) for those.",
        "A tab the account does not have (a channel without shorts) and an account without uploads answer an empty page."
      ],
      "faq": [],
      "keywords": [
        "rumble channel videos api",
        "rumble videos scraper",
        "rumble shorts api",
        "rumble livestreams api",
        "rumble channel scraper"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "Rumble channel or user: a bare name (Bongino: a channel, else the user of that name), c/<name> for a channel or user/<name> for a user, any channel or user link with any tab after it (rumble.com/c/Bongino, rumble.com/c/Bongino/shorts, rumble.com/user/vivafrei/livestreams, the root rumble.com/Bongino link), or a channel's id as this API returns it (_c276782) or its c/c-<channel id> name. A user's _u… id is refused: Rumble's public pages cannot look a user up by ID, so send its name. Names are case-insensitive.",
          "example": "Bongino",
          "max_length": 2048
        },
        {
          "name": "tab",
          "type": "string",
          "required": false,
          "description": "The tab to list: videos (default), shorts or live (Rumble's Livestreams tab: streams on air now, scheduled ones and past ones). A user's tabs include the videos of the channels it owns.",
          "example": "live",
          "enum": [
            "videos",
            "shorts",
            "live"
          ]
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "Order of the results. newest (default): Rumble's upload order, newest uploads first (Rumble's own order, not strictly by published_at: older uploads can sit among newer ones). popular: Rumble's View count order (most viewed first).",
          "enum": [
            "newest",
            "popular"
          ],
          "default": "newest",
          "vocabulary": "sort"
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Only posts published at or after this time. Neither sort is strictly by date, so since filters every page instead of ending the walk at the first older post: the walk ends after a few pages in a row with nothing in the window, and those pages are free.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Only posts published before this time; filters every page, like since.",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        },
        {
          "name": "duration",
          "type": "string",
          "required": false,
          "description": "Only short videos (Rumble's Under 4 minutes) or long ones (Over 20 minutes); any length when omitted. Not with tab=shorts.",
          "example": "long",
          "enum": [
            "short",
            "long"
          ]
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "Bongino"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://hugh.cdn.rumble.cloud/video/z8/U/K/d/b/UKdba.baa.4-bongino-t8rqq7.jpeg",
                "display_name": "The Dan Bongino Show",
                "id": "_c276782",
                "is_verified": true,
                "url": "https://rumble.com/c/bongino",
                "username": "bongino"
              },
              "coauthors": [],
              "duration_ms": 3233000,
              "hashtags": [],
              "id": "v7haadi",
              "is_nsfw": false,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 3233000,
                  "expires_at": null,
                  "height": 1080,
                  "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/25/s8/1/g/a/y/9/gay9A.OvCc-small-Bongino-Weekend-Report-Week..jpg",
                  "type": "video",
                  "url": "https://hugh.cdn.rumble.cloud/video/fww1/25/s8/2/g/a/y/9/gay9A.haa.mp4",
                  "width": 1920
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 80,
                "like_count": 1182,
                "quote_count": null,
                "repost_count": 3,
                "save_count": null,
                "share_count": null,
                "view_count": 207825
              },
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_follower_count": 3673478,
                  "caption_tracks": [],
                  "category": null,
                  "concurrent_viewer_count": null,
                  "dislike_count": 13,
                  "embed_id": "v7f3xg0",
                  "embed_url": "https://rumble.com/embed/v7f3xg0/",
                  "files": [],
                  "is_age_restricted": false,
                  "is_live_now": false,
                  "keywords": [],
                  "live_started_at": null,
                  "numeric_id": "448640784",
                  "scheduled_start_at": null,
                  "secondary_category": null
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-24T11:01:00Z",
              "text": null,
              "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/25/s8/1/g/a/y/9/gay9A.OvCc-small-Bongino-Weekend-Report-Week..jpg",
              "title": "Bongino Weekend Report - Week of 10/19/26",
              "type": "video",
              "unknown_fields": [
                "hashtags",
                "mentions",
                "platform_specific.rumble.keywords"
              ],
              "url": "https://rumble.com/v7haadi-bongino-weekend-report-week-of-101926.html"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://hugh.cdn.rumble.cloud/video/z8/U/K/d/b/UKdba.baa.4-bongino-t8rqq7.jpeg",
                "display_name": "The Dan Bongino Show",
                "id": "_c276782",
                "is_verified": true,
                "url": "https://rumble.com/c/bongino",
                "username": "bongino"
              },
              "coauthors": [],
              "duration_ms": 3316000,
              "hashtags": [],
              "id": "v7gyjd4",
              "is_nsfw": false,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 3316000,
                  "expires_at": null,
                  "height": 1080,
                  "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/bd/s8/1/i/k/s/7/iks7A.OvCc-small-Bongino-Weekend-Report-Week..jpg",
                  "type": "video",
                  "url": "https://hugh.cdn.rumble.cloud/video/fww1/bd/s8/2/i/k/s/7/iks7A.haa.mp4",
                  "width": 1920
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 119,
                "like_count": 1170,
                "quote_count": null,
                "repost_count": 2,
                "save_count": null,
                "share_count": null,
                "view_count": 257009
              },
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_follower_count": 3673478,
                  "caption_tracks": [],
                  "category": null,
                  "concurrent_viewer_count": null,
                  "dislike_count": 25,
                  "embed_id": "v7es6fm",
                  "embed_url": "https://rumble.com/embed/v7es6fm/",
                  "files": [],
                  "is_age_restricted": false,
                  "is_live_now": false,
                  "keywords": [],
                  "live_started_at": null,
                  "numeric_id": "448092562",
                  "scheduled_start_at": null,
                  "secondary_category": null
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-17T13:00:00Z",
              "text": null,
              "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/bd/s8/1/i/k/s/7/iks7A.OvCc-small-Bongino-Weekend-Report-Week..jpg",
              "title": "Bongino Weekend Report - Week of 10/12/26",
              "type": "video",
              "unknown_fields": [
                "hashtags",
                "mentions",
                "platform_specific.rumble.keywords"
              ],
              "url": "https://rumble.com/v7gyjd4-bongino-weekend-report-week-of-101226.html"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://hugh.cdn.rumble.cloud/video/z8/U/K/d/b/UKdba.baa.4-bongino-t8rqq7.jpeg",
                "display_name": "The Dan Bongino Show",
                "id": "_c276782",
                "is_verified": true,
                "url": "https://rumble.com/c/bongino",
                "username": "bongino"
              },
              "coauthors": [],
              "duration_ms": 3350000,
              "hashtags": [],
              "id": "v7go45s",
              "is_nsfw": false,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 3350000,
                  "expires_at": null,
                  "height": 1080,
                  "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2c/s8/1/q/C/B/5/qCB5A.OvCc-small-Bongino-Weekend-Report-Week..jpg",
                  "type": "video",
                  "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2c/s8/2/q/C/B/5/qCB5A.haa.mp4",
                  "width": 1920
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 164,
                "like_count": 1143,
                "quote_count": null,
                "repost_count": 0,
                "save_count": null,
                "share_count": null,
                "view_count": 265418
              },
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_follower_count": 3673477,
                  "caption_tracks": [],
                  "category": null,
                  "concurrent_viewer_count": null,
                  "dislike_count": 22,
                  "embed_id": "v7ehr8a",
                  "embed_url": "https://rumble.com/embed/v7ehr8a/",
                  "files": [],
                  "is_age_restricted": false,
                  "is_live_now": false,
                  "keywords": [],
                  "live_started_at": null,
                  "numeric_id": "447606298",
                  "scheduled_start_at": null,
                  "secondary_category": null
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-10T16:03:02Z",
              "text": null,
              "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2c/s8/1/q/C/B/5/qCB5A.OvCc-small-Bongino-Weekend-Report-Week..jpg",
              "title": "Bongino Weekend Report - Week of 10/05/26",
              "type": "video",
              "unknown_fields": [
                "hashtags",
                "mentions",
                "platform_specific.rumble.keywords"
              ],
              "url": "https://rumble.com/v7go45s-bongino-weekend-report-week-of-100526.html"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "rumble",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "_c276782",
              "url": "https://rumble.com/c/bongino"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "a channel's videos, walked",
          "params": {
            "handle": "Bongino"
          },
          "tags": [
            "videos",
            "newest",
            "walk",
            "handle"
          ]
        },
        {
          "name": "shorts through the shorts feed",
          "params": {
            "handle": "https://rumble.com/c/Bongino/shorts",
            "tab": "shorts"
          },
          "tags": [
            "shorts",
            "newest",
            "walk",
            "url"
          ]
        },
        {
          "name": "a channel's live streams",
          "params": {
            "handle": "c/Bongino",
            "tab": "live"
          },
          "tags": [
            "live",
            "newest"
          ]
        },
        {
          "name": "most viewed videos",
          "params": {
            "handle": "Bongino",
            "sort": "popular"
          },
          "tags": [
            "videos",
            "popular"
          ]
        },
        {
          "name": "a user's uploads with its channels'",
          "params": {
            "handle": "user/vivafrei"
          },
          "tags": [
            "videos",
            "user"
          ]
        },
        {
          "name": "a channel by its id",
          "params": {
            "handle": "_c276782",
            "tab": "shorts"
          },
          "tags": [
            "shorts",
            "raw_id"
          ]
        },
        {
          "name": "long videos only",
          "params": {
            "duration": "long",
            "handle": "Bongino"
          },
          "tags": [
            "videos",
            "duration"
          ]
        },
        {
          "name": "a channel without uploads",
          "params": {
            "handle": "c/POTUS"
          },
          "tags": [
            "empty_page"
          ]
        },
        {
          "name": "a channel without a shorts tab",
          "params": {
            "handle": "c/POTUS",
            "tab": "shorts"
          },
          "tags": [
            "empty_page",
            "shorts"
          ]
        },
        {
          "name": "most viewed shorts, walked on the tab page",
          "params": {
            "handle": "Bongino",
            "sort": "popular",
            "tab": "shorts"
          },
          "tags": [
            "shorts",
            "popular",
            "walk"
          ]
        },
        {
          "name": "unknown account",
          "params": {
            "handle": "zqxjvkwplmrtq9183"
          },
          "tags": [
            "not_found"
          ]
        },
        {
          "name": "since in the future: the page is emptied (free), not the end",
          "params": {
            "handle": "Bongino",
            "since": "2100-01-01T00:00:00Z"
          },
          "tags": [
            "videos",
            "since"
          ]
        },
        {
          "name": "a user's id is refused",
          "params": {
            "handle": "_u71v3"
          },
          "tags": [
            "invalid_input",
            "raw_id"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "tab",
        "sort",
        "since",
        "until",
        "duration",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "rumble.profile",
      "platform": "rumble",
      "name": "profile",
      "resource": "profile",
      "list": null,
      "path": "/v1/rumble/profile",
      "method": "GET",
      "operation_id": "rumble.profile.get",
      "status": "beta",
      "title": "Rumble Channel API",
      "summary": "Public Rumble channel or user profile and its counts",
      "description": "Returns a public Rumble channel or user: Rumble's own ID for it (the one Rumble's video data names the uploader by) and its name, display name, description, avatar, banner, verification badge, the social links it lists with their labels, its join date, follower count and exact video and lifetime view counts, and which kind of account it is with the ID of the user who owns it. Accepts a channel or user name, any channel or user link with any tab, or a channel's ID.",
      "use_cases": [
        "Track Rumble creators' growth over time",
        "Vet creators before a sponsorship",
        "Find a creator's other social accounts",
        "Compare a creator's Rumble audience with their YouTube or TikTok one"
      ],
      "notes": [
        "Rumble has channels (rumble.com/c/<name>) and users (rumble.com/user/<name>, the uploader account that owns channels). A bare name is looked up as a channel first, then as a user; send c/<name> or user/<name> to choose. platform_specific.rumble.account_type says which one answered.",
        "id is Rumble's own reference: _c<channel number> for a channel, _u<user number in base 36> for a user, the same string rumble.post and rumble.search_posts return as author.id. Channels and users are numbered separately (platform_specific.rumble.numeric_id), so only id is unambiguous. A channel's id is accepted as handle; a user's is not (send its name).",
        "username is a channel's name as Rumble spells it, or user/<name> for a user (a bare name is looked up as a channel first), the same as author.username on rumble.post and rumble.search_posts, so it can be sent back as handle.",
        "metrics.follower_count is the count the page header shows: from a thousand up it is cut to three significant figures (a floor: it can be under the real count, never over; listed in approximate_fields). Video and view counts are exact.",
        "created_at is the start, in UTC, of the day Rumble shows as the join date (listed in approximate_fields): Rumble shows the day only.",
        "type is unknown, location, country_code and category are null, and metrics.following_count and metrics.total_like_count are null: Rumble does not show them. is_private is false: Rumble has no private accounts.",
        "Names that are no channel or user answer not_found."
      ],
      "faq": [],
      "keywords": [
        "rumble channel api",
        "rumble profile api",
        "rumble follower count api",
        "rumble channel scraper"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "Rumble channel or user: a bare name (Bongino: a channel, else the user of that name), c/<name> for a channel or user/<name> for a user, any channel or user link with any tab after it (rumble.com/c/Bongino, rumble.com/c/Bongino/videos, rumble.com/user/vivafrei/about, the root rumble.com/Bongino link), or a channel's id as this API returns it (_c276782) or its c/c-<channel id> name (c/c-276782, which every channel has). A user's _u… id is refused: Rumble's public pages cannot look a user up by ID, so send its name. Names are case-insensitive.",
          "example": "Bongino",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "Bongino"
        },
        "response": {
          "data": {
            "approximate_fields": [
              "metrics.follower_count",
              "created_at"
            ],
            "avatar_url": "https://hugh.cdn.rumble.cloud/video/z8/U/K/d/b/UKdba.baa.4-bongino-t8rqq7.jpeg",
            "banner_url": "https://hugh.cdn.rumble.cloud/video/z8/U/K/d/b/UKdba.caa-bongino-tbhrxo.png",
            "bio": "The official channel for The Dan Bongino Show®. A former Deputy Director of the FBI, Secret Service Agent, NYPD officer, and best-selling author, Dan Bongino tackles the hot political issues, debunking both liberal and Republican establishment rhetoric.",
            "category": null,
            "country_code": null,
            "created_at": "2020-09-16T00:00:00Z",
            "display_name": "The Dan Bongino Show",
            "external_links": [
              {
                "title": "Twitter",
                "url": "https://twitter.com/dbongino"
              },
              {
                "title": "Facebook",
                "url": "https://facebook.com/danbongino"
              },
              {
                "title": "Instagram",
                "url": "https://instagram.com/dbongino"
              }
            ],
            "id": "_c276782",
            "is_private": false,
            "is_verified": true,
            "location": null,
            "metrics": {
              "follower_count": 3670000,
              "following_count": null,
              "post_count": 2136,
              "total_like_count": null,
              "total_view_count": 389354965
            },
            "platform": "rumble",
            "platform_specific": {
              "rumble": {
                "account_type": "channel",
                "numeric_id": "276782",
                "user_id": "_u169h4"
              }
            },
            "type": "unknown",
            "unknown_fields": [],
            "url": "https://rumble.com/c/bongino",
            "username": "bongino"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "rumble",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "_c276782",
              "url": "https://rumble.com/c/bongino"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "Channel by bare name, verified",
          "params": {
            "handle": "Bongino"
          },
          "tags": [
            "handle",
            "verified",
            "display_text"
          ]
        },
        {
          "name": "User by bare name (Rumble's 410 on /c/, then /user/)",
          "params": {
            "handle": "BonginoReport"
          },
          "tags": [
            "handle",
            "user"
          ]
        },
        {
          "name": "Channel by its id",
          "params": {
            "handle": "_c276782"
          },
          "tags": [
            "raw_id"
          ]
        },
        {
          "name": "Channel by its c/c-<number> name",
          "params": {
            "handle": "c/c-2878406"
          },
          "tags": [
            "namespace",
            "raw_id"
          ]
        },
        {
          "name": "Unverified channel without a custom name, by link",
          "params": {
            "handle": "https://rumble.com/c/c-5185017"
          },
          "tags": [
            "url",
            "unverified",
            "small"
          ]
        },
        {
          "name": "User link with a tab",
          "params": {
            "handle": "https://rumble.com/user/Delta_V_/videos"
          },
          "tags": [
            "url",
            "tab",
            "user"
          ]
        },
        {
          "name": "Root vanity link that names another channel",
          "params": {
            "handle": "https://rumble.com/trending"
          },
          "tags": [
            "vanity",
            "url"
          ]
        },
        {
          "name": "Channel without videos or views",
          "params": {
            "handle": "c/c-854353"
          },
          "tags": [
            "empty",
            "display_text"
          ]
        },
        {
          "name": "Channel name that does not exist",
          "params": {
            "handle": "c/thischanneldoesnotexist98765"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "A user's name asked as a channel",
          "params": {
            "handle": "c/vivafrei"
          },
          "tags": [
            "wrong_namespace"
          ]
        },
        {
          "name": "Removed channel by bare name (410, no user of that name)",
          "params": {
            "handle": "RTenEspanol"
          },
          "tags": [
            "deleted",
            "removed"
          ]
        },
        {
          "name": "A user's id is refused",
          "params": {
            "handle": "_u71v3"
          },
          "tags": [
            "invalid",
            "raw_id"
          ]
        },
        {
          "name": "Video link is refused",
          "params": {
            "handle": "https://rumble.com/v4y5h1n-example.html"
          },
          "tags": [
            "invalid"
          ]
        },
        {
          "name": "Rumble's own page is refused",
          "params": {
            "handle": "https://rumble.com/browse"
          },
          "tags": [
            "invalid",
            "reserved"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "rumble.search_posts",
      "platform": "rumble",
      "name": "search_posts",
      "resource": "post",
      "list": {
        "page_max": 36,
        "cursor_ttl_s": 3600,
        "order": "Rumble's relevance order",
        "orders": {
          "newest": "newest first",
          "popular": "Rumble's View count order (most viewed first)",
          "relevance": "Rumble's relevance order"
        }
      },
      "path": "/v1/rumble/search_posts",
      "method": "GET",
      "operation_id": "rumble.search_posts.list",
      "status": "beta",
      "title": "Rumble Search API",
      "summary": "Search Rumble videos, live streams and shorts by keyword",
      "description": "Searches Rumble's public videos and live streams, or its shorts, by keyword and returns them a page at a time: each video's link, title, thumbnail, exact upload time, real length, views, likes, dislikes and comments, its channel with the verification badge, and whether a stream is on air with its viewer count. Shorts also carry exact counts, the channel's follower count and the video file. Sort by relevance, newest or most viewed, and filter by upload date and length with Rumble's own filters.",
      "use_cases": [
        "Monitor Rumble for videos about a brand, person or topic",
        "Find the most viewed Rumble videos on a subject",
        "Track new uploads and live streams for a keyword",
        "Collect Rumble shorts for trend research"
      ],
      "notes": [
        "Video results show Rumble's abbreviated counts (2.42K: cut, not rounded, to three significant digits, so a slight undercount): those values are in approximate_fields. A count a result does not show (no votes, no comments yet) is null. Shorts carry exact counts.",
        "Rumble serves a limited number of result pages per search; a walk that reaches it ends with end_reason platform_limit.",
        "Search results carry no description: text is null and hashtags and mentions are listed in unknown_fields. Fetch the video for those.",
        "Rumble's search matches Latin-script keywords: a query in Cyrillic, Arabic, Hebrew or CJK script finds nothing. Queries its firewall reads as SQL or script injection are refused with invalid_input."
      ],
      "faq": [],
      "keywords": [
        "rumble search api",
        "rumble video search",
        "rumble scraper",
        "rumble shorts api",
        "search rumble videos"
      ],
      "params": [
        {
          "name": "query",
          "type": "string",
          "required": true,
          "description": "Keywords, matched by Rumble's search against titles and channels.",
          "example": "cats",
          "max_length": 512
        },
        {
          "name": "tab",
          "type": "string",
          "required": false,
          "description": "The search tab to list: videos (default; videos and live streams) or shorts.",
          "example": "shorts",
          "enum": [
            "videos",
            "shorts"
          ]
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "Order of the results. relevance (default): Rumble's best match. newest: newest uploads first. popular: Rumble's View count order (most viewed first).",
          "enum": [
            "relevance",
            "newest",
            "popular"
          ],
          "default": "relevance",
          "vocabulary": "sort"
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Rumble's upload-date filter is applied when it covers since (the last day, week, month or year), so fewer pages are fetched.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        },
        {
          "name": "duration",
          "type": "string",
          "required": false,
          "description": "Only short videos (Rumble's Under 4 minutes) or long ones (Over 20 minutes). Any length when omitted.",
          "example": "long",
          "enum": [
            "short",
            "long"
          ]
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "query": "cats"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": null,
                "display_name": "ViralHog",
                "id": "_u7bbl",
                "is_verified": false,
                "url": "https://rumble.com/user/ViralHog",
                "username": "user/ViralHog"
              },
              "coauthors": [],
              "duration_ms": 28000,
              "hashtags": [],
              "id": "v7hfhey",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 28000,
                  "expires_at": null,
                  "height": null,
                  "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/39/s8/6/Q/l/t/-/Qlt-A.oq1b.jpg",
                  "type": "video",
                  "url": null,
                  "width": null
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": null,
                "like_count": 3,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": 254
              },
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_follower_count": null,
                  "caption_tracks": [],
                  "category": null,
                  "concurrent_viewer_count": null,
                  "dislike_count": 0,
                  "embed_id": null,
                  "embed_url": null,
                  "files": [],
                  "is_age_restricted": null,
                  "is_live_now": false,
                  "keywords": [],
                  "live_started_at": null,
                  "numeric_id": null,
                  "scheduled_start_at": null,
                  "secondary_category": null
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-26T19:34:46Z",
              "text": null,
              "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/39/s8/6/Q/l/t/-/Qlt-A.oq1b.jpg",
              "title": "Orange Cat Sits Like Human On Fuzzy Couch",
              "type": "video",
              "unknown_fields": [
                "hashtags",
                "mentions",
                "platform_specific.rumble.keywords"
              ],
              "url": "https://rumble.com/v7hfhey-orange-cat-sits-like-human-on-fuzzy-couch.html"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": null,
                "display_name": "SereneChristine",
                "id": "_urv80h",
                "is_verified": false,
                "url": "https://rumble.com/user/SereneChristine",
                "username": "user/SereneChristine"
              },
              "coauthors": [],
              "duration_ms": 932000,
              "hashtags": [],
              "id": "v7hdue2",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 932000,
                  "expires_at": null,
                  "height": null,
                  "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/1e/s8/1/A/G/a/-/AGa-A.oq1b-small-The-Book-of-Enoch-Reveals-W..jpg",
                  "type": "video",
                  "url": null,
                  "width": null
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": null,
                "like_count": 4,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": 400
              },
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_follower_count": null,
                  "caption_tracks": [],
                  "category": null,
                  "concurrent_viewer_count": null,
                  "dislike_count": 1,
                  "embed_id": null,
                  "embed_url": null,
                  "files": [],
                  "is_age_restricted": null,
                  "is_live_now": false,
                  "keywords": [],
                  "live_started_at": null,
                  "numeric_id": null,
                  "scheduled_start_at": null,
                  "secondary_category": null
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-25T20:04:50Z",
              "text": null,
              "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/1e/s8/1/A/G/a/-/AGa-A.oq1b-small-The-Book-of-Enoch-Reveals-W..jpg",
              "title": "The Book of Enoch Reveals Why Cats Were Sent to Earth — And Why the Church Removed That Chapter",
              "type": "video",
              "unknown_fields": [
                "hashtags",
                "mentions",
                "platform_specific.rumble.keywords"
              ],
              "url": "https://rumble.com/v7hdue2-the-book-of-enoch-reveals-why-cats-were-sent-to-earth-and-why-the-church-re.html"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": null,
                "display_name": "tubewatch1",
                "id": "_utpvcv",
                "is_verified": false,
                "url": "https://rumble.com/user/tubewatch1",
                "username": "user/tubewatch1"
              },
              "coauthors": [],
              "duration_ms": 100000,
              "hashtags": [],
              "id": "v7hhiau",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 100000,
                  "expires_at": null,
                  "height": null,
                  "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/03/s8/6/M/p/Q/-/MpQ-A.oq1b.jpg",
                  "type": "video",
                  "url": null,
                  "width": null
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 1,
                "like_count": null,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": 211
              },
              "platform": "rumble",
              "platform_specific": {
                "rumble": {
                  "author_follower_count": null,
                  "caption_tracks": [],
                  "category": null,
                  "concurrent_viewer_count": null,
                  "dislike_count": null,
                  "embed_id": null,
                  "embed_url": null,
                  "files": [],
                  "is_age_restricted": null,
                  "is_live_now": false,
                  "keywords": [],
                  "live_started_at": null,
                  "numeric_id": null,
                  "scheduled_start_at": null,
                  "secondary_category": null
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-27T22:19:31Z",
              "text": null,
              "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fww1/03/s8/6/M/p/Q/-/MpQ-A.oq1b.jpg",
              "title": "Pretty Peaceful Precious Piper - My Adopted Shelter Cat Vlog",
              "type": "video",
              "unknown_fields": [
                "hashtags",
                "mentions",
                "platform_specific.rumble.keywords"
              ],
              "url": "https://rumble.com/v7hhiau-pretty-peaceful-precious-piper-my-adopted-shelter-cat-vlog.html"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "rumble",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": null,
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "videos for a keyword, walked",
          "params": {
            "query": "cats"
          },
          "tags": [
            "videos",
            "relevance",
            "walk"
          ]
        },
        {
          "name": "shorts with exact counts",
          "params": {
            "query": "cats",
            "tab": "shorts"
          },
          "tags": [
            "shorts",
            "walk"
          ]
        },
        {
          "name": "newest uploads first",
          "params": {
            "query": "news",
            "sort": "newest"
          },
          "tags": [
            "videos",
            "newest"
          ]
        },
        {
          "name": "most viewed videos",
          "params": {
            "query": "bongino",
            "sort": "popular"
          },
          "tags": [
            "videos",
            "popular"
          ]
        },
        {
          "name": "long videos only",
          "params": {
            "duration": "long",
            "query": "podcast"
          },
          "tags": [
            "videos",
            "duration"
          ]
        },
        {
          "name": "Spanish keywords",
          "params": {
            "query": "gatos graciosos"
          },
          "tags": [
            "videos",
            "non_english"
          ]
        },
        {
          "name": "a future since ends at once",
          "params": {
            "query": "news",
            "since": "2099-01-01",
            "sort": "newest"
          },
          "tags": [
            "since",
            "empty_page"
          ]
        },
        {
          "name": "no results",
          "params": {
            "query": "zqxjvkwplmrtq9183"
          },
          "tags": [
            "no_results",
            "empty_page"
          ]
        },
        {
          "name": "unknown tab",
          "params": {
            "query": "cats",
            "tab": "channels"
          },
          "tags": [
            "invalid_input"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "query",
      "accepts": [],
      "accepted_params": [
        "query",
        "tab",
        "sort",
        "since",
        "until",
        "duration",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "rumble.transcript",
      "platform": "rumble",
      "name": "transcript",
      "resource": "transcript",
      "list": null,
      "path": "/v1/rumble/transcript",
      "method": "GET",
      "operation_id": "rumble.transcript.get",
      "status": "beta",
      "title": "Rumble Transcript API",
      "summary": "Rumble video transcript",
      "description": "Returns the timed transcript of a public Rumble video, short or past live stream: the uploader's caption track when there is one, otherwise Rumble's automatic captions, as segments with start and end times and the full text, in the language you ask for when Rumble has it. Each answer says which track it used, links its WebVTT file and lists every track the video has. Videos without captions are transcribed from their audio with speech-to-text. Accepts every Rumble video link form, embed links included, or a bare video ID.",
      "use_cases": [
        "Summarize or search Rumble videos and podcasts with LLMs",
        "Monitor what channels say about a topic or brand",
        "Index a channel's back catalog for RAG",
        "Turn live stream replays into articles and clips"
      ],
      "notes": [
        "A stream that is on air now, or has not started, has no transcript yet (no_transcript); Rumble captions it once it ends.",
        "is_auto_generated is true for Rumble's automatic captions and for speech-to-text; platform_specific.rumble.track_label is Rumble's own label for the track used."
      ],
      "faq": [],
      "keywords": [
        "rumble transcript api",
        "rumble captions api",
        "rumble subtitles api",
        "rumble vtt",
        "rumble transcript scraper"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Rumble video, short or live stream URL (rumble.com/v…-title.html, /shorts/v…, /share/v…, /embed/v…/) or a video ID (v…).",
          "example": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
          "max_length": 2048
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Selects the caption track: an uploaded track in that language before Rumble's automatic one. When the video has no track in that language, the default track is returned (language says which). Default: an uploaded track in the spoken language, else Rumble's automatic captions.",
          "example": "en",
          "format": "bcp47",
          "vocabulary": "lang"
        }
      ],
      "sources": [
        "captions",
        "asr"
      ],
      "pricing": [
        {
          "kind": "captions",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "asr",
          "credits": 2,
          "per": 2,
          "unit": {
            "id": "media_minute",
            "name": "started minute of media",
            "plural": "started minutes of media",
            "max": 60
          },
          "max": 122,
          "label": "2 credits + 2 per started minute of media"
        }
      ],
      "min_credits": 1,
      "max_credits": 122,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "no_transcript",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
        },
        "response": {
          "data": {
            "available_languages": [
              "en"
            ],
            "duration_ms": 1678000,
            "id": "v79xhhm",
            "is_auto_generated": true,
            "language": "en",
            "platform": "rumble",
            "platform_specific": {
              "rumble": {
                "caption_tracks": [
                  {
                    "is_auto_generated": true,
                    "label": "English (auto)",
                    "language": "en",
                    "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/11/k/V/p/o/kVpoA.fn8Si.1.vtt"
                  }
                ],
                "caption_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/11/k/V/p/o/kVpoA.fn8Si.1.vtt",
                "track_label": "English (auto)"
              }
            },
            "segments": [
              {
                "end_ms": 11030,
                "start_ms": 6830,
                "text": "Let's get into these questions, and we'll try and get through as many as we can."
              },
              {
                "end_ms": 15630,
                "start_ms": 11030,
                "text": "The first one is from Christi Marbet, who says there were a few questions about this."
              },
              {
                "end_ms": 17730,
                "start_ms": 15630,
                "text": "They want you to comment on the following, quote,"
              }
            ],
            "source": "captions",
            "text": "Let's get into these questions, and we'll try and get through as many as we can. The first one is from Christi Marbet, who says there were a few questions about this. They want you to comment on the following, quote, the Christoph piece on Palestinian rape in Israel, and its supp…",
            "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "rumble",
            "source": "captions",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "v79xhhm",
              "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "video by its link (automatic English captions)",
          "params": {
            "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
          },
          "tags": [
            "video",
            "auto_captions"
          ]
        },
        {
          "name": "short by its shorts link",
          "params": {
            "url": "https://rumble.com/shorts/v7ham20"
          },
          "tags": [
            "short",
            "shorts_url"
          ]
        },
        {
          "name": "embed link",
          "params": {
            "url": "https://rumble.com/embed/v77qthe/?pub=4"
          },
          "tags": [
            "embed_url"
          ]
        },
        {
          "name": "uploaded Spanish captions, by video ID",
          "params": {
            "url": "v1n8sb6"
          },
          "tags": [
            "uploaded_captions",
            "non_english",
            "raw_id"
          ]
        },
        {
          "name": "lang=en on a video with only Spanish captions",
          "params": {
            "lang": "en",
            "url": "v1n8sb6"
          },
          "tags": [
            "lang",
            "fallback"
          ]
        },
        {
          "name": "past live stream",
          "params": {
            "url": "https://rumble.com/v7hicbc"
          },
          "tags": [
            "live",
            "past_stream",
            "long"
          ]
        },
        {
          "name": "24/7 live stream on air",
          "params": {
            "url": "https://rumble.com/v35waq4-rt-news-livestream-247.html"
          },
          "tags": [
            "live",
            "live_now"
          ]
        },
        {
          "name": "German clip without captions, speech-to-text",
          "params": {
            "url": "https://rumble.com/v741ccu"
          },
          "tags": [
            "no_captions",
            "asr",
            "non_english"
          ]
        },
        {
          "name": "video that does not exist",
          "params": {
            "url": "vzzzzzz"
          },
          "tags": [
            "not_found"
          ]
        },
        {
          "name": "channel link sent to the transcript endpoint",
          "params": {
            "url": "https://rumble.com/c/GGreenwald"
          },
          "tags": [
            "invalid_input"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "lang",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "threads.profile",
      "platform": "threads",
      "name": "profile",
      "resource": "profile",
      "list": null,
      "path": "/v1/threads/profile",
      "method": "GET",
      "operation_id": "threads.profile.get",
      "status": "beta",
      "title": "Threads Profile API",
      "summary": "Public Threads profile with exact follower counts",
      "description": "Returns a public Threads account: user ID, username, display name, bio, the links in its bio with their titles, the largest profile picture, verification badge, whether the account is private, and the exact follower count, plus the topic labels Threads shows on the profile and which bio links Threads marks verified. Accepts a username with or without the @, the account's numeric id, or any threads.com or threads.net profile link.",
      "use_cases": [
        "Track creator and brand growth on Threads",
        "Vet a Threads account before a campaign",
        "Enrich a lead list with Threads bios and links",
        "Resolve a Threads username or id to one profile"
      ],
      "notes": [
        "Private accounts return their public header with is_private true.",
        "metrics.following_count, metrics.post_count, metrics.total_like_count, metrics.total_view_count, created_at, banner_url, category, location and country_code are null, and type is unknown: Threads does not show them to logged-out visitors.",
        "Whether an account exists only on Threads is not available logged out.",
        "avatar_url is a Threads CDN link and can expire.",
        "If Threads returns only part of a profile, is_private, external_links, interest_tags and verified_link_urls are left empty and the rest is returned, with a partial_data warning.",
        "An account Threads does not show to logged-out visitors answers not_found, the same as one that does not exist. A post link is refused."
      ],
      "faq": [],
      "keywords": [
        "threads profile api",
        "threads follower count api",
        "threads user info api",
        "threads profile scraper",
        "threads bio link scraper"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "Threads username with or without the @ (zuck, @zuck), the account's numeric id, or a profile link (threads.com/@zuck, threads.net/@zuck, with or without a tab such as /replies, /reposts or /media, and with any query such as ?hl=es). Usernames are case-insensitive. A number of 5 or more digits is an account id; @ before it is a username.",
          "example": "zuck",
          "max_length": 2048
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "api",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "https://www.threads.com/@zuck"
        },
        "response": {
          "data": {
            "approximate_fields": [],
            "avatar_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.82787-19/825322135_17989325280103224_1252773933700107438_n.jpg?stp=dst-jpg_s640x640_tt6&_nc_cat=107&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-1.cdninstagram.com&_nc_gid…",
            "banner_url": null,
            "bio": "Mostly superintelligence and MMA takes",
            "category": null,
            "country_code": null,
            "created_at": null,
            "display_name": "Mark Zuckerberg",
            "external_links": [],
            "id": "63055343223",
            "is_private": false,
            "is_verified": true,
            "location": null,
            "metrics": {
              "follower_count": 5751366,
              "following_count": null,
              "post_count": null,
              "total_like_count": null,
              "total_view_count": null
            },
            "platform": "threads",
            "platform_specific": {
              "threads": {
                "interest_tags": [
                  "AI Threads",
                  "UFC Threads",
                  "AI"
                ],
                "verified_link_urls": []
              }
            },
            "type": "unknown",
            "unknown_fields": [],
            "url": "https://www.threads.com/@zuck",
            "username": "zuck"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "threads",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "63055343223",
              "url": "https://www.threads.com/@zuck"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "Zuckerberg by username",
          "params": {
            "handle": "zuck"
          },
          "tags": [
            "handle",
            "verified",
            "constants:threads.web",
            "constants:threads.username_hovercard",
            "constants:threads.profile_page_query"
          ]
        },
        {
          "name": "@username, any case",
          "params": {
            "handle": "@Zuck"
          },
          "tags": [
            "at_handle",
            "case"
          ]
        },
        {
          "name": "threads.com profile URL",
          "params": {
            "handle": "https://www.threads.com/@zuck"
          },
          "tags": [
            "url"
          ]
        },
        {
          "name": "profile URL with a trailing slash",
          "params": {
            "handle": "https://www.threads.com/@zuck/"
          },
          "tags": [
            "url"
          ]
        },
        {
          "name": "bare host and a language query",
          "params": {
            "handle": "https://threads.com/@zuck?hl=es"
          },
          "tags": [
            "url",
            "query"
          ]
        },
        {
          "name": "legacy threads.net host",
          "params": {
            "handle": "https://www.threads.net/@zuck"
          },
          "tags": [
            "url",
            "legacy_host"
          ]
        },
        {
          "name": "replies tab",
          "params": {
            "handle": "https://www.threads.com/@zuck/replies"
          },
          "tags": [
            "url",
            "tab"
          ]
        },
        {
          "name": "reposts tab",
          "params": {
            "handle": "https://www.threads.com/@zuck/reposts/"
          },
          "tags": [
            "url",
            "tab"
          ]
        },
        {
          "name": "media tab",
          "params": {
            "handle": "https://www.threads.com/@zuck/media"
          },
          "tags": [
            "url",
            "tab"
          ]
        },
        {
          "name": "percent-encoded @",
          "params": {
            "handle": "https://www.threads.com/%40zuck"
          },
          "tags": [
            "url",
            "encoded"
          ]
        },
        {
          "name": "numeric account id",
          "params": {
            "handle": "63055343223"
          },
          "tags": [
            "id"
          ]
        },
        {
          "name": "brand with bio links",
          "params": {
            "handle": "trendspider"
          },
          "tags": [
            "handle",
            "links"
          ]
        },
        {
          "name": "several titled bio links",
          "params": {
            "handle": "spotify"
          },
          "tags": [
            "handle",
            "links"
          ]
        },
        {
          "name": "unverified official account",
          "params": {
            "handle": "instagram"
          },
          "tags": [
            "handle",
            "unverified",
            "official"
          ]
        },
        {
          "name": "account that does not exist",
          "params": {
            "handle": "no_such_user_zz9plq"
          },
          "tags": [
            "not_found"
          ]
        },
        {
          "name": "an id Threads cannot resolve",
          "params": {
            "handle": "99999999999"
          },
          "tags": [
            "id",
            "not_found"
          ]
        },
        {
          "name": "a post link is refused",
          "params": {
            "handle": "https://www.threads.com/@zuck/post/DeZtp-TkQHh"
          },
          "tags": [
            "invalid"
          ]
        },
        {
          "name": "the login page is refused",
          "params": {
            "handle": "https://www.threads.com/login"
          },
          "tags": [
            "invalid"
          ]
        },
        {
          "name": "a followers path is refused",
          "params": {
            "handle": "https://www.threads.com/@zuck/followers"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "tiktok.comments",
      "platform": "tiktok",
      "name": "comments",
      "resource": "comment",
      "list": {
        "page_max": 50,
        "cursor_ttl_s": 86400,
        "order": "TikTok's comment ranking (the order its app shows)"
      },
      "path": "/v1/tiktok/comments",
      "method": "GET",
      "operation_id": "tiktok.comments.list",
      "status": "beta",
      "title": "TikTok Comments API",
      "summary": "Top-level comments of a TikTok video",
      "description": "Returns the public top-level comments of a TikTok video or photo post, a page at a time, in TikTok's own ranking: text, exact posting time, exact like and reply counts, the commenter's username, name, ID and verified badge, the comment's language, and whether it is pinned, liked by the creator or written by the creator. Follow page.next_cursor for more. Accepts tiktok.com video and photo links, mobile, embed and player URLs, vm./vt./t/ share links, or a numeric video ID.",
      "use_cases": [
        "Track audience sentiment on your videos and competitors'",
        "Find questions and purchase intent in comments",
        "Measure engagement beyond likes and views",
        "Build datasets of public comments for research"
      ],
      "notes": [
        "TikTok ranks comments itself and has no newest-first order, so since and until are not offered; published_at is exact for filtering on your side.",
        "Pages can hold fewer comments than limit while more follow, and TikTok repeats some comments across the first pages of a busy video: deduplicate by id.",
        "Replies are not included; metrics.reply_count says how many a comment has.",
        "Private videos and videos with comments turned off return private_or_unavailable; deleted videos return not_found, though TikTok keeps serving the comments of some deleted videos, which are then returned."
      ],
      "faq": [],
      "keywords": [
        "tiktok comments api",
        "tiktok comment scraper",
        "tiktok comments export",
        "tiktok comments json"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "TikTok video or photo post URL (tiktok.com/@user/video/<id>, /@user/photo/<id>, m.tiktok.com/v/<id>.html, embed and player URLs, vm.tiktok.com/<code>, vt.tiktok.com/<code>, tiktok.com/t/<code>) or a numeric video ID.",
          "example": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
          "max_length": 2048
        }
      ],
      "sources": [
        "api"
      ],
      "pricing": [
        {
          "kind": "api",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7336370956674203653~tplv-tiktokx-cropcenter:100:100.jpg?dr=9640&refresh_token=8c568077&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=30310797&shcp=ff37627b&idc=useast5",
                "display_name": "flamigoo",
                "id": "6650133637952618502",
                "is_verified": false,
                "url": "https://www.tiktok.com/@flamigo_kisses",
                "username": "flamigo_kisses"
              },
              "edited_at": null,
              "id": "6718335906996502534",
              "is_by_post_author": false,
              "is_edited": null,
              "is_liked_by_author": false,
              "is_pinned": false,
              "metrics": {
                "like_count": 166,
                "reply_count": 49
              },
              "parent_id": null,
              "platform": "tiktok",
              "platform_specific": {
                "tiktok": {
                  "language": null
                }
              },
              "post_id": "6718335390845095173",
              "published_at": "2019-07-27T13:34:35Z",
              "text": "ok ;)\nodoreta\nhave fun~\n(it's a Serbian name)",
              "unknown_fields": [],
              "url": "https://m.tiktok.com/v/6718335390845095173.html?share_comment_id=6718335906996502534&share_item_id=6718335390845095173"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7331407432645509126~tplv-tiktokx-cropcenter:100:100.jpg?dr=9640&refresh_token=0687ce2b&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=30310797&shcp=ff37627b&idc=useast5",
                "display_name": "vsco_room_xx",
                "id": "6718326650415203333",
                "is_verified": false,
                "url": "https://www.tiktok.com/@vsco_room_xx",
                "username": "vsco_room_xx"
              },
              "edited_at": null,
              "id": "6722043930156417030",
              "is_by_post_author": false,
              "is_edited": null,
              "is_liked_by_author": false,
              "is_pinned": false,
              "metrics": {
                "like_count": 53,
                "reply_count": 44
              },
              "parent_id": null,
              "platform": "tiktok",
              "platform_specific": {
                "tiktok": {
                  "language": null
                }
              },
              "post_id": "6718335390845095173",
              "published_at": "2019-08-06T13:23:37Z",
              "text": "srii good luck",
              "unknown_fields": [],
              "url": "https://m.tiktok.com/v/6718335390845095173.html?share_comment_id=6722043930156417030&share_item_id=6718335390845095173"
            },
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7328085019259748357~tplv-tiktokx-cropcenter:100:100.jpg?dr=9640&refresh_token=50158ea6&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=30310797&shcp=ff37627b&idc=useast5",
                "display_name": "Quit",
                "id": "6627564337508761605",
                "is_verified": false,
                "url": "https://www.tiktok.com/@pretzelsticks0",
                "username": "pretzelsticks0"
              },
              "edited_at": null,
              "id": "6718336105873702917",
              "is_by_post_author": false,
              "is_edited": null,
              "is_liked_by_author": true,
              "is_pinned": false,
              "metrics": {
                "like_count": 345,
                "reply_count": 20
              },
              "parent_id": null,
              "platform": "tiktok",
              "platform_specific": {
                "tiktok": {
                  "language": null
                }
              },
              "post_id": "6718335390845095173",
              "published_at": "2019-07-27T13:35:22Z",
              "text": "Well it’s pretty easy...and obvious 😂 hlysa",
              "unknown_fields": [],
              "url": "https://m.tiktok.com/v/6718335390845095173.html?share_comment_id=6718336105873702917&share_item_id=6718335390845095173"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "tiktok",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "6718335390845095173",
              "url": "https://www.tiktok.com/@/video/6718335390845095173"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "comments of a 2019 pet video, walked three pages",
          "params": {
            "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
          },
          "tags": [
            "video_url",
            "walk"
          ]
        },
        {
          "name": "pinned comment by a verified account",
          "params": {
            "limit": "10",
            "url": "https://www.tiktok.com/@hankgreen1/video/7047596209028074758?is_from_webapp=1&sender_device=pc"
          },
          "tags": [
            "pinned",
            "verified",
            "query_params"
          ]
        },
        {
          "name": "photo post, French comments",
          "params": {
            "url": "https://www.tiktok.com/@chinoir07/photo/7693183838452731168"
          },
          "tags": [
            "photo",
            "non_english"
          ]
        },
        {
          "name": "share link",
          "params": {
            "url": "https://www.tiktok.com/t/ZSgAbqM38/"
          },
          "tags": [
            "share_link"
          ]
        },
        {
          "name": "private video",
          "params": {
            "url": "https://www.tiktok.com/@leenabhushan/video/6748451240264420610"
          },
          "tags": [
            "private"
          ]
        },
        {
          "name": "deleted video",
          "params": {
            "url": "https://www.tiktok.com/@moxypatch/video/7206382937372134662"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "profile link",
          "params": {
            "url": "https://www.tiktok.com/@scout2015"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video",
        "post"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "tiktok.post",
      "platform": "tiktok",
      "name": "post",
      "resource": "post",
      "list": null,
      "path": "/v1/tiktok/post",
      "method": "GET",
      "operation_id": "tiktok.post.get",
      "status": "beta",
      "title": "TikTok Post API",
      "summary": "TikTok video or photo post with media and metrics",
      "description": "Returns a public TikTok video or photo post: caption, hashtags, tagged accounts, author, publish time, a cookie-free video link or every slideshow photo, cover, sound, tagged place, ad and AI labels, and view, like, comment, share and save counts, from a post or share link or a numeric ID.",
      "use_cases": [
        "Track engagement on creator and brand videos",
        "Monitor competitors' campaigns and ads",
        "Collect captions, hashtags and sounds for trend research"
      ],
      "notes": [
        "TikTok rounds large like and view counts (see approximate_fields); comments, shares and saves are exact.",
        "If the video page fails, the embed page answers without saves, language, location, AI label and sound length (partial_data warning).",
        "is_sponsored marks TikTok ads only (else null): paid partnerships are not public."
      ],
      "faq": [],
      "keywords": [
        "tiktok video api",
        "tiktok post scraper",
        "tiktok video downloader api",
        "tiktok likes and views api",
        "tiktok slideshow api"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "TikTok video or photo post link (web, mobile, embed or share link) or a numeric post ID.",
          "example": "https://www.tiktok.com/@niinoclock/video/7673108027645414678",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
        },
        "response": {
          "data": {
            "approximate_fields": [
              "duration_ms",
              "media[].duration_ms",
              "metrics.view_count"
            ],
            "author": {
              "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/4cbe05e194623e3f19aef975d9fdf26c~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=1a7ec680&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
              "display_name": "Scout, Suki & Stella",
              "id": "53279706535428096",
              "is_verified": true,
              "url": "https://www.tiktok.com/@scout2015",
              "username": "scout2015"
            },
            "coauthors": [],
            "duration_ms": 10000,
            "hashtags": [
              "foryoupage",
              "petsoftiktok",
              "aesthetic"
            ],
            "id": "6718335390845095173",
            "is_nsfw": false,
            "is_pinned": null,
            "is_sponsored": null,
            "language": "en",
            "media": [
              {
                "alt_text": null,
                "duration_ms": 10000,
                "expires_at": "2026-10-25T18:00:00Z",
                "height": 1024,
                "thumbnail_url": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-p-0068/2367c7d45cf54a1397abd0e72bf22eac~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
                "type": "video",
                "url": "https://v19.tiktokcdn-us.com/SCRUBBED/f2a52380/video/tos/useast5/tos-useast5-ve-0068c002-tx/15fbafb086324317bf77a649580b1f95/?a=1233&bti=ODszNWYuMDE6&&bt=2389&ft=aEKfuqT0mIoPD12Qd0iI3wUM0_AbMeF~O5&mime_type=video_mp4&rc=ODw1Z2gzZ2Q1ODo4aGdnZUBpM245aWhvZ3U4bjMzZzczM0AzNWA1MWJiNWEx…",
                "width": 576
              }
            ],
            "mentions": [],
            "metrics": {
              "comment_count": 5716,
              "like_count": 35200,
              "quote_count": null,
              "repost_count": null,
              "save_count": 649,
              "share_count": 1518,
              "view_count": 159700
            },
            "platform": "tiktok",
            "platform_specific": {
              "tiktok": {
                "author_sec_uid": "MS4wLjABAAAAPZWNdkF_cmVSPCvV0Y6MCsH29mlAOlMOX3ikzGvlfMm3K6OMZv-JrRImpEHxdIMI",
                "country_code": "US",
                "is_ad": false,
                "is_ai_generated": false,
                "location": null,
                "music": {
                  "author_name": "tiff",
                  "cover_url": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/62c59c8c91226b51c36d2338519eb63e~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=ae9b518c&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                  "duration_ms": 10000,
                  "id": "6689804660171082501",
                  "is_original": true,
                  "play_url": "https://v19.tiktokcdn-us.com/SCRUBBED/f2a52380/video/tos/useast5/tos-useast5-v-27dcd7-tx/fdec9588d6684e7d97da29739b9d0abf/?a=1233&bti=ODszNWYuMDE6&&bt=125&ft=GSDrKInz7ThMDnRGXq8Zmo&mime_type=audio_mpeg&rc=am48ZmQ6ZnFxNzMzNzU8M0Bpam48ZmQ6ZnFxNzMzNzU8M0BpNWRhcjRfaGBgLS1kMTZzYSNpNWR…",
                  "title": "original sound"
                }
              }
            },
            "platform_type": "video",
            "published_at": "2019-07-27T13:32:38Z",
            "text": "Scramble up ur name & I’ll try to guess it😍❤️ #foryoupage #petsoftiktok #aesthetic",
            "thumbnail_url": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-p-0068/2367c7d45cf54a1397abd0e72bf22eac~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
            "title": null,
            "type": "video",
            "unknown_fields": [
              "coauthors"
            ],
            "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "tiktok",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "6718335390845095173",
              "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "8 min cooking video (niinoclock)",
          "params": {
            "url": "https://www.tiktok.com/@niinoclock/video/7673108027645414678"
          },
          "tags": [
            "video",
            "long",
            "english"
          ]
        },
        {
          "name": "verified account, numeric post ID (scout2015)",
          "params": {
            "url": "6718335390845095173"
          },
          "tags": [
            "raw_id",
            "verified"
          ]
        },
        {
          "name": "photo post with a tagged account (French)",
          "params": {
            "url": "https://www.tiktok.com/@chinoir07/photo/7693183838452731168"
          },
          "tags": [
            "photo",
            "non_english",
            "mention"
          ]
        },
        {
          "name": "share link vt.tiktok.com",
          "params": {
            "url": "https://vt.tiktok.com/ZSgfdCHHq"
          },
          "tags": [
            "share_link"
          ]
        },
        {
          "name": "TikTok ad with a location tag",
          "params": {
            "url": "https://www.tiktok.com/@/video/7693940691843435790"
          },
          "tags": [
            "ad",
            "location"
          ]
        },
        {
          "name": "deleted video",
          "params": {
            "url": "https://www.tiktok.com/@denidil6/video/7065799023130643713"
          },
          "tags": [
            "deleted",
            "expected_error"
          ]
        },
        {
          "name": "private video",
          "params": {
            "url": "https://www.tiktok.com/@leenabhushan/video/6748451240264420610"
          },
          "tags": [
            "private",
            "expected_error"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video",
        "post"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "tiktok.posts",
      "platform": "tiktok",
      "name": "posts",
      "resource": "post",
      "list": {
        "page_max": 15,
        "cursor_ttl_s": 86400,
        "order": "newest first"
      },
      "path": "/v1/tiktok/posts",
      "method": "GET",
      "operation_id": "tiktok.posts.list",
      "status": "beta",
      "title": "TikTok Posts API",
      "summary": "A public TikTok account's videos and photo posts",
      "description": "Returns a TikTok account's public videos and photo posts, newest first, with caption, hashtags, mentions, publish time, duration, cover, photos and engagement counts.",
      "use_cases": [
        "Monitor an account's new posts since a date",
        "Benchmark engagement across accounts",
        "Build datasets of an account's TikTok content"
      ],
      "notes": [
        "Large play, like, comment and share counts are rounded by TikTok (see approximate_fields).",
        "media[].url is null for videos: TikTok serves video files only with its player's cookie.",
        "If TikTok's list is down, the first page lists the latest posts from its embed profile, with fewer fields."
      ],
      "faq": [],
      "keywords": [
        "tiktok posts api",
        "tiktok user videos api",
        "tiktok profile videos api",
        "tiktok videos scraper",
        "tiktok account posts json"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "TikTok username with or without the @, a profile URL (tiktok.com/@nasa) or a numeric user ID.",
          "example": "nasa",
          "max_length": 2048
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "@khaby.lame"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [
                "metrics.view_count",
                "metrics.like_count",
                "metrics.share_count"
              ],
              "author": {
                "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=07918010&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                "display_name": "Khabane lame",
                "id": "127905465618821121",
                "is_verified": true,
                "url": "https://www.tiktok.com/@khaby.lame",
                "username": "khaby.lame"
              },
              "coauthors": [],
              "duration_ms": 9000,
              "hashtags": [
                "learnfromkhaby",
                "comedy"
              ],
              "id": "7697307919943060767",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": "en",
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 9000,
                  "expires_at": null,
                  "height": 1280,
                  "thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oQbHQmFfa5VY3NlkEGDAQT00RzqAqBOETlEafj~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
                  "type": "video",
                  "url": null,
                  "width": 720
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 7503,
                "like_count": 305900,
                "quote_count": null,
                "repost_count": null,
                "save_count": 16282,
                "share_count": 32600,
                "view_count": 4600000
              },
              "platform": "tiktok",
              "platform_specific": {
                "tiktok": {
                  "author_sec_uid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
                  "country_code": null,
                  "is_ad": false,
                  "is_ai_generated": true,
                  "location": null,
                  "music": {
                    "author_name": "Khabane lame",
                    "cover_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=07918010&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                    "duration_ms": 9000,
                    "id": "7697308007327730462",
                    "is_original": true,
                    "play_url": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-v-27dcd7-tx2/oEEIAbfkyMVIeCnAjGGKYI9gqpqTImLAAfYo09/?a=1988&bti=ODszNWYuMDE6&&bt=125&ft=GcAInInz7Th~v-RGXq8Zmo&mime_type=audio_mpeg&rc=M2lybXI5cnE4ZTMzaTU8NEBpM2lybXI5cnE4ZTMzaTU8NEBxYG5tMmRrNjZhLS1kMTJzYSNxYG5t…",
                    "title": "original sound"
                  }
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-16T16:46:21Z",
              "text": "I guess is time to retire #learnfromkhaby #comedy 🥊",
              "thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oQbHQmFfa5VY3NlkEGDAQT00RzqAqBOETlEafj~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
              "title": null,
              "type": "video",
              "unknown_fields": [],
              "url": "https://www.tiktok.com/@khaby.lame/video/7697307919943060767"
            },
            {
              "approximate_fields": [
                "metrics.view_count",
                "metrics.like_count",
                "metrics.comment_count"
              ],
              "author": {
                "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=07918010&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                "display_name": "Khabane lame",
                "id": "127905465618821121",
                "is_verified": true,
                "url": "https://www.tiktok.com/@khaby.lame",
                "username": "khaby.lame"
              },
              "coauthors": [],
              "duration_ms": 30000,
              "hashtags": [
                "learnfromkhaby",
                "comedy"
              ],
              "id": "7694335322922044703",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": "en",
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 30000,
                  "expires_at": null,
                  "height": 1280,
                  "thumbnail_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/osAHzWAIipBAxVMie5CIDqxK0ArEREAAEKVSfn~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
                  "type": "video",
                  "url": null,
                  "width": 720
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 12600,
                "like_count": 690100,
                "quote_count": null,
                "repost_count": null,
                "save_count": 40145,
                "share_count": 20800,
                "view_count": 6900000
              },
              "platform": "tiktok",
              "platform_specific": {
                "tiktok": {
                  "author_sec_uid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
                  "country_code": null,
                  "is_ad": false,
                  "is_ai_generated": true,
                  "location": null,
                  "music": {
                    "author_name": "Khabane lame",
                    "cover_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=07918010&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                    "duration_ms": 30000,
                    "id": "7694335437137087262",
                    "is_original": true,
                    "play_url": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-v-27dcd7-tx2/o4fHr3qIArT5AEXEiCLVExDGAeqCAIOVe4joPR/?a=1988&bti=ODszNWYuMDE6&&bt=125&ft=GcAInInz7Th~v-RGXq8Zmo&mime_type=audio_mpeg&rc=M3lzeG45cm92ZTMzaTU8NEBpM3lzeG45cm92ZTMzaTU8NEBzNGtiMmRjXjBhLS1kMTJzYSNzNGti…",
                    "title": "original sound"
                  }
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-08T16:31:16Z",
              "text": "Was the ball out, or was it just my imagination? 🤨#learnfromkhaby #comedy",
              "thumbnail_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/osAHzWAIipBAxVMie5CIDqxK0ArEREAAEKVSfn~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
              "title": null,
              "type": "video",
              "unknown_fields": [],
              "url": "https://www.tiktok.com/@khaby.lame/video/7694335322922044703"
            },
            {
              "approximate_fields": [
                "metrics.view_count",
                "metrics.like_count",
                "metrics.share_count"
              ],
              "author": {
                "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=07918010&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                "display_name": "Khabane lame",
                "id": "127905465618821121",
                "is_verified": true,
                "url": "https://www.tiktok.com/@khaby.lame",
                "username": "khaby.lame"
              },
              "coauthors": [],
              "duration_ms": 34000,
              "hashtags": [
                "learnfromkhaby",
                "comedy"
              ],
              "id": "7691740195418377502",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": "en",
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 34000,
                  "expires_at": null,
                  "height": 1280,
                  "thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/o0jRDQRMAbfFAlZX8eqGQcARBqerRfAHR7gVSU~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
                  "type": "video",
                  "url": null,
                  "width": 720
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": 7325,
                "like_count": 418500,
                "quote_count": null,
                "repost_count": null,
                "save_count": 20087,
                "share_count": 23900,
                "view_count": 5000000
              },
              "platform": "tiktok",
              "platform_specific": {
                "tiktok": {
                  "author_sec_uid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
                  "country_code": null,
                  "is_ad": false,
                  "is_ai_generated": true,
                  "location": null,
                  "music": {
                    "author_name": "Khabane lame",
                    "cover_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=07918010&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
                    "duration_ms": 34000,
                    "id": "7691740326570019615",
                    "is_original": true,
                    "play_url": "https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-v-27dcd7-tx2/ogcDFBGWoU0A8F0eIAAREf8XVjvDqICFsEDJAo/?a=1988&bti=ODszNWYuMDE6&&bt=125&ft=GcAInInz7Th~v-RGXq8Zmo&mime_type=audio_mpeg&rc=M3hmanQ5cjg7ZDMzaTU8NEBpM3hmanQ5cjg7ZDMzaTU8NEBjMGgyMmRzbnNhLS1kMTJzYSNjMGgy…",
                    "title": "original sound"
                  }
                }
              },
              "platform_type": "video",
              "published_at": "2026-10-01T16:40:54Z",
              "text": "Just give me 5 more minutes 😭#learnfromkhaby #comedy",
              "thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/o0jRDQRMAbfFAlZX8eqGQcARBqerRfAHR7gVSU~tplv-tiktokx-origin.image?dr=9636&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
              "title": null,
              "type": "video",
              "unknown_fields": [],
              "url": "https://www.tiktok.com/@khaby.lame/video/7691740195418377502"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "tiktok",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "127905465618821121",
              "url": "https://www.tiktok.com/@khaby.lame"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "NASA's posts, three pages",
          "params": {
            "handle": "nasa"
          },
          "tags": [
            "organization",
            "handle",
            "walk"
          ]
        },
        {
          "name": "Creator by @username",
          "params": {
            "handle": "@khaby.lame"
          },
          "tags": [
            "creator",
            "at_handle"
          ]
        },
        {
          "name": "Business account by profile URL, five posts",
          "params": {
            "handle": "https://www.tiktok.com/@duolingo",
            "limit": "5"
          },
          "tags": [
            "business",
            "url",
            "limit"
          ]
        },
        {
          "name": "By numeric user ID",
          "params": {
            "handle": "6737188750352401410"
          },
          "tags": [
            "raw_id"
          ]
        },
        {
          "name": "since ends the walk at once (future date)",
          "params": {
            "handle": "nasa",
            "since": "2099-01-01"
          },
          "tags": [
            "since",
            "empty_page"
          ]
        },
        {
          "name": "Account that does not exist",
          "params": {
            "handle": "zzq9x81nouser"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "Video link is refused",
          "params": {
            "handle": "https://www.tiktok.com/@nasa/video/7665075736742530317"
          },
          "tags": [
            "invalid"
          ]
        },
        {
          "name": "garbage cursor",
          "params": {
            "cursor": "c1.bogus",
            "handle": "nasa"
          },
          "tags": [
            "cursor"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "since",
        "until",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "tiktok.profile",
      "platform": "tiktok",
      "name": "profile",
      "resource": "profile",
      "list": null,
      "path": "/v1/tiktok/profile",
      "method": "GET",
      "operation_id": "tiktok.profile.get",
      "status": "beta",
      "title": "TikTok Profile API",
      "summary": "Public TikTok profile and follower counts",
      "description": "Returns a public TikTok account: user ID, username, display name, bio, bio link, avatar, verification badge, whether the account is private, its business category, join date and exact follower, following, video and total like counts. Accepts a username with or without the @, a tiktok.com profile URL, or a numeric user ID.",
      "use_cases": [
        "Track creator growth over time",
        "Vet influencers before a campaign",
        "Enrich CRM or lead lists with TikTok accounts",
        "Resolve a post author's ID to a full profile"
      ],
      "notes": [
        "Private accounts return their profile with is_private true; their videos are not public.",
        "type is organization for accounts TikTok marks as organizations and unknown otherwise: TikTok does not label people.",
        "category is set only for business accounts. location, country_code, banner_url and metrics.total_view_count are always null: public TikTok profiles do not show them.",
        "When the profile page is unavailable the answer comes from TikTok's embed profile: follower and like counts are then rounded (listed in approximate_fields), the join date, category, type and video count are null, and external_links is [] listed in unknown_fields (the embed does not show the bio link).",
        "Share links (vm.tiktok.com) are not accepted: pass the username or the profile URL."
      ],
      "faq": [],
      "keywords": [
        "tiktok profile api",
        "tiktok follower count api",
        "tiktok user info api",
        "tiktok profile scraper"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "TikTok username with or without the @ (nasa, @nasa), a profile URL (tiktok.com/@nasa, m.tiktok.com/@nasa, with or without query parameters), or a numeric user ID (tiktok.com/share/user/<id> or the bare ID). Usernames are case-insensitive.",
          "example": "nasa",
          "max_length": 2048
        }
      ],
      "sources": [
        "page"
      ],
      "pricing": [
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "https://www.tiktok.com/@nasa"
        },
        "response": {
          "data": {
            "approximate_fields": [],
            "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e5143212a59c09a008bf50f487d54d1f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=9341391e&x-expires=4070908800&x-signature=SCRUBBED&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
            "banner_url": null,
            "bio": "Making the seemingly impossible, possible.✨",
            "category": null,
            "country_code": null,
            "created_at": "2026-07-20T15:55:49Z",
            "display_name": "NASA",
            "external_links": [
              {
                "title": null,
                "url": "https://science.nasa.gov/feature/artemis-ii-preliminary-lunar-science-report"
              }
            ],
            "id": "7664638705177150477",
            "is_private": false,
            "is_verified": true,
            "location": null,
            "metrics": {
              "follower_count": 2140425,
              "following_count": 23,
              "post_count": 60,
              "total_like_count": 11385816,
              "total_view_count": null
            },
            "platform": "tiktok",
            "platform_specific": {},
            "type": "organization",
            "unknown_fields": [],
            "url": "https://www.tiktok.com/@nasa",
            "username": "nasa"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "tiktok",
            "source": "page",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "7664638705177150477",
              "url": "https://www.tiktok.com/@nasa"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": false
      },
      "canaries": [
        {
          "name": "NASA by username",
          "params": {
            "handle": "nasa"
          },
          "tags": [
            "organization",
            "handle"
          ]
        },
        {
          "name": "Creator by @username",
          "params": {
            "handle": "@khaby.lame"
          },
          "tags": [
            "creator",
            "at_handle"
          ]
        },
        {
          "name": "Business account by profile URL",
          "params": {
            "handle": "https://www.tiktok.com/@duolingo"
          },
          "tags": [
            "business",
            "url"
          ]
        },
        {
          "name": "By numeric user ID",
          "params": {
            "handle": "6737188750352401410"
          },
          "tags": [
            "raw_id"
          ]
        },
        {
          "name": "Account that does not exist",
          "params": {
            "handle": "zzq9x81nouser"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "Video link is refused",
          "params": {
            "handle": "https://www.tiktok.com/@nasa/video/7665075736742530317"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "tiktok.transcript",
      "platform": "tiktok",
      "name": "transcript",
      "resource": "transcript",
      "list": null,
      "path": "/v1/tiktok/transcript",
      "method": "GET",
      "operation_id": "tiktok.transcript.get",
      "status": "beta",
      "title": "TikTok Transcript API",
      "summary": "TikTok video transcript",
      "description": "Returns the timed transcript of a public TikTok video: creator-edited captions, TikTok's auto-captions, or TikTok's own translation when you ask for another language with lang. Videos without any caption track are transcribed from their audio with speech-to-text. Accepts tiktok.com video, mobile, embed and vm./vt./t/ share links, or a numeric video ID.",
      "use_cases": [
        "Analyze what creators say at scale",
        "Track brand and product mentions in videos",
        "Feed short-form video into LLM pipelines",
        "Caption and translate TikTok content"
      ],
      "notes": [
        "Photo posts have no audio track and return no_transcript.",
        "Videos with licensed music and no speech may transcribe the song lyrics."
      ],
      "faq": [],
      "keywords": [
        "tiktok captions api",
        "tiktok subtitles api",
        "tiktok transcript scraper"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "TikTok video URL (tiktok.com/@user/video/<id>, m.tiktok.com/v/<id>.html, vm.tiktok.com/<code>, vt.tiktok.com/<code>, tiktok.com/t/<code>, embed URLs) or a numeric video ID.",
          "example": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
          "max_length": 2048
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Selects the caption track (TikTok also offers its own translations); falls back to the video's original language, then any track. TikTok's three-letter codes (eng-US) work too.",
          "example": "en",
          "format": "bcp47",
          "vocabulary": "lang"
        }
      ],
      "sources": [
        "captions",
        "asr"
      ],
      "pricing": [
        {
          "kind": "captions",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "asr",
          "credits": 2,
          "per": 2,
          "unit": {
            "id": "media_minute",
            "name": "started minute of media",
            "plural": "started minutes of media",
            "max": 60
          },
          "max": 122,
          "label": "2 credits + 2 per started minute of media"
        }
      ],
      "min_credits": 1,
      "max_credits": 122,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "no_transcript",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "7673108027645414678"
        },
        "response": {
          "data": {
            "available_languages": [
              "en"
            ],
            "duration_ms": 495000,
            "id": "7673108027645414678",
            "is_auto_generated": false,
            "language": "en",
            "platform": "tiktok",
            "platform_specific": {},
            "segments": [
              {
                "end_ms": 4820,
                "start_ms": 100,
                "text": "Let me show you how to make a Japanese cream stew!"
              },
              {
                "end_ms": 8380,
                "start_ms": 4821,
                "text": "I think there is a way to definitely make it from scratch,"
              },
              {
                "end_ms": 13120,
                "start_ms": 8381,
                "text": "but most Japanese people buy the stock for the cream stew."
              }
            ],
            "source": "captions",
            "text": "Let me show you how to make a Japanese cream stew! I think there is a way to definitely make it from scratch, but most Japanese people buy the stock for the cream stew. If you go to a Japanese supermarket, you can find this next to or near where the curry stock cubes are. This is…",
            "url": "https://www.tiktok.com/@niinoclock/video/7673108027645414678"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "tiktok",
            "source": "captions",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 668,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "7673108027645414678",
              "url": "https://www.tiktok.com/@niinoclock/video/7673108027645414678"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "en creator captions",
          "params": {
            "url": "https://www.tiktok.com/@hankgreen1/video/7047596209028074758"
          },
          "tags": [
            "creator_captions"
          ]
        },
        {
          "name": "fr auto-captions",
          "params": {
            "url": "https://www.tiktok.com/@elan.media_/video/7663447693913509152"
          },
          "tags": [
            "non_english",
            "auto_captions"
          ]
        },
        {
          "name": "lang=en translation of a fr video",
          "params": {
            "lang": "en",
            "url": "https://www.tiktok.com/@elan.media_/video/7663447693913509152"
          },
          "tags": [
            "lang",
            "translation"
          ]
        },
        {
          "name": "long video, raw id",
          "params": {
            "url": "7673108027645414678"
          },
          "tags": [
            "long",
            "raw_id"
          ]
        },
        {
          "name": "es creator captions via embed URL",
          "params": {
            "url": "https://www.tiktok.com/embed/v2/7691047892483656974"
          },
          "tags": [
            "embed_url",
            "non_english"
          ]
        },
        {
          "name": "never existed",
          "params": {
            "url": "7000000000000000001"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "invalid input",
          "params": {
            "url": "https://www.tiktok.com/@hankgreen1"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": {
        "requests": 112,
        "success_rate": 0.9911,
        "p50_ms": 668,
        "p95_ms": 2705
      },
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video",
        "post"
      ],
      "accepted_params": [
        "url",
        "lang",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "youtube.comments",
      "platform": "youtube",
      "name": "comments",
      "resource": "comment",
      "list": {
        "page_max": 20,
        "cursor_ttl_s": 3600,
        "order": "newest first",
        "orders": {
          "newest": "newest first",
          "popular": "YouTube's Top comments ranking"
        }
      },
      "path": "/v1/youtube/comments",
      "method": "GET",
      "operation_id": "youtube.comments.list",
      "status": "beta",
      "title": "YouTube Comments API",
      "summary": "Top-level comments of a YouTube video",
      "description": "Returns the public top-level comments of a YouTube video, short or live replay, a page at a time: text, author handle and channel, posting time, likes, reply count, and whether the comment is pinned, hearted, edited or written by the creator. Sort newest first (the default, which also supports since and until) or by YouTube's Top ranking, and follow page.next_cursor for more. Accepts every YouTube URL form or a bare 11-character video ID.",
      "use_cases": [
        "Track audience sentiment on your videos and competitors'",
        "Monitor new comments since a date",
        "Find questions and feedback to answer",
        "Build datasets of public comments for research"
      ],
      "notes": [
        "YouTube shows comment times as relative labels (\"3 weeks ago\"): published_at is the latest time the label allows and is listed in approximate_fields, so since and until are approximate to the label's unit.",
        "Like and reply counts above a thousand are rounded by YouTube (\"4.8K\") and listed in approximate_fields.",
        "Comments show the author's @handle; author.display_name is null.",
        "The newest order includes comments YouTube's Top ranking holds back as potential spam.",
        "Videos with comments turned off and private videos return private_or_unavailable; deleted videos return not_found.",
        "Replies are not included; metrics.reply_count says how many a comment has."
      ],
      "faq": [],
      "keywords": [
        "youtube comments api",
        "youtube comment scraper",
        "youtube comments export",
        "youtube comments json"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "YouTube video URL (watch, youtu.be, shorts, live, embed, m./music. hosts) or an 11-character video ID.",
          "example": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
          "max_length": 2048
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "Order of the results. newest (default): newest first. popular: YouTube's Top comments ranking. Either way the video's pinned comment comes first.",
          "enum": [
            "newest",
            "popular"
          ],
          "default": "newest",
          "vocabulary": "sort"
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Compared with published_at, which YouTube only shows as a relative label (\"2 days ago\"): the walk stops at the first comment whose label is older, so comments up to one label unit older can be included.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        }
      ],
      "sources": [
        "api"
      ],
      "pricing": [
        {
          "kind": "api",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "sort": "newest",
          "url": "jNQXAC9IVRw"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [
                "published_at",
                "metrics.like_count",
                "metrics.reply_count"
              ],
              "author": {
                "avatar_url": "https://yt3.ggpht.com/i8RqA9tYqbbnOi4mlnYEY7IR3kXAoDqQbM_5Sfzw7OjTubiGsOaTdlrIZmj-I0q0Vup68eqs=s88-c-k-c0x00ffffff-no-rj",
                "display_name": null,
                "id": "UCC5NfQ6Mf0dq_eEwv4P_hWA",
                "is_verified": true,
                "url": "https://www.youtube.com/channel/UCC5NfQ6Mf0dq_eEwv4P_hWA",
                "username": "SanDiegoZoo"
              },
              "edited_at": null,
              "id": "UgzuC3zzpRZkjc5Qzsd4AaABAg",
              "is_by_post_author": false,
              "is_edited": false,
              "is_liked_by_author": true,
              "is_pinned": true,
              "metrics": {
                "like_count": 4800000,
                "reply_count": 1000
              },
              "parent_id": null,
              "platform": "youtube",
              "platform_specific": {},
              "post_id": "jNQXAC9IVRw",
              "published_at": "2020-10-26T18:59:19Z",
              "text": "We're so honored that the first ever YouTube video was filmed here!",
              "unknown_fields": [],
              "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw&lc=UgzuC3zzpRZkjc5Qzsd4AaABAg"
            },
            {
              "approximate_fields": [
                "published_at"
              ],
              "author": {
                "avatar_url": "https://yt3.ggpht.com/U9zdJRwdpo6WwsenxMf6AyMyRMBTWoKsyAWCnJXdbPbNKh-YNEWP3AQRgFto91lckyGCBYENnaw=s88-c-k-c0x00ffffff-no-rj",
                "display_name": null,
                "id": "UCjoZE_5A9tO470CK3G6U7dg",
                "is_verified": false,
                "url": "https://www.youtube.com/channel/UCjoZE_5A9tO470CK3G6U7dg",
                "username": "CTwGary"
              },
              "edited_at": null,
              "id": "UgxHbErLhWMUy5GlFnp4AaABAg",
              "is_by_post_author": false,
              "is_edited": false,
              "is_liked_by_author": false,
              "is_pinned": false,
              "metrics": {
                "like_count": 0,
                "reply_count": 0
              },
              "parent_id": null,
              "platform": "youtube",
              "platform_specific": {},
              "post_id": "jNQXAC9IVRw",
              "published_at": "2026-10-26T18:58:19Z",
              "text": "I can’t believe it, but it’s 21 years old now",
              "unknown_fields": [],
              "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw&lc=UgxHbErLhWMUy5GlFnp4AaABAg"
            },
            {
              "approximate_fields": [
                "published_at"
              ],
              "author": {
                "avatar_url": "https://yt3.ggpht.com/Ar50xvd1O4GCXVttK6DgX0Y0cuhBl2b_HUFQjh-gajKbmS-qjuNAHOT5fw_RX_DS5gzfphkcKAI=s88-c-k-c0x00ffffff-no-rj",
                "display_name": null,
                "id": "UCFgjcRO4y8XFQL7E8_TcLlg",
                "is_verified": false,
                "url": "https://www.youtube.com/channel/UCFgjcRO4y8XFQL7E8_TcLlg",
                "username": "Nihal-poke"
              },
              "edited_at": null,
              "id": "UgzLOxwwIAUe0jUI4RR4AaABAg",
              "is_by_post_author": false,
              "is_edited": false,
              "is_liked_by_author": false,
              "is_pinned": false,
              "metrics": {
                "like_count": 0,
                "reply_count": 0
              },
              "parent_id": null,
              "platform": "youtube",
              "platform_specific": {},
              "post_id": "jNQXAC9IVRw",
              "published_at": "2026-10-26T18:58:19Z",
              "text": "I watch this video many times 😭",
              "unknown_fields": [],
              "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw&lc=UgzLOxwwIAUe0jUI4RR4AaABAg"
            }
          ],
          "page": {
            "has_more": true,
            "next_cursor": "c1.EXAMPLE_CURSOR",
            "next_cursor_expires_at": "2026-10-26T12:00:00Z",
            "end_reason": null
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "youtube",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "jNQXAC9IVRw",
              "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "newest comments of the first YouTube video",
          "params": {
            "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
          },
          "tags": [
            "newest",
            "watch_url",
            "constants:youtube.innertube_web"
          ]
        },
        {
          "name": "top comments via youtu.be",
          "params": {
            "sort": "popular",
            "url": "https://youtu.be/dQw4w9WgXcQ?si=canary"
          },
          "tags": [
            "popular",
            "share_link"
          ]
        },
        {
          "name": "short, limit below the page size",
          "params": {
            "limit": "5",
            "url": "https://www.youtube.com/shorts/3cWm9B_0_kI"
          },
          "tags": [
            "short",
            "limit"
          ]
        },
        {
          "name": "since ends the walk at once (future date)",
          "params": {
            "since": "2099-01-01",
            "url": "jNQXAC9IVRw"
          },
          "tags": [
            "since",
            "empty_page"
          ]
        },
        {
          "name": "comments turned off (made for kids)",
          "params": {
            "url": "https://www.youtube.com/watch?v=XqZsoesa55w"
          },
          "tags": [
            "comments_off",
            "private"
          ]
        },
        {
          "name": "deleted video",
          "params": {
            "url": "Q39EVAstoRM"
          },
          "tags": [
            "deleted",
            "raw_id"
          ]
        },
        {
          "name": "garbage cursor",
          "params": {
            "cursor": "c1.bogus",
            "url": "jNQXAC9IVRw"
          },
          "tags": [
            "cursor"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "sort",
        "since",
        "until",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "youtube.post",
      "platform": "youtube",
      "name": "post",
      "resource": "post",
      "list": null,
      "path": "/v1/youtube/post",
      "method": "GET",
      "operation_id": "youtube.post.get",
      "status": "beta",
      "title": "YouTube Video API",
      "summary": "YouTube video, short or live stream with exact counts",
      "description": "Returns a public YouTube video, short or live stream: title, description with its hashtags and links, the exact publish time, duration, thumbnail, the channel and any collaborating channels, exact view, like and comment counts, and YouTube's category, tags, chapters and live stream times. Accepts every YouTube video URL form or a bare video ID.",
      "use_cases": [
        "Track views, likes and comments on videos and shorts over time",
        "Enrich video links with titles, channels and thumbnails",
        "Monitor competitors' uploads and launches",
        "Collect tags, chapters and descriptions for content research"
      ],
      "notes": [
        "platform_type is short, live (streams and premieres) or video.",
        "Age-restricted and paid videos are returned with their public details.",
        "media[0].url is null: YouTube's stream links only work from the IP that requested them."
      ],
      "faq": [],
      "keywords": [
        "youtube video api",
        "youtube video details api",
        "youtube shorts api",
        "youtube views likes api",
        "youtube video metadata scraper"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "YouTube video, short or live stream URL (watch, youtu.be, shorts, live, embed; m. and music. hosts) or an 11-character video ID.",
          "example": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
          "max_length": 2048
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "api",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "page",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "https://youtube.com/shorts/3cWm9B_0_kI?feature=share"
        },
        "response": {
          "data": {
            "approximate_fields": [
              "platform_specific.youtube.author_subscriber_count"
            ],
            "author": {
              "avatar_url": "https://yt3.ggpht.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s176-c-k-c0x00ffffff-no-rj",
              "display_name": "MrBeast",
              "id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
              "is_verified": true,
              "url": "https://www.youtube.com/@MrBeast",
              "username": "MrBeast"
            },
            "coauthors": [],
            "duration_ms": 20000,
            "hashtags": [],
            "id": "3cWm9B_0_kI",
            "is_nsfw": false,
            "is_pinned": null,
            "is_sponsored": null,
            "language": null,
            "media": [
              {
                "alt_text": null,
                "duration_ms": 20000,
                "expires_at": null,
                "height": null,
                "thumbnail_url": "https://i.ytimg.com/vi/3cWm9B_0_kI/maxresdefault.jpg?sqp=-oaymwEoCIAKENAF8quKqQMcGADwAQH4AbYIgAKAD4oCDAgAEAEYRiBlKA8wDw==&rs=AOn4CLD2HeSN5ZikYi7hBi3SC7913d9CWQ",
                "type": "video",
                "url": null,
                "width": null
              }
            ],
            "mentions": [],
            "metrics": {
              "comment_count": 37974,
              "like_count": 13520602,
              "quote_count": null,
              "repost_count": null,
              "save_count": null,
              "share_count": null,
              "view_count": 731918538
            },
            "platform": "youtube",
            "platform_specific": {
              "youtube": {
                "author_subscriber_count": 524000000,
                "category": "Entertainment",
                "chapters": [],
                "description_links": [],
                "is_age_restricted": false,
                "is_live_now": false,
                "is_paywalled": false,
                "is_unlisted": false,
                "keywords": [],
                "live_ended_at": null,
                "live_started_at": null,
                "scheduled_start_at": null
              }
            },
            "platform_type": "short",
            "published_at": "2024-12-27T19:00:00Z",
            "text": null,
            "thumbnail_url": "https://i.ytimg.com/vi/3cWm9B_0_kI/maxresdefault.jpg?sqp=-oaymwEoCIAKENAF8quKqQMcGADwAQH4AbYIgAKAD4oCDAgAEAEYRiBlKA8wDw==&rs=AOn4CLD2HeSN5ZikYi7hBi3SC7913d9CWQ",
            "title": "How Many People To Stop Ronaldo?",
            "type": "video",
            "unknown_fields": [],
            "url": "https://www.youtube.com/shorts/3cWm9B_0_kI"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "youtube",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "3cWm9B_0_kI",
              "url": "https://www.youtube.com/shorts/3cWm9B_0_kI"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": false
      },
      "canaries": [
        {
          "name": "music video by watch URL",
          "params": {
            "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
          },
          "tags": [
            "video",
            "watch_url",
            "constants:youtube.innertube_web"
          ]
        },
        {
          "name": "short by shorts link",
          "params": {
            "url": "https://youtube.com/shorts/3cWm9B_0_kI?feature=share"
          },
          "tags": [
            "short",
            "shorts_url",
            "share_link"
          ]
        },
        {
          "name": "lecture with chapters by video ID",
          "params": {
            "url": "kCc8FmEb1nY"
          },
          "tags": [
            "video",
            "raw_id",
            "chapters",
            "long"
          ]
        },
        {
          "name": "live stream replay by live link",
          "params": {
            "url": "https://www.youtube.com/live/qVv6vCqciTM?si=canary"
          },
          "tags": [
            "live",
            "live_url",
            "non_english"
          ]
        },
        {
          "name": "collaboration of two channels",
          "params": {
            "url": "https://youtu.be/a-iReT6fwVI?si=canary"
          },
          "tags": [
            "collab",
            "share_link"
          ]
        },
        {
          "name": "age-restricted trailer: public details",
          "params": {
            "url": "https://www.youtube.com/watch?v=HtVdAasjOgU"
          },
          "tags": [
            "age_restricted"
          ]
        },
        {
          "name": "private video",
          "params": {
            "url": "https://www.youtube.com/watch?v=yZIXLfi8CZQ"
          },
          "tags": [
            "private"
          ]
        },
        {
          "name": "deleted video",
          "params": {
            "url": "https://youtu.be/Q39EVAstoRM"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "channel link sent to the video endpoint",
          "params": {
            "url": "https://www.youtube.com/@RickAstleyYT"
          },
          "tags": [
            "invalid_input"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "youtube.posts",
      "platform": "youtube",
      "name": "posts",
      "resource": "post",
      "list": {
        "page_max": 48,
        "cursor_ttl_s": 3600,
        "order": "newest first",
        "orders": {
          "newest": "newest first",
          "oldest": "oldest first",
          "popular": "YouTube's Popular order (most viewed first)"
        }
      },
      "path": "/v1/youtube/posts",
      "method": "GET",
      "operation_id": "youtube.posts.list",
      "status": "beta",
      "title": "YouTube Channel Videos API",
      "summary": "A YouTube channel's videos, shorts and live streams",
      "description": "Returns the public uploads of a YouTube channel a page at a time: its videos, shorts or live streams, each with its link, title, thumbnail, length, views and upload time, newest, oldest or most popular first. The newest uploads also carry exact times, view and like counts and descriptions. Accepts a handle, any channel link or a channel ID.",
      "use_cases": [
        "Monitor a channel for new uploads",
        "Export a creator's full video catalog",
        "Find a channel's most viewed videos or shorts",
        "Track live streams and premieres of channels you follow"
      ],
      "notes": [
        "Beyond each tab's newest uploads (up to 15, exact from YouTube's uploads feed), published_at comes from a relative label (the latest time it allows) and views are rounded, both in approximate_fields; text and metrics.like_count are null there, and a non-English title may be YouTube's English translation.",
        "Shorts beyond the newest have no published_at or duration_ms, so since and until are refused with tab=shorts. Streams live now or scheduled have no view count.",
        "A channel without the tab answers an empty page. A tab in a pasted link is ignored: set tab.",
        "The live tab lists upcoming and live streams first, then past streams by when they streamed: with tab=live, since and until filter the streams instead of ending the walk, so it reads further."
      ],
      "faq": [],
      "keywords": [
        "youtube channel videos api",
        "youtube shorts api",
        "youtube channel uploads",
        "youtube live streams api",
        "youtube video list scraper"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "YouTube channel: a handle with or without the @, any channel link (@handle, /channel/UC…, legacy /c/, /user/ and root vanity links, any tab, m. and music. hosts), a bare UC… channel ID, or c/<name>, user/<name>, vanity/<name>.",
          "example": "@MrBeast",
          "max_length": 2048
        },
        {
          "name": "tab",
          "type": "string",
          "required": false,
          "description": "The channel tab to list: videos (default), shorts or live (upcoming, live and past streams).",
          "example": "shorts",
          "enum": [
            "videos",
            "shorts",
            "live"
          ]
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "Order of the results. newest (default), popular (most viewed first) or oldest.",
          "enum": [
            "newest",
            "popular",
            "oldest"
          ],
          "default": "newest",
          "vocabulary": "sort"
        },
        {
          "name": "since",
          "type": "string",
          "required": false,
          "description": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Beyond the newest uploads published_at is approximate (\"3 weeks ago\"): uploads up to one label unit older may be included. Not with tab=shorts.",
          "example": "2026-10-01",
          "format": "date-time",
          "vocabulary": "since"
        },
        {
          "name": "until",
          "type": "string",
          "required": false,
          "description": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Not with tab=shorts.",
          "example": "2026-10-08",
          "format": "date-time",
          "vocabulary": "until"
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "invalid_cursor",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "@jawed"
        },
        "response": {
          "data": [
            {
              "approximate_fields": [],
              "author": {
                "avatar_url": "https://yt3.googleusercontent.com/uI3VE4PVqvCy0xnWLqMJnEzyBUm3T8VHOCp4ee-1RxdHqKXCdUE_qXYQnpf9AfuEoIPactVyDhM=s900-c-k-c0x00ffffff-no-rj",
                "display_name": "jawed",
                "id": "UC4QobU6STFB0P71PMvOGN5A",
                "is_verified": null,
                "url": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A",
                "username": "jawed"
              },
              "coauthors": [],
              "duration_ms": 19000,
              "hashtags": [],
              "id": "jNQXAC9IVRw",
              "is_nsfw": null,
              "is_pinned": null,
              "is_sponsored": null,
              "language": null,
              "media": [
                {
                  "alt_text": null,
                  "duration_ms": 19000,
                  "expires_at": null,
                  "height": 360,
                  "thumbnail_url": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
                  "type": "video",
                  "url": null,
                  "width": 480
                }
              ],
              "mentions": [],
              "metrics": {
                "comment_count": null,
                "like_count": 20117813,
                "quote_count": null,
                "repost_count": null,
                "save_count": null,
                "share_count": null,
                "view_count": 446865949
              },
              "platform": "youtube",
              "platform_specific": {
                "youtube": {
                  "author_subscriber_count": null,
                  "category": null,
                  "chapters": [],
                  "description_links": [
                    "https://www.youtube.com/watch?v=0PT5c1z3LL8",
                    "https://www.youtube.com/watch?v=RRBN_4L09Mg"
                  ],
                  "is_age_restricted": null,
                  "is_live_now": null,
                  "is_paywalled": null,
                  "is_unlisted": null,
                  "keywords": [],
                  "live_ended_at": null,
                  "live_started_at": null,
                  "scheduled_start_at": null
                }
              },
              "platform_type": "video",
              "published_at": "2005-04-24T03:31:52Z",
              "text": "Microplastics are accumulating in human brains at an alarming rate\nhttps://www.youtube.com/watch?v=0PT5c1z3LL8\n\n“Nanoplastics and Human Health” with Matthew J Campen, PhD, MSPH\nhttps://www.youtube.com/watch?v=RRBN_4L09Mg\n\n00:00 Intro\n00:05 The cool thing\n00:17 End",
              "thumbnail_url": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
              "title": "Me at the zoo",
              "type": "video",
              "unknown_fields": [
                "coauthors",
                "platform_specific.youtube.keywords",
                "platform_specific.youtube.chapters"
              ],
              "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
            }
          ],
          "page": {
            "has_more": false,
            "next_cursor": null,
            "next_cursor_expires_at": null,
            "end_reason": "end"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "youtube",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "UC4QobU6STFB0P71PMvOGN5A",
              "url": "https://www.youtube.com/@jawed"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": false
      },
      "canaries": [
        {
          "name": "newest videos of a big channel, walked",
          "params": {
            "handle": "@MrBeast"
          },
          "tags": [
            "newest",
            "handle",
            "constants:youtube.innertube_web",
            "constants:youtube.channel_tabs"
          ]
        },
        {
          "name": "shorts of a channel link",
          "params": {
            "handle": "https://www.youtube.com/@MrBeast/shorts",
            "tab": "shorts"
          },
          "tags": [
            "shorts",
            "url",
            "constants:youtube.channel_tabs"
          ]
        },
        {
          "name": "live streams by channel ID",
          "params": {
            "handle": "UCLA_DiR1FfKNvjuUpBHmylQ",
            "tab": "live"
          },
          "tags": [
            "live",
            "raw_id"
          ]
        },
        {
          "name": "most popular videos",
          "params": {
            "handle": "NASA",
            "sort": "popular"
          },
          "tags": [
            "popular",
            "handle"
          ]
        },
        {
          "name": "oldest videos first",
          "params": {
            "handle": "https://www.youtube.com/@RickAstleyYT/videos",
            "sort": "oldest"
          },
          "tags": [
            "oldest",
            "url"
          ]
        },
        {
          "name": "a channel with a single video",
          "params": {
            "handle": "@jawed"
          },
          "tags": [
            "small",
            "end"
          ]
        },
        {
          "name": "since ends the walk at once (future date)",
          "params": {
            "handle": "@MrBeast",
            "since": "2099-01-01"
          },
          "tags": [
            "since",
            "empty_page"
          ]
        },
        {
          "name": "a channel that never streamed",
          "params": {
            "handle": "@MrBeast",
            "tab": "live"
          },
          "tags": [
            "no_tab",
            "empty_page"
          ]
        },
        {
          "name": "unknown channel ID",
          "params": {
            "handle": "UCX6OQ3DkcsbYNE6H8uQQuVB"
          },
          "tags": [
            "not_found",
            "raw_id"
          ]
        },
        {
          "name": "unknown handle",
          "params": {
            "handle": "@this-handle-does-not-exist-9x"
          },
          "tags": [
            "not_found",
            "handle"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "tab",
        "sort",
        "since",
        "until",
        "max_age",
        "fields",
        "limit",
        "cursor"
      ]
    },
    {
      "id": "youtube.profile",
      "platform": "youtube",
      "name": "profile",
      "resource": "profile",
      "list": null,
      "path": "/v1/youtube/profile",
      "method": "GET",
      "operation_id": "youtube.profile.get",
      "status": "beta",
      "title": "YouTube Channel API",
      "summary": "Public YouTube channel profile and subscriber count",
      "description": "Returns a public YouTube channel: channel ID, handle, name, description, keywords, avatar, banner, verification badge, country, join date, the links on its About panel with their labels, and its subscriber count with exact video and lifetime view counts. Accepts a handle with or without the @, any channel link with any tab (@handle, /channel/UC…, the legacy /c/, /user/ and root vanity links), or a bare channel ID.",
      "use_cases": [
        "Track channel growth over time",
        "Vet creators before a sponsorship",
        "Enrich lead lists with a creator's other social links",
        "Resolve a video's channel ID to a full profile"
      ],
      "notes": [
        "metrics.follower_count is the subscriber count YouTube shows, rounded for display (listed in approximate_fields); null when the channel hides it. Video and view counts are exact; both are null for a channel without public videos.",
        "created_at is the start of the US Pacific day YouTube shows as the join date, in UTC: the channel was created within the following day (listed in approximate_fields).",
        "location is the country the owner set, as YouTube names it; country_code its ISO code.",
        "is_verified is true for the check mark and for an Official Artist Channel's note badge. YouTube's built-in channels (Music, Sports, Gaming, News, Learning, Live, Fashion & Beauty, Shopping) have no badge or banner (null); all but Music have no About panel, so they answer what their header shows.",
        "A bare string is a handle, even one shaped like a video ID: send a channel link or the UC… ID to be unambiguous. Links to youtube.com pages that are not channels answer not_found or invalid_input.",
        "metrics.following_count and metrics.total_like_count are always null and type is unknown: YouTube does not show them. Business email addresses are behind a sign-in and are not returned.",
        "Terminated and unknown channels answer not_found."
      ],
      "faq": [],
      "keywords": [
        "youtube channel api",
        "youtube subscriber count api",
        "youtube channel info api",
        "youtube profile scraper",
        "youtube channel id lookup"
      ],
      "params": [
        {
          "name": "handle",
          "type": "string",
          "required": true,
          "description": "YouTube channel: a handle with or without the @ (NASA, @NASA), any channel link (youtube.com/@NASA, youtube.com/channel/UC…, the legacy youtube.com/c/<name>, youtube.com/user/<name> and youtube.com/<name> links, with any tab or view after them such as /videos, /playlists, /posts or /about, and m. or music. hosts), a bare UC… channel ID, or c/<name>, user/<name> or vanity/<name>. Handles are case-insensitive. A bare string is always a handle, even one shaped like a video ID.",
          "example": "@NASA",
          "max_length": 2048
        }
      ],
      "sources": [
        "api",
        "page"
      ],
      "pricing": [
        {
          "kind": "",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        }
      ],
      "min_credits": 1,
      "max_credits": 1,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "handle": "@NASA"
        },
        "response": {
          "data": {
            "approximate_fields": [
              "created_at",
              "metrics.follower_count"
            ],
            "avatar_url": "https://yt3.googleusercontent.com/eIf5fNPcIcj9ig-wZBeq4stFy1lgjWTW1nLT5dYlFkHZprZ03QBiMcbpwNMB6XSBjrSFGtAGQg=s900-c-k-c0x00ffffff-no-rj",
            "banner_url": "https://yt3.googleusercontent.com/y8Srh-oCcilLvBO8jAPI546m1bn0puA5DIvQiBZ1cSxc_rZfKxKSFlTCtoCQCtB6viUf1NGsaQ=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
            "bio": "NASA's mission is to pioneer the future in space exploration, scientific discovery, and aeronautics research.\n\nTo do that, we have worked around the world—and off it—for more than 60 years, searching for answers to fundamental questions about our place in the universe. We're expl…",
            "category": null,
            "country_code": null,
            "created_at": "2008-06-03T07:00:00Z",
            "display_name": "NASA",
            "external_links": [
              {
                "title": "nasa.gov",
                "url": "https://www.nasa.gov"
              },
              {
                "title": "X",
                "url": "https://x.com/nasa"
              },
              {
                "title": "Facebook",
                "url": "https://www.facebook.com/NASA"
              }
            ],
            "id": "UCLA_DiR1FfKNvjuUpBHmylQ",
            "is_private": false,
            "is_verified": true,
            "location": null,
            "metrics": {
              "follower_count": 15100000,
              "following_count": null,
              "post_count": 6194,
              "total_like_count": null,
              "total_view_count": 1132473139
            },
            "platform": "youtube",
            "platform_specific": {
              "youtube": {
                "is_business_email_listed": null,
                "is_official_artist_channel": false,
                "is_subscriber_count_hidden": false,
                "keywords": [
                  "nasa",
                  "space",
                  "iss"
                ]
              }
            },
            "type": "unknown",
            "unknown_fields": [],
            "url": "https://www.youtube.com/@NASA",
            "username": "NASA"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "youtube",
            "source": "api",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 0,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "profile",
              "id": "UCLA_DiR1FfKNvjuUpBHmylQ",
              "url": "https://www.youtube.com/@NASA"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "NASA by @handle",
          "params": {
            "handle": "@NASA"
          },
          "tags": [
            "at_handle",
            "verified",
            "display_text",
            "constants:youtube.innertube_web",
            "constants:youtube.channel_about"
          ]
        },
        {
          "name": "MrBeast by a channel tab URL, with country",
          "params": {
            "handle": "https://www.youtube.com/@MrBeast/videos"
          },
          "tags": [
            "url",
            "tab",
            "country",
            "large_counts"
          ]
        },
        {
          "name": "By channel ID",
          "params": {
            "handle": "UCMCgOm8GZkHp8zJ6l7_hIuA"
          },
          "tags": [
            "raw_id",
            "non_english"
          ]
        },
        {
          "name": "Root vanity link",
          "params": {
            "handle": "https://www.youtube.com/pewdiepie"
          },
          "tags": [
            "vanity",
            "url"
          ]
        },
        {
          "name": "Legacy /user/ link, hidden subscriber count",
          "params": {
            "handle": "https://www.youtube.com/user/RickAstleyVEVO"
          },
          "tags": [
            "legacy_user",
            "hidden_count"
          ]
        },
        {
          "name": "Old vanity name redirected to its handle",
          "params": {
            "handle": "@hikakintv"
          },
          "tags": [
            "redirect",
            "non_english"
          ]
        },
        {
          "name": "YouTube's built-in Sports channel",
          "params": {
            "handle": "UCEgdi0XIXXZ-qJOFPf4JSKw"
          },
          "tags": [
            "builtin",
            "special"
          ]
        },
        {
          "name": "YouTube's built-in News channel by its root link",
          "params": {
            "handle": "https://www.youtube.com/news"
          },
          "tags": [
            "builtin",
            "special",
            "vanity"
          ]
        },
        {
          "name": "Channel YouTube says is not available (youtube.com/tv)",
          "params": {
            "handle": "https://www.youtube.com/tv"
          },
          "tags": [
            "unavailable",
            "private"
          ]
        },
        {
          "name": "A channel ID YouTube merged into another",
          "params": {
            "handle": "UCzucOGEnILK5cAdUUVCIefg"
          },
          "tags": [
            "moved",
            "raw_id"
          ]
        },
        {
          "name": "Terminated channel",
          "params": {
            "handle": "UCvsye7V9psc-APX6wV1twLg"
          },
          "tags": [
            "terminated",
            "deleted"
          ]
        },
        {
          "name": "Handle that does not exist",
          "params": {
            "handle": "@thishandledoesnotexist987654zz"
          },
          "tags": [
            "deleted"
          ]
        },
        {
          "name": "Video link is refused",
          "params": {
            "handle": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
          },
          "tags": [
            "invalid"
          ]
        }
      ],
      "stats": null,
      "lifecycle": null,
      "identity": "handle",
      "accepts": [
        "profile"
      ],
      "accepted_params": [
        "handle",
        "max_age",
        "fields"
      ]
    },
    {
      "id": "youtube.transcript",
      "platform": "youtube",
      "name": "transcript",
      "resource": "transcript",
      "list": null,
      "path": "/v1/youtube/transcript",
      "method": "GET",
      "operation_id": "youtube.transcript.get",
      "status": "beta",
      "title": "YouTube Transcript API",
      "summary": "YouTube video transcript",
      "description": "Returns the timed transcript of a public YouTube video, short or live replay: the creator's manual captions when they exist, otherwise YouTube's auto-generated track, in the language you ask for. Videos without any caption track are transcribed from their audio with speech-to-text. Accepts every YouTube URL form (watch, youtu.be, shorts, live, embed, music.) or a bare 11-character video ID.",
      "use_cases": [
        "Summarize or search video content with LLMs",
        "Build subtitle and translation tools",
        "Index a channel's back catalog for RAG",
        "Repurpose videos into articles and posts"
      ],
      "notes": [
        "Manual captions are preferred over auto-generated ones; is_auto_generated tells you which you got.",
        "Private, members-only, rental and age-restricted videos return private_or_unavailable."
      ],
      "faq": [],
      "keywords": [
        "youtube captions api",
        "youtube subtitles api",
        "youtube transcript scraper"
      ],
      "params": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "YouTube video URL (watch, youtu.be, shorts, live, embed, m./music. hosts) or an 11-character video ID.",
          "example": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
          "max_length": 2048
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Selects the caption track; a manual track is preferred over an auto-generated one. Default: the video's original-language manual track, else its auto-generated track.",
          "example": "en",
          "format": "bcp47",
          "vocabulary": "lang"
        }
      ],
      "sources": [
        "captions",
        "asr"
      ],
      "pricing": [
        {
          "kind": "captions",
          "credits": 1,
          "per": 0,
          "unit": null,
          "max": 1,
          "label": "1 credit"
        },
        {
          "kind": "asr",
          "credits": 2,
          "per": 2,
          "unit": {
            "id": "media_minute",
            "name": "started minute of media",
            "plural": "started minutes of media",
            "max": 60
          },
          "max": 122,
          "label": "2 credits + 2 per started minute of media"
        }
      ],
      "min_credits": 1,
      "max_credits": 122,
      "errors": [
        "invalid_input",
        "unauthorized",
        "forbidden",
        "insufficient_credits",
        "spend_limit_reached",
        "rate_limited",
        "not_found",
        "private_or_unavailable",
        "no_transcript",
        "upstream_blocked",
        "upstream_error",
        "overloaded",
        "internal"
      ],
      "example": {
        "params": {
          "url": "dQw4w9WgXcQ"
        },
        "response": {
          "data": {
            "available_languages": [
              "en",
              "de-DE",
              "ja"
            ],
            "duration_ms": 213000,
            "id": "dQw4w9WgXcQ",
            "is_auto_generated": false,
            "language": "en",
            "platform": "youtube",
            "platform_specific": {},
            "segments": [
              {
                "end_ms": 3040,
                "start_ms": 1360,
                "text": "[♪♪♪]"
              },
              {
                "end_ms": 21880,
                "start_ms": 18640,
                "text": "♪ We're no strangers to love ♪"
              },
              {
                "end_ms": 26960,
                "start_ms": 22640,
                "text": "♪ You know the rules and so do I ♪"
              }
            ],
            "source": "captions",
            "text": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ♪ A full commitment's what I'm thinking of ♪ ♪ You wouldn't get this from any other guy ♪ ♪ I just wanna tell you how I'm feeling ♪ ♪ Gotta make you understand ♪ ♪ Never gonna give you up ♪ ♪ Never gonna let …",
            "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
          },
          "meta": {
            "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
            "platform": "youtube",
            "source": "captions",
            "is_cached": false,
            "credits_charged": 1,
            "latency_ms": 511,
            "fetched_at": "2026-10-25T12:00:00Z",
            "input": {
              "kind": "video",
              "id": "dQw4w9WgXcQ",
              "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            },
            "credits_remaining": 9999,
            "client_request_id": null,
            "warnings": [],
            "mode": "live"
          }
        },
        "truncated": true
      },
      "canaries": [
        {
          "name": "manual en captions (watch url)",
          "params": {
            "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
          },
          "tags": [
            "short",
            "manual",
            "constants:youtube.innertube_android"
          ]
        },
        {
          "name": "first youtube video via youtu.be",
          "params": {
            "url": "https://youtu.be/jNQXAC9IVRw"
          },
          "tags": [
            "short",
            "share_link"
          ]
        },
        {
          "name": "long lecture, auto-generated only (raw id)",
          "params": {
            "url": "kCc8FmEb1nY"
          },
          "tags": [
            "long",
            "auto_generated",
            "raw_id",
            "constants:youtube.innertube_ios"
          ]
        },
        {
          "name": "TED talk lang selection",
          "params": {
            "lang": "pt-BR",
            "url": "https://www.youtube.com/watch?v=iG9CE55wbtY"
          },
          "tags": [
            "multi_language",
            "lang",
            "non_english"
          ]
        },
        {
          "name": "requested language not offered",
          "params": {
            "lang": "fr",
            "url": "jNQXAC9IVRw"
          },
          "tags": [
            "no_transcript",
            "lang"
          ]
        },
        {
          "name": "private video",
          "params": {
            "url": "yZIXLfi8CZQ"
          },
          "tags": [
            "private"
          ]
        },
        {
          "name": "video that never existed",
          "params": {
            "url": "Q39EVAstoRM"
          },
          "tags": [
            "deleted"
          ]
        }
      ],
      "stats": {
        "requests": 29,
        "success_rate": 0.9655,
        "p50_ms": 511,
        "p95_ms": 989
      },
      "lifecycle": null,
      "identity": "url",
      "accepts": [
        "video"
      ],
      "accepted_params": [
        "url",
        "lang",
        "max_age",
        "fields"
      ]
    }
  ],
  "errors": [
    {
      "code": "invalid_input",
      "status": 400,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The request parameters are missing or malformed, or the URL is not a supported link for this endpoint.",
      "remediation": "Fix the parameter named in param (the message says how); for a link of the wrong kind, call the endpoint the message names.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#invalid_input",
      "details": [
        {
          "name": "suggestion",
          "type": "string",
          "doc": "For an unknown parameter: the accepted parameter it most likely means; absent when nothing is close."
        },
        {
          "name": "accepted_params",
          "type": "string[]",
          "doc": "For an unknown parameter: every query parameter this endpoint accepts."
        },
        {
          "name": "url_kind",
          "type": "string",
          "doc": "For a link of the wrong kind: what the link points to (profile, video, post, …)."
        },
        {
          "name": "url_platform",
          "type": "string",
          "doc": "For a link of the wrong kind: the platform the link belongs to."
        },
        {
          "name": "accepted_url_kinds",
          "type": "string[]",
          "doc": "For a link of the wrong kind: the kinds of link this endpoint takes."
        },
        {
          "name": "endpoints",
          "type": "string[]",
          "doc": "For a link of the wrong kind: IDs of the endpoints that take it; empty when none does yet."
        },
        {
          "name": "fields",
          "type": "string[]",
          "doc": "For an unknown fields path: every path fields accepts on this endpoint."
        }
      ]
    },
    {
      "code": "invalid_cursor",
      "status": 400,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The cursor is malformed, expired, belongs to another endpoint, or the other parameters differ from the request that issued it.",
      "remediation": "Repeat the original request without cursor to start the list again.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#invalid_cursor",
      "details": [
        {
          "name": "reason",
          "type": "string",
          "doc": "Why: malformed, expired, wrong_endpoint, params_changed or pin_lost (the upstream exit a cursor-bound list was pinned to is gone; new values may be added)."
        }
      ]
    },
    {
      "code": "unauthorized",
      "status": 401,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The x-api-key header is missing, unknown or revoked (or, on the dashboard's routes, the session cookie is missing or expired).",
      "remediation": "Send a valid API key in the x-api-key header; without one, get a key at details.signup_url (AI agents: POST details.agent_signup_url).",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#unauthorized",
      "details": [
        {
          "name": "signup_url",
          "type": "string",
          "doc": "Where a human gets an API key (self-serve signup)."
        },
        {
          "name": "agent_signup_url",
          "type": "string",
          "doc": "POST an email address here to get a test key at once and a live key once the human confirms."
        }
      ]
    },
    {
      "code": "forbidden",
      "status": 403,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The API key is valid but may not make this request: its account is suspended, its scopes do not include the route, it is waiting for its owner's email confirmation, it is past its expiry, or the request came from an IP its allowlist does not include. A running job stops the same way when its account is suspended or the key that created it is revoked or expires. It is about the key, never the item (a private item is private_or_unavailable, also 403): branch on the code.",
      "remediation": "Do what details.reason says: if suspended, contact support; otherwise use a key whose scopes cover the route (details.required_scope), have the owner confirm the emailed link, create a new key, or call from an allowed IP.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#forbidden",
      "details": [
        {
          "name": "reason",
          "type": "string",
          "doc": "Why: suspended (an operator suspended the account), scope (the key lacks details.required_scope), key_pending (an agent signup's live key before its owner confirms), key_expired, key_revoked (a job's creating key was revoked while it ran), ip_not_allowed, test_mode (a test key asked for something live, such as a live key) or csrf (a dashboard request from another site). New values may be added."
        },
        {
          "name": "required_scope",
          "type": "string",
          "doc": "For reason scope: the scope the route needs (endpoints, jobs, account:read or admin)."
        }
      ]
    },
    {
      "code": "insufficient_credits",
      "status": 402,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The account does not have enough credits for this request.",
      "remediation": "Buy credits (a human pays: details.purchase_url, or details.checkout makes a checkout link), then repeat the request; do not retry automatically.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#insufficient_credits",
      "details": [
        {
          "name": "credits_required",
          "type": "integer",
          "doc": "Credits this request needed at the point it stopped (to start, or to finish a longer item)."
        },
        {
          "name": "credits_available",
          "type": "integer",
          "doc": "Credits the account could spend at that moment (in-flight requests hold part of the balance)."
        },
        {
          "name": "max_credits",
          "type": "integer",
          "doc": "For a job's item: the job's max_credits, when that cap (not the balance) stopped the item."
        },
        {
          "name": "purchase_url",
          "type": "string",
          "doc": "Where a human buys credits (the dashboard); absent when a job's max_credits, not the balance, stopped it."
        },
        {
          "name": "checkout",
          "type": "object",
          "doc": "The API call that makes a checkout link for a human to pay: {method, path (an absolute URL), packs (the pack IDs its body's pack takes)}."
        }
      ]
    },
    {
      "code": "spend_limit_reached",
      "status": 402,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The API key reached its spend limit for the current period; the account may still have credits.",
      "remediation": "Wait until details.resets_at or raise the key's spend limit (PATCH /v1/api_keys/{id}); do not retry automatically.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#spend_limit_reached",
      "details": [
        {
          "name": "api_key_id",
          "type": "string",
          "doc": "The key whose limit was reached."
        },
        {
          "name": "spend_limit",
          "type": "integer",
          "doc": "The limit: most credits the key may spend per interval."
        },
        {
          "name": "interval",
          "type": "string",
          "doc": "day or month (UTC calendar)."
        },
        {
          "name": "used",
          "type": "integer",
          "doc": "Credits the key spent this interval, plus what its requests in flight hold."
        },
        {
          "name": "credits_required",
          "type": "integer",
          "doc": "Credits this request needed."
        },
        {
          "name": "resets_at",
          "type": "string",
          "doc": "When the interval ends and the limit is free again, RFC 3339 UTC."
        }
      ]
    },
    {
      "code": "rate_limited",
      "status": 429,
      "retryable": true,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": true,
      "reserved": false,
      "description": "The account exceeded its runaway-protection ceiling: plans do not limit request rate, but a high per-account safety ceiling stops broken client loops. Support raises it on request. Without an API key (signup, the MCP server's tool listing and find_endpoint), requests are limited per IP address instead.",
      "remediation": "Wait for the number of seconds in the retry-after header, then retry; ask support to raise the ceiling if your sustained traffic needs more (calls without an API key: use one).",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#rate_limited",
      "details": [
        {
          "name": "retry_after",
          "type": "integer",
          "doc": "Seconds to wait before retrying; equals the retry-after header."
        }
      ]
    },
    {
      "code": "method_not_allowed",
      "status": 405,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The endpoint exists but does not accept this HTTP method.",
      "remediation": "Use the method in the allow header (GET for every data endpoint).",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#method_not_allowed",
      "details": []
    },
    {
      "code": "endpoint_retired",
      "status": 410,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The endpoint passed its sunset date and no longer answers.",
      "remediation": "Call the replacement endpoint (details.replacement); the changelog describes the migration.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#endpoint_retired",
      "details": [
        {
          "name": "sunset_at",
          "type": "string",
          "doc": "When the endpoint stopped answering, RFC 3339 UTC."
        },
        {
          "name": "replacement",
          "type": "string",
          "doc": "ID of the endpoint to use instead; absent when there is none."
        }
      ]
    },
    {
      "code": "idempotency_key_reused",
      "status": 422,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "The Idempotency-Key was already used with a different request (another route, or another body).",
      "remediation": "Send a new Idempotency-Key for a different request; reuse a key only to retry the identical request.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#idempotency_key_reused",
      "details": []
    },
    {
      "code": "idempotency_key_in_progress",
      "status": 409,
      "retryable": true,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": true,
      "reserved": false,
      "description": "A request with this Idempotency-Key is still running.",
      "remediation": "Retry after the number of seconds in the retry-after header to get that request's result.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#idempotency_key_in_progress",
      "details": [
        {
          "name": "retry_after",
          "type": "integer",
          "doc": "Seconds to wait before retrying; equals the retry-after header."
        }
      ]
    },
    {
      "code": "job_not_found",
      "status": 404,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "No job with this ID exists for the account: unknown, or past its retention.",
      "remediation": "Check the job ID; finished jobs are kept for a limited time.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#job_not_found",
      "details": []
    },
    {
      "code": "unknown_endpoint",
      "status": 404,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": true,
      "retry_after": false,
      "reserved": false,
      "description": "No endpoint or route has this path: a typo, a platform that does not have this endpoint yet, or a path that is not part of the API. Nothing was fetched or charged.",
      "remediation": "Call the path in details.suggestion when it is set (it is the one the path most likely means), or pick one of details.endpoints; do not retry the same path.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#unknown_endpoint",
      "details": [
        {
          "name": "suggestion",
          "type": "string",
          "doc": "The endpoint path this one most likely means; absent when nothing is close."
        },
        {
          "name": "endpoints",
          "type": "string[]",
          "doc": "Every public data endpoint's path."
        }
      ]
    },
    {
      "code": "not_found",
      "status": 404,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The item does not exist or was deleted.",
      "remediation": "Check the URL or ID; do not retry.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#not_found",
      "details": []
    },
    {
      "code": "private_or_unavailable",
      "status": 403,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The item exists but is private, age- or region-gated, or requires a login to view. It shares 403 with forbidden (which is about the key): branch on the code.",
      "remediation": "Only public items can be fetched; do not retry.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#private_or_unavailable",
      "details": []
    },
    {
      "code": "no_transcript",
      "status": 404,
      "retryable": false,
      "upstream_failure": false,
      "failure": false,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The media exists but has no transcript: no caption track and no speech to transcribe.",
      "remediation": "Do not retry; try another language with lang if the platform offers one.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#no_transcript",
      "details": []
    },
    {
      "code": "upstream_blocked",
      "status": 503,
      "retryable": true,
      "upstream_failure": true,
      "failure": true,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The platform refused every attempt.",
      "remediation": "Retry later with backoff; failed requests are free.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#upstream_blocked",
      "details": []
    },
    {
      "code": "upstream_error",
      "status": 502,
      "retryable": true,
      "upstream_failure": true,
      "failure": true,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "The platform failed or returned something unexpected.",
      "remediation": "Retry with backoff; failed requests are free.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#upstream_error",
      "details": []
    },
    {
      "code": "overloaded",
      "status": 503,
      "retryable": true,
      "upstream_failure": false,
      "failure": true,
      "gateway": false,
      "retry_after": true,
      "reserved": false,
      "description": "SocialTap was momentarily at capacity and did not start the request: nothing was fetched or charged.",
      "remediation": "Retry after the number of seconds in the retry-after header; failed requests are free.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#overloaded",
      "details": [
        {
          "name": "retry_after",
          "type": "integer",
          "doc": "Seconds to wait before retrying; equals the retry-after header."
        }
      ]
    },
    {
      "code": "internal",
      "status": 500,
      "retryable": true,
      "upstream_failure": true,
      "failure": true,
      "gateway": false,
      "retry_after": false,
      "reserved": false,
      "description": "Unexpected SocialTap error.",
      "remediation": "Retry with backoff; contact support with the request_id if it persists.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#internal",
      "details": []
    }
  ],
  "headers": [
    {
      "name": "x-request-id",
      "key": "requestId",
      "type": "string",
      "scope": "public",
      "doc": "Unique request ID; include it when contacting support."
    },
    {
      "name": "x-credits-charged",
      "key": "creditsCharged",
      "type": "int",
      "scope": "public",
      "doc": "Credits charged for this request (0 for errors and cache hits)."
    },
    {
      "name": "x-credits-remaining",
      "key": "creditsRemaining",
      "type": "int",
      "scope": "public",
      "doc": "Account balance after this request; for a busy account an estimate that may not yet subtract concurrent requests (about a second of usage), never below the real balance."
    },
    {
      "name": "retry-after",
      "key": "retryAfter",
      "type": "int",
      "scope": "public",
      "doc": "Seconds to wait before retrying; sent only with the codes whose retry_after is set in the error codes list (never on credit errors)."
    },
    {
      "name": "allow",
      "key": "allow",
      "type": "string",
      "scope": "public",
      "doc": "Methods the endpoint accepts (method_not_allowed only)."
    },
    {
      "name": "age",
      "key": "age",
      "type": "int",
      "scope": "public",
      "doc": "Seconds since the data was fetched (cache hits only)."
    },
    {
      "name": "x-client-request-id",
      "key": "clientRequestId",
      "type": "string",
      "scope": "public",
      "doc": "Your x-client-request-id, echoed (also meta.client_request_id)."
    },
    {
      "name": "ratelimit-policy",
      "key": "rateLimitPolicy",
      "type": "string",
      "scope": "public",
      "doc": "The account's runaway-protection ceiling as an IETF RateLimit-Policy field, as enforced: a token bucket of q requests (twice the ceiling in requests per second, at least 10) that refills in w seconds: \"account\";q=<requests>;w=<seconds>. Not a plan limit."
    },
    {
      "name": "ratelimit",
      "key": "rateLimit",
      "type": "string",
      "scope": "public",
      "doc": "What is left of the ceiling (IETF RateLimit field): \"account\";r=<requests that may be sent at once now>;t=<seconds until the bucket is full again>."
    },
    {
      "name": "deprecation",
      "key": "deprecation",
      "type": "string",
      "scope": "public",
      "doc": "RFC 9745: the endpoint is deprecated, as of this date (@<unix seconds>; may be in the future). Also in meta.warnings."
    },
    {
      "name": "sunset",
      "key": "sunset",
      "type": "string",
      "scope": "public",
      "doc": "RFC 8594: when a deprecated endpoint stops answering (HTTP-date); from then on it answers endpoint_retired."
    },
    {
      "name": "link",
      "key": "link",
      "type": "string",
      "scope": "public",
      "doc": "RFC 8288 links: rel=\"next\" is the next page of a list (while page.has_more), the same request with cursor set; rel=\"deprecation\" is a deprecated endpoint's notice."
    },
    {
      "name": "location",
      "key": "location",
      "type": "string",
      "scope": "public",
      "doc": "On 202 answers: the job's URL (GET it, free, for its status)."
    },
    {
      "name": "preference-applied",
      "key": "preferenceApplied",
      "type": "string",
      "scope": "public",
      "doc": "RFC 7240: respond-async when Prefer: respond-async turned the request into a job (202)."
    },
    {
      "name": "idempotent-replayed",
      "key": "idempotentReplayed",
      "type": "bool",
      "scope": "public",
      "doc": "true when the answer replays an earlier request with the same Idempotency-Key (it shows the resource's current state)."
    },
    {
      "name": "x-api-key",
      "key": "apiKey",
      "type": "string",
      "scope": "client_request",
      "doc": "Your API key."
    },
    {
      "name": "authorization",
      "key": "authorization",
      "type": "string",
      "scope": "client_request",
      "doc": "Bearer <your API key>: the same key as x-api-key, in the form most HTTP and MCP clients send (x-api-key wins when both are sent)."
    },
    {
      "name": "x-client-request-id",
      "key": "clientRequestId",
      "type": "string",
      "scope": "client_request",
      "doc": "Your own ID for the request (1–128 printable ASCII characters): echoed back and logged with ours, so support can find a request whose response never reached you."
    },
    {
      "name": "traceparent",
      "key": "traceparent",
      "type": "string",
      "scope": "client_request",
      "doc": "W3C Trace Context of your trace: recorded with the request (its trace ID) so a trace can be matched to ours; SocialTap starts its own trace."
    },
    {
      "name": "idempotency-key",
      "key": "idempotencyKey",
      "type": "string",
      "scope": "client_request",
      "doc": "On any POST: your unique key for the request (1–255 printable ASCII characters; a UUID is ideal), kept 24 hours. Retrying with the same key and body never repeats the work: the answer is the first request's result, in its current state."
    },
    {
      "name": "prefer",
      "key": "prefer",
      "type": "string",
      "scope": "client_request",
      "doc": "RFC 7240. respond-async on any endpoint request runs it as a one-request job: the answer is 202 with the job (Location: its URL) instead of the result."
    },
    {
      "name": "cache-control",
      "key": "cacheControl",
      "type": "string",
      "scope": "client_request",
      "doc": "max-age=N accepts a cached response up to N seconds old, like the max_age parameter (max_age wins when both are sent). Other directives are ignored."
    },
    {
      "name": "webhook-id",
      "key": "webhookId",
      "type": "string",
      "scope": "webhook",
      "doc": "The event ID (evt_…), the same on every retry: deduplicate deliveries on it."
    },
    {
      "name": "webhook-timestamp",
      "key": "webhookTimestamp",
      "type": "int",
      "scope": "webhook",
      "doc": "When this attempt was signed, in Unix seconds: reject deliveries outside your tolerance (replays)."
    },
    {
      "name": "webhook-signature",
      "key": "webhookSignature",
      "type": "string",
      "scope": "webhook",
      "doc": "Space-separated v1,SIGNATURE entries, each the base64 HMAC-SHA256 of webhook-id, webhook-timestamp and the raw body joined by dots, with one active secret (two during a rotation): accept the delivery when one matches."
    }
  ],
  "common_params": [
    {
      "name": "max_age",
      "type": "integer",
      "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh. The Cache-Control: max-age=N request header is equivalent; max_age wins when both are sent.",
      "minimum": 0
    },
    {
      "name": "fields",
      "type": "string",
      "description": "Return only these fields of each item: comma-separated paths in the schema's notation (id,text,metrics.view_count,segments[].text; a parent path keeps the whole object). Unknown paths are rejected. Applied after the cache, so it changes neither the price nor cache hits; page and meta are always returned whole."
    }
  ],
  "list_params": [
    {
      "name": "limit",
      "type": "integer",
      "description": "Items per page, 1 to the endpoint's page size (its default and maximum; larger values are reduced to it). Omit it: every page costs the same, so a smaller limit means more pages to pay for.",
      "minimum": 1
    },
    {
      "name": "cursor",
      "type": "string",
      "description": "page.next_cursor from the previous response. Send the same other parameters; omit to start from the first page."
    }
  ],
  "page_fields": [
    {
      "path": "has_more",
      "type": "boolean",
      "nullable": false,
      "description": "True when another page exists; then next_cursor is set. An empty page with has_more true is not the end."
    },
    {
      "path": "next_cursor",
      "type": "string",
      "nullable": true,
      "description": "Pass as cursor, with the same other parameters, to get the next page; null at the end."
    },
    {
      "path": "next_cursor_expires_at",
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "description": "When next_cursor stops working, RFC 3339 UTC; null at the end. Don't store cursors."
    },
    {
      "path": "end_reason",
      "type": "string",
      "nullable": true,
      "description": "Why there are no more pages; null while has_more is true. end: the list ended, or reached since/until. platform_limit: the platform stops serving further pages although the list goes on. max_pages: SocialTap's cap on pages in one walk. New values may be added. A short or empty page is not the end: only has_more false is.",
      "enum": [
        "end",
        "platform_limit",
        "max_pages"
      ]
    }
  ],
  "meta_fields": [
    {
      "path": "request_id",
      "type": "string",
      "nullable": false,
      "description": "Unique request ID; include it when contacting support."
    },
    {
      "path": "platform",
      "type": "string",
      "nullable": false,
      "description": "Platform ID of the endpoint (youtube, tiktok, …)."
    },
    {
      "path": "source",
      "type": "string",
      "nullable": false,
      "description": "Which upstream strategy produced the data."
    },
    {
      "path": "is_cached",
      "type": "boolean",
      "nullable": false,
      "description": "True when served from the cache (free); see max_age."
    },
    {
      "path": "credits_charged",
      "type": "integer",
      "nullable": false,
      "description": "Credits charged for this request (0 for errors and cache hits)."
    },
    {
      "path": "latency_ms",
      "type": "integer",
      "nullable": false,
      "description": "Time SocialTap spent on the request, in milliseconds."
    },
    {
      "path": "fetched_at",
      "type": "string",
      "format": "date-time",
      "nullable": false,
      "description": "When the data was fetched from the platform, RFC 3339 UTC (older than the request for cache hits)."
    },
    {
      "path": "input",
      "type": "object",
      "nullable": true,
      "description": "What the request's url or handle resolved to: kind, platform ID and canonical URL, so you can confirm what was fetched; null for searches."
    },
    {
      "path": "input.kind",
      "type": "string",
      "nullable": false,
      "description": "What the input points to (profile, video, post, …). New values may be added; treat unknown values as other."
    },
    {
      "path": "input.id",
      "type": "string",
      "nullable": true,
      "description": "Platform-native ID of the item; null when it is only known after the fetch and the request failed."
    },
    {
      "path": "input.url",
      "type": "string",
      "nullable": true,
      "description": "Canonical URL of the item; null when unknown."
    },
    {
      "path": "credits_remaining",
      "type": "integer",
      "nullable": true,
      "description": "Account balance after this request (the x-credits-remaining header); for a busy account an estimate that may not yet subtract concurrent requests (about a second of usage), never below the real balance; null when SocialTap could not read it."
    },
    {
      "path": "client_request_id",
      "type": "string",
      "nullable": true,
      "description": "Your x-client-request-id, echoed; null when you sent none."
    },
    {
      "path": "warnings",
      "type": "object[]",
      "nullable": false,
      "description": "Things to act on that did not fail the request: a deprecated endpoint, partial data. [] when none."
    },
    {
      "path": "warnings[].code",
      "type": "string",
      "nullable": false,
      "description": "Machine-readable warning code (see the warnings list). New codes may be added."
    },
    {
      "path": "warnings[].message",
      "type": "string",
      "nullable": false,
      "description": "What to do about it."
    },
    {
      "path": "warnings[].doc_url",
      "type": "string",
      "nullable": false,
      "description": "Where to read more (the changelog entry, the endpoint's docs)."
    },
    {
      "path": "warnings[].fields",
      "type": "string[]",
      "nullable": false,
      "description": "partial_data: the output fields (catalog paths such as metrics.view_count) that are null or [] because part of the data could not be fetched; absent for other codes."
    },
    {
      "path": "mode",
      "type": "string",
      "nullable": true,
      "description": "live, or test for a test key's answer: a recorded response (fixture), free and deterministic; null when SocialTap could not tell. New values may be added.",
      "enum": [
        "live",
        "test"
      ]
    }
  ],
  "error_fields": [
    {
      "path": "code",
      "type": "string",
      "nullable": false,
      "description": "Machine-readable error code (see the error codes list); stable."
    },
    {
      "path": "message",
      "type": "string",
      "nullable": false,
      "description": "What went wrong and how to fix it, for humans and agents; wording may change."
    },
    {
      "path": "request_id",
      "type": "string",
      "nullable": false,
      "description": "Unique request ID; include it when contacting support."
    },
    {
      "path": "status",
      "type": "integer",
      "nullable": false,
      "description": "The HTTP status of the response, repeated for clients that only see the body."
    },
    {
      "path": "retryable",
      "type": "boolean",
      "nullable": false,
      "description": "True when repeating the same request later may succeed (after details.retry_after when present)."
    },
    {
      "path": "param",
      "type": "string",
      "nullable": true,
      "description": "The query parameter or header the error is about; null when it is not about one input."
    },
    {
      "path": "remediation",
      "type": "string",
      "nullable": false,
      "description": "What to do about this code, one sentence."
    },
    {
      "path": "doc_url",
      "type": "string",
      "nullable": false,
      "description": "URL of this code's documentation."
    },
    {
      "path": "details",
      "type": "object",
      "nullable": false,
      "description": "The code's dynamic values (the error codes list documents each code's keys); {} when none."
    },
    {
      "path": "charged",
      "type": "boolean",
      "nullable": false,
      "description": "Whether the request was charged: always false, failed requests are free."
    }
  ],
  "error_example": {
    "error": {
      "code": "invalid_input",
      "message": "unknown parameter \"username\"; did you mean \"handle\"? This endpoint accepts: handle, max_age, fields.",
      "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
      "status": 400,
      "retryable": false,
      "param": "username",
      "remediation": "Fix the parameter named in param (the message says how); for a link of the wrong kind, call the endpoint the message names.",
      "doc_url": "https://staging-fly.socialtap.dev/docs/errors/#invalid_input",
      "details": {
        "accepted_params": [
          "handle",
          "max_age",
          "fields"
        ],
        "suggestion": "handle"
      },
      "charged": false
    }
  },
  "param_vocabulary": [
    {
      "name": "lang",
      "type": "string",
      "doc": "Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -).",
      "aliases": [
        "hl",
        "lang_code",
        "language",
        "language_code",
        "locale"
      ],
      "lists": false,
      "format": "bcp47",
      "example": "en"
    },
    {
      "name": "country",
      "type": "string",
      "doc": "Region: an ISO 3166-1 alpha-2 country code such as US or BR (case-insensitive).",
      "aliases": [
        "country_code",
        "geo",
        "gl",
        "market",
        "region"
      ],
      "lists": false,
      "format": "iso3166-1-alpha-2",
      "example": "US"
    },
    {
      "name": "sort",
      "type": "string",
      "doc": "Order of the results.",
      "aliases": [
        "order",
        "order_by",
        "orderby",
        "sort_by",
        "sortby"
      ],
      "lists": false,
      "values": [
        "relevance",
        "newest",
        "oldest",
        "popular"
      ]
    },
    {
      "name": "status",
      "type": "string",
      "doc": "Only items that are still running (active), only items that stopped (inactive), or both (all).",
      "aliases": [
        "active",
        "active_status",
        "ad_active_status",
        "state"
      ],
      "lists": false,
      "values": [
        "active",
        "inactive",
        "all"
      ],
      "example": "active"
    },
    {
      "name": "since",
      "type": "string",
      "doc": "Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged.",
      "aliases": [
        "after",
        "date_from",
        "from",
        "from_date",
        "min_date",
        "start",
        "start_date",
        "start_time"
      ],
      "lists": true,
      "format": "date-time",
      "example": "2026-10-01"
    },
    {
      "name": "until",
      "type": "string",
      "doc": "Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
      "aliases": [
        "before",
        "date_to",
        "end",
        "end_date",
        "end_time",
        "max_date",
        "to",
        "to_date"
      ],
      "lists": true,
      "format": "date-time",
      "example": "2026-10-08"
    }
  ],
  "url_kinds": [
    {
      "id": "profile",
      "name": "profile"
    },
    {
      "id": "video",
      "name": "video"
    },
    {
      "id": "post",
      "name": "post"
    },
    {
      "id": "hashtag",
      "name": "hashtag"
    },
    {
      "id": "playlist",
      "name": "playlist"
    }
  ],
  "warnings": [
    {
      "code": "deprecated_endpoint",
      "description": "The endpoint is deprecated: it stops answering on its sunset date, after which it returns endpoint_retired. The message names the date and the replacement."
    },
    {
      "code": "test_default_example",
      "description": "Test mode only: no recorded answer exists for the input you sent, so the answer is the endpoint's docs example (meta.input names the item it is about), not the item you named. The input was validated as a live request would be; a live key fetches the item itself."
    },
    {
      "code": "partial_data",
      "description": "Part of the data could not be fetched (a secondary request to the platform failed) while the rest is valid: the fields listed in fields are null (or []) although the platform has them. The request was charged as usual; repeat it later for the full data."
    }
  ],
  "changelog": [
    {
      "id": "2026-10-30-contract",
      "date": "2026-10-30",
      "title": "API contract changes",
      "kind": "changed",
      "endpoints": [],
      "body": "",
      "changes": [
        "endpoint facebook.post added (/v1/facebook/post)",
        "resource post: field platform_specific.facebook added",
        "resource post: field platform_specific.facebook.feedback_id added",
        "resource post: field platform_specific.facebook.video_id added",
        "resource post: field platform_specific.facebook.reactions added",
        "resource post: field platform_specific.facebook.reactions[].type added",
        "resource post: field platform_specific.facebook.reactions[].count added",
        "resource post: field platform_specific.facebook.shared_post added",
        "resource post: field platform_specific.facebook.shared_post.id added",
        "resource post: field platform_specific.facebook.shared_post.url added",
        "resource post: field platform_specific.facebook.shared_post.author added",
        "resource post: field platform_specific.facebook.shared_post.author.id added",
        "resource post: field platform_specific.facebook.shared_post.author.username added",
        "resource post: field platform_specific.facebook.shared_post.author.display_name added",
        "resource post: field platform_specific.facebook.shared_post.author.url added",
        "resource post: field platform_specific.facebook.shared_post.author.avatar_url added",
        "resource post: field platform_specific.facebook.shared_post.author.is_verified added",
        "resource post: field platform_specific.facebook.link added",
        "resource post: field platform_specific.facebook.link.url added",
        "resource post: field platform_specific.facebook.link.title added",
        "resource post: field platform_specific.facebook.link.image_url added",
        "MCP tool get_post: platform facebook added",
        "endpoint threads.profile added (/v1/threads/profile)",
        "resource profile: field platform_specific.threads added",
        "resource profile: field platform_specific.threads.interest_tags added",
        "resource profile: field platform_specific.threads.verified_link_urls added",
        "MCP tool find_endpoint: platform threads added",
        "MCP tool get_profile: platform threads added"
      ],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-30-contract"
    },
    {
      "id": "2026-10-29-threads-profile",
      "date": "2026-10-29",
      "title": "Threads profiles",
      "kind": "added",
      "endpoints": [
        "threads.profile"
      ],
      "body": "`GET /v1/threads/profile` returns a public Threads account. Send a username with or without the @, the account's numeric id, or a threads.com or threads.net profile link, including the replies, reposts and media tabs.\n\nFollower counts are the exact integer Threads publishes. The response also lists the topic labels Threads shows on the profile and which bio links Threads marks verified. A private account's public header comes back with `is_private` true. An unknown account is `not_found`, and a post link is refused.",
      "changes": [
        "operation GET /v1/security_events added (security_events.list)",
        "route session.create: param body.agent_token added",
        "docs path agent_confirm added (/agent/confirm/)",
        "docs path check_email added (/signup/check-email/)",
        "docs path forgot_password added (/signin/forgot/)",
        "docs path reset_password added (/signin/reset/)",
        "docs path security added (/security/)",
        "docs path signin added (/signin/)",
        "docs path start added (/start/)",
        "docs path two_factor added (/signin/two-factor/)",
        "docs path verify_email added (/signup/verify/)",
        "breaking (accepted): operation POST /v1/signup removed",
        "breaking (accepted): route session.create: auth changed none → session",
        "breaking (accepted): route session.create: scope changed \"\" → \"account:read\"",
        "breaking (accepted): route session.create: param body.token removed",
        "breaking (accepted): docs path signup_confirm (/signup/confirm/) removed",
        "endpoint instagram.posts added (/v1/instagram/posts)",
        "MCP tool list_posts: platform instagram added",
        "resource post: field platform_specific.instagram added",
        "resource post: field platform_specific.instagram.is_ai_generated added",
        "endpoint facebook.post added (/v1/facebook/post)",
        "resource post: field platform_specific.facebook added",
        "resource post: field platform_specific.facebook.feedback_id added",
        "resource post: field platform_specific.facebook.video_id added",
        "resource post: field platform_specific.facebook.reactions added",
        "resource post: field platform_specific.facebook.reactions[].type added",
        "resource post: field platform_specific.facebook.reactions[].count added",
        "resource post: field platform_specific.facebook.shared_post added",
        "resource post: field platform_specific.facebook.shared_post.id added",
        "resource post: field platform_specific.facebook.shared_post.url added",
        "resource post: field platform_specific.facebook.shared_post.author added",
        "resource post: field platform_specific.facebook.shared_post.author.id added",
        "resource post: field platform_specific.facebook.shared_post.author.username added",
        "resource post: field platform_specific.facebook.shared_post.author.display_name added",
        "resource post: field platform_specific.facebook.shared_post.author.url added",
        "resource post: field platform_specific.facebook.shared_post.author.avatar_url added",
        "resource post: field platform_specific.facebook.shared_post.author.is_verified added",
        "resource post: field platform_specific.facebook.link added",
        "resource post: field platform_specific.facebook.link.url added",
        "resource post: field platform_specific.facebook.link.title added",
        "resource post: field platform_specific.facebook.link.image_url added",
        "MCP tool get_post: platform facebook added",
        "endpoint threads.profile added (/v1/threads/profile)",
        "resource profile: field platform_specific.threads added",
        "resource profile: field platform_specific.threads.interest_tags added",
        "MCP tool find_endpoint: platform threads added",
        "MCP tool get_profile: platform threads added",
        "resource profile: field platform_specific.threads.verified_link_urls added"
      ],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-29-threads-profile"
    },
    {
      "id": "2026-10-28-contract",
      "date": "2026-10-28",
      "title": "API contract changes",
      "kind": "changed",
      "endpoints": [],
      "body": "",
      "changes": [
        "endpoint youtube.posts added (/v1/youtube/posts)",
        "MCP tool list_posts added",
        "endpoint tiktok.post added (/v1/tiktok/post)",
        "resource post: field platform_specific.tiktok added",
        "resource post: field platform_specific.tiktok.author_sec_uid added",
        "resource post: field platform_specific.tiktok.country_code added",
        "resource post: field platform_specific.tiktok.is_ad added",
        "resource post: field platform_specific.tiktok.is_ai_generated added",
        "resource post: field platform_specific.tiktok.location added",
        "resource post: field platform_specific.tiktok.location.id added",
        "resource post: field platform_specific.tiktok.location.name added",
        "resource post: field platform_specific.tiktok.location.address added",
        "resource post: field platform_specific.tiktok.location.city added",
        "resource post: field platform_specific.tiktok.location.category added",
        "resource post: field platform_specific.tiktok.music added",
        "resource post: field platform_specific.tiktok.music.id added",
        "resource post: field platform_specific.tiktok.music.title added",
        "resource post: field platform_specific.tiktok.music.author_name added",
        "resource post: field platform_specific.tiktok.music.is_original added",
        "resource post: field platform_specific.tiktok.music.duration_ms added",
        "resource post: field platform_specific.tiktok.music.cover_url added",
        "resource post: field platform_specific.tiktok.music.play_url added",
        "MCP tool get_post: platform tiktok added",
        "endpoint tiktok.posts added (/v1/tiktok/posts)",
        "MCP tool list_posts: platform tiktok added",
        "endpoint tiktok.comments added (/v1/tiktok/comments)",
        "resource comment: field platform_specific.tiktok added",
        "resource comment: field platform_specific.tiktok.language added",
        "MCP tool list_comments: platform tiktok added",
        "endpoint instagram.profile added (/v1/instagram/profile)",
        "resource profile: field platform_specific.instagram added",
        "resource profile: field platform_specific.instagram.fbid added",
        "resource profile: field platform_specific.instagram.is_memorialized added",
        "resource profile: field platform_specific.instagram.is_story_live added",
        "resource profile: field platform_specific.instagram.is_highlights_shown added",
        "resource profile: field platform_specific.instagram.pronouns added",
        "MCP tool get_profile: platform instagram added",
        "endpoint rumble.search_posts added (/v1/rumble/search_posts)",
        "resource post: field platform_specific.rumble added",
        "resource post: field platform_specific.rumble.dislike_count added",
        "resource post: field platform_specific.rumble.author_follower_count added",
        "resource post: field platform_specific.rumble.is_age_restricted added",
        "resource post: field platform_specific.rumble.is_live_now added",
        "resource post: field platform_specific.rumble.concurrent_viewer_count added",
        "resource post: field platform_specific.rumble.live_started_at added",
        "resource post: field platform_specific.rumble.scheduled_start_at added",
        "MCP tool find_endpoint: platform rumble added",
        "MCP tool search: argument duration added",
        "MCP tool search: platform rumble added",
        "MCP tool search: argument sort added",
        "MCP tool search: argument tab added",
        "MCP tool search: type posts added",
        "endpoint rumble.post added (/v1/rumble/post)",
        "resource post: field platform_specific.rumble.embed_id added",
        "resource post: field platform_specific.rumble.embed_url added",
        "resource post: field platform_specific.rumble.numeric_id added",
        "resource post: field platform_specific.rumble.category added",
        "resource post: field platform_specific.rumble.secondary_category added",
        "resource post: field platform_specific.rumble.keywords added",
        "resource post: field platform_specific.rumble.caption_tracks added",
        "resource post: field platform_specific.rumble.caption_tracks[].language added",
        "resource post: field platform_specific.rumble.caption_tracks[].label added",
        "resource post: field platform_specific.rumble.caption_tracks[].url added",
        "resource post: field platform_specific.rumble.caption_tracks[].is_auto_generated added",
        "resource post: field platform_specific.rumble.files added",
        "resource post: field platform_specific.rumble.files[].kind added",
        "resource post: field platform_specific.rumble.files[].format added",
        "resource post: field platform_specific.rumble.files[].url added",
        "resource post: field platform_specific.rumble.files[].width added",
        "resource post: field platform_specific.rumble.files[].height added",
        "resource post: field platform_specific.rumble.files[].bitrate_kbps added",
        "resource post: field platform_specific.rumble.files[].size_bytes added",
        "MCP tool get_post: platform rumble added",
        "endpoint rumble.transcript added (/v1/rumble/transcript)",
        "resource transcript: field platform_specific.rumble added",
        "resource transcript: field platform_specific.rumble.track_label added",
        "resource transcript: field platform_specific.rumble.caption_url added",
        "resource transcript: field platform_specific.rumble.caption_tracks added",
        "resource transcript: field platform_specific.rumble.caption_tracks[].language added",
        "resource transcript: field platform_specific.rumble.caption_tracks[].label added",
        "resource transcript: field platform_specific.rumble.caption_tracks[].url added",
        "resource transcript: field platform_specific.rumble.caption_tracks[].is_auto_generated added",
        "MCP tool get_transcript: platform rumble added",
        "endpoint rumble.profile added (/v1/rumble/profile)",
        "resource profile: field platform_specific.rumble added",
        "resource profile: field platform_specific.rumble.account_type added",
        "resource profile: field platform_specific.rumble.numeric_id added",
        "resource profile: field platform_specific.rumble.user_id added",
        "MCP tool get_profile: platform rumble added",
        "endpoint rumble.comments added (/v1/rumble/comments)",
        "resource comment: field platform_specific.rumble added",
        "resource comment: field platform_specific.rumble.dislike_count added",
        "resource comment: field platform_specific.rumble.author_badges added",
        "MCP tool list_comments: platform rumble added",
        "endpoint rumble.posts added (/v1/rumble/posts)",
        "MCP tool list_posts: argument duration added",
        "MCP tool list_posts: platform rumble added",
        "endpoint rumble.posts: param since added",
        "endpoint rumble.posts: param until added",
        "endpoint rumble.posts: pages emptied by since/until are free"
      ],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-28-contract"
    },
    {
      "id": "2026-10-27-sign-in",
      "date": "2026-10-27",
      "title": "Sign in with Google, GitHub or a password, and two-factor authentication",
      "kind": "changed",
      "endpoints": [],
      "body": "The dashboard has a new sign-in.\n\n- **Sign up and sign in** with Google, GitHub, or an email address and a password (the address is verified first).\n  The emailed sign-in links are gone: `POST /v1/signup` is removed, and `POST /v1/session` is now the dashboard's\n  setup call once you are signed in.\n- **Two-factor authentication** with an authenticator app and backup codes, for every way of signing in.\n- **Security settings**: your sign-in methods, password, sessions (sign out any of them), and a log of sign-ins and\n  security changes (`GET /v1/security_events`).\n- **AI agents** still sign up with `POST /v1/agent_signup`. To activate an agent's live key, its human now signs in\n  (or signs up) with the address the agent used and approves the agent.",
      "changes": [
        "error code insufficient_credits: details key purchase_url added",
        "error code insufficient_credits: details key checkout added",
        "error code unknown_endpoint added (HTTP 404)",
        "warning code test_default_example added",
        "MCP tool create_job: argument detail added",
        "MCP tool create_job: argument idempotency_key added",
        "MCP tool list_job_results added",
        "resource ad: field platform_specific added",
        "resource comment: field platform_specific added",
        "resource post: field platform_specific added",
        "resource profile: field platform_specific added",
        "resource transcript: field platform_specific added",
        "endpoint youtube.profile added (/v1/youtube/profile)",
        "resource profile: field platform_specific.youtube added",
        "resource profile: field platform_specific.youtube.keywords added",
        "resource profile: field platform_specific.youtube.is_official_artist_channel added",
        "MCP tool get_profile: platform youtube added",
        "resource profile: field platform_specific.youtube.is_subscriber_count_hidden added",
        "resource profile: field platform_specific.youtube.is_business_email_listed added",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/apix ⇒ username apix",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/cx ⇒ username cx",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/jobsx ⇒ username jobsx",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/livex ⇒ username livex",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/logoutx ⇒ username logoutx",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/select_sitex ⇒ username select_sitex",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/sx ⇒ username sx",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/testtubex ⇒ username testtubex",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/trendsx ⇒ username trendsx",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/tx ⇒ username tx",
        "breaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/ytx ⇒ username ytx",
        "operation POST /v1/docs_feedback added (docs_feedback.create)",
        "MCP tool read_doc added",
        "MCP tool search_docs added",
        "docs path api_catalog added (/.well-known/api-catalog)",
        "docs path endpoint_reference added (/docs/reference/{platform}/{name}/)",
        "docs path not_found_markdown added (/404.md)",
        "docs path search_index added (/search.json)",
        "docs path skill added (/skill.md)"
      ],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-27-sign-in"
    },
    {
      "id": "2026-10-26-accounts",
      "date": "2026-10-26",
      "title": "Self-serve signup, test keys, API key management and usage",
      "kind": "added",
      "endpoints": [],
      "body": "You can now get started without talking to anyone, test for free, and manage your account through the API.\n\n- **Sign up** with your email address: the emailed link creates your account with free credits, a live key and a\n  test key, and opens the dashboard (keys, usage, balance, credit packs). **AI agents** can sign up with\n  `POST /v1/agent_signup`: they get a test key at once and a live key that works once you confirm by email.\n- **Test keys** (`st_test_…`) answer every endpoint from recorded responses, free and deterministic, and reserved\n  \"magic\" inputs trigger each error code, so integrations and CI can exercise every branch at no cost.\n- **API keys** have scopes (`endpoints`, `jobs`, `account:read`, `admin`), optional spend limits per day or month\n  (`spend_limit_reached`), expiry and IP allowlists, managed through `/v1/api_keys`.\n- **Account and usage**: `GET /v1/account` (balance, plan, the calling key), `GET /v1/usage` (requests and credits\n  over time by endpoint, key and outcome) and `GET /v1/credit_transactions` (the ledger). Set\n  `low_balance_threshold` to get a `credits.low` email and event.\n- `meta.mode` says whether a response came from a live or a test key. `forbidden` is now returned (with\n  `details.reason`), and a missing key's `unauthorized` says where to get one.",
      "changes": [
        "endpoint facebook.transcript: accepts video links",
        "endpoint instagram.transcript: accepts video links",
        "endpoint instagram.transcript: accepts post links",
        "endpoint tiktok.transcript: accepts video links",
        "endpoint tiktok.transcript: accepts post links",
        "endpoint youtube.transcript: accepts video links",
        "error code endpoint_retired added (HTTP 410)",
        "error code forbidden added (HTTP 403)",
        "error code idempotency_key_in_progress added (HTTP 409)",
        "error code idempotency_key_reused added (HTTP 422)",
        "error code insufficient_credits: details key credits_required added",
        "error code insufficient_credits: details key credits_available added",
        "error code invalid_cursor: details key reason added",
        "error code invalid_input: details key suggestion added",
        "error code invalid_input: details key accepted_params added",
        "error code invalid_input: details key url_kind added",
        "error code invalid_input: details key url_platform added",
        "error code invalid_input: details key accepted_url_kinds added",
        "error code invalid_input: details key endpoints added",
        "error code invalid_input: details key fields added",
        "error code job_not_found added (HTTP 404)",
        "error code overloaded: details key retry_after added",
        "error code rate_limited: details key retry_after added",
        "error code spend_limit_reached added (HTTP 402)",
        "header cache-control added",
        "header deprecation added",
        "header link added",
        "header ratelimit added",
        "header ratelimit-policy added",
        "header sunset added",
        "header traceparent added",
        "header x-client-request-id added",
        "common param fields added",
        "warning code deprecated_endpoint added",
        "shared param country added",
        "shared param lang added",
        "shared param since added",
        "shared param sort added",
        "shared param until added",
        "meta fields are part of the locked contract",
        "page fields are part of the locked contract",
        "error fields are part of the locked contract",
        "MCP tool find_endpoint added",
        "MCP tool get_transcript added",
        "header authorization added",
        "error code forbidden: details key reason added",
        "error code forbidden: details key required_scope added",
        "error code spend_limit_reached: details key api_key_id added",
        "error code spend_limit_reached: details key spend_limit added",
        "error code spend_limit_reached: details key interval added",
        "error code spend_limit_reached: details key used added",
        "error code spend_limit_reached: details key credits_required added",
        "error code spend_limit_reached: details key resets_at added",
        "error code unauthorized: details key signup_url added",
        "error code unauthorized: details key agent_signup_url added",
        "meta: field mode added",
        "MCP tool get_account added",
        "error code insufficient_credits: details key max_credits added",
        "header idempotency-key added",
        "header idempotent-replayed added",
        "header location added",
        "header prefer added",
        "header preference-applied added",
        "header webhook-id added",
        "header webhook-signature added",
        "header webhook-timestamp added",
        "event type job.completed added",
        "event type job.canceled added",
        "event type job.expired added",
        "event type credits.low added",
        "event type credits.depleted added",
        "event type api_key.spend_limit_reached added",
        "event type webhook.test added",
        "operation DELETE /v1/webhook_endpoints/{id} added (webhook_endpoints.delete)",
        "operation GET /v1/events added (events.list)",
        "operation GET /v1/events/{id} added (events.get)",
        "operation GET /v1/jobs added (jobs.list)",
        "operation GET /v1/jobs/{id} added (jobs.get)",
        "operation GET /v1/jobs/{id}/results added (jobs.results.list)",
        "operation GET /v1/jobs/{id}/results.jsonl added (jobs.results.download)",
        "operation GET /v1/webhook_endpoints added (webhook_endpoints.list)",
        "operation GET /v1/webhook_endpoints/{id} added (webhook_endpoints.get)",
        "operation GET /v1/webhook_endpoints/{id}/deliveries added (webhook_endpoints.deliveries.list)",
        "operation PATCH /v1/webhook_endpoints/{id} added (webhook_endpoints.update)",
        "operation POST /v1/events/{id}/redeliver added (events.redeliver)",
        "operation POST /v1/jobs added (jobs.create)",
        "operation POST /v1/jobs/{id}/cancel added (jobs.cancel)",
        "operation POST /v1/webhook_endpoints added (webhook_endpoints.create)",
        "operation POST /v1/webhook_endpoints/{id}/rotate_secret added (webhook_endpoints.rotate_secret)",
        "operation POST /v1/webhook_endpoints/{id}/test added (webhook_endpoints.test)",
        "MCP tool create_job added",
        "MCP tool get_job added",
        "endpoint tiktok.profile added (/v1/tiktok/profile)",
        "resource profile is live",
        "MCP tool get_profile added",
        "endpoint instagram.post added (/v1/instagram/post)",
        "resource post is live",
        "MCP tool get_post added",
        "endpoint facebook.search_ads added (/v1/facebook/search_ads)",
        "resource ad is live",
        "MCP tool search added",
        "endpoint youtube.comments added (/v1/youtube/comments)",
        "resource comment is live",
        "MCP tool list_comments added",
        "endpoint facebook.search_ads: param lang added",
        "shared param status added",
        "MCP tool search: argument lang added",
        "breaking (accepted): endpoint facebook.search_ads: param status default changed \"\" → \"all\"",
        "warning code partial_data added",
        "meta: field warnings[].fields added",
        "resource ad: field unknown_fields added",
        "resource comment: field unknown_fields added",
        "resource post: field unknown_fields added",
        "resource profile: field unknown_fields added",
        "docs path pricing_feed added (/pricing.json)"
      ],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-26-accounts"
    },
    {
      "id": "2026-10-26-api-conventions",
      "date": "2026-10-26",
      "title": "Request conventions, richer errors and response metadata",
      "kind": "changed",
      "endpoints": [],
      "body": "Every endpoint now follows the same request conventions, and every response tells you more about itself.\n\n- **Unknown parameters are rejected** with `invalid_input`, free, naming the parameter and the one you most likely\n  meant (`username` → `handle`). Previously they were ignored. Common parameters (`max_age`, `fields`) are always\n  known.\n- **Errors carry everything needed to react** without parsing the message: `status`, `retryable`, `param`,\n  `remediation`, `doc_url`, `details` (for example `credits_required`, or the endpoint a link belongs to) and\n  `charged` (always false). `retry-after` is never sent on credit errors.\n- **A link of the wrong kind** (a profile link sent to a video endpoint, a link from another platform) is answered with\n  the endpoint that takes it.\n- **`meta`** gains `input` (what your url resolved to), `credits_remaining`, `client_request_id` and `warnings`.\n- **`fields`** selects only the fields you need, after the cache, at no cost.\n- **Lists** gain `page.end_reason` and a `Link: rel=\"next\"` header; `since` stops paging on newest-first lists.\n- **Headers**: send `x-client-request-id` to have your own ID echoed and logged, and `traceparent` to match traces.\n  `RateLimit-Policy` and `RateLimit` describe the account's runaway-protection ceiling, and `Cache-Control: max-age`\n  works like `max_age`.\n- Deprecated endpoints will announce themselves with `Deprecation` and `Sunset` headers and a warning, and answer\n  `endpoint_retired` after their sunset. This changelog is also a [JSON Feed](/changelog.json).",
      "changes": [],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-26-api-conventions"
    },
    {
      "id": "2026-10-26-jobs",
      "date": "2026-10-26",
      "title": "Background jobs and batches, webhooks, events and Idempotency-Key",
      "kind": "added",
      "endpoints": [],
      "body": "Run many requests, or one long one, without holding a connection open, and hear back when they are done.\n\n- **Jobs**: `POST /v1/jobs` runs a batch of endpoint requests in the background, at each endpoint's own price, and\n  `max_pages` walks a whole list server-side. With `?wait` a short job answers inline (a synchronous batch); otherwise\n  poll `GET /v1/jobs/{id}` (free), page through `GET /v1/jobs/{id}/results` as items finish, or download every result\n  from the job's signed `results_url`. `Prefer: respond-async` turns any endpoint request into a one-request job.\n- **Credits** are set aside per job (`max_credits`) and charged per item as it ends; failed items are free. A key's\n  spend limit holds through its jobs, and a test key's jobs answer from recorded responses, free.\n- **Webhooks** (Standard Webhooks signatures, retried for days, secrets rotated without downtime) deliver\n  `job.completed`, `job.canceled`, `job.expired`, `credits.low`, `credits.depleted` and\n  `api_key.spend_limit_reached`; `/v1/events` lists every event and redelivers one on request.\n- **Idempotency-Key** on every POST: retrying with the same key and body never repeats the work.",
      "changes": [],
      "doc_url": "https://staging-fly.socialtap.dev/docs/changelog/#2026-10-26-jobs"
    }
  ],
  "source_kinds": [
    {
      "id": "captions",
      "name": "Captions",
      "description": "The platform's own caption track (uploaded or auto-generated)."
    },
    {
      "id": "asr",
      "name": "Speech-to-text",
      "description": "Transcribed by SocialTap from the media's audio when the platform has no captions."
    },
    {
      "id": "api",
      "name": "Platform API",
      "description": "The platform's public, logged-out API."
    },
    {
      "id": "page",
      "name": "Public page",
      "description": "Data embedded in the platform's public web page."
    }
  ],
  "docs": {
    "account": "/docs/account/",
    "agent_confirm": "/agent/confirm/",
    "agents": "/docs/agents/",
    "api_catalog": "/.well-known/api-catalog",
    "changelog": "/docs/changelog/",
    "changelog_feed": "/changelog.json",
    "check_email": "/signup/check-email/",
    "dashboard": "/dashboard/",
    "endpoint": "/apis/{platform}/{name}/",
    "endpoint_reference": "/docs/reference/{platform}/{name}/",
    "error": "/docs/errors/#{code}",
    "errors": "/docs/errors/",
    "forgot_password": "/signin/forgot/",
    "llms_full_txt": "/llms-full.txt",
    "llms_txt": "/llms.txt",
    "not_found_markdown": "/404.md",
    "pricing_feed": "/pricing.json",
    "reference": "/docs/reference/",
    "reset_password": "/signin/reset/",
    "search_index": "/search.json",
    "security": "/security/",
    "signin": "/signin/",
    "signup": "/signup/",
    "skill": "/skill.md",
    "skills": "/.well-known/agent-skills/index.json",
    "start": "/start/",
    "test_mode": "/docs/test-mode/",
    "two_factor": "/signin/two-factor/",
    "verify_email": "/signup/verify/"
  },
  "sign_in": {
    "base_path": "/auth",
    "providers": [
      "google",
      "github"
    ],
    "password_min_length": 10,
    "password_max_length": 128,
    "session_ttl_s": 604800,
    "session_update_age_s": 86400,
    "fresh_s": 600,
    "email_link_ttl_s": 3600,
    "agent_confirm_ttl_s": 86400,
    "two_factor_digits": 6,
    "security_events_retention_s": 7776000
  },
  "mcp": {
    "path": "/mcp",
    "transport": "streamable-http",
    "name": "dev.socialtap/mcp",
    "title": "SocialTap",
    "version": "1.158.0",
    "instructions": "SocialTap returns public social media data from the major platforms, normalized into one JSON schema per resource. One API key, one credit balance, and you only pay for requests that succeed. Available now: ads on Facebook; comments on Rumble, TikTok and YouTube; posts on Facebook, Instagram, Rumble, TikTok and YouTube; profiles on Instagram, Rumble, Threads, TikTok and YouTube; transcripts on Facebook, Instagram, Rumble, TikTok and YouTube. Use these tools whenever a task needs public data from Facebook, Instagram, Rumble, Threads, TikTok or YouTube.\n\nTools:\n- get_post: Get a post on Facebook, Instagram, Rumble, TikTok or YouTube\n- get_profile: Get a profile on Instagram, Rumble, Threads, TikTok or YouTube\n- get_transcript: Get a transcript on Facebook, Instagram, Rumble, TikTok or YouTube\n- list_comments: List comments on Rumble, TikTok or YouTube\n- list_posts: List posts on Instagram, Rumble, TikTok or YouTube\n- search: Search ads and posts on Facebook or Rumble\n- find_endpoint: Find an endpoint\n- search_docs: Search the docs\n- read_doc: Read a docs page\n- get_account: Get account balance\n- create_job: Create a background job\n- get_job: Get a background job\n- list_job_results: List a job's results\n\nRules:\n- Pass platform plus the link, handle or query the tool asks for; find_endpoint finds the right tool for a need or a link.\n- Prices are credits per successful call (per page for lists); each tool states its price. Every result states credits_charged and credits_remaining. Failed calls are free. Pass max_age=<seconds> to accept a stored copy: cache hits are free.\n- Results are concise by default (detail=\"full\" returns every field) and cut at about 20,000 tokens. When a result has next_cursor, call the same tool with the same arguments and cursor=next_cursor for the rest; lists return one page per call.\n- Errors are results with isError and an error object: retry only when error.retryable is true (after details.retry_after seconds when set); otherwise follow error.remediation. On insufficient_credits stop and tell the user.\n- Keys starting with st_test_ are test keys: every tool answers from recorded responses, free and deterministic.\n- null means unknown, never zero.\n- search_docs and read_doc read these docs (free, no key): look a question, error code or field up there before guessing.\n\nDocs for agents: https://staging-fly.socialtap.dev/llms.txt (index), https://staging-fly.socialtap.dev/docs/agents/ (this server and the API).",
    "auth_headers": [
      "authorization",
      "x-api-key"
    ],
    "max_result_tokens": 20000,
    "tools": [
      {
        "name": "get_post",
        "title": "Get a post",
        "description": "Get a public post on Facebook, Instagram, Rumble, TikTok or YouTube. A public post (video, reel, short, photo, carousel, tweet or text) with its author, media and engagement metrics. Pass platform and url (its link or ID). Price per successful call: Facebook, Instagram, Rumble, TikTok: 1 credit. YouTube: 1 credit (platform api); or 1 credit (public page). Failed calls and cache hits (max_age accepts a stored copy) are free; every result states credits_charged and credits_remaining. Results over about 20,000 tokens are cut: when next_cursor is set, call again with the same arguments and cursor=next_cursor. For other data or platforms, call find_endpoint. Notes: Facebook: Counts are exact, as Facebook's page states them. view_count is set on videos and reels; share_count on posts and photos (Facebook's video page shows none logged out). Facebook: Media URLs are Facebook CDN links that expire: media[].expires_at says when; download what you need before then. Facebook: Posts that are private, limited to friends or a group, or deleted return private_or_unavailable: logged out, Facebook answers them all alike. They are not charged. Facebook: If the post's page is unavailable, the answer comes from Facebook's embedded post: counts as displayed (large ones rounded, see approximate_fields), and no view count, reactions by type, feedback ID or reshared post, nor a video's file and length (partial_data warning). Facebook: Past and current live broadcasts are platform_type live, with their title. Instagram: Media URLs are Instagram CDN links that expire: media[].expires_at says when; download what you need before then. Instagram: view_count is set for single videos and reels only (Instagram shows no view count for photos and carousels). like_count and view_count are null when the owner hides them. When Instagram's embed page, the only logged-out source of the view count, fails or omits it, the post is still returned with view_count null and a partial_data warning in meta.warnings. Instagram: Instagram does not expose share or save counts, pinned state, sponsorship labels or the caption's language to logged-out visitors: those fields are null. Instagram: Private, age-restricted and deleted posts return private_or_unavailable or not_found and are not charged. Rumble: On a video's page Rumble cuts dislikes, comment and follower counts to three significant digits once they reach thousands (a cut label is a floor: the real count is at most one unit in its last digit higher; listed in approximate_fields); likes are made exact from the rating bar when the dislikes are exact; views, and every count of a short, are exact. Rumble: metrics.comment_count on a video is the count its page shows, which can run below the total Rumble's own lists give for the same video; null when the page shows none. Rumble: platform_specific.rumble.embed_id is the player's ID: /embed/ links use it, and it differs from id. Rumble: platform_type is short, live (streams on air, scheduled or past) or video. TikTok: TikTok rounds large like and view counts (see approximate_fields); comments, shares and saves are exact. TikTok: If the video page fails, the embed page answers without saves, language, location, AI label and sound length (partial_data warning). TikTok: is_sponsored marks TikTok ads only (else null): paid partnerships are not public. YouTube: platform_type is short, live (streams and premieres) or video. YouTube: Age-restricted and paid videos are returned with their public details. YouTube: media[0].url is null: YouTube's stream links only work from the IP that requested them.",
        "input_schema": {
          "type": "object",
          "properties": {
            "platform": {
              "description": "The platform the link is on. Optional: a link names its platform; required only for a bare ID that could be another platform's.",
              "enum": [
                "facebook",
                "instagram",
                "rumble",
                "tiktok",
                "youtube"
              ],
              "type": "string"
            },
            "url": {
              "description": "Facebook: Facebook post, photo, video or reel URL: /<page>/posts/<id>, permalink.php and story.php links, /photo/?fbid= and /<page>/photos/… links, reel, watch, video.php and /<page>/videos/… links, fb.watch and /share/p|v|r/ share links (m., mbasic. and web. hosts too), or a numeric post, photo or video ID. Instagram: Instagram post, reel or carousel URL (instagram.com/p/…, /reel/…, /reels/…, /tv/…, /<username>/p/…, m.instagram.com, instagr.am, instagram.com/share/… links) or a raw shortcode. Tracking params and img_index are ignored: the whole post is returned. Rumble: Rumble video, short or live stream URL (rumble.com/v…-title.html, /shorts/v…, /share/v…, /embed/v…/) or a video ID (v…). TikTok: TikTok video or photo post link (web, mobile, embed or share link) or a numeric post ID. YouTube: YouTube video, short or live stream URL (watch, youtu.be, shorts, live, embed; m. and music. hosts) or an 11-character video ID.",
              "maxLength": 2048,
              "type": "string"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns platform, id, url, type, title, text, published_at, author.username, author.display_name, duration_ms, hashtags, metrics; full returns every field (adds platform_type, language, coauthors, thumbnail_url, media, mentions, is_pinned, is_sponsored, is_nsfw, platform_specific, approximate_fields, unknown_fields). Same price.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            },
            "max_age": {
              "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh.",
              "minimum": 0,
              "type": "integer"
            },
            "cursor": {
              "description": "next_cursor from this tool's previous result, to continue a cut result. Send the same other arguments.",
              "type": "string"
            }
          },
          "required": [
            "url"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Get a post",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "get_profile",
        "title": "Get a profile",
        "description": "Get a public profile on Instagram, Rumble, Threads, TikTok or YouTube. A public account (creator, channel, page, company or community) with its bio, links and follower metrics. Pass platform and handle (a profile link, @handle, username or ID). Price per successful call: Instagram, Rumble, TikTok, YouTube: 1 credit. Threads: 1 credit (platform api); or 1 credit (public page). Failed calls and cache hits (max_age accepts a stored copy) are free; every result states credits_charged and credits_remaining. Results over about 20,000 tokens are cut: when next_cursor is set, call again with the same arguments and cursor=next_cursor. For other data or platforms, call find_endpoint.",
        "input_schema": {
          "type": "object",
          "properties": {
            "platform": {
              "description": "The platform the profile is on. Optional with a profile link (it names the platform); required with a bare username or ID.",
              "enum": [
                "instagram",
                "rumble",
                "threads",
                "tiktok",
                "youtube"
              ],
              "type": "string"
            },
            "handle": {
              "description": "Instagram: Instagram username with or without the @ (natgeo, @natgeo), or a profile link (instagram.com/natgeo, with or without a tab such as /reels/ or /tagged/, m.instagram.com, instagr.am, instagram.com/_u/natgeo, instagram.com/stories/natgeo/, with any query such as ?igsh=…). Usernames are case-insensitive. A bare number is a username: numeric user IDs are not accepted. Rumble: Rumble channel or user: a bare name (Bongino: a channel, else the user of that name), c/<name> for a channel or user/<name> for a user, any channel or user link with any tab after it (rumble.com/c/Bongino, rumble.com/c/Bongino/videos, rumble.com/user/vivafrei/about, the root rumble.com/Bongino link), or a channel's id as this API returns it (_c276782) or its c/c-<channel id> name (c/c-276782, which every channel has). A user's _u… id is refused: Rumble's public pages cannot look a user up by ID, so send its name. Names are case-insensitive. Threads: Threads username with or without the @ (zuck, @zuck), the account's numeric id, or a profile link (threads.com/@zuck, threads.net/@zuck, with or without a tab such as /replies, /reposts or /media, and with any query such as ?hl=es). Usernames are case-insensitive. A number of 5 or more digits is an account id; @ before it is a username. TikTok: TikTok username with or without the @ (nasa, @nasa), a profile URL (tiktok.com/@nasa, m.tiktok.com/@nasa, with or without query parameters), or a numeric user ID (tiktok.com/share/user/<id> or the bare ID). Usernames are case-insensitive. YouTube: YouTube channel: a handle with or without the @ (NASA, @NASA), any channel link (youtube.com/@NASA, youtube.com/channel/UC…, the legacy youtube.com/c/<name>, youtube.com/user/<name> and youtube.com/<name> links, with any tab or view after them such as /videos, /playlists, /posts or /about, and m. or music. hosts), a bare UC… channel ID, or c/<name>, user/<name> or vanity/<name>. Handles are case-insensitive. A bare string is always a handle, even one shaped like a video ID.",
              "maxLength": 2048,
              "type": "string"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns platform, id, username, display_name, url, type, bio, is_verified, is_private, category, external_links, location, created_at, metrics; full returns every field (adds avatar_url, banner_url, country_code, platform_specific, approximate_fields, unknown_fields). Same price.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            },
            "max_age": {
              "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh.",
              "minimum": 0,
              "type": "integer"
            },
            "cursor": {
              "description": "next_cursor from this tool's previous result, to continue a cut result. Send the same other arguments.",
              "type": "string"
            }
          },
          "required": [
            "handle"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Get a profile",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "get_transcript",
        "title": "Get a transcript",
        "description": "Get the transcript of a public video or post on Facebook, Instagram, Rumble, TikTok or YouTube. Timed transcript of a public video: the platform's caption track, or speech-to-text on its audio when there is none. Pass platform and url (its link or ID). Price per successful call: 1 credit (captions); or 2 credits + 2 per started minute of media, at most 122 (speech-to-text). Failed calls and cache hits (max_age accepts a stored copy) are free; every result states credits_charged and credits_remaining. Results over about 20,000 tokens are cut: when next_cursor is set, call again with the same arguments and cursor=next_cursor. For other data or platforms, call find_endpoint. Notes: Facebook: Videos that Facebook only serves to logged-in users return private_or_unavailable. Instagram: Most results come from speech-to-text (meta.source = asr) and are priced per minute. Instagram: Image posts return invalid_input; videos without speech return no_transcript. Rumble: A stream that is on air now, or has not started, has no transcript yet (no_transcript); Rumble captions it once it ends. Rumble: is_auto_generated is true for Rumble's automatic captions and for speech-to-text; platform_specific.rumble.track_label is Rumble's own label for the track used. TikTok: Photo posts have no audio track and return no_transcript. TikTok: Videos with licensed music and no speech may transcribe the song lyrics. YouTube: Manual captions are preferred over auto-generated ones; is_auto_generated tells you which you got. YouTube: Private, members-only, rental and age-restricted videos return private_or_unavailable.",
        "input_schema": {
          "type": "object",
          "properties": {
            "platform": {
              "description": "The platform the link is on. Optional: a link names its platform; required only for a bare ID that could be another platform's.",
              "enum": [
                "facebook",
                "instagram",
                "rumble",
                "tiktok",
                "youtube"
              ],
              "type": "string"
            },
            "url": {
              "description": "Facebook: Facebook video URL (reel, watch, page video, video.php, m./mbasic./web. hosts, fb.watch and share/v|r links) or a numeric video ID. Instagram: Instagram reel/post URL (instagram.com/reel/…, /reels/…, /p/…, /tv/…, instagr.am, instagram.com/share/… links) or a raw shortcode. For carousel posts, ?img_index=N selects the item; default is the first video. Rumble: Rumble video, short or live stream URL (rumble.com/v…-title.html, /shorts/v…, /share/v…, /embed/v…/) or a video ID (v…). TikTok: TikTok video URL (tiktok.com/@user/video/<id>, m.tiktok.com/v/<id>.html, vm.tiktok.com/<code>, vt.tiktok.com/<code>, tiktok.com/t/<code>, embed URLs) or a numeric video ID. YouTube: YouTube video URL (watch, youtu.be, shorts, live, embed, m./music. hosts) or an 11-character video ID.",
              "maxLength": 2048,
              "type": "string"
            },
            "lang": {
              "description": "Only on Rumble, TikTok or YouTube. Rumble: Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Selects the caption track: an uploaded track in that language before Rumble's automatic one. When the video has no track in that language, the default track is returned (language says which). Default: an uploaded track in the spoken language, else Rumble's automatic captions. TikTok: Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Selects the caption track (TikTok also offers its own translations); falls back to the video's original language, then any track. TikTok's three-letter codes (eng-US) work too. YouTube: Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Selects the caption track; a manual track is preferred over an auto-generated one. Default: the video's original-language manual track, else its auto-generated track.",
              "type": "string"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns platform, id, url, language, source, is_auto_generated, available_languages, duration_ms, text; full returns every field (adds segments, platform_specific). Same price.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            },
            "max_age": {
              "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh.",
              "minimum": 0,
              "type": "integer"
            },
            "cursor": {
              "description": "next_cursor from this tool's previous result, to continue a cut result. Send the same other arguments.",
              "type": "string"
            }
          },
          "required": [
            "url"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Get a transcript",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "list_comments",
        "title": "List comments",
        "description": "List the comments of a public post on Rumble, TikTok or YouTube, one page per call. A public comment or reply on a post, with its author, thread position and like/reply counts. Pass platform and url (its link or ID). Price per successful page: 1 credit. Failed calls and cache hits (max_age accepts a stored copy) are free; every result states credits_charged and credits_remaining. Results over about 20,000 tokens are cut: when next_cursor is set, call again with the same arguments and cursor=next_cursor. Follow next_cursor while it is set to get further pages; an empty or short page is not the end. For other data or platforms, call find_endpoint. Notes: Rumble: Replies are included: parent_id names the comment a reply answers. Sorted newest, comments and replies are interleaved by time; sorted popular, each comment is followed by its replies. Rumble: Rumble shows comment times to the minute: published_at is exact to the minute and listed in approximate_fields. Rumble: Rumble's comment count for a video (on its page and in rumble.post) includes comments it no longer lists, so a full walk can return fewer. Rumble: metrics.reply_count is Rumble's own count of a comment's replies and can exceed the replies returned: Rumble counts replies it no longer lists. Rumble: author.id is null: Rumble's comments name the commenter by username only (author.username, user/<name>, joins with rumble.profile). Rumble: Videos whose comments Rumble shows only to signed-in viewers or buyers return private_or_unavailable. TikTok: TikTok ranks comments itself and has no newest-first order, so since and until are not offered; published_at is exact for filtering on your side. TikTok: Pages can hold fewer comments than limit while more follow, and TikTok repeats some comments across the first pages of a busy video: deduplicate by id. TikTok: Replies are not included; metrics.reply_count says how many a comment has. TikTok: Private videos and videos with comments turned off return private_or_unavailable; deleted videos return not_found, though TikTok keeps serving the comments of some deleted videos, which are then returned. YouTube: YouTube shows comment times as relative labels (\"3 weeks ago\"): published_at is the latest time the label allows and is listed in approximate_fields, so since and until are approximate to the label's unit. YouTube: Like and reply counts above a thousand are rounded by YouTube (\"4.8K\") and listed in approximate_fields. YouTube: Comments show the author's @handle; author.display_name is null. YouTube: The newest order includes comments YouTube's Top ranking holds back as potential spam. YouTube: Videos with comments turned off and private videos return private_or_unavailable; deleted videos return not_found. YouTube: Replies are not included; metrics.reply_count says how many a comment has.",
        "input_schema": {
          "type": "object",
          "properties": {
            "platform": {
              "description": "The platform the link is on. Optional: a link names its platform; required only for a bare ID that could be another platform's.",
              "enum": [
                "rumble",
                "tiktok",
                "youtube"
              ],
              "type": "string"
            },
            "url": {
              "description": "Rumble: Rumble video, short or live stream URL (rumble.com/v…-title.html, /shorts/v…, /share/v…, /embed/v…/) or a video ID (v…). TikTok: TikTok video or photo post URL (tiktok.com/@user/video/<id>, /@user/photo/<id>, m.tiktok.com/v/<id>.html, embed and player URLs, vm.tiktok.com/<code>, vt.tiktok.com/<code>, tiktok.com/t/<code>) or a numeric video ID. YouTube: YouTube video URL (watch, youtu.be, shorts, live, embed, m./music. hosts) or an 11-character video ID.",
              "maxLength": 2048,
              "type": "string"
            },
            "sort": {
              "description": "Only on Rumble or YouTube. Rumble: Order of the results. newest (default): every comment and reply, newest first. popular: Rumble's Sort by likes order of comments, each followed by its replies. YouTube: Order of the results. newest (default): newest first. popular: YouTube's Top comments ranking. Either way the video's pinned comment comes first.",
              "enum": [
                "newest",
                "popular"
              ],
              "type": "string"
            },
            "since": {
              "description": "Only on Rumble or YouTube. Rumble: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Compared with published_at, which Rumble shows to the minute. Replies count as items: on newest the walk stops at the first comment or reply older than since. YouTube: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Compared with published_at, which YouTube only shows as a relative label (\"2 days ago\"): the walk stops at the first comment whose label is older, so comments up to one label unit older can be included.",
              "type": "string"
            },
            "until": {
              "description": "Only on Rumble or YouTube. Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
              "type": "string"
            },
            "limit": {
              "description": "Items per page, 1 to the endpoint's page size (its default and maximum; larger values are reduced to it). Omit it: every page costs the same, so a smaller limit means more pages to pay for.",
              "maximum": 500,
              "minimum": 1,
              "type": "integer"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns id, parent_id, text, author.username, published_at, is_pinned, metrics; full returns every field (adds platform, post_id, url, edited_at, is_edited, is_liked_by_author, is_by_post_author, platform_specific, approximate_fields, unknown_fields). Same price.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            },
            "max_age": {
              "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh.",
              "minimum": 0,
              "type": "integer"
            },
            "cursor": {
              "description": "next_cursor from this tool's previous result, to continue a cut result or get the next page. Send the same other arguments.",
              "type": "string"
            }
          },
          "required": [
            "url"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "List comments",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "list_posts",
        "title": "List posts",
        "description": "List the posts of a public profile on Instagram, Rumble, TikTok or YouTube, one page per call. A public post (video, reel, short, photo, carousel, tweet or text) with its author, media and engagement metrics. Pass platform and handle (a profile link, @handle, username or ID). Price per successful page: 1 credit. Failed calls and cache hits (max_age accepts a stored copy) are free; every result states credits_charged and credits_remaining. Results over about 20,000 tokens are cut: when next_cursor is set, call again with the same arguments and cursor=next_cursor. Follow next_cursor while it is set to get further pages; an empty or short page is not the end. For other data or platforms, call find_endpoint. Notes: Instagram: Pinned posts lead the first page, whatever their age. Instagram does not mark pins for logged-out visitors: is_pinned is inferred from the order, and null for a leading post the order cannot tell. Instagram: view_count is set for videos; like_count and view_count are null when the owner hides them. If Instagram's view counts fail on a later page, it is returned without them and with a partial_data warning. Instagram: Media URLs are Instagram CDN links that expire: media[].expires_at says when. Instagram: Share and save counts and the caption's language are not public logged out: those fields are null. Rumble: tab=live lists Rumble's Livestreams tab: streams on air now (platform_specific.rumble.is_live_now, concurrent_viewer_count), scheduled ones (scheduled_start_at, no duration or views yet) and past ones. tab=videos holds the other uploads, tab=shorts the shorts. Rumble: sort=newest is Rumble's upload order, newest first but not strictly by date: some older uploads sit among newer ones, so read published_at rather than the position. Rumble: A user's tabs (user/<name>) list its own uploads and those of the channels it owns; each post's author says which account published it. Rumble: List results carry no description: text is null and hashtags and mentions are listed in unknown_fields. Fetch the video (rumble.post) for those. Rumble: A tab the account does not have (a channel without shorts) and an account without uploads answer an empty page. TikTok: Large play, like, comment and share counts are rounded by TikTok (see approximate_fields). TikTok: media[].url is null for videos: TikTok serves video files only with its player's cookie. TikTok: If TikTok's list is down, the first page lists the latest posts from its embed profile, with fewer fields. YouTube: Beyond each tab's newest uploads (up to 15, exact from YouTube's uploads feed), published_at comes from a relative label (the latest time it allows) and views are rounded, both in approximate_fields; text and metrics.like_count are null there, and a non-English title may be YouTube's English translation. YouTube: Shorts beyond the newest have no published_at or duration_ms, so since and until are refused with tab=shorts. Streams live now or scheduled have no view count. YouTube: A channel without the tab answers an empty page. A tab in a pasted link is ignored: set tab. YouTube: The live tab lists upcoming and live streams first, then past streams by when they streamed: with tab=live, since and until filter the streams instead of ending the walk, so it reads further.",
        "input_schema": {
          "type": "object",
          "properties": {
            "platform": {
              "description": "The platform the profile is on. Optional with a profile link (it names the platform); required with a bare username or ID.",
              "enum": [
                "instagram",
                "rumble",
                "tiktok",
                "youtube"
              ],
              "type": "string"
            },
            "handle": {
              "description": "Instagram: Instagram username with or without the @, or a profile URL (instagram.com/nasa, m.instagram.com, instagr.am, a /reels/ or /tagged/ tab, an instagram.com/_u/ app link). Numeric user IDs are not accepted: Instagram does not resolve them logged out. Rumble: Rumble channel or user: a bare name (Bongino: a channel, else the user of that name), c/<name> for a channel or user/<name> for a user, any channel or user link with any tab after it (rumble.com/c/Bongino, rumble.com/c/Bongino/shorts, rumble.com/user/vivafrei/livestreams, the root rumble.com/Bongino link), or a channel's id as this API returns it (_c276782) or its c/c-<channel id> name. A user's _u… id is refused: Rumble's public pages cannot look a user up by ID, so send its name. Names are case-insensitive. TikTok: TikTok username with or without the @, a profile URL (tiktok.com/@nasa) or a numeric user ID. YouTube: YouTube channel: a handle with or without the @, any channel link (@handle, /channel/UC…, legacy /c/, /user/ and root vanity links, any tab, m. and music. hosts), a bare UC… channel ID, or c/<name>, user/<name>, vanity/<name>.",
              "maxLength": 2048,
              "type": "string"
            },
            "since": {
              "description": "Instagram: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Rumble: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Only posts published at or after this time. Neither sort is strictly by date, so since filters every page instead of ending the walk at the first older post: the walk ends after a few pages in a row with nothing in the window, and those pages are free. TikTok: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. YouTube: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Beyond the newest uploads published_at is approximate (\"3 weeks ago\"): uploads up to one label unit older may be included. Not with tab=shorts.",
              "type": "string"
            },
            "until": {
              "description": "Instagram: Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Rumble: Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Only posts published before this time; filters every page, like since. TikTok: Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). YouTube: Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Not with tab=shorts.",
              "type": "string"
            },
            "tab": {
              "description": "Only on Rumble or YouTube. Rumble: The tab to list: videos (default), shorts or live (Rumble's Livestreams tab: streams on air now, scheduled ones and past ones). A user's tabs include the videos of the channels it owns. YouTube: The channel tab to list: videos (default), shorts or live (upcoming, live and past streams).",
              "enum": [
                "videos",
                "shorts",
                "live"
              ],
              "type": "string"
            },
            "sort": {
              "description": "Only on Rumble or YouTube. Rumble: Order of the results. newest (default): Rumble's upload order, newest uploads first (Rumble's own order, not strictly by published_at: older uploads can sit among newer ones). popular: Rumble's View count order (most viewed first). YouTube: Order of the results. newest (default), popular (most viewed first) or oldest.",
              "enum": [
                "newest",
                "popular",
                "oldest"
              ],
              "type": "string"
            },
            "duration": {
              "description": "Only on Rumble. Only short videos (Rumble's Under 4 minutes) or long ones (Over 20 minutes); any length when omitted. Not with tab=shorts.",
              "enum": [
                "short",
                "long"
              ],
              "type": "string"
            },
            "limit": {
              "description": "Items per page, 1 to the endpoint's page size (its default and maximum; larger values are reduced to it). Omit it: every page costs the same, so a smaller limit means more pages to pay for.",
              "maximum": 48,
              "minimum": 1,
              "type": "integer"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns platform, id, url, type, title, text, published_at, author.username, author.display_name, duration_ms, hashtags, metrics; full returns every field (adds platform_type, language, coauthors, thumbnail_url, media, mentions, is_pinned, is_sponsored, is_nsfw, platform_specific, approximate_fields, unknown_fields). Same price.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            },
            "max_age": {
              "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh.",
              "minimum": 0,
              "type": "integer"
            },
            "cursor": {
              "description": "next_cursor from this tool's previous result, to continue a cut result or get the next page. Send the same other arguments.",
              "type": "string"
            }
          },
          "required": [
            "handle"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "List posts",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "search",
        "title": "Search ads and posts",
        "description": "Search public ads or posts on Facebook or Rumble by query. Pass platform and query (the search terms). Price per successful page: 1 credit. Failed calls and cache hits (max_age accepts a stored copy) are free; every result states credits_charged and credits_remaining. Results over about 20,000 tokens are cut: when next_cursor is set, call again with the same arguments and cursor=next_cursor. Follow next_cursor while it is set to get further pages; an empty or short page is not the end. For other data or platforms, call find_endpoint. Notes: Facebook: Payer, impressions, reach and spend are disclosed only for political and social-issue ads; they are null for other ads. Facebook: Dates are whole days (Meta reports the day an ad first and last ran, US Pacific time), so they are listed in approximate_fields. Facebook: since and until return the ads that ran during the window (first ran before until, and still running or last ran at or after since), whole days as Meta reports them; a filtered page can hold fewer ads than the page size, and that is not the end of the list. Facebook: Ads that share one creative are grouped by Meta; each ad of a group is returned as its own item. Facebook: Languages, targeting and EU reach by country are not part of the search results; those fields are empty or null. Rumble: Video results show Rumble's abbreviated counts (2.42K: cut, not rounded, to three significant digits, so a slight undercount): those values are in approximate_fields. A count a result does not show (no votes, no comments yet) is null. Shorts carry exact counts. Rumble: Rumble serves a limited number of result pages per search; a walk that reaches it ends with end_reason platform_limit. Rumble: Search results carry no description: text is null and hashtags and mentions are listed in unknown_fields. Fetch the video for those. Rumble: Rumble's search matches Latin-script keywords: a query in Cyrillic, Arabic, Hebrew or CJK script finds nothing. Queries its firewall reads as SQL or script injection are refused with invalid_input.",
        "input_schema": {
          "type": "object",
          "properties": {
            "platform": {
              "description": "The platform to search.",
              "enum": [
                "facebook",
                "rumble"
              ],
              "type": "string"
            },
            "type": {
              "description": "What to search for.",
              "enum": [
                "ads",
                "posts"
              ],
              "type": "string"
            },
            "query": {
              "description": "Facebook: Keywords matched against the ad's text, in any order. Wrap the query in double quotes (\"cold brew\") to match an exact phrase. Rumble: Keywords, matched by Rumble's search against titles and channels.",
              "maxLength": 512,
              "type": "string"
            },
            "country": {
              "description": "Only on Facebook. Region: an ISO 3166-1 alpha-2 country code such as US or BR (case-insensitive). Only ads delivered in this country. All countries when omitted.",
              "type": "string"
            },
            "lang": {
              "description": "Only on Facebook. Preferred language: a BCP-47 tag such as en or pt-BR (case-insensitive; _ is read as -). Only ads whose text Meta detects as this language (the primary subtag counts: pt-BR searches pt). All languages when omitted.",
              "type": "string"
            },
            "status": {
              "description": "Only on Facebook. Only items that are still running (active), only items that stopped (inactive), or both (all). Default: all.",
              "enum": [
                "active",
                "inactive",
                "all"
              ],
              "type": "string"
            },
            "since": {
              "description": "Facebook: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Ads count when they ran during the window: an ad that last ran (last_shown_at) before since is left out; active ads ran until today. Rumble: Only items at or after this time: RFC 3339 (2026-10-01T12:00:00Z) or a date (2026-10-01, midnight UTC). On newest-first lists, paging stops when it is reached, so later pages are not fetched or charged. Rumble's upload-date filter is applied when it covers since (the last day, week, month or year), so fewer pages are fetched.",
              "type": "string"
            },
            "until": {
              "description": "Facebook: Only items before this time (exclusive): RFC 3339 or a date (midnight UTC). Ads count when they ran during the window: an ad that first ran (first_shown_at) at or after until is left out. Rumble: Only items before this time (exclusive): RFC 3339 or a date (midnight UTC).",
              "type": "string"
            },
            "tab": {
              "description": "Only on Rumble. The search tab to list: videos (default; videos and live streams) or shorts.",
              "enum": [
                "videos",
                "shorts"
              ],
              "type": "string"
            },
            "sort": {
              "description": "Only on Rumble. Order of the results. relevance (default): Rumble's best match. newest: newest uploads first. popular: Rumble's View count order (most viewed first).",
              "enum": [
                "relevance",
                "newest",
                "popular"
              ],
              "type": "string"
            },
            "duration": {
              "description": "Only on Rumble. Only short videos (Rumble's Under 4 minutes) or long ones (Over 20 minutes). Any length when omitted.",
              "enum": [
                "short",
                "long"
              ],
              "type": "string"
            },
            "limit": {
              "description": "Items per page, 1 to the endpoint's page size (its default and maximum; larger values are reduced to it). Omit it: every page costs the same, so a smaller limit means more pages to pay for.",
              "maximum": 36,
              "minimum": 1,
              "type": "integer"
            },
            "detail": {
              "default": "concise",
              "description": "ads: concise (default) returns platform, id, url, advertiser.username, advertiser.display_name, is_active, first_shown_at, last_shown_at, type, creatives[].title, creatives[].body, creatives[].link_url, impressions, spend; full returns every field (adds paid_by, publisher_platforms, languages, country_codes, is_political, reach, audience_size, platform_specific, approximate_fields, unknown_fields). posts: concise (default) returns platform, id, url, type, title, text, published_at, author.username, author.display_name, duration_ms, hashtags, metrics; full returns every field (adds platform_type, language, coauthors, thumbnail_url, media, mentions, is_pinned, is_sponsored, is_nsfw, platform_specific, approximate_fields, unknown_fields). Same price.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            },
            "max_age": {
              "description": "Accept a cached response up to this many seconds old. Cache hits cost 0 credits. Omit to always fetch fresh.",
              "minimum": 0,
              "type": "integer"
            },
            "cursor": {
              "description": "next_cursor from this tool's previous result, to continue a cut result or get the next page. Send the same other arguments.",
              "type": "string"
            }
          },
          "required": [
            "platform",
            "type",
            "query"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Search ads and posts",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "find_endpoint",
        "title": "Find an endpoint",
        "description": "Find which SocialTap tool and endpoint serves a need (\"TikTok comments\", \"YouTube transcript\") or a link: returns the best matches with the tool and arguments to call, the price, the parameters and an example result. Use it when no tool obviously fits, or to check which platforms and links a tool takes. Free, and it works without an API key.",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "description": "What you need, in plain words, or a link to a post, video or profile.",
              "maxLength": 2048,
              "minLength": 1,
              "type": "string"
            },
            "platform": {
              "description": "Only endpoints on this platform.",
              "enum": [
                "facebook",
                "instagram",
                "rumble",
                "threads",
                "tiktok",
                "youtube"
              ],
              "type": "string"
            },
            "limit": {
              "default": 3,
              "description": "How many matches to return.",
              "maximum": 10,
              "minimum": 1,
              "type": "integer"
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Find an endpoint",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "search_docs",
        "title": "Search the docs",
        "description": "Search the SocialTap docs (guides, the API reference, error codes, schemas, pricing) for a question or term: returns the best-matching sections with their page, a snippet and the path to read with read_doc. Use it before writing integration code. Free, and it works without an API key.",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "description": "What to look up: a question, an error code, a parameter or field name.",
              "maxLength": 256,
              "minLength": 1,
              "type": "string"
            },
            "limit": {
              "default": 5,
              "description": "How many sections to return.",
              "maximum": 10,
              "minimum": 1,
              "type": "integer"
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Search the docs",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "read_doc",
        "title": "Read a docs page",
        "description": "Read one SocialTap docs page as Markdown: a path from search_docs or llms.txt (/docs/pagination/), or a full docs URL. Long pages come in parts: call again with cursor=next_cursor for the rest. Free, and it works without an API key.",
        "input_schema": {
          "type": "object",
          "properties": {
            "path": {
              "description": "The page: its path on the docs site (/docs/errors/) or its URL, with or without index.md.",
              "maxLength": 512,
              "minLength": 1,
              "type": "string"
            },
            "cursor": {
              "description": "Where to continue a long page: a previous result's next_cursor.",
              "maxLength": 32,
              "type": "string"
            }
          },
          "required": [
            "path"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Read a docs page",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_account",
        "title": "Get account balance",
        "description": "Get the account, balance and calling key. The account's balance and plan, the low-balance alert threshold, and the calling key: its mode, scopes, spend limit (with what it used this interval) and expiry. Free; never cached. A pending agent key may call it (and nothing else) to learn when its owner confirmed.\n\n**Auth:** an API key with the `account:read` scope, or the dashboard session.\n\n**Test mode:** A test key sees the fixed test balance. Use it to check the credit balance before a large task; every other result already states credits_remaining.",
        "input_schema": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Get account balance",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "create_job",
        "title": "Create a background job",
        "description": "Run many requests (or one long one) as a job. Runs up to `max_requests` (1000) endpoint requests in the background: each item is exactly the request its endpoint answers synchronously, at the same price (failed items are free), with the same caches. `max_pages` walks a list endpoint server-side with its cursor. Credits work as for synchronous requests: each page reserves its endpoint's minimum when it runs (against the balance and the calling key's spend limit) and is topped up to its price, so a job starts whenever its first page could run; `max_credits` (default: the sum of every item's maximum price) caps what the job may spend. With `wait`, the answer is 200 with the first page of results when the job ends in time (a synchronous batch), else 202 with the job; poll `GET /v1/jobs/{id}` (free) or subscribe to `job.completed`.\n\n**Auth:** an API key with the `jobs` scope, or the dashboard session.\n\n**Test mode:** A test key's job runs every item in test mode: each gets its endpoint's test-mode answer (recorded responses, magic inputs), free; nothing is held or charged. A test key sees test jobs only.\n\nUse it instead of a loop of single calls for many items or for walking a whole list; poll it with get_job and read its results with list_job_results. Retrying with the same arguments (and idempotency_key) never creates a second job.",
        "input_schema": {
          "type": "object",
          "properties": {
            "wait": {
              "description": "Seconds to wait for the job to end before answering. If it ends in time the answer is 200 with the first page of results (a synchronous batch); otherwise 202 with the job as it is.",
              "maximum": 60,
              "minimum": 0,
              "type": "integer"
            },
            "max_age": {
              "description": "Accept cached results up to this many seconds old for every item (free cache hits), like the endpoints' max_age.",
              "minimum": 0,
              "type": "integer"
            },
            "max_credits": {
              "description": "Most the job may spend: a cap, never held up front (each page reserves as a synchronous request does). Default: the sum of every item's maximum price (times its max_pages). Items that would go over it are canceled.",
              "minimum": 1,
              "type": "integer"
            },
            "metadata": {
              "additionalProperties": {
                "maxLength": 500,
                "type": "string"
              },
              "description": "Up to 16 string pairs of your own, returned with the job and in its events.",
              "type": "object"
            },
            "requests": {
              "description": "The requests to run, 1 to 1000; custom_id must be unique within the job.",
              "items": {
                "properties": {
                  "custom_id": {
                    "description": "Your ID for the item (letters, digits, _ and -), echoed on its results.",
                    "maxLength": 64,
                    "minLength": 1,
                    "type": "string"
                  },
                  "endpoint": {
                    "description": "The endpoint ID: Endpoint ID on its reference page, x-socialtap-endpoint in OpenAPI (youtube.transcript; not its operationId or path).",
                    "enum": [
                      "facebook.post",
                      "facebook.search_ads",
                      "facebook.transcript",
                      "instagram.post",
                      "instagram.posts",
                      "instagram.profile",
                      "instagram.transcript",
                      "rumble.comments",
                      "rumble.post",
                      "rumble.posts",
                      "rumble.profile",
                      "rumble.search_posts",
                      "rumble.transcript",
                      "threads.profile",
                      "tiktok.comments",
                      "tiktok.post",
                      "tiktok.posts",
                      "tiktok.profile",
                      "tiktok.transcript",
                      "youtube.comments",
                      "youtube.post",
                      "youtube.posts",
                      "youtube.profile",
                      "youtube.transcript"
                    ],
                    "type": "string"
                  },
                  "max_pages": {
                    "description": "List endpoints only: walk up to this many pages with the cursor (default 1). Each page is a result and costs a page's price.",
                    "maximum": 1000,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "params": {
                    "additionalProperties": {},
                    "description": "The endpoint's query params, as you would send them to it (strings, numbers or booleans).",
                    "type": "object"
                  }
                },
                "required": [
                  "custom_id",
                  "endpoint",
                  "params"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "webhook_url": {
              "description": "Also deliver this job's job.* events to this URL: the URL of one of the account's webhook endpoints (its secret signs them).",
              "maxLength": 2048,
              "type": "string"
            },
            "idempotency_key": {
              "description": "Makes a retry safe: the same key with the same arguments returns the first call's result (its current state), never runs it twice. Default: derived from the other arguments, so an identical retry is already safe; pass a new value to run the same arguments again.",
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns each result's data with its endpoint's concise fields (as the endpoint tools do); full returns every field. Same price: reading results is free.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            }
          },
          "required": [
            "requests"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Create a background job",
          "readOnlyHint": false,
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": true
        }
      },
      {
        "name": "get_job",
        "title": "Get a background job",
        "description": "Get a job (free to poll). The job's status, per-state request counts and credits. Free: poll it, or long-poll with `wait`.\n\n**Auth:** an API key with the `jobs` scope, or the dashboard session.\n\n**Test mode:** A test key's job runs every item in test mode: each gets its endpoint's test-mode answer (recorded responses, magic inputs), free; nothing is held or charged. A test key sees test jobs only. Poll a job created with create_job until it completes (wait long-polls); polling is free. Read its results with list_job_results.",
        "input_schema": {
          "type": "object",
          "properties": {
            "id": {
              "description": "Job ID (job_…).",
              "type": "string"
            },
            "wait": {
              "description": "Seconds to wait for the job to end before answering (a long poll): the answer is the job as it is then.",
              "maximum": 60,
              "minimum": 0,
              "type": "integer"
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "Get a background job",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "list_job_results",
        "title": "List a job's results",
        "description": "List a job's results as they complete. The job's results in the order they completed, cursor-paged: one per page an item fetched (a single-item endpoint has one page), and one with the item's final status when it ended without a result (canceled, expired). `result` is exactly the synchronous response's envelope, `error` exactly its error object. Results of a running job can be read as they arrive: keep the last `page.next_cursor` and continue from it. Kept `results_retention_s` (7 days) after the job ends. Free.\n\n**Auth:** an API key with the `jobs` scope, or the dashboard session.\n\n**Test mode:** A test key's job runs every item in test mode: each gets its endpoint's test-mode answer (recorded responses, magic inputs), free; nothing is held or charged. A test key sees test jobs only. Each result is one page of one item: exactly that endpoint's answer, concise like the endpoint tools' unless detail is full. Follow next_cursor for the next results; results arrive while the job runs.",
        "input_schema": {
          "type": "object",
          "properties": {
            "id": {
              "description": "Job ID (job_…).",
              "type": "string"
            },
            "status": {
              "description": "Only results in this status (e.g. failed, to resubmit them).",
              "enum": [
                "succeeded",
                "failed",
                "canceled",
                "expired"
              ],
              "type": "string"
            },
            "limit": {
              "description": "Results per page (default and maximum 100).",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            },
            "cursor": {
              "description": "page.next_cursor of the previous page; omit to start from the first result.",
              "maxLength": 200,
              "type": "string"
            },
            "detail": {
              "default": "concise",
              "description": "concise (default) returns each result's data with its endpoint's concise fields (as the endpoint tools do); full returns every field. Same price: reading results is free.",
              "enum": [
                "concise",
                "full"
              ],
              "type": "string"
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "annotations": {
          "title": "List a job's results",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      }
    ]
  },
  "test_mode": {
    "key_prefix": "st_test_",
    "balance": 10000,
    "magic": {
      "handle": "socialtap_test_{code}",
      "query": "socialtap_test_{code}",
      "url": "https://socialtap.dev/test/{code}"
    },
    "codes": [
      "invalid_input",
      "invalid_cursor",
      "insufficient_credits",
      "spend_limit_reached",
      "rate_limited",
      "not_found",
      "private_or_unavailable",
      "no_transcript",
      "upstream_blocked",
      "upstream_error",
      "overloaded",
      "internal"
    ],
    "cursor": "t1.",
    "default_warning": "test_default_example",
    "endpoints": {
      "facebook.post": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://www.facebook.com/1515533333772646"
            },
            "inputs": [
              "1515533333772646",
              "https://www.facebook.com/1515533333772646"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/9gag/posts/pfbid0HCdcCAZwvriYCAKpD9htRSvmQU64KVd5EiFWhVPGPe7EQGXtnYM4wdfa8QXqkDnCl"
            },
            "inputs": [
              "https://www.facebook.com/9gag/posts/pfbid0HCdcCAZwvriYCAKpD9htRSvmQU64KVd5EiFWhVPGPe7EQGXtnYM4wdfa8QXqkDnCl"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/BillGates/posts/pfbid02Bg6iC7XFjU15gErSDkVqmC79VSsj6FzpahPUYaEZaRQVPypC1KUn1XcDbGCw275Ql"
            },
            "inputs": [
              "https://www.facebook.com/BillGates/posts/pfbid02Bg6iC7XFjU15gErSDkVqmC79VSsj6FzpahPUYaEZaRQVPypC1KUn1XcDbGCw275Ql"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/photo/?fbid=1629624498532920"
            },
            "inputs": [
              "https://www.facebook.com/photo/?fbid=1629624498532920&set=a.416660999829282",
              "https://www.facebook.com/photo/?fbid=1629624498532920"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/cnn/posts/pfbid0zVcLXuYcv5N8D5oZn9NMU3R116cECPXJiKY6QyxiZGTA7eRDZb3zv3NkVwgC1GVdl"
            },
            "inputs": [
              "https://www.facebook.com/cnn/posts/pfbid0zVcLXuYcv5N8D5oZn9NMU3R116cECPXJiKY6QyxiZGTA7eRDZb3zv3NkVwgC1GVdl"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/zuck/posts/pfbid0E4UD7MJyFS496try46EVky6BTQ8kuMFPVBs87iqjKUv4DT5gG4QDWpmt5KmM6SjXl"
            },
            "inputs": [
              "https://www.facebook.com/zuck/posts/pfbid0E4UD7MJyFS496try46EVky6BTQ8kuMFPVBs87iqjKUv4DT5gG4QDWpmt5KmM6SjXl"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/video.php?v=1408202287429345"
            },
            "inputs": [
              "https://www.facebook.com/NASA/videos/1408202287429345/",
              "https://www.facebook.com/video.php?v=1408202287429345"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/photo/?fbid=1629624498532920"
            },
            "inputs": [
              "https://www.facebook.com/photo/?fbid=1629624498532920&set=a.416660999829282",
              "https://www.facebook.com/photo/?fbid=1629624498532920"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/photo/?fbid=1515533303772648"
            },
            "inputs": [
              "https://www.facebook.com/photo/?fbid=1515533303772648"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "https://www.facebook.com/9gag/posts/pfbid0HCdcCAZwvriYCAKpD9htRSvmQU64KVd5EiFWhVPGPe7EQGXtnYM4wdfa8QXqkDnCl"
            },
            "inputs": [
              "https://www.facebook.com/9gag/posts/pfbid0HCdcCAZwvriYCAKpD9htRSvmQU64KVd5EiFWhVPGPe7EQGXtnYM4wdfa8QXqkDnCl"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/BillGates/posts/pfbid02Bg6iC7XFjU15gErSDkVqmC79VSsj6FzpahPUYaEZaRQVPypC1KUn1XcDbGCw275Ql"
            },
            "inputs": [
              "https://www.facebook.com/BillGates/posts/pfbid02Bg6iC7XFjU15gErSDkVqmC79VSsj6FzpahPUYaEZaRQVPypC1KUn1XcDbGCw275Ql"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/elpais/posts/pfbid02sw1cZ9knGv3xdc94DdvzAa3D9w4R15mTEw3oZxiXwezhk6TMJwpm4M5vJz4bAVDal"
            },
            "inputs": [
              "https://www.facebook.com/elpais/posts/pfbid02sw1cZ9knGv3xdc94DdvzAa3D9w4R15mTEw3oZxiXwezhk6TMJwpm4M5vJz4bAVDal"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/cnn/posts/pfbid0zVcLXuYcv5N8D5oZn9NMU3R116cECPXJiKY6QyxiZGTA7eRDZb3zv3NkVwgC1GVdl"
            },
            "inputs": [
              "https://www.facebook.com/cnn/posts/pfbid0zVcLXuYcv5N8D5oZn9NMU3R116cECPXJiKY6QyxiZGTA7eRDZb3zv3NkVwgC1GVdl"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/barackobama/posts/pfbid02cCzrBubyJTbzX8n9yVuxvP4qMbzzDn5TuQrdTh7mmkh7ZBWUSzfHW7EvYuM3RWf4l"
            },
            "inputs": [
              "https://www.facebook.com/barackobama/posts/pfbid02cCzrBubyJTbzX8n9yVuxvP4qMbzzDn5TuQrdTh7mmkh7ZBWUSzfHW7EvYuM3RWf4l"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/permalink.php?id=100059479812265&story_fbid=1515533333772646"
            },
            "inputs": [
              "https://www.facebook.com/story.php?story_fbid=1515533333772646&id=100059479812265",
              "https://www.facebook.com/permalink.php?id=100059479812265&story_fbid=1515533333772646"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/zuck/posts/pfbid0E4UD7MJyFS496try46EVky6BTQ8kuMFPVBs87iqjKUv4DT5gG4QDWpmt5KmM6SjXl"
            },
            "inputs": [
              "https://www.facebook.com/zuck/posts/pfbid0E4UD7MJyFS496try46EVky6BTQ8kuMFPVBs87iqjKUv4DT5gG4QDWpmt5KmM6SjXl"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/cnn/posts/1515533333772645"
            },
            "inputs": [
              "https://www.facebook.com/cnn/posts/1515533333772645"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "https://www.facebook.com/NASA/posts/1670768087751894"
            },
            "inputs": [
              "https://www.facebook.com/NASA/posts/1670768087751894"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/video.php?v=4075684206061398"
            },
            "inputs": [
              "https://www.facebook.com/reel/4075684206061398/",
              "https://www.facebook.com/video.php?v=4075684206061398"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/share/r/1CfnJ9UQoT/"
            },
            "inputs": [
              "https://www.facebook.com/share/r/1CfnJ9UQoT/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/video.php?v=1408202287429345"
            },
            "inputs": [
              "https://www.facebook.com/NASA/videos/1408202287429345/",
              "https://www.facebook.com/video.php?v=1408202287429345"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/video.php?v=637842556329505"
            },
            "inputs": [
              "https://www.facebook.com/video.php?v=637842556329505"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          }
        ]
      },
      "facebook.search_ads": {
        "identity": "query",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "query": "groceries delivered",
              "status": "all"
            },
            "inputs": [
              "groceries delivered"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "US",
              "query": "coffee",
              "status": "all"
            },
            "inputs": [
              "coffee"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "country": "US",
              "query": "coffee",
              "status": "all"
            },
            "inputs": [
              "coffee"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "US",
              "query": "\"cold brew\"",
              "status": "active"
            },
            "inputs": [
              "\"cold brew\""
            ],
            "status": 200
          },
          {
            "params": {
              "country": "US",
              "query": "coffee",
              "since": "2026-09-01T00:00:00Z",
              "status": "all",
              "until": "2026-10-01T00:00:00Z"
            },
            "inputs": [
              "coffee"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "GB",
              "query": "coffee",
              "status": "inactive"
            },
            "inputs": [
              "coffee"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "US",
              "query": "zzqxjvbnmqwplkk",
              "status": "all"
            },
            "inputs": [
              "zzqxjvbnmqwplkk"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "JP",
              "query": "コーヒー",
              "status": "all"
            },
            "inputs": [
              "コーヒー"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "US",
              "query": "voting information center",
              "status": "all"
            },
            "inputs": [
              "voting information center"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "running shoes",
              "since": "2026-10-01T00:00:00Z",
              "status": "all"
            },
            "inputs": [
              "running shoes"
            ],
            "status": 200
          },
          {
            "params": {
              "country": "XX",
              "query": "espresso",
              "status": "all"
            },
            "inputs": [
              "espresso"
            ],
            "status": 400,
            "error_code": "invalid_input"
          }
        ]
      },
      "facebook.transcript": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "no_transcript",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://www.facebook.com/reel/1718871615853822/"
            },
            "inputs": [
              "https://www.facebook.com/reel/1718871615853822/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/3034943296845097/"
            },
            "inputs": [
              "https://www.facebook.com/reel/3034943296845097/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/738566979178125/"
            },
            "inputs": [
              "https://www.facebook.com/reel/738566979178125/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/1755978666533018/"
            },
            "inputs": [
              "https://www.facebook.com/reel/1755978666533018/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://fb.watch/G1pb1cwZsM/"
            },
            "inputs": [
              "https://fb.watch/G1pb1cwZsM/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/1570030614893129/"
            },
            "inputs": [
              "https://www.facebook.com/reel/1570030614893129/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/1113509447153884/"
            },
            "inputs": [
              "https://www.facebook.com/reel/1113509447153884/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://fb.watch/G-oJWeu2nt/"
            },
            "inputs": [
              "https://fb.watch/G-oJWeu2nt/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/1803909017420449/"
            },
            "inputs": [
              "https://www.facebook.com/reel/1803909017420449/"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/1408202287429345/"
            },
            "inputs": [
              "https://www.facebook.com/reel/1408202287429345/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.facebook.com/reel/3034943296845097/"
            },
            "inputs": [
              "https://www.facebook.com/reel/3034943296845097/"
            ],
            "status": 404,
            "error_code": "no_transcript",
            "shadowed": true
          }
        ]
      },
      "instagram.post": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://www.instagram.com/p/De492EVDJd3/"
            },
            "inputs": [
              "https://www.instagram.com/p/De492EVDJd3/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/DexcKhDDno3/"
            },
            "inputs": [
              "https://www.instagram.com/p/DexcKhDDno3/?img_index=2",
              "https://www.instagram.com/p/DexcKhDDno3/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/DeuOR-CjKE9/"
            },
            "inputs": [
              "https://www.instagram.com/p/DeuOR-CjKE9/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De1S3KpCXf1/"
            },
            "inputs": [
              "https://www.instagram.com/reel/De1S3KpCXf1/",
              "https://www.instagram.com/p/De1S3KpCXf1/"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De1S3KpCXf0/"
            },
            "inputs": [
              "https://www.instagram.com/reel/De1S3KpCXf0/",
              "https://www.instagram.com/p/De1S3KpCXf0/"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/ChdZ_3UALgB/"
            },
            "inputs": [
              "https://www.instagram.com/reel/ChdZ_3UALgB/",
              "https://www.instagram.com/p/ChdZ_3UALgB/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/share/reel/_oDaXMUlS/"
            },
            "inputs": [
              "https://www.instagram.com/share/reel/_oDaXMUlS/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/BBBBBBBBBBB/"
            },
            "inputs": [
              "https://www.instagram.com/p/BBBBBBBBBBB/"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/DDDDDDDDDDD/"
            },
            "inputs": [
              "https://www.instagram.com/p/DDDDDDDDDDD/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/CCCCCCCCCCC/"
            },
            "inputs": [
              "https://www.instagram.com/p/CCCCCCCCCCC/"
            ],
            "status": 503,
            "error_code": "upstream_blocked"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De1S3KpCXf0/"
            },
            "inputs": [
              "https://www.instagram.com/p/De1S3KpCXf0/"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/EEEEEEEEEEE/"
            },
            "inputs": [
              "https://www.instagram.com/p/EEEEEEEEEEE/"
            ],
            "status": 200
          }
        ]
      },
      "instagram.posts": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "@nasa",
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "natgeo"
            },
            "inputs": [
              "https://www.instagram.com/natgeo/reels/",
              "natgeo",
              "https://www.instagram.com/natgeo/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bts.bighitofficial"
            },
            "inputs": [
              "bts.bighitofficial",
              "https://www.instagram.com/bts.bighitofficial/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "zzq9x81nouser"
            },
            "inputs": [
              "zzq9x81nouser"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "vogue"
            },
            "inputs": [
              "vogue"
            ],
            "status": 403,
            "error_code": "private_or_unavailable",
            "shadowed": true
          },
          {
            "params": {
              "handle": "budweiser"
            },
            "inputs": [
              "budweiser"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "vogue"
            },
            "inputs": [
              "vogue",
              "https://www.instagram.com/vogue/"
            ],
            "status": 200
          }
        ]
      },
      "instagram.profile": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "legal"
            },
            "inputs": [
              "https://www.instagram.com/legal/",
              "legal"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "@NASA",
              "nasa",
              "https://www.instagram.com/nasa/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "natgeo"
            },
            "inputs": [
              "https://www.instagram.com/natgeo/",
              "natgeo"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "bts.bighitofficial"
            },
            "inputs": [
              "bts.bighitofficial",
              "https://www.instagram.com/bts.bighitofficial/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "zzq9x81nouser"
            },
            "inputs": [
              "zzq9x81nouser"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "qp"
            },
            "inputs": [
              "qp",
              "https://www.instagram.com/qp/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "vogue"
            },
            "inputs": [
              "vogue",
              "https://www.instagram.com/vogue/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "budweiser"
            },
            "inputs": [
              "budweiser"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "handle": "jackdaniels_us"
            },
            "inputs": [
              "jackdaniels_us"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "handle": "nba"
            },
            "inputs": [
              "nba",
              "https://www.instagram.com/nba/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "srr"
            },
            "inputs": [
              "srr",
              "https://www.instagram.com/srr/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nike"
            },
            "inputs": [
              "https://www.instagram.com/nike/reels/",
              "nike",
              "https://www.instagram.com/nike/"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "age_restricted_example"
            },
            "inputs": [
              "age_restricted_example"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "handle": "natgeo"
            },
            "inputs": [
              "natgeo",
              "https://www.instagram.com/natgeo/"
            ],
            "status": 200,
            "shadowed": true
          }
        ]
      },
      "instagram.transcript": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "no_transcript",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://www.instagram.com/p/De11ONFn3Xk/"
            },
            "inputs": [
              "https://www.instagram.com/p/De11ONFn3Xk/"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De1S3KpCXf0/"
            },
            "inputs": [
              "https://www.instagram.com/p/De1S3KpCXf0/"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De4J7SciJp7/"
            },
            "inputs": [
              "https://www.instagram.com/p/De4J7SciJp7/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De492EVDJd3/"
            },
            "inputs": [
              "https://www.instagram.com/p/De492EVDJd3/"
            ],
            "status": 400,
            "error_code": "invalid_input"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/DexcKhDDno3/?img_index=2"
            },
            "inputs": [
              "https://www.instagram.com/p/DexcKhDDno3/?img_index=2"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De1S3KpCXf1/"
            },
            "inputs": [
              "https://www.instagram.com/p/De1S3KpCXf1/"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/DeuOR-CjKE9/"
            },
            "inputs": [
              "https://www.instagram.com/p/DeuOR-CjKE9/"
            ],
            "status": 400,
            "error_code": "invalid_input"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De1S3KpCXf0/"
            },
            "inputs": [
              "https://www.instagram.com/p/De1S3KpCXf0/"
            ],
            "status": 404,
            "error_code": "no_transcript",
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/ChdZ_3UALgB/"
            },
            "inputs": [
              "https://www.instagram.com/p/ChdZ_3UALgB/"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.instagram.com/share/reel/_oDaXMUlS/"
            },
            "inputs": [
              "https://www.instagram.com/share/reel/_oDaXMUlS/"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/De6q2K4lYUd/"
            },
            "inputs": [
              "https://www.instagram.com/p/De6q2K4lYUd/"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/"
            ],
            "status": 403,
            "error_code": "private_or_unavailable",
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/"
            ],
            "status": 404,
            "error_code": "no_transcript",
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/?img_index=1"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/?img_index=1"
            ],
            "status": 400,
            "error_code": "invalid_input"
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/"
            ],
            "status": 403,
            "error_code": "private_or_unavailable",
            "shadowed": true
          },
          {
            "params": {
              "url": "https://www.instagram.com/p/AAAAAAAAAAA/"
            },
            "inputs": [
              "https://www.instagram.com/p/AAAAAAAAAAA/"
            ],
            "status": 503,
            "error_code": "upstream_blocked",
            "shadowed": true
          }
        ]
      },
      "rumble.comments": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "sort": "newest",
              "url": "v7h29za"
            },
            "inputs": [
              "https://rumble.com/shorts/v7h29za",
              "v7h29za",
              "https://rumble.com/v7h29za"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "sort": "newest",
              "url": "https://rumble.com/embed/v77qthe/"
            },
            "inputs": [
              "https://rumble.com/embed/v77qthe/"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "https://rumble.com/embed/v79xhhm/"
            },
            "inputs": [
              "https://rumble.com/embed/v79xhhm/"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "https://rumble.com/embed/vzzzzzz/"
            },
            "inputs": [
              "https://rumble.com/embed/vzzzzzz/"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "sort": "newest",
              "url": "v3w40jw"
            },
            "inputs": [
              "https://rumble.com/v3w40jw",
              "v3w40jw"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v35waq4"
            },
            "inputs": [
              "https://rumble.com/v35waq4-rt-news-livestream-247.html",
              "v35waq4",
              "https://rumble.com/v35waq4"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7hga5c"
            },
            "inputs": [
              "https://rumble.com/v7hga5c-rt-de-live-tv.html",
              "v7hga5c",
              "https://rumble.com/v7hga5c"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7hicbc"
            },
            "inputs": [
              "https://rumble.com/v7hicbc-crunch-time-ep.-2626-10282026.html",
              "v7hicbc",
              "https://rumble.com/v7hicbc"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7hicbc"
            },
            "inputs": [
              "v7hicbc",
              "https://rumble.com/v7hicbc"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "v7hicbc"
            },
            "inputs": [
              "v7hicbc",
              "https://rumble.com/v7hicbc"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "v7hicbc"
            },
            "inputs": [
              "v7hicbc",
              "https://rumble.com/v7hicbc"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7hirte"
            },
            "inputs": [
              "https://rumble.com/share/v7hirte?src=load",
              "v7hirte",
              "https://rumble.com/v7hirte"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7hgv02"
            },
            "inputs": [
              "https://rumble.com/shorts/v7hgv02",
              "v7hgv02",
              "https://rumble.com/v7hgv02"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7g7zzu"
            },
            "inputs": [
              "https://rumble.com/shorts/v7g7zzu?e9s=src_v1_cmd",
              "v7g7zzu",
              "https://rumble.com/v7g7zzu"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v1i5ake"
            },
            "inputs": [
              "https://rumble.com/v1i5ake",
              "v1i5ake"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "sort": "newest",
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
              "v79xhhm",
              "https://rumble.com/v79xhhm"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
              "v79xhhm",
              "https://rumble.com/v79xhhm"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "v7599uk"
            },
            "inputs": [
              "v7599uk",
              "https://rumble.com/v7599uk"
            ],
            "status": 200
          }
        ]
      },
      "rumble.post": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://rumble.com/embed/v77qthe/"
            },
            "inputs": [
              "https://rumble.com/embed/v77qthe/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hgv02"
            },
            "inputs": [
              "https://rumble.com/shorts/v7hgv02",
              "v7hgv02"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "v79xhhm"
            },
            "inputs": [
              "v79xhhm"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "v35waq4"
            },
            "inputs": [
              "https://rumble.com/v35waq4-rt-news-livestream-247.html",
              "v35waq4"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hga5c"
            },
            "inputs": [
              "https://rumble.com/v7hga5c-rt-de-live-tv.html",
              "v7hga5c"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hicbc"
            },
            "inputs": [
              "v7hicbc"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hfuko"
            },
            "inputs": [
              "https://rumble.com/v7hfuko-trump-doj-charges-deep-state-comey-again-4th-arrest-in-a-week-timcast-irl.html",
              "v7hfuko"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hgv02"
            },
            "inputs": [
              "https://rumble.com/shorts/v7hgv02",
              "v7hgv02"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v35waq4"
            },
            "inputs": [
              "https://rumble.com/v35waq4-rt-news-livestream-247.html",
              "v35waq4"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
              "v79xhhm"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v35waq4"
            },
            "inputs": [
              "https://rumble.com/v35waq4-rt-news-livestream-247.html",
              "v35waq4"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "v7hgv02"
            },
            "inputs": [
              "https://rumble.com/shorts/v7hgv02",
              "v7hgv02"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "v7hirte"
            },
            "inputs": [
              "https://rumble.com/share/v7hirte?src=x",
              "v7hirte"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
              "v79xhhm"
            ],
            "status": 200,
            "shadowed": true,
            "default": true
          }
        ]
      },
      "rumble.posts": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "potus",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "c/POTUS",
              "potus"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "live"
            },
            "inputs": [
              "c/Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "vivafrei",
              "sort": "newest",
              "tab": "live"
            },
            "inputs": [
              "https://rumble.com/user/vivafrei/livestreams",
              "vivafrei"
            ],
            "status": 200
          },
          {
            "params": {
              "duration": "long",
              "handle": "bongino",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "potus",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "c/POTUS",
              "potus"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "francesoir",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "FranceSoir",
              "francesoir"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "popular",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "popular",
              "tab": "live"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "popular",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "https://rumble.com/c/Bongino/shorts",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "_c276782",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "_c276782"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "c/bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "c/bongino",
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "creationofgod",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "CreationOfGod",
              "creationofgod"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "viralhog",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "user/ViralHog",
              "viralhog"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "viralhog",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "https://rumble.com/user/ViralHog",
              "viralhog"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "vivafrei",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "user/vivafrei",
              "vivafrei"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "bongino",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200
          }
        ]
      },
      "rumble.profile": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "_c2878406"
            },
            "inputs": [
              "_c2878406"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "c-276782"
            },
            "inputs": [
              "c/c-276782",
              "c-276782"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "c-854353"
            },
            "inputs": [
              "c/c-854353",
              "c-854353"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "francesoir"
            },
            "inputs": [
              "c/FranceSoir",
              "francesoir"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "monark"
            },
            "inputs": [
              "c/Monark",
              "monark"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "akademiks"
            },
            "inputs": [
              "https://rumble.com/c/Akademiks/videos",
              "akademiks"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "c-5185017"
            },
            "inputs": [
              "https://rumble.com/c/c-5185017",
              "c-5185017"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino"
            },
            "inputs": [
              "Bongino",
              "bongino"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "c-2335430"
            },
            "inputs": [
              "https://rumble.com/c-2335430",
              "c-2335430"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bonginoreport"
            },
            "inputs": [
              "BonginoReport",
              "bonginoreport"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "delta_v_"
            },
            "inputs": [
              "https://rumble.com/user/Delta_V_/about",
              "delta_v_"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "trending"
            },
            "inputs": [
              "https://rumble.com/trending",
              "trending"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bongino"
            },
            "inputs": [
              "c/Bongino",
              "bongino"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "bonginoreport"
            },
            "inputs": [
              "user/BonginoReport",
              "bonginoreport"
            ],
            "status": 200,
            "shadowed": true
          }
        ]
      },
      "rumble.search_posts": {
        "identity": "query",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "query": "bongino",
              "sort": "popular",
              "tab": "videos"
            },
            "inputs": [
              "bongino"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "cats",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "cats"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "query": "cats",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "cats"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "cats",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "cats"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "cats",
              "sort": "relevance",
              "tab": "shorts"
            },
            "inputs": [
              "cats"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "cats",
              "sort": "relevance",
              "tab": "shorts"
            },
            "inputs": [
              "cats"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "election",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "election"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "news",
              "since": "2026-10-25T00:00:00Z",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "news"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "zqxjvkwplmrtq9183",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "zqxjvkwplmrtq9183"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "zqxjvkwplmrtq9183",
              "sort": "relevance",
              "tab": "shorts"
            },
            "inputs": [
              "zqxjvkwplmrtq9183"
            ],
            "status": 200
          },
          {
            "params": {
              "duration": "long",
              "query": "podcast",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "podcast"
            ],
            "status": 200
          },
          {
            "params": {
              "query": "gatos graciosos",
              "sort": "relevance",
              "tab": "videos"
            },
            "inputs": [
              "gatos graciosos"
            ],
            "status": 200
          }
        ]
      },
      "rumble.transcript": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "no_transcript",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://rumble.com/embed/v77qthe/"
            },
            "inputs": [
              "https://rumble.com/embed/v77qthe/?pub=4",
              "https://rumble.com/embed/v77qthe/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v35waq4"
            },
            "inputs": [
              "https://rumble.com/v35waq4-rt-news-livestream-247.html",
              "v35waq4"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "v7gyfyc"
            },
            "inputs": [
              "https://rumble.com/v7gyfyc",
              "v7gyfyc"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hflc2"
            },
            "inputs": [
              "v7hflc2"
            ],
            "status": 404,
            "error_code": "no_transcript",
            "shadowed": true
          },
          {
            "params": {
              "url": "v6qikk8"
            },
            "inputs": [
              "v6qikk8"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "v7hicbc"
            },
            "inputs": [
              "https://rumble.com/v7hicbc",
              "v7hicbc"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7gfn9e"
            },
            "inputs": [
              "https://rumble.com/shorts/v7gfn9e",
              "v7gfn9e"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hibne"
            },
            "inputs": [
              "v7hibne"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7ham20"
            },
            "inputs": [
              "https://rumble.com/shorts/v7ham20",
              "v7ham20"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hflc2"
            },
            "inputs": [
              "v7hflc2"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
              "v79xhhm"
            ],
            "status": 404,
            "error_code": "no_transcript",
            "shadowed": true
          },
          {
            "params": {
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm",
              "v79xhhm"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "es-mx",
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm",
              "v79xhhm"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://rumble.com/embed/v33aw1a/"
            },
            "inputs": [
              "https://rumble.com/embed/v33aw1a/?pub=4",
              "https://rumble.com/embed/v33aw1a/"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "v1n8sb6"
            },
            "inputs": [
              "v1n8sb6"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "en",
              "url": "v1n8sb6"
            },
            "inputs": [
              "v1n8sb6"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v7hirte"
            },
            "inputs": [
              "https://rumble.com/share/v7hirte?src=record",
              "v7hirte"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "v79xhhm"
            },
            "inputs": [
              "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
              "v79xhhm"
            ],
            "status": 200,
            "shadowed": true,
            "default": true
          }
        ]
      },
      "threads.profile": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "63055343223"
            },
            "inputs": [
              "63055343223"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "10000000099"
            },
            "inputs": [
              "10000000099"
            ],
            "status": 502,
            "error_code": "upstream_error"
          },
          {
            "params": {
              "handle": "arabic.sample"
            },
            "inputs": [
              "arabic.sample",
              "https://www.threads.com/@arabic.sample"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "no_such_user_zz9plq"
            },
            "inputs": [
              "no_such_user_zz9plq"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "zuck"
            },
            "inputs": [
              "zuck",
              "https://www.threads.com/@zuck"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "private.sample"
            },
            "inputs": [
              "private.sample",
              "https://www.threads.com/@private.sample"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "spotify"
            },
            "inputs": [
              "@Spotify",
              "spotify",
              "https://www.threads.com/@spotify"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "zuck"
            },
            "inputs": [
              "https://www.threads.com/@zuck",
              "zuck"
            ],
            "status": 200,
            "shadowed": true,
            "default": true
          },
          {
            "params": {
              "handle": "zuck"
            },
            "inputs": [
              "https://www.threads.net/@zuck/replies",
              "zuck",
              "https://www.threads.com/@zuck"
            ],
            "status": 200,
            "shadowed": true
          }
        ]
      },
      "tiktok.comments": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "6718335390845095173"
            },
            "inputs": [
              "6718335390845095173",
              "https://www.tiktok.com/@/video/6718335390845095173"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7206382937372134662"
            },
            "inputs": [
              "https://www.tiktok.com/@moxypatch/video/7206382937372134662",
              "7206382937372134662"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "url": "6718335390845095173"
            },
            "inputs": [
              "6718335390845095173",
              "https://www.tiktok.com/@/video/6718335390845095173"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "6718335390845095173"
            },
            "inputs": [
              "https://www.tiktok.com/@scout2015/video/6718335390845095173",
              "6718335390845095173",
              "https://www.tiktok.com/@/video/6718335390845095173"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "6718335390845095173"
            },
            "inputs": [
              "https://www.tiktok.com/@scout2015/video/6718335390845095173",
              "6718335390845095173",
              "https://www.tiktok.com/@/video/6718335390845095173"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7000000000000000001"
            },
            "inputs": [
              "7000000000000000001"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "url": "6718335390845095173"
            },
            "inputs": [
              "6718335390845095173",
              "https://www.tiktok.com/@/video/6718335390845095173"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7693183838452731168"
            },
            "inputs": [
              "https://www.tiktok.com/@chinoir07/photo/7693183838452731168",
              "7693183838452731168",
              "https://www.tiktok.com/@/video/7693183838452731168"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7047596209028074758"
            },
            "inputs": [
              "https://www.tiktok.com/@hankgreen1/video/7047596209028074758?is_from_webapp=1&sender_device=pc",
              "7047596209028074758",
              "https://www.tiktok.com/@/video/7047596209028074758"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "6748451240264420610"
            },
            "inputs": [
              "https://www.tiktok.com/@leenabhushan/video/6748451240264420610",
              "6748451240264420610"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "https://www.tiktok.com/t/ZSgAbqM38/"
            },
            "inputs": [
              "https://www.tiktok.com/t/ZSgAbqM38/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://vt.tiktok.com/ZSg5BSeaD/"
            },
            "inputs": [
              "https://vt.tiktok.com/ZSg5BSeaD",
              "https://vt.tiktok.com/ZSg5BSeaD/"
            ],
            "status": 200
          }
        ]
      },
      "tiktok.post": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "7693183838452731168"
            },
            "inputs": [
              "7693183838452731168"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "7673108027645414678"
            },
            "inputs": [
              "https://www.tiktok.com/@niinoclock/video/7673108027645414678",
              "7673108027645414678"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "7693940691843435790"
            },
            "inputs": [
              "https://www.tiktok.com/@/video/7693940691843435790",
              "7693940691843435790"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7695346199171435794"
            },
            "inputs": [
              "https://m.tiktok.com/v/7695346199171435794.html",
              "7695346199171435794"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7701024293387373838"
            },
            "inputs": [
              "https://www.tiktok.com/embed/v2/7701024293387373838",
              "7701024293387373838"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7701024293387373838"
            },
            "inputs": [
              "https://www.tiktok.com/embed/v2/7701024293387373838",
              "7701024293387373838"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "7693183838452731168"
            },
            "inputs": [
              "https://www.tiktok.com/@chinoir07/photo/7693183838452731168",
              "7693183838452731168"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://vt.tiktok.com/ZSgAbqM38/"
            },
            "inputs": [
              "https://vt.tiktok.com/ZSgAbqM38/"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7673108027645414678"
            },
            "inputs": [
              "https://www.tiktok.com/@niinoclock/video/7673108027645414678?is_from_webapp=1&sender_device=pc",
              "7673108027645414678"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "6718335390845095173"
            },
            "inputs": [
              "https://www.tiktok.com/@scout2015/video/6718335390845095173",
              "6718335390845095173"
            ],
            "status": 200,
            "default": true
          }
        ]
      },
      "tiktok.posts": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "khaby.lame"
            },
            "inputs": [
              "@khaby.lame",
              "khaby.lame",
              "https://www.tiktok.com/@khaby.lame"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.tiktok.com/@nasa"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.tiktok.com/@nasa"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bts_official_bighit"
            },
            "inputs": [
              "bts_official_bighit",
              "https://www.tiktok.com/@bts_official_bighit"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "zzq9x81nouser"
            },
            "inputs": [
              "zzq9x81nouser"
            ],
            "status": 404,
            "error_code": "not_found",
            "shadowed": true
          },
          {
            "params": {
              "handle": "google"
            },
            "inputs": [
              "https://www.tiktok.com/@google",
              "google"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "999999999999999999"
            },
            "inputs": [
              "https://www.tiktok.com/share/user/999999999999999999",
              "999999999999999999"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "6917704832925746181"
            },
            "inputs": [
              "6917704832925746181"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "nasa",
              "https://www.tiktok.com/@nasa"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "zzq9x81nouser"
            },
            "inputs": [
              "zzq9x81nouser"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "google"
            },
            "inputs": [
              "google",
              "https://www.tiktok.com/@google"
            ],
            "status": 200,
            "shadowed": true
          }
        ]
      },
      "tiktok.profile": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "qq7x2nouser0z"
            },
            "inputs": [
              "qq7x2nouser0z"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "scout2015"
            },
            "inputs": [
              "scout2015",
              "https://www.tiktok.com/@scout2015"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "duolingo"
            },
            "inputs": [
              "duolingo",
              "https://www.tiktok.com/@duolingo"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "khaby.lame"
            },
            "inputs": [
              "@khaby.lame",
              "khaby.lame",
              "https://www.tiktok.com/@khaby.lame"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "bts_official_bighit"
            },
            "inputs": [
              "bts_official_bighit",
              "https://www.tiktok.com/@bts_official_bighit"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "zzq9x81nouser"
            },
            "inputs": [
              "zzq9x81nouser"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "https://www.tiktok.com/@nasa",
              "nasa"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "7000000000000000001"
            },
            "inputs": [
              "7000000000000000001"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "107955"
            },
            "inputs": [
              "https://www.tiktok.com/share/user/107955",
              "107955"
            ],
            "status": 200
          }
        ]
      },
      "tiktok.transcript": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "no_transcript",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
            },
            "inputs": [
              "https://www.tiktok.com/@scout2015/video/6718335390845095173",
              "6718335390845095173"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7699163285702135073"
            },
            "inputs": [
              "7699163285702135073"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "lang": "eng-US",
              "url": "https://www.tiktok.com/@elan.media_/video/7663447693913509152"
            },
            "inputs": [
              "https://www.tiktok.com/@elan.media_/video/7663447693913509152",
              "7663447693913509152"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "de",
              "url": "7689027164263435538"
            },
            "inputs": [
              "7689027164263435538"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.tiktok.com/@niinoclock/video/7673108027645414678"
            },
            "inputs": [
              "https://www.tiktok.com/@niinoclock/video/7673108027645414678",
              "7673108027645414678"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "https://www.tiktok.com/embed/v2/7691047892483656974"
            },
            "inputs": [
              "https://www.tiktok.com/embed/v2/7691047892483656974",
              "7691047892483656974"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.tiktok.com/@elan.media_/video/7663447693913509152?is_from_webapp=1&sender_device=pc"
            },
            "inputs": [
              "https://www.tiktok.com/@elan.media_/video/7663447693913509152?is_from_webapp=1&sender_device=pc",
              "7663447693913509152"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "7699163285702135073"
            },
            "inputs": [
              "7699163285702135073"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "ja",
              "url": "https://m.tiktok.com/v/7689027164263435538.html"
            },
            "inputs": [
              "https://m.tiktok.com/v/7689027164263435538.html",
              "7689027164263435538"
            ],
            "status": 200
          }
        ]
      },
      "youtube.comments": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "sort": "popular",
              "url": "HtVdAasjOgU"
            },
            "inputs": [
              "HtVdAasjOgU",
              "https://www.youtube.com/watch?v=HtVdAasjOgU"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "XqZsoesa55w"
            },
            "inputs": [
              "XqZsoesa55w"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "sort": "newest",
              "url": "jNQXAC9IVRw"
            },
            "inputs": [
              "jNQXAC9IVRw"
            ],
            "status": 400,
            "error_code": "invalid_cursor",
            "shadowed": true
          },
          {
            "params": {
              "sort": "newest",
              "url": "qUTSzYEtUG0"
            },
            "inputs": [
              "qUTSzYEtUG0",
              "https://www.youtube.com/watch?v=qUTSzYEtUG0"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "jNQXAC9IVRw"
            },
            "inputs": [
              "jNQXAC9IVRw",
              "https://www.youtube.com/watch?v=jNQXAC9IVRw"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "since": "2026-10-01T00:00:00Z",
              "sort": "newest",
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "dQw4w9WgXcQ",
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "kJQP7kiw5Fk"
            },
            "inputs": [
              "kJQP7kiw5Fk",
              "https://www.youtube.com/watch?v=kJQP7kiw5Fk"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "Q39EVAstoRM"
            },
            "inputs": [
              "Q39EVAstoRM"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "sort": "newest",
              "url": "yZIXLfi8CZQ"
            },
            "inputs": [
              "yZIXLfi8CZQ"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "sort": "newest",
              "url": "3cWm9B_0_kI"
            },
            "inputs": [
              "3cWm9B_0_kI",
              "https://www.youtube.com/watch?v=3cWm9B_0_kI"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "jNQXAC9IVRw"
            },
            "inputs": [
              "jNQXAC9IVRw",
              "https://www.youtube.com/watch?v=jNQXAC9IVRw"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "popular",
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "dQw4w9WgXcQ",
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            ],
            "status": 200
          },
          {
            "params": {
              "sort": "newest",
              "url": "E_HgDSKu_50"
            },
            "inputs": [
              "E_HgDSKu_50",
              "https://www.youtube.com/watch?v=E_HgDSKu_50"
            ],
            "status": 200
          }
        ]
      },
      "youtube.post": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "HtVdAasjOgU"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=HtVdAasjOgU",
              "HtVdAasjOgU"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "kCc8FmEb1nY"
            },
            "inputs": [
              "kCc8FmEb1nY"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "a-iReT6fwVI"
            },
            "inputs": [
              "https://youtu.be/a-iReT6fwVI",
              "a-iReT6fwVI"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "XqZsoesa55w"
            },
            "inputs": [
              "XqZsoesa55w"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "RRBN_4L09Mg"
            },
            "inputs": [
              "RRBN_4L09Mg"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "Q39EVAstoRM"
            },
            "inputs": [
              "https://youtu.be/Q39EVAstoRM",
              "Q39EVAstoRM"
            ],
            "status": 404,
            "error_code": "not_found",
            "shadowed": true
          },
          {
            "params": {
              "url": "jNQXAC9IVRw"
            },
            "inputs": [
              "jNQXAC9IVRw"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "qVv6vCqciTM"
            },
            "inputs": [
              "https://www.youtube.com/live/qVv6vCqciTM?si=abc",
              "qVv6vCqciTM"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "jfKfPfyJRdk"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=jfKfPfyJRdk",
              "jfKfPfyJRdk"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "9bZkp7q19f0"
            },
            "inputs": [
              "https://m.youtube.com/watch?v=9bZkp7q19f0",
              "9bZkp7q19f0"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "Q39EVAstoRM"
            },
            "inputs": [
              "Q39EVAstoRM"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "url": "3cWm9B_0_kI"
            },
            "inputs": [
              "https://www.youtube.com/shorts/3cWm9B_0_kI",
              "3cWm9B_0_kI"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
              "dQw4w9WgXcQ"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "yYr8q0y5Jfg"
            },
            "inputs": [
              "yYr8q0y5Jfg"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "yZIXLfi8CZQ"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=yZIXLfi8CZQ",
              "yZIXLfi8CZQ"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "3cWm9B_0_kI"
            },
            "inputs": [
              "https://youtube.com/shorts/3cWm9B_0_kI?feature=share",
              "3cWm9B_0_kI"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "dQw4w9WgXcQ"
            ],
            "status": 503,
            "error_code": "upstream_blocked",
            "shadowed": true
          },
          {
            "params": {
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
              "dQw4w9WgXcQ"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "kCc8FmEb1nY"
            },
            "inputs": [
              "kCc8FmEb1nY"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
              "dQw4w9WgXcQ"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "mjxtSnNyHEk"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=mjxtSnNyHEk",
              "mjxtSnNyHEk"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
              "dQw4w9WgXcQ"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "url": "SuaDQWjAbjg"
            },
            "inputs": [
              "SuaDQWjAbjg"
            ],
            "status": 200
          }
        ]
      },
      "youtube.posts": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "invalid_cursor",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "UCOpNcN46UbXVtpKMrmU4Abg",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "UCOpNcN46UbXVtpKMrmU4Abg",
              "https://www.youtube.com/channel/UCOpNcN46UbXVtpKMrmU4Abg"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "rickastleyvevo",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "https://www.youtube.com/user/RickAstleyVEVO",
              "rickastleyvevo",
              "https://www.youtube.com/user/rickastleyvevo"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCLA_DiR1FfKNvjuUpBHmylQ",
              "sort": "newest",
              "tab": "live"
            },
            "inputs": [
              "UCLA_DiR1FfKNvjuUpBHmylQ",
              "https://www.youtube.com/channel/UCLA_DiR1FfKNvjuUpBHmylQ"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "UCLA_DiR1FfKNvjuUpBHmylQ",
              "sort": "newest",
              "tab": "live"
            },
            "inputs": [
              "UCLA_DiR1FfKNvjuUpBHmylQ",
              "https://www.youtube.com/channel/UCLA_DiR1FfKNvjuUpBHmylQ"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCzucOGEnILK5cAdUUVCIefg",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "UCzucOGEnILK5cAdUUVCIefg",
              "https://www.youtube.com/channel/UCzucOGEnILK5cAdUUVCIefg"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "live"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "hikakintv",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "@HikakinTV",
              "hikakintv",
              "https://www.youtube.com/@hikakintv"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "jawed",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "@jawed",
              "jawed",
              "https://www.youtube.com/@jawed"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "https://www.youtube.com/@MrBeast/shorts",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "shorts"
            },
            "inputs": [
              "https://www.youtube.com/@MrBeast/shorts",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "popular",
              "tab": "shorts"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCX6OQ3DkcsbYNE6H8uQQuVB",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "UCX6OQ3DkcsbYNE6H8uQQuVB"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "mrbeast",
              "sort": "newest",
              "tab": "videos"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "rickastleyyt",
              "sort": "oldest",
              "tab": "videos"
            },
            "inputs": [
              "https://www.youtube.com/@RickAstleyYT/videos",
              "rickastleyyt",
              "https://www.youtube.com/@rickastleyyt"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa",
              "sort": "popular",
              "tab": "videos"
            },
            "inputs": [
              "@NASA",
              "nasa",
              "https://www.youtube.com/@nasa"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa",
              "sort": "popular",
              "tab": "videos"
            },
            "inputs": [
              "@NASA",
              "nasa",
              "https://www.youtube.com/@nasa"
            ],
            "status": 200
          }
        ]
      },
      "youtube.profile": {
        "identity": "handle",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "handle": "cocomelon"
            },
            "inputs": [
              "@CoComelon",
              "cocomelon",
              "https://www.youtube.com/@cocomelon"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCzuqhhs6NWbgTzMuM09WKDQ"
            },
            "inputs": [
              "UCzuqhhs6NWbgTzMuM09WKDQ"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCrpQ4p1Ql_hG8rKXIKM1MOQ"
            },
            "inputs": [
              "UCrpQ4p1Ql_hG8rKXIKM1MOQ"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "gaming"
            },
            "inputs": [
              "https://www.youtube.com/gaming",
              "gaming"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCtFRv9O2AHqOZjjynzrv-xg"
            },
            "inputs": [
              "UCtFRv9O2AHqOZjjynzrv-xg"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "live"
            },
            "inputs": [
              "https://www.youtube.com/live",
              "live"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UC-9-kyTW8ZkZNDHQJ6FgpwQ"
            },
            "inputs": [
              "UC-9-kyTW8ZkZNDHQJ6FgpwQ"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "news"
            },
            "inputs": [
              "https://www.youtube.com/news",
              "news"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCEgdi0XIXXZ-qJOFPf4JSKw"
            },
            "inputs": [
              "UCEgdi0XIXXZ-qJOFPf4JSKw"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCX6OQ3DkcsbYNE6H8uQQuVA"
            },
            "inputs": [
              "UCX6OQ3DkcsbYNE6H8uQQuVA"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "https://www.youtube.com/c/nasa",
              "nasa"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCzucOGEnILK5cAdUUVCIefg"
            },
            "inputs": [
              "UCzucOGEnILK5cAdUUVCIefg"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "s"
            },
            "inputs": [
              "https://www.youtube.com/s",
              "s"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "mrbeast"
            },
            "inputs": [
              "https://www.youtube.com/@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "@NASA",
              "nasa",
              "https://www.youtube.com/@nasa"
            ],
            "status": 200,
            "shadowed": true,
            "default": true
          },
          {
            "params": {
              "handle": "abcd"
            },
            "inputs": [
              "@abcd",
              "abcd",
              "https://www.youtube.com/@abcd"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "vdud"
            },
            "inputs": [
              "@vdud",
              "vdud",
              "https://www.youtube.com/@vdud"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "ドラえもんチャンネル"
            },
            "inputs": [
              "https://www.youtube.com/@ドラえもんチャンネル/featured",
              "ドラえもんチャンネル",
              "https://www.youtube.com/@%E3%83%89%E3%83%A9%E3%81%88%E3%82%82%E3%82%93%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "pewdiepie"
            },
            "inputs": [
              "https://www.youtube.com/pewdiepie/videos",
              "pewdiepie"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "aljazeera"
            },
            "inputs": [
              "@aljazeera",
              "aljazeera",
              "https://www.youtube.com/@aljazeera"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "qwerty"
            },
            "inputs": [
              "@qwerty",
              "qwerty",
              "https://www.youtube.com/@qwerty"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCvsye7V9psc-APX6wV1twLg"
            },
            "inputs": [
              "https://www.youtube.com/channel/UCvsye7V9psc-APX6wV1twLg",
              "UCvsye7V9psc-APX6wV1twLg"
            ],
            "status": 404,
            "error_code": "not_found",
            "shadowed": true
          },
          {
            "params": {
              "handle": "UCwZEU0wAwIyZb4x5G_KJp2w"
            },
            "inputs": [
              "UCwZEU0wAwIyZb4x5G_KJp2w"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCF0pVplsI8R5kcAqgtoRqoA"
            },
            "inputs": [
              "UCF0pVplsI8R5kcAqgtoRqoA"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "handle": "tv"
            },
            "inputs": [
              "https://www.youtube.com/tv",
              "tv"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "handle": "UCaaaaaaaaaaaaaaaaaaaaaa"
            },
            "inputs": [
              "UCaaaaaaaaaaaaaaaaaaaaaa"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "handle": "rickastleyvevo"
            },
            "inputs": [
              "https://www.youtube.com/user/RickAstleyVEVO",
              "rickastleyvevo"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "hikakintv"
            },
            "inputs": [
              "@HikakinTV",
              "hikakintv",
              "https://www.youtube.com/@hikakintv"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "dudeperfect"
            },
            "inputs": [
              "dudeperfect",
              "https://www.youtube.com/@dudeperfect"
            ],
            "status": 200
          },
          {
            "params": {
              "handle": "UCEgdi0XIXXZ-qJOFPf4JSKw"
            },
            "inputs": [
              "UCEgdi0XIXXZ-qJOFPf4JSKw"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "mrbeast"
            },
            "inputs": [
              "@MrBeast",
              "mrbeast",
              "https://www.youtube.com/@mrbeast"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "nasa"
            },
            "inputs": [
              "@NASA",
              "nasa",
              "https://www.youtube.com/@nasa"
            ],
            "status": 200,
            "shadowed": true
          },
          {
            "params": {
              "handle": "UCvsye7V9psc-APX6wV1twLg"
            },
            "inputs": [
              "UCvsye7V9psc-APX6wV1twLg"
            ],
            "status": 404,
            "error_code": "not_found"
          }
        ]
      },
      "youtube.transcript": {
        "identity": "url",
        "codes": [
          "invalid_input",
          "insufficient_credits",
          "spend_limit_reached",
          "rate_limited",
          "not_found",
          "private_or_unavailable",
          "no_transcript",
          "upstream_blocked",
          "upstream_error",
          "overloaded",
          "internal"
        ],
        "cases": [
          {
            "params": {
              "url": "HtVdAasjOgU"
            },
            "inputs": [
              "HtVdAasjOgU"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "https://www.youtube.com/live/qVv6vCqciTM"
            },
            "inputs": [
              "https://www.youtube.com/live/qVv6vCqciTM",
              "qVv6vCqciTM",
              "https://www.youtube.com/watch?v=qVv6vCqciTM"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "dQw4w9WgXcQ"
            ],
            "status": 503,
            "error_code": "upstream_blocked",
            "shadowed": true
          },
          {
            "params": {
              "url": "jNQXAC9IVRw"
            },
            "inputs": [
              "jNQXAC9IVRw",
              "https://www.youtube.com/watch?v=jNQXAC9IVRw"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "en",
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "dQw4w9WgXcQ",
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "de",
              "url": "dQw4w9WgXcQ"
            },
            "inputs": [
              "dQw4w9WgXcQ",
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "ja",
              "url": "https://youtu.be/dQw4w9WgXcQ"
            },
            "inputs": [
              "https://youtu.be/dQw4w9WgXcQ",
              "dQw4w9WgXcQ",
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            ],
            "status": 200
          },
          {
            "params": {
              "lang": "fr",
              "url": "jNQXAC9IVRw"
            },
            "inputs": [
              "jNQXAC9IVRw"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "jfKfPfyJRdk"
            },
            "inputs": [
              "jfKfPfyJRdk"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.youtube.com/watch?v=kCc8FmEb1nY"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=kCc8FmEb1nY",
              "kCc8FmEb1nY"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
              "dQw4w9WgXcQ"
            ],
            "status": 200,
            "default": true
          },
          {
            "params": {
              "lang": "pt-BR",
              "url": "https://www.youtube.com/watch?v=iG9CE55wbtY"
            },
            "inputs": [
              "https://www.youtube.com/watch?v=iG9CE55wbtY",
              "iG9CE55wbtY"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "lqQg6PlCWgI"
            },
            "inputs": [
              "lqQg6PlCWgI"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://www.youtube.com/shorts/tjjjtzRLHvA"
            },
            "inputs": [
              "https://www.youtube.com/shorts/tjjjtzRLHvA",
              "tjjjtzRLHvA"
            ],
            "status": 404,
            "error_code": "no_transcript"
          },
          {
            "params": {
              "url": "https://music.youtube.com/watch?v=kJQP7kiw5Fk"
            },
            "inputs": [
              "https://music.youtube.com/watch?v=kJQP7kiw5Fk",
              "kJQP7kiw5Fk",
              "https://www.youtube.com/watch?v=kJQP7kiw5Fk"
            ],
            "status": 200
          },
          {
            "params": {
              "url": "Q39EVAstoRM"
            },
            "inputs": [
              "Q39EVAstoRM"
            ],
            "status": 404,
            "error_code": "not_found"
          },
          {
            "params": {
              "url": "yYr8q0y5Jfg"
            },
            "inputs": [
              "yYr8q0y5Jfg"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "yZIXLfi8CZQ"
            },
            "inputs": [
              "yZIXLfi8CZQ"
            ],
            "status": 403,
            "error_code": "private_or_unavailable"
          },
          {
            "params": {
              "url": "6SJNVb0GnPI"
            },
            "inputs": [
              "6SJNVb0GnPI"
            ],
            "status": 404,
            "error_code": "not_found"
          }
        ]
      }
    }
  },
  "stats_meta": {
    "generated_at": "2026-10-25T23:03:48Z",
    "environment": "staging",
    "window_days": 7,
    "method": "Gateway requests in staging of kind api/canary over the last 7 days, excluding cache hits and requests rejected before the engine (unauthorized, insufficient_credits, rate_limited); success_rate counts every outcome except upstream_blocked, upstream_error, internal, canary_fail as success (correct invalid_input, not_found, private_or_unavailable or no_transcript answers succeed), p50/p95 are gateway latency over HTTP 200 responses weighted by sample interval, and endpoints with fewer than 20 requests are omitted."
  },
  "event_types": [
    {
      "type": "job.completed",
      "doc": "A job ended with every item ended (check request_counts: items fail individually).",
      "data_type": "JobEventData"
    },
    {
      "type": "job.canceled",
      "doc": "A canceled job ended: its running items finished.",
      "data_type": "JobEventData"
    },
    {
      "type": "job.expired",
      "doc": "A job reached its deadline; its unfinished items expired.",
      "data_type": "JobEventData"
    },
    {
      "type": "credits.low",
      "doc": "A balance change took the balance from above the account's low_balance_threshold to at or below it (once per crossing; the owner is emailed too).",
      "data_type": "CreditsLowData"
    },
    {
      "type": "credits.depleted",
      "doc": "The balance reached 0 (once, until credits are added).",
      "data_type": "CreditsDepletedData"
    },
    {
      "type": "api_key.spend_limit_reached",
      "doc": "An API key's request (or job) was refused for its spend limit, the first time in the limit's interval.",
      "data_type": "SpendLimitReachedData"
    },
    {
      "type": "webhook.test",
      "doc": "Sent by POST /v1/webhook_endpoints/{id}/test to that endpoint only.",
      "data_type": "WebhookTestData"
    }
  ],
  "jobs": {
    "max_requests": 1000,
    "max_wait_s": 60,
    "max_pages_per_request": 1000,
    "max_pages": 10000,
    "queued_max_pages": 50000,
    "deadline_s": 86400,
    "results_retention_s": 604800,
    "records_retention_s": 2592000,
    "results_url_ttl_s": 3600,
    "concurrency": 10,
    "account_concurrency": 25,
    "max_attempts": 3,
    "metadata_max_keys": 16,
    "metadata_key_max_length": 40,
    "metadata_value_max_length": 500,
    "custom_id_max_length": 64,
    "custom_id_pattern": "^[A-Za-z0-9_-]{1,64}$",
    "results_page_max": 100,
    "prefer_async": "respond-async",
    "async_custom_id": "request",
    "job_id_prefix": "job_",
    "results_download_format": "jsonl",
    "ended_statuses": [
      "completed",
      "canceled",
      "expired"
    ]
  },
  "webhooks": {
    "retry_schedule_s": [
      0,
      5,
      300,
      1800,
      7200,
      18000,
      36000,
      50400,
      72000,
      86400
    ],
    "retry_jitter": 0.1,
    "timeout_s": 15,
    "rotation_overlap_max_s": 86400,
    "secret_prefix": "whsec_",
    "secret_bytes": 32,
    "signature_version": "v1",
    "tolerance_s": 300,
    "disable_after_failing_s": 432000,
    "response_excerpt_bytes": 1024,
    "events_retention_s": 2592000,
    "max_endpoints": 16,
    "user_agent": "SocialTap-Webhooks/1",
    "endpoint_id_prefix": "we_",
    "event_id_prefix": "evt_",
    "delivery_id_prefix": "whd_",
    "content_type": "application/json"
  },
  "idempotency": {
    "key_max_length": 255,
    "ttl_s": 86400,
    "in_progress_s": 120,
    "retry_after_s": 1
  }
}
