{"openapi":"3.1.0","info":{"title":"Captapi API","version":"0.1.0","summary":"Structured public data from social platforms through one REST API.","description":"Captapi returns public data (profiles, posts, comments, transcripts, search, ads, commerce) from social platforms as JSON.\n\nAuth: send your key as `Authorization: Bearer capt_live_...` or `X-API-Key: capt_live_...`. Keys are created by a human at https://captapi.com/dashboard/api-keys.\n\nBilling: each operation states its cost in `x-credit-cost`. The `X-Captapi-Credits` response header shows what was charged. Failed requests (4xx/5xx) are not billed. `cache=true` serves from the 24h cache, free on a hit where `billedOnCacheHit` is false. Where the price depends on which path served the call, `x-credit-cost.note` gives the full rule and the range we have observed.\n\nEmpty results: on many list and search endpoints a call that ran but found nothing is charged 0 credits (for example an ad-library or profile search with no matches). Where an empty result is still billed, the endpoint description says so; Google Maps business search, for instance, bills its one page because the lookup ran. The `X-Captapi-Credits` header always shows the actual charge.\n\nErrors: every non-2xx response uses the same envelope, `{ success: false, error: { code, message, retryable } }`. Retry only when `retryable` is true, honouring `Retry-After`.\n\nResponse schemas are inferred from real captured responses and list the fields seen there plus documented top-level fields. Fields can be null when a platform does not expose them.\n\nEndpoint list: https://captapi.com/llms-endpoints.txt · Guide for agents: https://captapi.com/llms.txt · MCP: https://captapi.com/mcp.json","contact":{"name":"Captapi support","email":"support@captapi.com","url":"https://captapi.com"},"termsOfService":"https://captapi.com/legal/terms","license":{"name":"Captapi Terms of Service","url":"https://captapi.com/legal/terms"}},"servers":[{"url":"https://api.captapi.com"}],"externalDocs":{"description":"Docs","url":"https://captapi.com/docs"},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"tags":[{"name":"Account","description":"Credit balance, plan limits and recent usage for the calling key."},{"name":"Amazon Shop","description":"Public data from Amazon Shop."},{"name":"Batch","description":"Run several endpoint calls in one request."},{"name":"Bluesky","description":"Public data from Bluesky."},{"name":"Facebook","description":"Public data from Facebook."},{"name":"Facebook Ad Library","description":"Public data from Facebook Ad Library."},{"name":"Facebook Events","description":"Public data from Facebook Events."},{"name":"Facebook Marketplace","description":"Public data from Facebook Marketplace."},{"name":"GitHub","description":"Public data from GitHub."},{"name":"Google Ad Library","description":"Public data from Google Ad Library."},{"name":"Google Maps","description":"Public data from Google Maps."},{"name":"History","description":"Stored metric time series for tracked profiles and posts."},{"name":"Instagram","description":"Public data from Instagram."},{"name":"Kick","description":"Public data from Kick."},{"name":"Komi","description":"Public data from Komi."},{"name":"Kwai","description":"Public data from Kwai."},{"name":"Linkbio","description":"Public data from Linkbio."},{"name":"LinkedIn","description":"Public data from LinkedIn."},{"name":"LinkedIn Ad Library","description":"Public data from LinkedIn Ad Library."},{"name":"Linkme","description":"Public data from Linkme."},{"name":"Linktree","description":"Public data from Linktree."},{"name":"Monitors","description":"Scheduled re-runs of an endpoint that POST new items to your webhook."},{"name":"Pillar","description":"Public data from Pillar."},{"name":"Pinterest","description":"Public data from Pinterest."},{"name":"Reddit","description":"Public data from Reddit."},{"name":"Rumble","description":"Public data from Rumble."},{"name":"Snapchat","description":"Public data from Snapchat."},{"name":"SoundCloud","description":"Public data from SoundCloud."},{"name":"Spotify","description":"Public data from Spotify."},{"name":"Status","description":"Live API health per platform."},{"name":"Threads","description":"Public data from Threads."},{"name":"TikTok","description":"Public data from TikTok."},{"name":"TikTok Ad Library","description":"Public data from TikTok Ad Library."},{"name":"TikTok Shop","description":"Public data from TikTok Shop."},{"name":"Truth Social","description":"Public data from Truth Social."},{"name":"Twitch","description":"Public data from Twitch."},{"name":"Twitter / X","description":"Public data from Twitter / X."},{"name":"Utilities","description":"Endpoints that are not tied to one platform."},{"name":"YouTube","description":"Public data from YouTube."}],"paths":{"/v1/youtube/transcript":{"get":{"operationId":"youtube_transcript","tags":["YouTube"],"summary":"YouTube Transcript API","description":"YouTube's published captions with timestamps — not speech-to-text.\n\nReturns the captions YouTube publishes for a video — manual or auto-generated. It does not perform speech-to-text. Long live streams and VODs frequently have no auto-captions at all. When there is no caption track this endpoint returns 404 and costs 0 credits (strictly better than charging for a null body); use /v1/youtube/audio-transcript to transcribe the audio directly (priced per minute). The 404 body includes code (no_captions / language_not_available / video_unavailable), reason, availableLanguages[], hasAutoCaptions, and — when the video is reachable with audio but has no tracks — a suggestion block with estimatedCredits for audio-transcript. video_unavailable (deleted, private, or otherwise unplayable) does not include that suggestion. Success responses use the same transcript vocabulary as audio-transcript / Rumble: text + segments[{text,startMs,endMs}], plus source: \"captions\", requestedLanguage, and returnedLanguage (no redundant language twin). Pass language to require that track; there is no silent fallback. Flat 1 credit on success.\n\nDocs: https://captapi.com/apis/youtube-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"YouTube's published captions with timestamps — not speech-to-text.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"YouTube video id parsed from the url."},"title":{"type":"string","description":"Title of the item."},"text":{"type":"string","description":"Full caption text — segment texts joined with a single space. Same key as /audio-transcript."},"segments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Full caption text — segment texts joined with a single space. Same key as /audio-transcript."},"startMs":{"type":"integer","description":"Cue start in integer milliseconds."},"endMs":{"type":"integer","description":"Cue end in integer milliseconds (always > startMs)."}}}},"platform":{"type":"string","description":"Always \"youtube\" on this endpoint."},"requestedLanguage":{"description":"Language the caller asked for (null when unspecified)."},"returnedLanguage":{"type":"string","description":"Language of the caption track actually returned."},"isAutoGenerated":{"type":"boolean","description":"Whether the selected YouTube caption track is auto-generated (ASR). Null when source is not captions."},"isTranslated":{"type":"boolean","description":"Whether the transcript was machine-translated to the requested language. Null when unknown."},"hasAutoCaptions":{"type":"boolean","description":"Has auto captions. Example: true."},"source":{"description":"Always \"captions\" — YouTube's published caption track (not speech-to-text). Pair with /audio-transcript source:\"asr\"."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","videoId":"dQw4w9WgXcQ","title":"Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","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 you down ♪ ♪ Never gonna run around and desert you ♪ ♪ Never gonna make you cry ♪ ♪ Never gonna say goodbye ♪ ♪ Never gonna tell a lie and hurt you ♪ ...","segments":[{"text":"[♪♪♪]","startMs":1360,"endMs":3040},{"text":"♪ We're no strangers to love ♪","startMs":18640,"endMs":21880}],"platform":"youtube","requestedLanguage":null,"returnedLanguage":"en","isAutoGenerated":false,"isTranslated":false,"hasAutoCaptions":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/audio-transcript":{"get":{"operationId":"youtube_audio_transcript","tags":["YouTube"],"summary":"YouTube Audio Transcript API","description":"Speech-to-text for YouTube audio.\n\nTranscribes YouTube audio with AI speech-to-text when the video has no published captions (or when you want speech-to-text regardless). Separate from /transcript — that endpoint only returns YouTube's caption tracks. Pricing is duration-based and honest: creditsUsed = ceil(durationSeconds / 60) × 2 (badge: 2 credits/min of audio). Success includes estimatedCredits (same number) so maxCredits is usable without doing the arithmetic. Pass maxCredits to refuse expensive jobs before any STT runs (400 cost_exceeds_max, 0 credits). Measured end-to-end: ~20 min of audio ≈ 12s, ~82 min ≈ 49s. Audio is re-encoded to 16 kHz mono 32 kbps before upload so podcast-length jobs stay under the ~25 MB ceiling. Sync path is capped at 90 minutes so the request finishes inside the 110s request deadline; longer videos return 400 duration_too_long with estimatedCredits before any STT spend. An audio download miss is 502 audio_extract_failed with a split reason: blocked_rate (403/429, retryable, retryAfterSeconds=300), extract_timeout (retryable, 60s), extractor_unavailable (signed-URL / extractor miss, retryable, 120s), no_audio_format / restricted / live_unavailable (this video, retryable false). estimatedCreditsIfRetried is only present when retryable is true. A permanent miss with no captions sets obtainable:false and says no transcript is obtainable — it does not leave suggestedEndpoint:null as an open loop. Download budget is 20s (a doomed fetch used to sit for ~67s). blocked_rate opens a service-wide circuit (cacheScope=service, blockedRateConsecutive) so further downloads wait out the cooldown instead of deepening a YouTube block. When a published caption track exists, suggestedEndpoint=/v1/youtube/transcript — suggest, never substitute STT with captions. Response always includes source: \"asr\", asrProvider, languageIsDetected, numeric segments[{text,startMs,endMs}], text, durationSeconds, creditsUsed, estimatedCredits. Cache hits still bill — the cache is our margin.\n\nDocs: https://captapi.com/apis/youtube-audio-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string"}},{"name":"maxCredits","in":"query","required":false,"description":"Refuse before STT when estimatedCredits would exceed this (400 cost_exceeds_max, 0 credits). The estimate is on every success and, when the extract miss is retryable, as estimatedCreditsIfRetried.","schema":{"type":"integer","maximum":50000,"minimum":1}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits/min of audio","billedOnCacheHit":false},"x-one-liner":"Speech-to-text for YouTube audio.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"youtube\" on this endpoint."},"videoId":{"type":"string","description":"YouTube video id parsed from the url."},"url":{"type":"string","description":"Canonical URL of the item."},"asrProvider":{"type":"string","description":"Speech-to-text tier that produced this transcript: \"asr-fast\" (default) or \"asr-standard\" (used when the fast tier is unavailable)."},"language":{"type":"string","description":"BCP-47 / ISO speech language code from ASR (e.g. \"en\"), not a full name like \"english\"."},"languageIsDetected":{"type":"boolean","description":"true when language was auto-detected from the audio; false when the language query param was honored."},"durationSeconds":{"type":"integer","description":"Audio length in whole seconds — basis for per-minute billing."},"segments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Full transcript — segment texts joined with a single space. Prefer this over any legacy transcript alias."},"startMs":{"type":"integer","description":"Cue start in integer milliseconds."},"endMs":{"type":"integer","description":"Cue end in integer milliseconds (always > startMs)."}}}},"text":{"type":"string","description":"Full transcript — segment texts joined with a single space. Prefer this over any legacy transcript alias."},"creditsUsed":{"type":"integer","description":"Credits billed for this call: ceil(durationSeconds / 60) × 2. Present in data (and echoed on the envelope)."},"source":{"description":"Always \"asr\" — AI speech-to-text on the audio (not YouTube's published captions). Pair with /youtube/transcript source:\"captions\"."}}}}},"example":{"success":true,"data":{"platform":"youtube","videoId":"jNQXAC9IVRw","url":"https://www.youtube.com/watch?v=jNQXAC9IVRw","asrProvider":"asr-fast","language":"en","languageIsDetected":true,"durationSeconds":19,"segments":[{"text":"Alright, so here we are in front of the elephants.","startMs":0,"endMs":4000},{"text":"The cool thing about these guys is that they have really, really, really long fronts.","startMs":4000,"endMs":12000},{"text":"And that's cool.","startMs":12000,"endMs":14000},{"text":"And that's pretty much all there is to say.","startMs":16000,"endMs":19000}],"text":"Alright, so here we are in front of the elephants. The cool thing about these guys is that they have really, really, really long fronts. And that's cool. And that's pretty much all there is to say.","creditsUsed":2}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/summarize":{"get":{"operationId":"youtube_summarize","tags":["YouTube"],"summary":"YouTube Summarizer API","description":"AI summary from YouTube's published captions — same source as /transcript.\n\nFetches YouTube's published captions (same engine as /transcript — not speech-to-text) and returns an AI summary, key points, topics, and sentiment. When the video has no caption tracks, you get the same diagnostic 404 as /transcript (code, reason, availableLanguages, hasAutoCaptions) and are charged 0 credits — never 3. Long live streams often lack auto-captions. Flat 3 credits only when a summary is returned.\n\nDocs: https://captapi.com/apis/youtube-summarizer","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":3,"label":"3 credits","billedOnCacheHit":false},"x-one-liner":"AI summary from YouTube's published captions — same source as /transcript.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"Platform video ID."},"title":{"type":"string","description":"Title of the item."},"summary":{"type":"string","description":"AI-generated summary of the content."},"keyPoints":{"type":"array","items":{"type":"string"},"description":"The most important takeaways."},"topics":{"type":"array","items":{"type":"string"},"description":"Detected topics and themes."},"sentiment":{"type":"string","description":"Overall tone (positive, neutral, negative)."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","videoId":"dQw4w9WgXcQ","title":"Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","summary":"The song 'Never Gonna Give You Up' by Rick Astley is a classic pop anthem that emphasizes unwavering commitment and loyalty in a romantic relationship. The lyrics express a deep emotional connection, highlighting the importance of honesty and trust between partners. Astley reassures his loved one that he will always be there for them, promising never to abandon or hurt them, which resonates with listeners on a personal level.\n\nThis iconic track has gained a cultural significance beyond its initial release, becoming a symbol of internet memes and nostalgia. Its catchy melody and memorable chorus have made it a timeless favorite, often associated with themes of love, dedication, and sincerity. The song's upbeat tempo and heartfelt message continue to engage audiences, making it a staple in pop music history.","keyPoints":["Emphasizes commitment and loyalty in relationships.","Highlights the importance of honesty and trust.","Reassures loved ones of unwavering support.","Cultural icon associated with internet memes.","Timeless melody and catchy chorus.","Resonates with themes of love and dedication.","Continues to engage audiences across generations."],"topics":["Rick Astley","Never Gonna Give You Up","Pop Music","Commitment","Love","Nostalgia","Internet Memes"],"sentiment":"positive"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/video-details":{"get":{"operationId":"youtube_video_details","tags":["YouTube"],"summary":"YouTube Video Details API","description":"YouTube video metadata + stats.\n\nReturns title, channel, duration, view/like/comment counts, publishedAt (UTC Z), genre/categoryId, availableCaptions[] with expiresAt, live flags, and the degraded envelope. ANDROID InnerTube supplies engagement; publishDate / genre / @handle / isFamilySafe come from the watch-page microformat (retried once when missing). Every 200 includes degraded (boolean) and degradedReason (null or \"partial-extraction\") — retry when degraded is true. commentCountIsApproximate and likeCountIsApproximate are always keyed (false when the count is null — unknown is not a compact token). likeCount comes from the watch-page accessibility label and is exact when present; the flag is still stamped (CP-F). defaultLanguage is YouTube's video-language metadata and is usually null on this surface; defaultAudioLanguage is that field when InnerTube sends it, otherwise the first ASR caption languageCode. channelVerified is the watch-page owner badge when exposed; null means unread, not unverified (use /youtube/channel-details.verified). thumbnailUrl is the largest thumbnails[] URL, not a second image. descriptionLinks[] is {url, text} — text is the same-line label or null. Flat 1 credit.\n\nDocs: https://captapi.com/apis/youtube-video-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"YouTube video metadata + stats.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"channelName":{"type":"string","description":"Name of the channel."},"channelId":{"type":"string","description":"Stable channel id (YouTube UC… when applicable)."},"channelUrl":{"type":"string","description":"URL of the channel."},"publishedAt":{"type":"string","description":"UTC ISO-8601 with millisecond Z (YouTube's microformat offset is normalized). null + degraded when the watch fetch failed."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"viewCount":{"type":"integer","description":"View count."},"likeCount":{"type":"integer","description":"Like count from the watch-page accessibility label (or InnerTube next fallback) — the true integer, not the visible 19M chrome. null + degraded when unread."},"commentCount":{"type":"integer","description":"Comment count."},"thumbnailUrl":{"type":"string","description":"Largest thumbnails[].url. Convenience alias — identical to thumbnails[last].url."},"genre":{"type":"string","description":"Category name from playerMicroformatRenderer (e.g. Music)."},"categoryId":{"type":"string","description":"YouTube category id — from the player when present, else mapped from genre."},"tags":{"type":"array","items":{"type":"string"},"description":"Tags attached to the item."},"durationFormatted":{"type":"string","description":"Human-readable duration."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","id":"dQw4w9WgXcQ","title":"Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","description":"The official video for “Never Gonna Give You Up” by Rick Astley. \n\nNever: The Autobiography 📚 OUT NOW! \nFollow this link to get your copy and listen to Rick’s ‘Never’ playlist ❤️ #RickAstleyNever\nhttps://linktr.ee/rickastleynever\n\n“Never Gonna Give You Up” was a global smash on its release in July 1987, topping the charts in 25 countries including Rick’s native UK and the US Billboard Hot 100.  It also won the Brit Award for Best single in 1988. Stock Aitken and Waterman wrote and produced the track which was the lead-off single and lead track from Rick’s debut LP “Whenever You Need Somebody”.  The album was itself a UK number one and would go on to sell over 15 million copies worldwide.\n\nThe legendary video was directed by Simon West – who later went on to make Hollywood blockbusters such as Con Air, Lara Croft – Tomb Raider and The Expendables 2.  The video passed the 1bn YouTube views milestone on 28 July 2021.\n\nSubscribe to the official Rick Astley YouTube channel: https://RickAstley.lnk.to/YTSubID\n\nFollow Rick Astley:\nFacebook: https://RickAstley.lnk.to/FBFollowID \nTwitter: http …","channelName":"Rick Astley","channelId":"UCuAXFkgsw1L7xaCfnd5JJOw","channelUrl":"https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","publishedAt":"2009-10-24T23:57:33-07:00","durationSeconds":213,"viewCount":1797826473,"likeCount":19283915,"commentCount":2400000,"thumbnailUrl":"https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/sddefault.webp","genre":"Music","categoryId":"10","tags":["rick astley","Never Gonna Give You Up"],"durationFormatted":"00:03:33"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/comments":{"get":{"operationId":"youtube_comments","tags":["YouTube"],"summary":"YouTube Comments API","description":"Get comments on any YouTube video — text, author, likes, and truncated publishedTimeApprox from the relative label, with cursor pagination (nextCursor + hasMore).\n\nThe YouTube Comments API lets you pull comments with author, text, likes, and replies for YouTube comments with a single REST call. No OAuth, no infrastructure to maintain, and no platform SDKs — send the request, get clean structured JSON back. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d.\n\nDocs: https://captapi.com/apis/youtube-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Get comments on any YouTube video — text, author, likes, and truncated publishedTimeApprox from the relative label, with cursor pagination (nextCursor + hasMore).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"Platform video ID."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"totalComments":{"type":"integer","description":"The video's total number of comments, across all pages."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"author":{"type":"string","description":"Author name or handle."},"authorChannelId":{"type":"string","description":"Author channel id. Example: \"UCBR8-60-B28hp2BmDPdntcQ\"."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"authorIsVerified":{"type":"boolean","description":"Whether the author is verified."},"authorIsChannelOwner":{"type":"boolean","description":"Whether the author owns the channel."},"text":{"type":"string","description":"Text content."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"replyCount":{"type":"integer","description":"How many replies this comment has. Use Comment Replies with this comment's id to fetch them."},"hasCreatorHeart":{"type":"boolean","description":"Whether the creator hearted the comment."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."},"publishedTimeApprox":{"type":"string","description":"Approximate ISO-8601 derived from publishedTimeText, truncated to the label's precision (day/hour/minute). Not an observed instant — see publishedTimeIsApproximate."},"publishedTimeIsApproximate":{"type":"boolean","description":"true when publishedTimeApprox was derived from a relative label rather than an absolute timestamp YouTube exposed."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","videoId":"dQw4w9WgXcQ","totalReturned":2,"totalComments":2400000,"nextCursor":"Eg0SC2RRdzR3OVdnWGNRGAYyJSIRIgtkUXc0dzlXZ1hjUTAAeAJCEGNvbW1lbnRzLXNlY3Rpb24%3D","hasMore":true,"comments":[{"id":"Ugzge340dBgB75hWBm54AaABAg","author":"@YouTube","authorChannelId":"UCBR8-60-B28hp2BmDPdntcQ","authorAvatarUrl":"https://yt3.ggpht.com/3s6evpqAiDU9tQR4sC2siJippbH2RWVPnwHgyl4V0th2iuQz0VDQZbUhQBGmsxLYo-mjG6TqZQ=s88-c-k-c0x00ffffff-no-rj","authorIsVerified":true,"authorIsChannelOwner":false,"text":"can confirm: he never gave us up","likeCount":290000,"replyCount":961,"hasCreatorHeart":false,"publishedTimeText":"1 year ago","publishedTimeApprox":"2025-08-03T00:00:00.000Z","publishedTimeIsApproximate":true},{"id":"UgxTsG2dsspEiq6MAZJ4AaABAg","author":"@MariahRhona","authorChannelId":"UCe8dr6l5fgxVh6peaTtx8XA","authorAvatarUrl":"https://yt3.ggpht.com/sEIirS_KS8tpBOKKPUIrE887msAjyf3N4gggHploxxmmwt3B2MkNRBB_t90olc0hXeghSsLj3A=s88-c-k-c0x00ffffff-no-rj","authorIsVerified":false,"authorIsChannelOwner":false,"text":"who came here saying this video was taken down","likeCount":27000,"replyCount":982,"hasCreatorHeart":false,"publishedTimeText":"3 days ago","publishedTimeApprox":"2026-07-31T00:00:00.000Z","publishedTimeIsApproximate":true}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/channel-details":{"get":{"operationId":"youtube_channel_details","tags":["YouTube"],"summary":"YouTube Channel Details API","description":"YouTube channel stats — ISO country, createdAt date-only, real banner or null, quote-aware SEO tags, absolute links.\n\nPass a channel URL, @handle, or UC… id and get clean JSON. Canonical profile core: platform, id, username, url, displayName, bio, avatar, banner, followers, postCount, verified, createdAt. Identical-value aliases (handle/name/description/thumbnailUrl/bannerUrl/subscriberCount/videoCount/joinedAt/joinedDate) are not emitted. Also: canonicalUrl (@handle when known), followersIsApproximate (true when followers came from a K/M/B shelf label — 2.15M → 2150000), viewCount (exact when About exposes it; YouTube rounds subscribers, not views), country (ISO-3166 alpha-2) + countryName, links[{text,url}] with absolute https URLs, email when published in About/description (not the CAPTCHA reveal), and tags[] from channel SEO keywords (quote-aware — multi-word tags stay one entry). Identity-card convention: banner, country, countryName, and email stay on the key set and are null when unknown — we never substitute the avatar for a missing banner. Resolver/search rows (instagram/profile-search) omit-when-absent; that is a different class. following is omitted — YouTube does not publish a following count on the channel About card. createdAt is date-only (YYYY-MM-DD); YouTube only exposes the join day. Flat 1 credit. Cache is off by default.\n\nDocs: https://captapi.com/apis/youtube-channel-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube channel URL, @handle, bare handle, or UC... channel ID, e.g. https://youtube.com/@handle or @mkbhd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"YouTube channel stats — ISO country, createdAt date-only, real banner or null, quote-aware SEO tags, absolute links.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"handle":{"type":"string","description":"Account handle."},"description":{"type":"string","description":"Description text."},"subscriberCount":{"type":"integer","description":"Subscriber count (channel, subreddit, or similar)."},"videoCount":{"type":"integer","description":"Population video count when the source is authoritative (e.g. TikTok challenge/detail statsV2 on popular-hashtags, or a channel's uploaded-video total). Never a sample tally — sample sizes use sampleVideoCount / sampleSize."},"viewCount":{"type":"integer","description":"Lifetime channel view count when the About panel exposes it (exact integer)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"bannerUrl":{"description":"Banner image URL. Deprecated alias of banner on YouTube (one release)."},"country":{"type":"string","description":"ISO-3166 alpha-2 channel country (e.g. US, IN). Prefer this over countryName for joins."},"joinedDate":{"type":"string","description":"When the account was created."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"links":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"url":{"type":"string","description":"Canonical URL of the item."}}}},"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"canonicalUrl":{"type":"string","description":"Preferred public URL — https://www.youtube.com/@handle when known, else /channel/UC…."},"countryName":{"type":"string","description":"English display name for country (e.g. United States). Locale-stable English from our ISO map."},"joinedAt":{"type":"string","description":"Joined at. Example: \"2012-02-19\"."},"tags":{"type":"array","items":{"type":"string"},"description":"SEO keywords from channelMetadata. Multi-word tags stay one entry (quote-aware parse)."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA","id":"UCX6OQ3DkcsbYNE6H8uQQuVA","name":"MrBeast","handle":"@MrBeast","description":"SUBSCRIBE FOR A COOKIE!\nNew MrBeast or MrBeast Gaming video every single Saturday at noon eastern time!\nAccomplishments:\n- Raised $20,000,000 To Plant 20,000,000 Trees\n- Removed 30,000,000 pounds of trash from the ocean\n- Helped 2,000 people walk again\n- Helped 1,000 blind people see\n- Helped 1,000 deaf people hear\n- Built wells in Africa\n- Built and gave away 100 houses\n- Adopted every dog in a shelter (twice)\n- Given millions to charity\n- Started my own snack company Feastables\n- Started my own software company Viewstats\n- Gave away a private island (twice)\n- Gave away 1 million meals\n- I counted to 100k\n- Ran a marathon in the world's largest shoes\n- Survived 50 hours in Antarctica\n- Recreated Squid Game in real life\n- Created the largest competition show with 1000 people (Beast Games)\n- Gave $5,000,000 to one person\n\nTerms & Conditions of Current Sweepstakes: \nhttps://mrb.gg/bow-and-arrow\nhttps://bit.ly/MrB_Birthday_YT\nhttps://bit.ly/MrB_Cash_Giveaway","subscriberCount":510000000,"videoCount":994,"viewCount":135029730952,"thumbnailUrl":"https://yt3.googleusercontent.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s900-c-k-c0x00ffffff-no-rj","bannerUrl":null,"country":"US","joinedDate":"Feb 19, 2012","verified":true,"links":[{"text":"$1,000,000 Contest","url":"https://themostdangerousgames.com"},{"text":"Follow","url":"https://instagram.com/mrbeast"}],"platform":"youtube","canonicalUrl":"https://www.youtube.com/@MrBeast","countryName":"United States","joinedAt":"2012-02-19","tags":["challenge","philanthropy"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/search":{"get":{"operationId":"youtube_search","tags":["YouTube"],"summary":"YouTube Search API","description":"YouTube search with cursor pagination — typed hits, ids, canonical URLs, filters (2 credits/page).\n\nSearch YouTube by keyword and get a cursor-paginated page of clean JSON: results[] with type (video|short|channel|playlist|live), id, canonical url, title, publishedTimeApprox + publishedTimeIsApproximate + publishedTimeText, viewCount + viewCountText + viewCountIsApproximate, durationSeconds, thumbnailUrl, channel{id,title,handle,url,thumbnail}, badges[], and subscriberCount on channel hits. Typed arrays videos[] / shorts[] / channels[] / playlists[] / lives[] / shelves[] are disjoint partitions of results (a live is only in lives[], never also in videos[]) — Σ typed === results.length. Filter with type, sortBy, uploadDate, duration, region. Pass nextCursor as cursor for the next page. Flat 2 credits per page.\n\nDocs: https://captapi.com/apis/youtube-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query or keywords (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"all | videos | shorts | channels | playlists.","schema":{"enum":["all","videos","shorts","channels","playlists","video","channel","playlist","short","movie","movies"],"type":"string"}},{"name":"sortBy","in":"query","required":false,"description":"relevance | date | views | rating (alias: popular→views).","schema":{"enum":["relevance","date","views","rating","popular"],"type":"string"}},{"name":"uploadDate","in":"query","required":false,"description":"any | today | this_week | this_month | this_year.","schema":{"enum":["any","today","this_week","this_month","this_year","hour","week","month","year"],"type":"string"}},{"name":"duration","in":"query","required":false,"description":"any | under_4 | 4_20 | over_20. Applies to long-form videos (not Shorts).","schema":{"enum":["any","under_4","4_20","over_20","short","medium","long"],"type":"string"}},{"name":"region","in":"query","required":false,"description":"ISO country code for localized results (default US).","schema":{"type":"string","minLength":2,"maxLength":2}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"YouTube search with cursor pagination — typed hits, ids, canonical URLs, filters (2 credits/page).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"results":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Content type of the item."},"id":{"type":"string","description":"Id of this results item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this results item."},"publishedAt":{"type":"string","description":"Publish time as ISO-8601 when YouTube exposes an absolute timestamp; approximate when derived from a relative label — see publishedTimeText."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."},"channelId":{"type":"string","description":"Stable channel id (YouTube UC… when applicable)."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Id of this results item."},"title":{"type":"string","description":"Title of this results item."},"handle":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"thumbnail":{}},"description":"YouTube channel object for the result when present."},"badges":{"type":"array","items":{"type":"string"},"description":"Platform badges on the result (SoundCloud pro/verified; YouTube 4K/LIVE/New; etc.)."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."}}}},"videos":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Content type of the item."},"id":{"type":"string","description":"Id of this videos item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this videos item."},"publishedAt":{"type":"string","description":"Publish time as ISO-8601 when YouTube exposes an absolute timestamp; approximate when derived from a relative label — see publishedTimeText."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."},"channelId":{"type":"string","description":"Stable channel id (YouTube UC… when applicable)."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Id of this results item."},"title":{"type":"string","description":"Title of this results item."},"handle":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"thumbnail":{}},"description":"YouTube channel object for the result when present."},"badges":{"type":"array","items":{"type":"string"},"description":"Platform badges on the result (SoundCloud pro/verified; YouTube 4K/LIVE/New; etc.)."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."}}}},"shorts":{"type":"array","items":{},"description":"Shorts (array)."},"channels":{"type":"array","items":{},"description":"Channels (array)."},"playlists":{"type":"array","items":{},"description":"Playlists (array)."}}}}},"example":{"success":true,"data":{"query":"space","totalReturned":5,"nextCursor":"EtACEgVzcGFjZRrGAlNCU0NBUXRxUm14WGQyaFFVbUpRZDRJQkMwdzVUazFTUzFsVE5uYzBnZ0VMUVhVeWJEWk9iMlo0TUVXQ0FRc3pXamh1TkRONWNDMXRaNElCQzJseU9HcE5lVXhDVXpacmdnRUxaeTFuYTJOM1dXdGtSRUdDQVF0R1RsSTNZVGhxYjBOSGM0SUJDMkpvTVd4amJqSlRVRTVuZ2dFTFZVdHJMV2hWUVd0UGQydUNBUXRvWjAxcVlqVjJhbWhtYTRJQkN6SlVhbnBKTXpWSk5sTmpnZ0VMV2xWMVVVMUtOVTh6V0UyQ0FRdFliWGxrTjBWRFZHeEpXWUlCQzFWek1sb3RWME01Y21GdmdnRUxaVmRmYlc5V05uWnZkRUdDQVF0WloyTlVkMlY1Vmt0a2I3SUJCZ29FQ0JZUUF1b0JCQWdDRUJrJTNEGIHg6BgiC3NlYXJjaC1mZWVk","hasMore":true,"results":[{"type":"video","id":"jFlWwhPRbPw","url":"https://www.youtube.com/watch?v=jFlWwhPRbPw","title":"James Webb Found a Structure So Big It Breaks Known Physics","publishedAt":"2026-07-23T19:42:10.000Z","viewCount":38769,"durationSeconds":7924,"thumbnailUrl":"https://i.ytimg.com/vi/jFlWwhPRbPw/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA7UvQbAJ_-ucLxF_Y5rLx6Et8OqQ","channelName":"Late Science","channelId":"UCIqH5kGFOM_lP9x_AmPodjQ","channel":{"id":"UCIqH5kGFOM_lP9x_AmPodjQ","title":"Late Science","handle":"@Late_Science","url":"https://www.youtube.com/@Late_Science","thumbnail":null},"badges":["4K"],"publishedTimeText":"10 days ago"},{"type":"video","id":"L9NMRKYS6w4","url":"https://www.youtube.com/watch?v=L9NMRKYS6w4","title":"James Webb Detected a Sign of a Different Universe That Shattered Every Model Built Since Einstein","publishedAt":"2026-06-03T19:42:10.000Z","viewCount":151088,"durationSeconds":6441,"thumbnailUrl":"https://i.ytimg.com/vi/L9NMRKYS6w4/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDucFGeHFH4XAYqCTdLsGr5dul9IA","channelName":"SPACE BEFOREAFTER","channelId":"UCxbnsftoQou1IfWZlEb_1iA","channel":{"id":"UCxbnsftoQou1IfWZlEb_1iA","title":"SPACE BEFOREAFTER","handle":"@space-before-after","url":"https://www.youtube.com/@space-before-after","thumbnail":null},"badges":[],"publishedTimeText":"2 months ago"}],"videos":[{"type":"video","id":"jFlWwhPRbPw","url":"https://www.youtube.com/watch?v=jFlWwhPRbPw","title":"James Webb Found a Structure So Big It Breaks Known Physics","publishedAt":"2026-07-23T19:42:10.000Z","viewCount":38769,"durationSeconds":7924,"thumbnailUrl":"https://i.ytimg.com/vi/jFlWwhPRbPw/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA7UvQbAJ_-ucLxF_Y5rLx6Et8OqQ","channelName":"Late Science","channelId":"UCIqH5kGFOM_lP9x_AmPodjQ","channel":{"id":"UCIqH5kGFOM_lP9x_AmPodjQ","title":"Late Science","handle":"@Late_Science","url":"https://www.youtube.com/@Late_Science","thumbnail":null},"badges":["4K"],"publishedTimeText":"10 days ago"},{"type":"video","id":"L9NMRKYS6w4","url":"https://www.youtube.com/watch?v=L9NMRKYS6w4","title":"James Webb Detected a Sign of a Different Universe That Shattered Every Model Built Since Einstein","publishedAt":"2026-06-03T19:42:10.000Z","viewCount":151088,"durationSeconds":6441,"thumbnailUrl":"https://i.ytimg.com/vi/L9NMRKYS6w4/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDucFGeHFH4XAYqCTdLsGr5dul9IA","channelName":"SPACE BEFOREAFTER","channelId":"UCxbnsftoQou1IfWZlEb_1iA","channel":{"id":"UCxbnsftoQou1IfWZlEb_1iA","title":"SPACE BEFOREAFTER","handle":"@space-before-after","url":"https://www.youtube.com/@space-before-after","thumbnail":null},"badges":[],"publishedTimeText":"2 months ago"}],"shorts":[],"channels":[],"playlists":[]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/channel-videos":{"get":{"operationId":"youtube_channel_videos","tags":["YouTube"],"summary":"YouTube Channel Videos API","description":"Channel uploads with cursor pagination — exact publishedAt from reel_item_watch (same as channel-shorts).\n\nSend a channel URL, @handle, or UC… id and get uploads as clean JSON with nextCursor + hasMore. Pass nextCursor as cursor for page 2+. Each row shares the channel-shorts / playlist-videos shape: exact publishedAt from reel/reel_item_watch microformat (not publishedTimeApprox), publishedTimeText from the shelf label, viewCount + viewCountIsApproximate, durationSeconds + durationFormatted, genre, badges, thumbnailUrl, and nested channel{}. commentCount* appears only on Shorts rows (channel-shorts). Optional fast=true uses YouTube RSS (exact publishedAt, thinner metadata, no cursor). Flat 2 credits on the native path.\n\nDocs: https://captapi.com/apis/youtube-channel-videos","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube channel URL, @handle, bare handle, or UC... channel ID, e.g. https://youtube.com/@handle or @mkbhd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"fast","in":"query","required":false,"description":"Set true to use YouTube RSS for faster results with less detailed metadata. Leave false when viewCount/duration quality matters.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Channel uploads with cursor pagination — exact publishedAt from reel_item_watch (same as channel-shorts).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"videos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this videos item."},"publishedAt":{"type":"string","description":"ISO-8601 when available; approximate from relative labels on list cards — see publishedTimeText."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/@MrBeast","totalReturned":2,"videos":[{"url":"https://www.youtube.com/watch?v=lVylRtlPOIE","title":"I Granted 100 Kids Their Biggest Wish!","publishedAt":"2026-07-29T19:42:10.000Z","viewCount":31000000,"durationSeconds":875,"thumbnailUrl":"https://i.ytimg.com/vi/lVylRtlPOIE/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDEw9iu9Jqd9KZ9pBMfbkc-aipTog","channelName":"MrBeast","publishedTimeText":"4 days ago"},{"url":"https://www.youtube.com/watch?v=iYlODtkyw_I","title":"Survive 30 Days Chained To A Stranger, Win $250,000","publishedAt":"2026-07-03T19:42:10.000Z","viewCount":81000000,"durationSeconds":2105,"thumbnailUrl":"https://i.ytimg.com/vi/iYlODtkyw_I/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBr_mSSbkEXsEQf8rxuahzMDeW9Jg","channelName":"MrBeast","publishedTimeText":"1 month ago"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/playlist-videos":{"get":{"operationId":"youtube_playlist_videos","tags":["YouTube"],"summary":"YouTube Playlist Videos API","description":"Paginated playlist contents — cursor/nextCursor/hasMore, same row shape as channel-videos.\n\nPaste a YouTube playlist URL and get one page of videos as clean JSON (same enriched row shape as channel-videos / channel-shorts): id, url, title, publishedAt (ISO from reel_item_watch), publishedTimeText, viewCount, durationSeconds/durationFormatted, genre, badges, thumbnailUrl, channel{}. Envelope: id, totalVideos, totalReturned, nextCursor, hasMore. Pass nextCursor for the next page until hasMore is false. Optional fast=true uses YouTube RSS (no cursor). Flat 2 credits per page on the native path. For title/channel/thumbnail without videos, use Playlist (1 credit).\n\nDocs: https://captapi.com/apis/youtube-playlist-videos","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube playlist URL, e.g. https://youtube.com/playlist?list=ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"fast","in":"query","required":false,"description":"Set true to use YouTube RSS for faster results with less detailed metadata. Leave false when viewCount/duration quality matters.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Paginated playlist contents — cursor/nextCursor/hasMore, same row shape as channel-videos.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"totalVideos":{"type":"integer","description":"Total videos in the playlist (full size). Differs from totalReturned, which is this response's page length."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"videos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this videos item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this videos item."},"publishedAt":{"type":"string","description":"Exact ISO-8601 from reel_item_watch when available; publishedTimeText keeps shelf relative labels."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of this videos item."},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Channel object on each video row (uploader), same as channel-videos."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj","id":"PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj","totalVideos":200,"totalReturned":2,"videos":[{"id":"ekr2nIex040","url":"https://www.youtube.com/watch?v=ekr2nIex040","title":"ROSÉ & Bruno Mars - APT. (Official Music Video)","publishedAt":"2025-08-03T20:35:07.000Z","publishedTimeText":"1y ago","viewCount":2606548493,"durationSeconds":173,"thumbnailUrl":"https://i.ytimg.com/vi_webp/ekr2nIex040/sddefault.webp?v=6711dbac","channelName":"ROSÉ","channel":{"id":"UCBo1hnzxV9rz3WVsv__Rn1g","title":"ROSÉ","url":"https://www.youtube.com/channel/UCBo1hnzxV9rz3WVsv__Rn1g"}},{"id":"kPa7bsKwL-c","url":"https://www.youtube.com/watch?v=kPa7bsKwL-c","title":"Lady Gaga, Bruno Mars - Die With A Smile (Official Music Video)","publishedAt":"2025-08-03T20:35:07.000Z","publishedTimeText":"1y ago","viewCount":1782354502,"durationSeconds":252,"thumbnailUrl":"https://i.ytimg.com/vi/kPa7bsKwL-c/sddefault.jpg","channelName":"LadyGagaVEVO","channel":{"id":"UC07Kxew-cMIaykMOkzqHtBQ","title":"LadyGagaVEVO","url":"https://www.youtube.com/channel/UC07Kxew-cMIaykMOkzqHtBQ"}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/playlist":{"get":{"operationId":"youtube_playlist","tags":["YouTube"],"summary":"YouTube Playlist API","description":"Playlist metadata only — title, channel{}, totalVideos, thumbnailUrl.\n\nPaste a YouTube playlist URL and get identity JSON: platform, url, id, title, channel{id,title,handle,url}, totalVideos, thumbnailUrl, timings. No videos array — use Playlist Videos for paginated contents. Flat 1 credit (single HTML fetch, no player enrich).\n\nDocs: https://captapi.com/apis/youtube-playlist","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube playlist URL, e.g. https://youtube.com/playlist?list=ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Playlist metadata only — title, channel{}, totalVideos, thumbnailUrl.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of the item."},"channelName":{"type":"string","description":"Name of the channel."},"owner":{"type":"object","properties":{"id":{"type":"string","description":"Id of this owner item."},"name":{"type":"string","description":"Name of this owner item."},"url":{"type":"string","description":"Canonical URL of the item."},"handle":{"type":"string","description":"Account handle."}}},"totalVideos":{"type":"integer","description":"Full playlist size from the header (not the page length)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"videos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this videos item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this videos item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Playlist cover thumbnail from the sidebar when YouTube exposes one."},"channelName":{"type":"string","description":"Name of the channel."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of the item."},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Owning YouTube channel — id, title, handle, url (same shape as sibling list endpoints)."}}}}}}}},"example":{"success":true,"data":{"platform":"youtube","url":"https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj","id":"PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj","title":"Pop Music Playlist - Timeless Pop Songs (Updated Weekly 2026)","channelName":"by Redlist - Just Hits","owner":{"id":"UCs72iRpTEuwV3y6pdWYLgiw","name":"by Redlist - Just Hits","url":"https://www.youtube.com/@Redlist-JustHits","handle":"@Redlist-JustHits"},"totalVideos":200,"totalReturned":2,"videos":[{"id":"ekr2nIex040","url":"https://www.youtube.com/watch?v=ekr2nIex040","title":"ROSÉ & Bruno Mars - APT. (Official Music Video)","publishedAt":"2025-08-03T20:35:07.000Z","publishedTimeText":"1y ago","viewCount":2606548493,"durationSeconds":173,"thumbnailUrl":"https://i.ytimg.com/vi_webp/ekr2nIex040/sddefault.webp?v=6711dbac","channelName":"ROSÉ","channel":{"id":"UCBo1hnzxV9rz3WVsv__Rn1g","title":"ROSÉ","url":"https://www.youtube.com/channel/UCBo1hnzxV9rz3WVsv__Rn1g"}},{"id":"kPa7bsKwL-c","url":"https://www.youtube.com/watch?v=kPa7bsKwL-c","title":"Lady Gaga, Bruno Mars - Die With A Smile (Official Music Video)","publishedAt":"2025-08-03T20:35:07.000Z","publishedTimeText":"1y ago","viewCount":1782354502,"durationSeconds":252,"thumbnailUrl":"https://i.ytimg.com/vi/kPa7bsKwL-c/sddefault.jpg","channelName":"LadyGagaVEVO","channel":{"id":"UC07Kxew-cMIaykMOkzqHtBQ","title":"LadyGagaVEVO","url":"https://www.youtube.com/channel/UC07Kxew-cMIaykMOkzqHtBQ"}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/shorts/transcript":{"get":{"operationId":"youtube_shorts_transcript","tags":["YouTube"],"summary":"YouTube Shorts Transcript API","description":"Transcript for a YouTube Short — rejects long-form videos (≤3 min only).\n\nSame caption engine as YouTube Transcript (published captions only — not speech-to-text), scoped to Shorts. Pass a youtube.com/shorts/… URL (or a watch URL that is actually a Short). Videos longer than 3 minutes return HTTP 422 — use /v1/youtube/transcript for those. Caption-miss 404 uses the same diagnostic body and charges 0. Flat 1 credit on success.\n\nDocs: https://captapi.com/apis/youtube-shorts-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube Shorts URL, e.g. https://youtube.com/shorts/ID (≤3 min). Long-form videos return HTTP 422 — use the matching /v1/youtube/… endpoint instead. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Transcript for a YouTube Short — rejects long-form videos (≤3 min only).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"Platform video ID."},"title":{"type":"string","description":"Title of the item."},"transcript":{"type":"string","description":"Complete text transcript (file-upload endpoints). Timed caption/ASR endpoints use text instead."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"start":{"type":"integer","description":"Start time in seconds."},"duration":{"type":"number","description":"Duration when present — prefer durationSeconds (number) and durationText on endpoints that expose both."},"timestamp":{"type":"string","description":"Human-readable timestamp (MM:SS format)."}}}},"wordCount":{"type":"integer","description":"Total number of words in the transcript (file-upload endpoints)."},"segments":{"type":"integer","description":"Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list."},"language":{"type":"string","description":"Detected or requested language code."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/shorts/egvLKQe6I4I","videoId":"egvLKQe6I4I","title":"Don't Pop the Balloon","transcript":"Don't pop the balloon. Whatever you do, don't pop it...","transcriptSegments":[{"text":"Don't pop the balloon.","start":0,"duration":2,"timestamp":"00:00"},{"text":"Whatever you do, don't pop it.","start":2,"duration":2.4,"timestamp":"00:02"}],"wordCount":42,"segments":2,"language":"English"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/shorts/summarize":{"get":{"operationId":"youtube_shorts_summarize","tags":["YouTube"],"summary":"YouTube Shorts Summarizer API","description":"AI summary of a YouTube Short — rejects long-form videos (≤3 min only).\n\nSame summarizer as YouTube Summarizer (captions → AI summary), scoped to Shorts (≤3 minutes). Longer videos return HTTP 422. Caption-miss 404 matches /transcript diagnostics and charges 0 — never 3. Flat 3 credits only when a summary is returned.\n\nDocs: https://captapi.com/apis/youtube-shorts-summarizer","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube Shorts URL, e.g. https://youtube.com/shorts/ID (≤3 min). Long-form videos return HTTP 422 — use the matching /v1/youtube/… endpoint instead. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":3,"label":"3 credits","billedOnCacheHit":false},"x-one-liner":"AI summary of a YouTube Short — rejects long-form videos (≤3 min only).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"Platform video ID."},"title":{"type":"string","description":"Title of the item."},"summary":{"type":"string","description":"AI-generated summary of the content."},"keyPoints":{"type":"array","items":{"type":"string"},"description":"The most important takeaways."},"topics":{"type":"array","items":{"type":"string"},"description":"Detected topics and themes."},"sentiment":{"type":"string","description":"Overall tone (positive, neutral, negative)."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/shorts/egvLKQe6I4I","videoId":"egvLKQe6I4I","title":"Don't Pop the Balloon","summary":"MrBeast challenges people not to pop a balloon in a high-stakes Short.","keyPoints":["Contestants must keep a balloon intact.","Quick comedy beat typical of YouTube Shorts."],"topics":["challenge","shorts"],"sentiment":"positive"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/shorts/video-details":{"get":{"operationId":"youtube_shorts_details","tags":["YouTube"],"summary":"YouTube Shorts Stats API","description":"YouTube Short metadata — same schema as Video Details, with isShort:true; long-form videos get HTTP 422.\n\nSame field schema as YouTube Video Details (title, channel, duration, view/like/comment counts, tags, timings.path, …) but scoped to Shorts: response always includes platform, isShort:true, durationSeconds + durationFormatted, and a youtube.com/shorts/{id} URL. Uses reel_item_watch for publishDate / description / @handle (ANDROID player often omits Shorts microformat). Thumbnails prefer vertical / channel covers over landscape frame-2 stills. commentCountIsApproximate is true when YouTube only exposes a compact total (e.g. 11K→11000). defaultLanguage / defaultAudioLanguage are present (null when YouTube omits them). genre / categoryId / isFamilySafe are omitted when unavailable. Videos longer than 3 minutes — even if pasted as /shorts/{id} — return HTTP 422; use Video Details for those. Flat 1 credit.\n\nDocs: https://captapi.com/apis/youtube-shorts-stats","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube Shorts URL, e.g. https://youtube.com/shorts/ID (≤3 min). Long-form videos return HTTP 422 — use the matching /v1/youtube/… endpoint instead. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"YouTube Short metadata — same schema as Video Details, with isShort:true; long-form videos get HTTP 422.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"channelName":{"type":"string","description":"Name of the channel."},"channelId":{"type":"string","description":"Stable channel id (YouTube UC… when applicable)."},"channelUrl":{"type":"string","description":"URL of the channel."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"durationFormatted":{"type":"string","description":"Human-readable duration."},"viewCount":{"type":"integer","description":"View count."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"commentCount":{"type":"integer","description":"Comment count."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"genre":{"type":"string","description":"Music genre."},"tags":{"type":"array","items":{},"description":"Tags attached to the item."},"isShort":{"type":"boolean","description":"Is short. Example: true."},"contentType":{"type":"string","description":"Content type. Example: \"short\"."}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/shorts/egvLKQe6I4I","id":"egvLKQe6I4I","title":"Don't Pop the Balloon","description":"Don't pop the balloon...","channelName":"MrBeast","channelId":"UCX6OQ3DkcsbYNE6H8uQQuVA","channelUrl":"https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA","publishedAt":"2024-01-01T00:00:00Z","durationSeconds":51,"durationFormatted":"00:00:51","viewCount":97835773,"likeCount":2500000,"commentCount":12000,"thumbnailUrl":"https://i.ytimg.com/vi/egvLKQe6I4I/hqdefault.jpg","genre":"Entertainment","tags":[],"isShort":true,"contentType":"short"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/shorts/comments":{"get":{"operationId":"youtube_shorts_comments","tags":["YouTube"],"summary":"YouTube Shorts Comments API","description":"Comments on a YouTube Short — rejects long-form videos (≤3 min only).\n\nSame comments engine as YouTube Comments, scoped to Shorts. Long-form videos return HTTP 422. Flat 2 credits with cursor pagination.\n\nDocs: https://captapi.com/apis/youtube-shorts-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube Shorts URL, e.g. https://youtube.com/shorts/ID (≤3 min). Long-form videos return HTTP 422 — use the matching /v1/youtube/… endpoint instead. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Comments on a YouTube Short — rejects long-form videos (≤3 min only).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"Platform video ID."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"totalComments":{"type":"integer","description":"The video's total number of comments, across all pages."},"nextCursor":{"description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"author":{"type":"string","description":"Author name or handle."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"authorIsVerified":{"type":"boolean","description":"Whether the author is verified."},"authorIsChannelOwner":{"type":"boolean","description":"Whether the author owns the channel."},"text":{"type":"string","description":"Text content."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"replyCount":{"type":"integer","description":"How many replies this comment has. Use Comment Replies with this comment's id to fetch them."},"hasCreatorHeart":{"type":"boolean","description":"Whether the creator hearted the comment."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/shorts/egvLKQe6I4I","videoId":"egvLKQe6I4I","totalReturned":2,"totalComments":12000,"nextCursor":null,"hasMore":false,"comments":[{"id":"Ugshortcomment001","author":"@MrBeast","authorAvatarUrl":"https://yt3.ggpht.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s88-c-k-c0x00ffffff-no-rj","authorIsVerified":true,"authorIsChannelOwner":true,"text":"Did you pop it?","likeCount":50000,"replyCount":1200,"hasCreatorHeart":true,"publishedTimeText":"1 year ago"},{"id":"Ugshortcomment002","author":"@viewer123","authorAvatarUrl":"https://yt3.ggpht.com/ytc/default=s88-c-k-c0x00ffffff-no-rj","authorIsVerified":false,"authorIsChannelOwner":false,"text":"I would have popped it instantly","likeCount":8000,"replyCount":40,"hasCreatorHeart":false,"publishedTimeText":"1 year ago"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/channel-shorts":{"get":{"operationId":"youtube_channel_shorts","tags":["YouTube"],"summary":"YouTube Channel Shorts API","description":"Channel Shorts with cursor pagination — same row shape as channel-videos (exact publishedAt).\n\nLists a channel's Shorts tab with nextCursor + hasMore (same cursor as channel-videos). Each row is player-enriched via reel_item_watch + ANDROID: exact publishedAt, publishedTimeText when the shelf exposes a relative label, viewCount + viewCountIsApproximate, durationSeconds/durationFormatted, genre, badges, commentCount trio, thumbnailUrl (prefers cover over frame-2 stills), and nested channel{}. Flat 2 credits on the native path. Not an alias of Video Details.\n\nDocs: https://captapi.com/apis/youtube-channel-shorts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube channel URL, @handle, bare handle, or UC... channel ID, e.g. https://youtube.com/@handle or @mkbhd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Channel Shorts with cursor pagination — same row shape as channel-videos (exact publishedAt).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"shorts":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this shorts item."},"publishedAt":{"description":"ISO-8601 when available; approximate from relative labels on list cards — see publishedTimeText."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/@MrBeast","totalReturned":2,"shorts":[{"url":"https://www.youtube.com/shorts/Df5Y-2ndQyU","title":"Read My Book, You Could Win $1,000,000","publishedAt":null,"viewCount":8900000,"durationSeconds":null,"thumbnailUrl":null,"channelName":"MrBeast"},{"url":"https://www.youtube.com/shorts/egvLKQe6I4I","title":"Don't Pop the Balloon","publishedAt":null,"viewCount":90000000,"durationSeconds":null,"thumbnailUrl":null,"channelName":"MrBeast"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/trending-shorts":{"get":{"operationId":"youtube_trending_shorts","tags":["YouTube"],"summary":"YouTube Trending Shorts API","description":"YouTube Shorts recommendation sequence — fixed window per call (no cursor), not a global chart.\n\nServed from YouTube's reel_watch_sequence (Shorts recommendation feed). This is not a global trending ranking: results are session-dependent, may include older or re-uploaded Shorts, and can vary between calls. Trending returns a fixed window up to limit — there is no hasMore/nextCursor (unlike channel-videos / channel-shorts / search). Response source is always reel_watch_sequence on the native path. Each row is player-enriched with nested channel{id,url,title,handle} (https + percent-decoded @handle), exact viewCount + viewCountText + viewCountIsApproximate, durationSeconds + durationFormatted, publishedAt/genre when microformat exposes them, and commentCount with commentCountIsApproximate. Flat aliases (channelId/channelUrl/viewCountInt/…) and empty badges/channel.thumbnail are omitted. Optional q seeds the sequence from a topic Short only — values like trending/shorts are ignored (not echoed as query). Flat 2 credits.\n\nDocs: https://captapi.com/apis/youtube-trending-shorts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Optional topic seed for the Shorts recommendation sequence. Omit (or pass trending/shorts) for the default reel feed — not a keyword search.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Returns a single window; use limit to size it. No cursor. Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"YouTube Shorts recommendation sequence — fixed window per call (no cursor), not a global chart.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"shorts":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this shorts item."},"viewCount":{"type":"integer","description":"View count."}}}}}}}},"example":{"success":true,"data":{"platform":"youtube","query":"trending","totalReturned":2,"shorts":[{"url":"https://www.youtube.com/shorts/ggMTGsuaooU","title":"GO CRAZY! 👀 2026 Group Dance Trend #Shorts #Dance #Squad #Trending #fypシ Kaido Gia Chowbaby & more","viewCount":121000},{"url":"https://www.youtube.com/shorts/O07T9_5VIRI","title":"who remembers this trend?😳 #trending #viral #tiktok #funny","viewCount":23000000}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/channel-streams":{"get":{"operationId":"youtube_channel_streams","tags":["YouTube"],"summary":"YouTube Channel Streams API","description":"Channel Live tab only — liveStatus per row; 0 credits when hasLiveTab is false.\n\nReads YouTube's Live tab (not Videos). Channels without a Live tab (common for non-streamers) return totalReturned:0 and hasLiveTab:false instead of silently echoing Videos — billed 0 credits (tab check only; no stream fetch). When the Live tab exists, each row is player-enriched with exact viewCount, ISO publishedAt + publishedTimeText, thumbnailUrl, type stream|upcoming, and liveStatus live|upcoming|past. durationSeconds/durationFormatted are null when YouTube reports 0 (live/unknown) — never 00:00:00. Flat 2 credits on the native path when streams are fetched.\n\nDocs: https://captapi.com/apis/youtube-channel-streams","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube channel URL, @handle, bare handle, or UC... channel ID, e.g. https://youtube.com/@handle or @mkbhd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits when hasLiveTab is true; 0 credits when hasLiveTab is false.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Channel Live tab only — liveStatus per row; 0 credits when hasLiveTab is false.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"streams":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this streams item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Live stream or VOD length in seconds when YouTube exposes it."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/@MrBeast","totalReturned":2,"streams":[{"url":"https://www.youtube.com/watch?v=AaMdXZMvT3w","title":"Survive 30 Days On An Island With Your Ex, Win $250,000","publishedAt":"2026-05-16T16:00:01.000Z","viewCount":89925200,"durationSeconds":2349,"thumbnailUrl":"https://i.ytimg.com/vi/AaMdXZMvT3w/maxresdefault.jpg","channelName":"MrBeast"},{"url":"https://www.youtube.com/watch?v=GpQSUjNsNm0","title":"7 Days Stranded in The Arctic","publishedAt":"2026-05-30T16:00:02.000Z","viewCount":91519007,"durationSeconds":1935,"thumbnailUrl":"https://i.ytimg.com/vi/GpQSUjNsNm0/maxresdefault.jpg","channelName":"MrBeast"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/hashtag-search":{"get":{"operationId":"youtube_hashtag_search","tags":["YouTube"],"summary":"YouTube Hashtag Search API","description":"Videos from youtube.com/hashtag/{name} — nested channel{}, viewCountIsApproximate.\n\nPass a hashtag (with or without #) and get the videos listed on YouTube's hashtag page as clean JSON. This is the /hashtag/{name} feed — not a search?q= keyword query. A query with spaces (travel blog) is 400 HASHTAG_HAS_SPACES — YouTube hashtag pages are one token; nothing is fetched. Use /v1/youtube/search for a keyword phrase. Titles often omit the #tag (it may live only in the description); association is the hashtag page itself. Envelope field is hashtag (the normalized tag). Each result includes type (video|short|live), id, url, title, nested channel{id,title,handle?,url}, viewCount + viewCountIsApproximate, and durationSeconds when YouTube exposes them. Returns a single window; use limit to size it. No cursor. Billed per returned result (~1 credit each).\n\nDocs: https://captapi.com/apis/youtube-hashtag-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Hashtag with or without the # (min 2 characters). One token — spaces are 400 HASHTAG_HAS_SPACES.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Returns a single window; use limit to size it. No cursor. Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":20,"perResult":1,"label":"~20 credits (1/result)","billedOnCacheHit":false},"x-one-liner":"Videos from youtube.com/hashtag/{name} — nested channel{}, viewCountIsApproximate.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this results item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"viewCount":{"type":"integer","description":"View count."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"channelName":{"type":"string","description":"Name of the channel."}}}}}}}},"example":{"success":true,"data":{"query":"music","totalReturned":2,"results":[{"url":"https://www.youtube.com/watch?v=3iAiWIytqdw","title":"Forever Young - Music Travel Love ft. Bugoy Drilon","publishedAt":"2025-04-16T00:00:08.000Z","viewCount":31307210,"durationSeconds":265,"thumbnailUrl":"https://i.ytimg.com/vi/3iAiWIytqdw/maxresdefault.jpg","channelName":"Music Travel Love"},{"url":"https://www.youtube.com/watch?v=WpYPeL-gF5U","title":"Stay Royalty - Official Music Video of The Royalty Family (2020)","publishedAt":"2020-12-27T16:12:50.000Z","viewCount":14883690,"durationSeconds":194,"thumbnailUrl":"https://i.ytimg.com/vi/WpYPeL-gF5U/maxresdefault.jpg","channelName":"The Royalty Family"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/comment-replies":{"get":{"operationId":"youtube_comment_replies","tags":["YouTube"],"summary":"YouTube Comment Replies API","description":"Replies under a top-level comment — parentReplyCount + cursor.\n\nPass a video URL and a top-level commentId from /comments. Returns replies with nextCursor/hasMore and parentReplyCount (the parent's total when YouTube exposes it). Nested reply ids are not supported (404). Reply rows omit replyCount — those nested threads are not fetchable. Accepts commentId (preferred) or legacy comment_id. Flat 2 credits; 0 on 404.\n\nDocs: https://captapi.com/apis/youtube-comment-replies","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"commentId","in":"query","required":true,"description":"ID of the parent (top-level) comment to fetch replies for — from the comments endpoint. Legacy alias: comment_id.","schema":{"type":"string"}},{"name":"comment_id","in":"query","required":false,"deprecated":true,"description":"Deprecated alias of commentId.","schema":{"deprecated":true,"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Replies under a top-level comment — parentReplyCount + cursor.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"videoId":{"type":"string","description":"Platform video ID."},"commentId":{"type":"string","description":"Top-level parent comment id. Nested reply ids return 404."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"replies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this replies item."},"author":{"type":"string","description":"Author name or handle."},"authorChannelId":{"type":"string","description":"Author channel id. Example: \"UCjFRISlX-LPxiqViJAE3h6Q\"."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"authorIsVerified":{"type":"boolean","description":"Whether the author is verified."},"authorIsChannelOwner":{"type":"boolean","description":"Whether the author owns the channel."},"text":{"type":"string","description":"Text content."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"replyCount":{"type":"integer","description":"How many replies this comment has. Use Comment Replies with this comment's id to fetch them."},"hasCreatorHeart":{"type":"boolean","description":"Whether the creator hearted the comment."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."},"replyToId":{"type":"string","description":"Reply to id. Example: \"Ugzge340dBgB75hWBm54AaABAg\"."},"publishedTimeApprox":{"type":"string","description":"Approximate ISO-8601 derived from publishedTimeText, truncated to the label's precision (day/hour/minute). Not an observed instant — see publishedTimeIsApproximate."},"publishedTimeIsApproximate":{"type":"boolean","description":"true when publishedTimeApprox was derived from a relative label rather than an absolute timestamp YouTube exposed."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","videoId":"dQw4w9WgXcQ","commentId":"Ugzge340dBgB75hWBm54AaABAg","totalReturned":2,"replies":[{"id":"Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHE9eIiztxR","author":"@linganguliguliwatcha","authorChannelId":"UCjFRISlX-LPxiqViJAE3h6Q","authorAvatarUrl":"https://yt3.ggpht.com/AbGqKNjK9k5tyOqdV7cdXx-GgnGuuGQ5wj8RN42U5YCDvYHT0vaOKXGFahR36iaDPseGN08DjQ=s88-c-k-c0x00ffffff-no-rj","authorIsVerified":false,"authorIsChannelOwner":false,"text":"YOUTUBE AND ONE LIKE WOOHAAAAH","likeCount":7200,"replyCount":5,"hasCreatorHeart":false,"publishedTimeText":"1 year ago","replyToId":"Ugzge340dBgB75hWBm54AaABAg","publishedTimeApprox":"2025-08-03T00:00:00.000Z","publishedTimeIsApproximate":true},{"id":"Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAB_-JmDA","author":"@_bugrabilgin","authorChannelId":"UCg9tPtxMOieUEyhSv63uJ4g","authorAvatarUrl":"https://yt3.ggpht.com/LvMpN24GYYr8w43sGoMeYZYejDPJz_skehI6jm_XGGhfM5YeRa9OOsaplj60LnFNehE79ZxImg=s88-c-k-c0x00ffffff-no-rj","authorIsVerified":false,"authorIsChannelOwner":false,"text":"HEY YOUTUBE","likeCount":3000,"replyCount":2,"hasCreatorHeart":false,"publishedTimeText":"1 year ago","replyToId":"Ugzge340dBgB75hWBm54AaABAg","publishedTimeApprox":"2025-08-03T00:00:00.000Z","publishedTimeIsApproximate":true}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/channel-playlists":{"get":{"operationId":"youtube_channel_playlists","tags":["YouTube"],"summary":"YouTube Channel Playlists API","description":"Channel playlists with cursor pagination — id, title, totalVideos, thumbnailUrl.\n\nPass a channel URL, @handle, or UC… ID and get that channel's /playlists tab as clean JSON with nextCursor + hasMore. Each row: id (playlist list= ID — chain into /v1/youtube/playlist), url, title, totalVideos (same name as /playlist), thumbnailUrl. Flat 2 credits per page.\n\nDocs: https://captapi.com/apis/youtube-channel-playlists","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube channel URL, @handle, bare handle, or UC... channel ID, e.g. https://youtube.com/@handle or @mkbhd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Channel playlists with cursor pagination — id, title, totalVideos, thumbnailUrl.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"playlists":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this playlists item."},"videoCount":{"type":"integer","description":"Population video count when the source is authoritative (e.g. TikTok challenge/detail statsV2 on popular-hashtags, or a channel's uploaded-video total). Never a sample tally — sample sizes use sampleVideoCount / sampleSize."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/@MrBeast","totalReturned":2,"playlists":[{"url":"https://www.youtube.com/playlist?list=PLoSWVnSA9vG8hI-SUpAimvYJrPh-PRRvp","title":"If You Survive, You Win","videoCount":5,"thumbnailUrl":"https://i.ytimg.com/vi/tnTPaLOaHz8/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCjPAnSe9imDV7q3RLqefBW_CQRCw"},{"url":"https://www.youtube.com/playlist?list=PLoSWVnSA9vG_s-XT40oPKF0iWFGw8pOp2","title":"Helping People In Need","videoCount":10,"thumbnailUrl":"https://i.ytimg.com/tvfilm_banner/PLoSWVnSA9vG_s-XT40oPKF0iWFGw8pOp2/16_9_.jpg?sqp=CIK3qNMG-oaymwEICNYGEOADSFqi85f_AwYIsPuCygY=&rs=AOn4CLCIBDlHX0ennRaBJ6KUK7hIIyYqJQ"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/community-posts":{"get":{"operationId":"youtube_community_posts","tags":["YouTube"],"summary":"YouTube Community Posts API","description":"Community posts — channel{}, publishedTimeApprox, likeCountIsApproximate, linkedVideos[], cursor (1 credit).\n\nPass a channel URL, @handle, or UC… ID and get that channel's community /posts tab as clean JSON. communityStatus tells you what an empty list means: ok (posts[]), no_posts (tab open, zero posts), disabled (YouTube says this community is unavailable — 200, not 404). A handle that does not resolve is 404 CHANNEL_NOT_FOUND — never \"No community posts found\". A tab we could not read is 503 COMMUNITY_UNAVAILABLE (retryable, Retry-After). Each post: id/url, channel{id,title,url,handle} (no flat author twin), text, likeCount + likeCountText + likeCountIsApproximate, publishedTimeApprox + publishedTimeIsApproximate + publishedTimeText (relative labels only — no exact instant source), postType (text|image|poll|video|playlist|quiz), pollOptions[] + totalVotes + totalVotesIsApproximate when poll, images[], hashtags[] (deduped; digit-only rank mentions like \"ranks #1\" are not hashtags — YouTube never linkifies them), linkedVideos[] when the post attaches a video. Cursor pagination via nextCursor + hasMore. Flat 1 credit on the native path (including no_posts and disabled); 404/503 bill 0.\n\nDocs: https://captapi.com/apis/youtube-community-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube channel URL, @handle, bare handle, or UC... channel ID, e.g. https://youtube.com/@handle or @mkbhd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 1 credit per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Community posts — channel{}, publishedTimeApprox, likeCountIsApproximate, linkedVideos[], cursor (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"communityStatus":{"type":"string","description":"ok when posts[] is the shelf; no_posts when the tab is open and empty; disabled when YouTube says the community is unavailable. Never infer from posts:[] alone on an error."},"channelExists":{"type":"boolean","description":"True on a 200. A missing handle is 404 CHANNEL_NOT_FOUND, not this flag."},"posts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this posts item."},"url":{"type":"string","description":"Canonical URL of the item."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Id of this posts item."},"title":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"handle":{"type":"string"}},"description":"YouTube channel that authored the community post."},"text":{"type":"string","description":"Text content."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"likeCountText":{"type":"string","description":"Original like-count label from the platform (e.g. \"727K\", \"3.2M\")."},"likeCountIsApproximate":{"type":"boolean","description":"True when likeCount was parsed from a compact K/M/B label rather than an exact integer."},"hashtags":{"type":"array","items":{},"description":"Hashtags extracted from the text."},"linkedVideos":{"type":"array","items":{},"description":"Linked videos (array)."},"publishedTimeApprox":{"type":"string","description":"Approximate ISO-8601 derived from publishedTimeText, truncated to the label's precision (day/hour/minute). Not an observed instant — see publishedTimeIsApproximate."},"publishedTimeIsApproximate":{"type":"boolean","description":"true when publishedTimeApprox was derived from a relative label rather than an absolute timestamp YouTube exposed."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."},"isEdited":{"type":"boolean","description":"Is edited. Example: false."},"postType":{"type":"string","description":"Content type. YouTube community: \"text\" | \"image\" | \"poll\" | \"video\" | \"playlist\" | \"quiz\". Instagram: \"image\" | \"video\" | \"carousel\"."},"images":{"type":"array","items":{"type":"string"},"description":"Image URLs attached to the community post."},"pollOptions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"voteCount":{},"percentage":{}}}},"totalVotes":{"type":"integer"},"totalVotesText":{"type":"string"},"totalVotesIsApproximate":{"type":"boolean"}}}}}}}},"example":{"success":true,"data":{"url":"https://www.youtube.com/@starterstory","totalReturned":2,"hasMore":true,"nextCursor":"4qmFsgKTARIYVUNoaHc2RGxLS1RROW1ZU3BUZlhVWXFBGl5FZ1Z3YjNOMGM3Z0JBSklEQUtvREtBb2tVVEpvUTFKR1RYZGxSRXBvVmxSRmVsVnFRbGRVTWtaV1QxaHdWRTF1VWtSU1ZVWkNLR1R5QmdrS0Iwb0FvZ0VDQ0FFJTNEmgIWYmFja3N0YWdlLWl0ZW0tc2VjdGlvbg%3D%3D","communityStatus":"ok","channelExists":true,"posts":[{"id":"UgkxT0w7k1zkNQLiYQALw23IkNHZuKAjl4Xj","url":"https://www.youtube.com/post/UgkxT0w7k1zkNQLiYQALw23IkNHZuKAjl4Xj","channel":{"id":"UChhw6DlKKTQ9mYSpTfXUYqA","title":"Starter Story","url":"https://www.youtube.com/@starterstory","handle":"@starterstory"},"text":"I flew to NYC to spend 24 hours with the four friends behind Cal AI - the app they sold for millions and is now on track for $50M this year.","likeCount":350,"likeCountText":"350","likeCountIsApproximate":false,"hashtags":[],"linkedVideos":[],"publishedTimeApprox":"2026-09-06T16:00:00.000Z","publishedTimeIsApproximate":true,"publishedTimeText":"4 hours ago","isEdited":false,"postType":"image","images":["https://yt3.ggpht.com/QIYjBZ6NvP95fDGFWdK4232QiiBh_CHlnYKkeNGVBqRmcLG1LyLQoUDghnxoZDOj2Dujm69XpTJG7W4=s1440-c-fcrop64=1,0000199affffe666-rw-nd-v1"]},{"id":"UgkxBUGxNbJO0zDdYGVn7WUnS2WtxCONdhit","url":"https://www.youtube.com/post/UgkxBUGxNbJO0zDdYGVn7WUnS2WtxCONdhit","channel":{"id":"UChhw6DlKKTQ9mYSpTfXUYqA","title":"Starter Story","url":"https://www.youtube.com/@starterstory","handle":"@starterstory"},"text":"Who got their 2 hours of DEEP work in today?","likeCount":96,"likeCountText":"96","likeCountIsApproximate":false,"hashtags":[],"linkedVideos":[],"publishedTimeApprox":"2026-08-07T00:00:00.000Z","publishedTimeIsApproximate":true,"publishedTimeText":"1 month ago","isEdited":false,"postType":"poll","images":[],"pollOptions":[{"text":"Yes","voteCount":null,"percentage":null},{"text":"No","voteCount":null,"percentage":null}],"totalVotes":1300,"totalVotesText":"1.3K votes","totalVotesIsApproximate":true}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/community-post-details":{"get":{"operationId":"youtube_community_post_details","tags":["YouTube"],"summary":"YouTube Community Post Details API","description":"One community post — list schema + commentCount trio + isEdited.\n\nPaste a YouTube community post URL (/post/Ugkx… or /community?lb=) and get the same clean shape as Community Posts list items: text, images[], postType, pollOptions + totalVotes when poll (omitted on non-polls), likeCount trio, publishedTimeApprox vocabulary with isEdited (no \"(edited)\" in the time label), channel{}, linkedVideos[], and commentCount + commentCountText + commentCountIsApproximate. Trailing whitespace / newlines from a curl or clipboard paste are stripped — they are not a 500. A watch URL or a URL that still contains a control character is 400. Flat 1 credit.\n\nDocs: https://captapi.com/apis/youtube-community-post-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"YouTube community post URL (/post/Ugkx… or /community?lb=). Trailing whitespace is stripped. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"One community post — list schema + commentCount trio + isEdited.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"channelName":{"type":"string","description":"Name of the channel."},"channelUrl":{"type":"string","description":"URL of the channel."},"likes":{"type":"string","description":"Like count as a number when YouTube exposes it — prefer likeCount + likeCountText on this endpoint."},"comments":{"type":"integer","description":"Comment count."},"images":{"type":"array","items":{"type":"string"},"description":"Image URLs attached to the community post."},"publishedTimeText":{"type":"string","description":"Original relative publish label from the platform when an exact timestamp was not available (e.g. \"1 year ago\")."}}}}},"example":{"success":true,"data":{"platform":"youtube","id":"UgkxfMvMnSnV3Ww9HwAY2wFGmVevmhRaYAYO","url":"https://www.youtube.com/post/UgkxfMvMnSnV3Ww9HwAY2wFGmVevmhRaYAYO","text":"Inside this box is the world's FIRST 500M Play Button. We're 10M away from 500M and I cannot wait to see what’s in here so help me out.","publishedAt":"2026-07-03T19:42:10.000Z","channelName":"MrBeast","channelUrl":"https://www.youtube.com/@MrBeast","likes":"727K","comments":16260,"images":["https://yt3.ggpht.com/BgBr4f_nvLm84HY2JVaPiDZRLZXJsqA7Q29CJkAksrwRFNXN1GgQJxzjYfzWUYR6ZekKBXCVwxPQKw=s1000-rw-nd-v1"],"publishedTimeText":"1 month ago (edited)"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/youtube/video-sponsors":{"get":{"operationId":"youtube_video_sponsors","tags":["YouTube"],"summary":"YouTube Video Sponsors API","description":"SponsorBlock community segments — free while the CC BY-NC-SA commercial-use exception is pending.\n\nPaste a YouTube video URL. Returns community-sourced skip segments from SponsorBlock (https://sponsor.ajay.app/) — not YouTube official data and not Captapi detection. Envelope always includes source:\"sponsorblock\", sourceUrl, license:\"CC BY-NC-SA 4.0\" (attribution required; commercial use needs SponsorBlock's explicit permission), and videoDurationSeconds even when segments is empty. Segments sorted by startSeconds with overlapsWith. coverageSeconds is the union of filtered intervals — overlapping segments are counted once, so coverageSeconds ≤ sum(durationSeconds). minVotes and categories are echoed so a filtered coverageSeconds is distinguishable from an unfiltered one. Default minVotes=0 drops rejected segments (votes < 0). Default categories=sponsor,selfpromo,interaction. 0 credits on every call since 2026-08-09: the SponsorBlock database/API licence is non-commercial, so this endpoint stays free unless SponsorBlock grants a written commercial-use exception.\n\nDocs: https://captapi.com/apis/youtube-video-sponsors","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public YouTube video URL, e.g. https://youtube.com/watch?v=ID. Not a TikTok/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"minVotes","in":"query","required":false,"description":"Minimum SponsorBlock votes to keep a segment. Default 0 (drops community-rejected votes < 0).","schema":{"type":"integer","maximum":100,"minimum":-10,"default":0}},{"name":"categories","in":"query","required":false,"description":"Comma-separated categories. Default sponsor,selfpromo,interaction. Also intro,outro,preview,music_offtopic,poi_highlight,filler.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":0,"label":"0 credits","billedOnCacheHit":false},"x-one-liner":"SponsorBlock community segments — free while the CC BY-NC-SA commercial-use exception is pending.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"videoId":{"type":"string","description":"Platform video ID."},"videoDurationSeconds":{"type":"number","description":"Full video length in seconds. Always present — including when segments is empty (proves the video was looked up)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"segments":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","description":"SponsorBlock segment category: \"sponsor\" | \"selfpromo\" | \"interaction\" | \"intro\" | \"outro\" | \"preview\" | \"music_offtopic\" | \"poi_highlight\" | \"filler\"."},"actionType":{"type":"string","description":"SponsorBlock action (usually \"skip\")."},"startSeconds":{"type":"number","description":"Segment start time in seconds."},"endSeconds":{"type":"number","description":"Segment end time in seconds."},"startFormatted":{"type":"string","description":"Segment start as M:SS or H:MM:SS."},"endFormatted":{"type":"string","description":"Segment end as M:SS or H:MM:SS."},"durationSeconds":{"type":"number","description":"Sponsor segment length in seconds (end - start)."},"votes":{"type":"integer","description":"Votes. Example: 1."},"uuid":{"type":"string","description":"Uuid."}}}}}}}},"example":{"success":true,"data":{"videoId":"Wdjh81uH6FU","videoDurationSeconds":938.852,"totalReturned":5,"segments":[{"category":"selfpromo","actionType":"skip","startSeconds":554.515,"endSeconds":638.201,"startFormatted":"9:15","endFormatted":"10:38","durationSeconds":83.686,"votes":1,"uuid":"52f9974390e30c4941d529cb028dfa56886a6e738fd1c5f1603a37f9bd9c21217"},{"category":"sponsor","actionType":"skip","startSeconds":600.675,"endSeconds":617.15,"startFormatted":"10:01","endFormatted":"10:17","durationSeconds":16.475,"votes":0,"uuid":"6377104df535c8eb2c2d7d6437320e71660b93a02517da2ba668c3813d7de6ff7"},{"category":"sponsor","actionType":"skip","startSeconds":555.65,"endSeconds":560.175,"startFormatted":"9:16","endFormatted":"9:20","durationSeconds":4.525,"votes":0,"uuid":"f75d77a0658f668c014ffa63f26f2ecc439a6d6b18b868d93c0875f55a47ba017"},{"category":"selfpromo","actionType":"skip","startSeconds":567.302,"endSeconds":573,"startFormatted":"9:27","endFormatted":"9:33","durationSeconds":5.698,"votes":0,"uuid":"328569d7ae428c1243bc54f010800a5cf6b5449e47abd3ee0f8093531ebeb8137"},{"category":"sponsor","actionType":"skip","startSeconds":621.375,"endSeconds":627.7,"startFormatted":"10:21","endFormatted":"10:28","durationSeconds":6.325,"votes":-1,"uuid":"ee142c1cb73f13b3eceef18ffdd1eafd763c1adaef8df88f2c2b20f768e40ad27"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/transcript":{"get":{"operationId":"tiktok_transcript","tags":["TikTok"],"summary":"TikTok Transcript API","description":"Extract timestamped transcripts from any public TikTok video in a single request.\n\nThe TikTok Transcript API lets you extract the full, timestamped transcript for TikTok transcript with a single REST call. No OAuth, no infrastructure to maintain, and no platform SDKs — send the request, get clean structured JSON back. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d.\n\nDocs: https://captapi.com/apis/tiktok-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public TikTok video URL, e.g. https://www.tiktok.com/@khaby.lame/video/7646812028874673439. Not a YouTube/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string","maxLength":8}},{"name":"cache","in":"query","required":false,"description":"Serve from the 24h shared cache when available (0 credits on hit). Default true — set false to always fetch fresh.","schema":{"type":"boolean","default":true}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Extract timestamped transcripts from any public TikTok video in a single request.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"language":{"type":"string","description":"Detected or requested language code."},"text":{"type":"string","description":"Full transcript — segment texts joined with a single space. Same key as YouTube/Rumble transcript endpoints."},"segments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Full transcript — segment texts joined with a single space. Same key as YouTube/Rumble transcript endpoints."},"startMs":{"type":"integer","description":"Start ms. Example: 0."},"endMs":{"type":"integer","description":"End ms. Example: 9280."}}}}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/@papakitten2/video/7666347838045031702","language":"en","text":"Well, spin on my mind, I wanna make a rock and a-na-na I wanna make a rock and a-na-na Wish we never go, go, rock and a-na We need to make a rock and a-na I wanna make a rock and a-na I wanna make a rock and a-na Wish we never go, go, rock and a-na We need to make a rock and a-na Wish we never go, go, rock and a-na We need to make a rock and a-na","segments":[{"text":"Well, spin on my mind, I wanna make a rock and a-na-na I wanna make a rock and a-na-na","startMs":0,"endMs":9280},{"text":"Wish we never go, go, rock and a-na We need to make a rock and a-na","startMs":9280,"endMs":16480},{"text":"I wanna make a rock and a-na I wanna make a rock and a-na","startMs":16480,"endMs":23200},{"text":"Wish we never go, go, rock and a-na We need to make a rock and a-na","startMs":23200,"endMs":30480},{"text":"Wish we never go, go, rock and a-na We need to make a rock and a-na","startMs":30480,"endMs":32480}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/summarize":{"get":{"operationId":"tiktok_summarize","tags":["TikTok"],"summary":"TikTok Summarizer API","description":"Turn any TikTok video into an AI summary with key points, topics, and sentiment.\n\nThe TikTok Summarizer API lets you generate an AI summary with key points and topics for TikTok summarizer with a single REST call. No OAuth, no infrastructure to maintain, and no platform SDKs — send the request, get clean structured JSON back. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d.\n\nDocs: https://captapi.com/apis/tiktok-summarizer","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public TikTok video URL, e.g. https://www.tiktok.com/@khaby.lame/video/7646812028874673439. Not a YouTube/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"ISO code, e.g. \"tr\": pins the speech language and sets the summary output language. Defaults to auto-detect + English summary.","schema":{"type":"string","maxLength":8}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":4,"label":"4 credits","billedOnCacheHit":false},"x-one-liner":"Turn any TikTok video into an AI summary with key points, topics, and sentiment.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"summary":{"type":"string","description":"AI-generated summary of the content."},"keyPoints":{"type":"array","items":{"type":"string"},"description":"The most important takeaways."},"topics":{"type":"array","items":{"type":"string"},"description":"Detected topics and themes."},"sentiment":{"type":"string","description":"Overall tone (positive, neutral, negative)."}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/@khaby.lame/video/7646812028874673439","summary":"Khaby Lame delivers a silent-comedy thank-you bit: after a simple setup, he gestures the punchline and signs off with “Thank you, please come again.”","keyPoints":["Silent physical comedy — no spoken narration.","The caption is “Thank you, please come again!!!”","Hashtags: #learnfromkhaby #comedy."],"topics":["comedy","silent comedy","khaby lame"],"sentiment":"positive"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/video-details":{"get":{"operationId":"tiktok_video_details","tags":["TikTok"],"summary":"TikTok Video Details API","description":"Get everything about one TikTok video from its URL — caption, view/like/comment/share/save counts, creator, sound, hashtags, and thumbnail.\n\nPaste any public TikTok video URL and the TikTok Video Details API returns the full picture as clean JSON: the caption, when it was posted, how long it runs, and its engagement — views, likes, comments, shares, and saves. You also get the creator (username, display name, follower count, verified badge, and avatar), the sound/music name, the list of hashtags, and a thumbnail image. Use it to build analytics dashboards, track a campaign, or enrich a content database. source is native; timings.path is mobile | web (same vocabulary as kick/clip and twitter/profile — fetchPath is gone). Mobile is TikTok's aweme detail — exact integers with per-counter *IsApproximate flags set false, plus downloads and play URLs when TikTok exposes them. When every mobile exit is soft-blocked, web serves the page's display-rounded counters; the flags say so per counter. The web path does not populate videoUrl / downloadUrl / downloadUrlNoWatermark / downloads / author.region — that is a logged-out web limit, documented here, not a payload apology. mediaUrlsExpireAt still fills from thumbnailUrl / avatar when those carry a parseable stamp. adAuthorized is whether the creator permitted Spark Ads on this organic video — it is not \"this item is an advertisement\". isCommerce / isBrandedContent / isPaidPartnership stay separate; filter those if you want commercial content. author.region is the creator's country on the mobile aweme (null on web when TikTok omits it) — there is no flat authorRegion twin. locationCreated is the video's posting locale, a different signal. author.followersIsApproximate uses the same display-roundness ladder as engagement (v ≥ 10 000 and a clean hundred/100k). followersAsOf is gone — it always equalled fetchedAt. fetchedAt is when the fetch started, not when it returned. status.allowComment / allowShare are booleans: unknown bits are false (shared serialisation rule), not null next to the other status flags. TikTok CDN media URLs die on two windows: video/download ~24h (hex path timestamp or expire=), thumbnails/covers ~48h (x-expires). mediaUrlsExpireAt is the earliest — persist ids, not the URL. For creator country with regionSource / regionConfidence, use TikTok Profile Region. This endpoint focuses on metadata and stats. No TikTok login and no infrastructure to maintain on your side. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/tiktok-video-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public TikTok video URL, e.g. https://www.tiktok.com/@khaby.lame/video/7646812028874673439. Not a YouTube/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string","examples":["https://www.tiktok.com/@khaby.lame/video/7646812028874673439"]}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Get everything about one TikTok video from its URL — caption, view/like/comment/share/save counts, creator, sound, hashtags, and thumbnail.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"mediaType":{"type":"string","description":"Media type label for this item (platform-specific enum)."},"width":{"type":"integer","description":"Width in pixels."},"height":{"type":"integer","description":"Height in pixels."},"videoUrl":{"type":"string","description":"Playable CDN URL when TikTok exposes one that is not session-cookie bound. Present on timings.path=mobile when TikTok publishes an unbound link; null on web (logged-out watch page). Web playAddr with tk=tt_chain_token 403s for callers and is omitted. Null does not mean the video is deleted."},"downloadUrl":{"type":"string","description":"Watermarked download CDN URL when TikTok exposes one. Null on timings.path=web — same web-path limit as videoUrl."},"downloadUrlNoWatermark":{"description":"No-watermark download URL when the mobile aweme exposes one. Null on web."},"hasWatermark":{"type":"boolean","description":"Has watermark. Example: true."},"mediaUrlsExpireAt":{"type":"string","description":"Earliest ISO expiry across every signed URL in this payload (videoUrl / downloadUrl / downloadUrlNoWatermark / thumbnailUrl / author.profileImage). Parses expire= / x-expires and the 8-char hex path timestamp on v45-style play URLs (~24h). Image x-expires is typically ~48h — the min is the safe assumption. Null only when no URL yields a parseable stamp (logged, never guessed). Persist the video id and refetch."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"followersAsOf":{"type":"string","description":"Followers as of. Example: \"2026-07-27T08:14:52.000Z\"."},"region":{"type":"string","description":"Creator profile region from the mobile aweme (populated on timings.path=mobile). Null on web when TikTok omits it. There is no flat authorRegion twin. When TikTok exposes it nowhere, /tiktok/profile-region infers the creator country with regionSource / regionConfidence."}}},"engagement":{"type":"object","properties":{"views":{"type":"integer","description":"View count when the platform exposes one."},"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count."},"shares":{"type":"integer","description":"Share count. On analytics endpoints: null when the platform has no public share metric (stable schema). On single-platform endpoints the key is omitted instead."},"saves":{"type":"integer","description":"Save count. On analytics endpoints: null when the platform has no public save metric (stable schema). On single-platform endpoints the key is omitted instead."},"viewsIsApproximate":{"type":"boolean","description":"True when engagement.views came from a compact/display-rounded label (TikTok stats, Facebook og \"610K views\") rather than an exact integer."},"likesIsApproximate":{"type":"boolean","description":"True when engagement.likes looks display-rounded rather than exact."},"commentsIsApproximate":{"type":"boolean","description":"True when engagement.comments looks display-rounded rather than exact."},"sharesIsApproximate":{"type":"boolean","description":"True when engagement.shares looks display-rounded rather than exact."},"savesIsApproximate":{"type":"boolean","description":"True when engagement.saves looks display-rounded rather than exact."},"downloads":{"type":"integer","description":"Exact download count from the mobile aweme statistics when TikTok exposes it — typically present on timings.path=mobile, omitted on web. video-details and music-posts are the only endpoints that surface it."}}},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{},"description":"Accounts mentioned in the text."},"musicName":{"type":"string","description":"Name of the soundtrack used."},"musicId":{"type":"string","description":"ID of the soundtrack used."},"musicAuthor":{"type":"string","description":"Music author. Example: \"Khabane lame\"."},"isOriginalSound":{"type":"boolean","description":"Is original sound. Example: true."},"locationCreated":{"type":"string","description":"ISO country for the video's posting/serving locale — not the creator's home country (see author.region / profile-region)."},"authorRegion":{"type":"string","description":"Creator's TikTok profile region (ISO country) when TikTok exposes it on the video — hydrated from the mobile aweme detail, so it is populated on most videos. When TikTok does not expose it anywhere, /tiktok/profile-region infers the creator country with regionSource / regionConfidence. Distinct from locationCreated (video locale)."},"descLanguage":{"description":"Language code TikTok assigns to the video caption when exposed."},"shopProductUrl":{"description":"TikTok Shop product page URL when the video anchors a product (https://www.tiktok.com/shop/pdp/…). Null/omitted when the video does not sell."},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."},"isCommerce":{"type":"boolean","description":"True when TikTok marks the item as commerce / shop-capable."},"isBrandedContent":{"type":"boolean","description":"True when TikTok marks the item as brand-organic / branded content."},"isPaidPartnership":{"type":"boolean","description":"True when TikTok marks the item as a paid partnership."},"status":{"type":"object","properties":{"allowComment":{"type":"boolean","description":"Whether comments are allowed. Unknown on both the web page and the mobile aweme is false — not null. Same shared boolean rule as twitter/profile."},"allowShare":{"type":"boolean","description":"Whether shares are allowed. Unknown on both the web page and the mobile aweme is false — not null."},"isPrivate":{"type":"boolean","description":"Whether the account is private."},"isDeleted":{"type":"boolean","description":"Is deleted. Example: false."},"inReview":{"type":"boolean","description":"In review. Example: false."},"isProhibited":{"type":"boolean","description":"Is prohibited. Example: false."}}},"fetchedAt":{"type":"string","description":"When this fetch started (ISO-8601 UTC). On a long call this is seconds before the response returns — not completion. Cache hits keep the original stamp."}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/@khaby.lame/video/7646812028874673439","id":"7646812028874673439","caption":"Thank you, please come again!!!🙋🏿‍♂️💸#learnfromkhaby #comedy","publishedAt":"2026-06-02T14:56:35.000Z","durationSeconds":29.534,"thumbnailUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oUAHVIiQDac8uC75AEfyALAA1FrTAqEEQ3GRPe~tplv-tiktokx-origin.image?dr=9636&x-expires=1783263600&x-signature=2PlkofS3nAbuOWtQQSaCTJIU0bQ%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","mediaType":"video","width":576,"height":1024,"videoUrl":"https://v16-webapp-prime.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/osABAiDgQEbQItAyAFeBfiAXnEBQDEfKGQIgSE/?a=1988&expire=1785171600","downloadUrl":"https://v16-webapp-prime.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/osABAiDgQEbQItAyAFeBfiAXnEBQDEfKGQIgSE/?a=1988&expire=1785171600","downloadUrlNoWatermark":null,"hasWatermark":true,"mediaUrlsExpireAt":"2026-07-27T17:00:00.000Z","author":{"id":"127905465618821121","secUid":"MS4wLjABAAAAwAg0rOj4qHjHBN4BQLRlTaNI0dpqRuTrNi-TM0LKNpc","username":"khaby.lame","displayName":"Khabane lame","url":"https://www.tiktok.com/@khaby.lame","followers":162476412,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:720:720.jpeg?dr=9640&refresh_token=828dd685&x-expires=1783263600&x-signature=uG12wEuTZOcKwj9%2BCpq6wCtqNe8%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=f20df69d&idc=useast5","followersAsOf":"2026-07-27T08:14:52.000Z","region":"IT"},"engagement":{"views":17042375,"likes":1550817,"comments":16306,"shares":16050,"saves":62013,"viewsIsApproximate":false,"likesIsApproximate":false,"commentsIsApproximate":false,"sharesIsApproximate":false,"savesIsApproximate":false,"downloads":7108},"hashtags":["learnfromkhaby","comedy"],"mentions":[],"musicName":"original sound - khaby.lame","musicId":"7646812079113898783","musicAuthor":"Khabane lame","isOriginalSound":true,"locationCreated":"IT","authorRegion":"IT","descLanguage":null,"shopProductUrl":null,"isAd":false,"isCommerce":false,"isBrandedContent":false,"isPaidPartnership":false,"status":{"allowComment":true,"allowShare":true,"isPrivate":false,"isDeleted":false,"inReview":false,"isProhibited":false},"fetchedAt":"2026-07-27T08:14:52.000Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/comments":{"get":{"operationId":"tiktok_comments","tags":["TikTok"],"summary":"TikTok Comments API","description":"TikTok comments — clean schema plus authorName, stable authorId/authorSecUid and commentLanguage for listening loops.\n\nPaste a public TikTok video URL and get comments as clean JSON (not TikTok's 40+ junk user fields). Each comment keeps username (author) + display name (authorName) + avatar, and adds stable authorId (uid) and authorSecUid for repeat-commenter detection, plus commentLanguage for market listening without a separate language detector. replyCount when TikTok exposes it. totalComments + cursor pagination (nextCursor/hasMore — hasMore is always a boolean; a null nextCursor means the end of the comments). An unresolvable URL is 404 at 0 credits — never a 200 with a synthesised row. Same rule as Post Analytics and as /tiktok/video-details on the same URL. When the native comment path is blocked, the first page may come from the fallback path (may take longer): degraded=true with degradedReason=extended, totalComments stays on the envelope, and hasMore is false (the fallback path cannot page). Flat 2 credits per successful call. Need replies? Use TikTok Comment Replies with the parent comment id.\n\nDocs: https://captapi.com/apis/tiktok-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public TikTok video URL, e.g. https://www.tiktok.com/@khaby.lame/video/7646812028874673439. Not a YouTube/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (a numeric offset, e.g. 50). A null nextCursor means the end of the comments.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"TikTok comments — clean schema plus authorName, stable authorId/authorSecUid and commentLanguage for listening loops.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"totalComments":{"type":"integer","description":"Video-level comment count when TikTok exposes one. Always present on the degraded extended path (0 when unknown). Omitted on a native page only when TikTok sent no total."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"text":{"type":"string","description":"Text content."},"author":{"type":"string","description":"Author name or handle."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"authorId":{"type":"string","description":"Author id. Example: \"6958917445306926086\"."},"commentLanguage":{"type":"string","description":"Comment language. Example: \"en\"."},"replyCount":{"type":"integer","description":"How many replies this comment has. Use Comment Replies with this comment's id to fetch them."},"authorSecUid":{"description":"Primary artist / sound-owner secUid when TikTok exposes one."},"authorName":{"type":"string","description":"Name of the author."}}}},"nextCursor":{"type":"string","description":"Numeric offset to pass back as cursor. Null means the end of the comments."},"hasMore":{"type":"boolean","description":"Boolean on every path. true when nextCursor is a resume offset; false when nextCursor is null (end of the thread, or the fallback path which cannot page). Never null."}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/@khaby.lame/video/7646812028874673439","totalComments":824,"totalReturned":2,"comments":[{"id":"7646834545992696596","text":"Mr beast 500 million 🥰🇧🇩","author":"yeasin3344556677","authorAvatarUrl":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-avt-0068/1e20d2d83b1200c623f0dec26603356f~tplv-tiktokx-cropcenter-q:100:100:q70.webp?dr=9606&idc=useast2b&ps=87d6e48a&refresh_token=7098d2d1&s=COMMENT_LIST&sc=avatar&shcp=5597e28e&shp=30310797&t=223449c4&x-expires=1784300400&x-signature=%2FbEc5ajSBQOMXt9rOeQY8GO%2Beh8%3D","likeCount":223,"publishedAt":"2026-06-02T16:23:41.000Z","authorId":"6958917445306926086","commentLanguage":"en","replyCount":14,"authorSecUid":null,"authorName":"yeasin3344556677"},{"id":"7647102586621297429","text":"С каждым лайком нос растёт","author":"gudingar","authorAvatarUrl":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-avt-0068/56317ccbf99872b4f14448d7fb959826~tplv-tiktokx-cropcenter-q:100:100:q70.webp?dr=9606&idc=useast2b&ps=87d6e48a&refresh_token=9f5971b4&s=COMMENT_LIST&sc=avatar&shcp=5597e28e&shp=30310797&t=223449c4&x-expires=1784300400&x-signature=FXHzE%2FNLM2v17bh45RTPVfe8%2BDA%3D","likeCount":635,"publishedAt":"2026-06-03T09:43:54.000Z","authorId":"6958917445306926086","commentLanguage":"ru","replyCount":0,"authorSecUid":null,"authorName":"gudingar"}],"nextCursor":"2","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/channel-details":{"get":{"operationId":"tiktok_channel_details","tags":["TikTok"],"summary":"TikTok Channel Details API","description":"Resolve a TikTok @handle to id + secUid — createTime, ttSeller, bioLink, decoded privacy flags.\n\nPass a profile URL or @handle and get a curated identity card for CRM joins and chaining — not a geography endpoint. Single key set: platform, id, handle, url, displayName, bio, avatar, followers + followersIsApproximate, following, likes + likesIsApproximate, postCount + postCountIsApproximate, verified, private, secUid, likesGiven (videos this account has liked — not likes received; null when TikTok hides it), category, createTime (ISO; the unix twin is raw.createTimeUnix), bioLink{link,risk: low|medium|high}, ttSeller (user.ttSeller — has a TikTok Shop storefront; act on this for Shop joins), isCommerceUser (commerceUserInfo.commerceUser — TikTok's commerce-user flag, not a shop; can disagree with ttSeller), isOrganization, friendCount, language, region only when TikTok exposes it on the profile page, decoded privacy (commentsAllowedFrom / duetsAllowedFrom / stitchesAllowedFrom / downloadsAllowed), contact{emails,links} (bio-only links — bioLink.link is not duplicated), and source / stages / timings (same envelope as user-showcase and video-details; this path is web-only so mobileStatus is skipped). Upstream TikTok privacy ints, createTimeUnix, and other internals are behind raw=true. For creator country with regionSource / regionConfidence use /tiktok/profile-region (2 credits). Pass cacheMaxAge=1d|3d|7d|14d|30d. Flat 1 credit.\n\nDocs: https://captapi.com/apis/tiktok-channel-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"raw","in":"query","required":false,"description":"Set true to include TikTok's upstream user/statsV2 blob under raw, plus createTimeUnix (unix twin of createTime). Default false — curated fields only.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Resolve a TikTok @handle to id + secUid — createTime, ttSeller, bioLink, decoded privacy flags.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"likes":{"type":"integer","description":"Total likes across the creator's videos (TikTok heartCount). Not likesGiven."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"verified":{"type":"boolean","description":"Whether TikTok shows a verified badge on this profile."},"private":{"type":"boolean","description":"Whether the account is private."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"category":{"type":"string","description":"Generic category label for the item or community."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"createTime":{"type":"string","description":"When the account was created (ISO 8601)."},"createTimeUnix":{"type":"integer","description":"Unix twin of createTime — only under raw=true. The curated card is ISO createTime only."},"friendCount":{"type":"integer","description":"Mutual-follow (friends) count when exposed."},"diggCount":{"description":"Digg count."},"bioLink":{"type":"object","properties":{"link":{"type":"string","description":"Link. Example: \"spr.ly/natgeotiktok\"."},"risk":{"type":"integer","description":"Risk. Example: 3."}}},"isCommerceUser":{"type":"boolean","description":"TikTok's commerce-user flag (commerceUserInfo.commerceUser). Not a shop. Independent of ttSeller."},"ttSeller":{"type":"boolean","description":"Has a TikTok Shop storefront (user.ttSeller). Act on this for /tiktok-shop/* joins."},"isOrganization":{"type":"boolean","description":"Whether the account is an organization account."},"language":{"type":"string","description":"Detected or requested language code."},"commentsAllowedFrom":{"type":"string","description":"Who can comment: \"everyone\", \"friends\", or \"off\"."},"duetsAllowedFrom":{"type":"string","description":"Who can duet: \"everyone\", \"friends\", or \"off\"."},"stitchesAllowedFrom":{"type":"string","description":"Who can stitch: \"everyone\", \"friends\", or \"off\"."},"downloadsAllowed":{"type":"boolean","description":"Whether others may download this creator's videos."},"contact":{"type":"object","properties":{"links":{"type":"array","items":{"type":"string"},"description":"Links listed on the page."}}},"fetchedAt":{"type":"string","description":"When this snapshot was fetched (ISO 8601 UTC)."},"handle":{"type":"string","description":"TikTok @handle (canonical). No username twin on this endpoint."}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/@natgeo","id":"6780344874811442181","displayName":"National Geographic","bio":"Step into wonder and find your inner explorer with National Geographic 🌎","followers":9590041,"following":61,"likes":53508645,"postCount":1454,"verified":true,"private":false,"avatar":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/324924e171e481040a1ea202962f6e07~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=2d807a74&x-expires=1786435200&x-signature=VLjDqS0313BGst8y0tyrQFabZB4%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","category":"Media & Entertainment","secUid":"MS4wLjABAAAAEf96k3JW8-3eOhgzgQswlFF6ZDnn1dzqWWorJjwDsiNZymqTtvOcFhp_RiYYST6s","createTime":"2020-01-10T16:08:37.000Z","createTimeUnix":1578672517,"friendCount":58,"diggCount":null,"bioLink":{"link":"spr.ly/natgeotiktok","risk":3},"isCommerceUser":true,"ttSeller":false,"isOrganization":true,"language":"en","commentsAllowedFrom":"everyone","duetsAllowedFrom":"off","stitchesAllowedFrom":"off","downloadsAllowed":false,"contact":{"links":["spr.ly/natgeotiktok"]},"fetchedAt":"2026-08-09T08:56:19.857Z","handle":"natgeo"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/profile-region":{"get":{"operationId":"tiktok_profile_region","tags":["TikTok"],"summary":"TikTok Profile Region API","description":"Find out where a TikTok creator is likely based and what language they use — country, language, stable ids, and core profile stats.\n\nGive the TikTok Profile Region API a profile URL, @handle, or username and it returns creator geography and language as clean JSON — the dedicated geo surface. channel-details (1 credit) reads the same profile page and emits region only when TikTok itself publishes it (rare) — it never guesses. This endpoint adds the work that justifies 2 credits: when the page has no country we run an AI estimate from bio / display name / username / language (regionSource=inferred + regionConfidence; a username that merely equals a country name — @syria, @france — is not treated as evidence), and when the page exposes neither region nor language we fall back to a caption-language sample from recent videos before estimating. The response tells you whether the country came from TikTok or from that estimate. You also get stable id + secUid, account createTime / createTimeUnix, ttSeller + isOrganization (boolean), interface language, and core profile stats — followers, following, total likes, and videos (integer count) — plus display name, verified and private flags, and the avatar. Stats on this surface may be TTL-stale; use channel-details when you need a fresh identity card. Upstream TikTok blobs are not returned by default — pass raw=true only when you need the opt-in escape hatch. Flat 2 credits per live call. Pass cache=true for the 7d shared cache (0 credits on hit), or cacheMaxAge=1d|3d|7d|14d|30d; default is always fresh.\n\nDocs: https://captapi.com/apis/tiktok-profile-region","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"raw","in":"query","required":false,"description":"Set true to include TikTok's upstream user/statsV2 blob under raw. Default false — curated fields only.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 7d response cache (0 credits on hit). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Find out where a TikTok creator is likely based and what language they use — country, language, stable ids, and core profile stats.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"createTime":{"type":"string","description":"When the account was created (ISO 8601)."},"createTimeUnix":{"type":"integer","description":"Create time unix. Example: 1470866554."},"ttSeller":{"type":"boolean","description":"Has a TikTok Shop storefront (user.ttSeller). Act on this for /tiktok-shop/* joins. Not the same as isCommerceUser."},"isOrganization":{"type":"integer","description":"Whether TikTok marks the account as an organization (boolean — never 0/1)."},"region":{"type":"string","description":"Creator's country as an ISO code (e.g. IT, US). Same profile-page field channel-details copies when TikTok exposes it (rare). Here a missing value is filled by AI inference (regionSource=inferred) or, if the page has neither region nor language, a caption-language sample from recent videos. Check regionSource / regionConfidence. Distinct from video-details.locationCreated (video locale)."},"language":{"type":"string","description":"Detected or requested language code."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"likes":{"type":"integer","description":"Total likes across the creator's videos (TikTok heartCount)."},"videos":{"type":"integer","description":"Total public video count on the profile (integer). Not a typed media asset list."},"verified":{"type":"boolean","description":"Whether TikTok shows a verified badge on this profile."},"private":{"type":"boolean","description":"Whether the account is private."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"raw":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","description":"Stable platform ID for the item."},"shortId":{"type":"string"},"uniqueId":{"type":"string"},"nickname":{"type":"string"},"avatarLarger":{"type":"string"},"avatarMedium":{"type":"string"},"avatarThumb":{"type":"string"},"signature":{"type":"string"},"createTime":{"type":"integer","description":"When the account was created (ISO 8601)."},"verified":{"type":"boolean","description":"Whether TikTok shows a verified badge on this profile."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"ftc":{"type":"boolean"},"relation":{"type":"integer"},"openFavorite":{"type":"boolean"},"commentSetting":{"type":"integer"},"commerceUserInfo":{"type":"object","properties":{"commerceUser":{"type":"boolean"}}},"duetSetting":{"type":"integer"},"stitchSetting":{"type":"integer"},"privateAccount":{"type":"boolean"},"secret":{"type":"boolean"},"isADVirtual":{"type":"boolean"},"roomId":{"type":"string"},"uniqueIdModifyTime":{"type":"integer"},"ttSeller":{"type":"boolean","description":"Has a TikTok Shop storefront (user.ttSeller). Act on this for /tiktok-shop/* joins. Not the same as isCommerceUser."},"downloadSetting":{"type":"integer"},"profileTab":{"type":"object","properties":{"showMusicTab":{"type":"boolean"},"showQuestionTab":{"type":"boolean"},"showPlayListTab":{"type":"boolean"}}},"followingVisibility":{"type":"integer"},"recommendReason":{"type":"string"},"nowInvitationCardUrl":{"type":"string"},"nickNameModifyTime":{"type":"integer"},"isEmbedBanned":{"type":"boolean"},"canExpPlaylist":{"type":"boolean"},"profileEmbedPermission":{"type":"integer"},"language":{"type":"string","description":"Detected or requested language code."},"eventList":{"type":"array","items":{}},"suggestAccountBind":{"type":"boolean"},"isOrganization":{"type":"integer","description":"Whether TikTok marks the account as an organization (boolean — never 0/1)."},"UserStoryStatus":{"type":"integer"},"shortDramaCreator":{"type":"object","properties":{}}}},"statsV2":{"type":"object","properties":{"followerCount":{"type":"integer"},"followingCount":{"type":"integer"},"heart":{"type":"integer"},"heartCount":{"type":"integer"},"videoCount":{"type":"integer"},"diggCount":{"type":"integer"},"friendCount":{"type":"integer"}}}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."},"regionConfidence":{"type":"string","description":"For an inferred region, confidence of the guess: \"high\", \"medium\", or \"low\". Null when the region came from TikTok."},"regionSource":{"type":"string","description":"Where region came from: \"tiktok\" (authoritative, reported by TikTok) or \"inferred\" (best-effort estimate from public signals)."}}}}},"example":{"success":true,"data":{"platform":"tiktok","username":"khaby.lame","displayName":"Khabane lame","url":"https://www.tiktok.com/@khaby.lame","id":"127905465618821121","secUid":"MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA","createTime":"2016-08-10T22:02:34.000Z","createTimeUnix":1470866554,"ttSeller":false,"isOrganization":0,"region":"IT","language":"en","followers":162355782,"following":81,"likes":2642875898,"videos":1343,"verified":true,"private":false,"profileImage":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=bf39da46&x-expires=1784628000&x-signature=%2BIQ2jcCwEJiHbixnVnOi2G2qh5E%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","raw":{"user":{"id":"127905465618821121","shortId":"","uniqueId":"khaby.lame","nickname":"Khabane lame","avatarLarger":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=bf39da46&x-expires=1784628000&x-signature=%2BIQ2jcCwEJiHbixnVnOi2G2qh5E%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","avatarMedium":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:720:720.jpeg?dr=9640&refresh_token=0ed06557&x-expires=1784628000&x-signature=WrS0%2Bg%2FT%2BKycLjzRdl%2Fzdc5i5H0%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","avatarThumb":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?dr=9640&refresh_token=913c08ee&x-expires=1784628000&x-signature=nJ6FpgyLtkWHGaHctQAjTQiqRfE%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","signature":"Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎","createTime":1470866554,"verified":true,"secUid":"MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA","ftc":false,"relation":0,"openFavorite":false,"commentSetting":0,"commerceUserInfo":{"commerceUser":false},"duetSetting":0,"stitchSetting":0,"privateAccount":false,"secret":false,"isADVirtual":false,"roomId":"","uniqueIdModifyTime":0,"ttSeller":false,"downloadSetting":0,"profileTab":{"showMusicTab":false,"showQuestionTab":false,"showPlayListTab":false},"followingVisibility":1,"recommendReason":"","nowInvitationCardUrl":"","nickNameModifyTime":0,"isEmbedBanned":false,"canExpPlaylist":true,"profileEmbedPermission":1,"language":"en","eventList":[],"suggestAccountBind":false,"isOrganization":0,"UserStoryStatus":0,"shortDramaCreator":{}},"statsV2":{"followerCount":162355782,"followingCount":81,"heart":2642875898,"heartCount":2642875898,"videoCount":1343,"diggCount":0,"friendCount":77}},"regionConfidence":"high","regionSource":"inferred"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/audience-demographics":{"get":{"operationId":"tiktok_audience_demographics","tags":["TikTok"],"summary":"TikTok Audience Demographics API","description":"Audience country + language mix for a TikTok creator — engagement sample, not a follower census.\n\nGive a profile URL, @handle, or username and get a ranked audience-country breakdown as clean JSON. TikTok does not publish follower geography — we sample people engaging with recent videos. The two signals come from two populations, disclosed in the response: audienceLanguages[] are tallied from top-level commenters (basis.language=\"commenters\"), while audienceLocations[] come from repliers under the most-replied parent comments (basis.region=\"repliers\") — the only public surface that reliably exposes user.region. Each country row carries country name, countryCode, count, and numeric percentage (+ percentageText). Response includes sampleSize, totalCountries, regionSampleParents + regionSampleVideos (how many distinct parent threads / videos the region sample is spread over), and a clustering-aware confidence: the size-based label (low <400, medium 400–999, high ≥1000) is CAPPED when the region sample is concentrated in few threads (<8 parents or <4 videos → low; <20 parents or <8 videos → at most medium), because 400 repliers from 6 threads are not 400 independent observations. Optional other{} only when countriesLimit truncates. timings{path,postsVia,postsMs,postsDeadlineMs,commentsMs,commentsVia,totalMs,videoConcurrency,commentsAttempts,commentsErrors,commentsAttemptsPerVideo} — postsVia names the leg that served the video list (native|extended), commentsVia the comments surface (web+replies), commentsErrors counts blocked comment requests absorbed before clean pages, and commentsAttemptsPerVideo is the per-video attempts distribution (sorted desc). If the posts leg hits its deadline on a real profile you get a degraded 200 (degraded:true, degradedReason:\"posts-timeout\", 0 credits) — 404 NOT_FOUND is reserved for profiles positively confirmed absent, never for a slow fetch. Choose videos=12|30|60 (credits 3/5/8) for sample depth. Percentages across audienceLocations (+ other) sum to ~100%. This reflects who engages, not a full follower census.\n\nDocs: https://captapi.com/apis/tiktok-audience-demographics","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"videos","in":"query","required":false,"description":"How many recent videos to sample comments from: 12 (default, 3 credits), 30 (5 credits), or 60 (8 credits).","schema":{"type":"integer","default":12}},{"name":"countriesLimit","in":"query","required":false,"description":"Max countries in audienceLocations; remainder folds into other{count,percentage}. Omit for the full list (other is omitted when unused).","schema":{"type":"integer","maximum":100,"minimum":1}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":3,"label":"3 credits","billedOnCacheHit":false},"x-one-liner":"Audience country + language mix for a TikTok creator — engagement sample, not a follower census.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"username":{"type":"string","description":"Account username / handle."},"url":{"type":"string","description":"Canonical URL of the item."},"videosSampled":{"type":"integer","description":"How many of the creator's recent videos were sampled to build the breakdown."},"sampleSize":{"type":"integer","description":"Total number of commenter countries counted across the sampled videos."},"audienceLocations":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"countryCode":{"type":"string","description":"ISO-3166 alpha-2 country code (e.g. US, MX)."},"count":{"type":"integer","description":"Number of items in this bucket (e.g. commenters from this country in the sample)."},"percentage":{"type":"number","description":"Numeric share of the sample (e.g. 26.02). Never a string — use percentageText for display. Values across audienceLocations (+ other) sum to ~100."},"percentageText":{"type":"string","description":"Display form of percentage with a % suffix (e.g. \"26.02%\"). Prefer percentage for math."}}}},"basis":{"type":"object","properties":{"language":{"type":"string","description":"Detected or requested language code."},"region":{"type":"string","description":"Region or country code for this result (meaning depends on the endpoint — market vs creator home)."}}},"videosRequested":{"type":"integer","description":"videos query parameter used for this call (12, 30, or 60)."},"totalCountries":{"type":"integer","description":"How many distinct countries appeared in the commenter sample (before countriesLimit truncation)."},"confidence":{"type":"string","description":"Sample-strength from sampleSize (\"low\" <400, \"medium\" 400–999, \"high\" ≥1000), capped for clustering: regionSampleParents <8 or regionSampleVideos <4 forces low; <20 parents or <8 videos caps at medium."},"other":{"type":"object","properties":{"count":{"type":"integer","description":"Number of items in this bucket (e.g. commenters from this country in the sample)."},"percentage":{"type":"number","description":"Numeric share of the sample (e.g. 26.02). Never a string — use percentageText for display. Values across audienceLocations (+ other) sum to ~100."},"percentageText":{"type":"string","description":"Display form of percentage with a % suffix (e.g. \"26.02%\"). Prefer percentage for math."}}},"audienceLanguages":{"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Detected or requested language code."},"count":{"type":"integer","description":"Number of items in this bucket (e.g. commenters from this country in the sample)."},"percentage":{"type":"number","description":"Numeric share of the sample (e.g. 26.02). Never a string — use percentageText for display. Values across audienceLocations (+ other) sum to ~100."},"percentageText":{"type":"string","description":"Display form of percentage with a % suffix (e.g. \"26.02%\"). Prefer percentage for math."}}}},"languageSampleSize":{"type":"integer","description":"How many comments contributed a language code to audienceLanguages."},"regionSampleParents":{"type":"integer","description":"Distinct parent comment threads the region sample is spread over. Low values mean repliers clustered in few conversations — confidence is capped accordingly."},"regionSampleVideos":{"type":"integer","description":"Distinct videos that contributed at least one replier to the region sample."}}}}},"example":{"success":true,"data":{"platform":"tiktok","username":"khaby.lame","url":"https://www.tiktok.com/@khaby.lame","videosSampled":12,"sampleSize":269,"audienceLocations":[{"country":"Pakistan","countryCode":"PK","count":70,"percentage":26.02,"percentageText":"26.02%"},{"country":"United States","countryCode":"US","count":33,"percentage":12.27,"percentageText":"12.27%"}],"basis":{"language":"commenters","region":"repliers"},"videosRequested":12,"totalCountries":23,"confidence":"low","other":{"count":129,"percentage":47.96,"percentageText":"47.96%"},"audienceLanguages":[{"language":"en","count":142,"percentage":52.79,"percentageText":"52.79%"},{"language":"ur","count":61,"percentage":22.68,"percentageText":"22.68%"}],"languageSampleSize":269,"regionSampleParents":41,"regionSampleVideos":11}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/search-suggestions":{"get":{"operationId":"tiktok_search_suggestions","tags":["TikTok"],"summary":"TikTok Search Suggestions API","description":"Get the autocomplete terms TikTok suggests in its search bar for a keyword — the real phrases people search, ranked, so you can find trending queries and long-tail keyword ideas.\n\nGive the TikTok Search Suggestions API a seed keyword and it returns the autocomplete phrases TikTok shows in its search bar as clean JSON — the actual phrases people search for. Each suggestion row carries only what varies — the search term, its rank (1 = top of the list), and a ready-to-open search URL. The envelope echoes the market you requested once: query, country (named to match the country parameter), and language. Use the country and language parameters to see what a specific market is searching (for example US in English, or DE in German). Great for TikTok keyword research, trending queries, and content planning. No TikTok login required. Flat 2 credits per call, no matter how many suggestions return. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/tiktok-search-suggestions","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Seed keyword to expand into autocomplete suggestions, e.g. skincare.","schema":{"type":"string","minLength":1}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code that localizes the suggestions to a market, e.g. US, GB, DE. Default US.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"language","in":"query","required":false,"description":"Interface language for the suggestions, e.g. en-US or de-DE. Default en-US.","schema":{"type":"string","default":"en-US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Get the autocomplete terms TikTok suggests in its search bar for a keyword — the real phrases people search, ranked, so you can find trending queries and long-tail keyword ideas.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"query":{"type":"string","description":"The seed keyword the suggestions expand (envelope-level; rows carry only suggestion/rank/searchUrl)."},"country":{"type":"string","description":"Envelope echo of the country query param (e.g. US) — the market suggestions were localized for. Named country to match the request; not a creator's home country (this endpoint has no regionSource)."},"language":{"type":"string","description":"Envelope echo of the language query param (e.g. en-US) — the interface language used to localize suggestions."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"suggestions":{"type":"array","items":{"type":"object","properties":{"suggestion":{"type":"string","description":"A search term TikTok autocompletes for your keyword — a phrase real users search for."},"rank":{"type":"integer","description":"Rank position in the list."},"searchUrl":{"type":"string","description":"Direct TikTok search URL for this suggestion — open it to see the matching results."}}}}}}}},"example":{"success":true,"data":{"platform":"tiktok","query":"makeup","country":"US","language":"en-US","totalReturned":2,"suggestions":[{"suggestion":"makeup tutorial","rank":1,"searchUrl":"https://www.tiktok.com/search?q=makeup+tutorial"},{"suggestion":"makeup brush set","rank":2,"searchUrl":"https://www.tiktok.com/search?q=makeup+brush+set"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/channel-posts":{"get":{"operationId":"tiktok_channel_posts","tags":["TikTok"],"summary":"TikTok Channel Posts API","description":"Latest videos from a TikTok profile.\n\nSend a profile URL, @handle, or username and the TikTok Channel Posts API returns that creator's most recent videos as clean, structured JSON. When TikTok blocks the live post list, a successful call may be a snapshot up to 6 hours old — not a silent cache. Those responses set degraded=true, degradedReason=extended-timeout-served-stale, and staleAgeMs / staleTtlMs (21600000) / staleFinishedAt so you can see how old the snapshot is before you treat the numbers as current. A live miss with no in-window snapshot is 502 UPSTREAM_UNAVAILABLE (0 credits) with timings{path,nativeMs,…}. views / likes / comments / shares / saves each carry *IsApproximate from the same display-rounding ladder as top-search (rounded → true, exact → false). Each post includes the TikTok page URL and video ID, caption, publish date, duration, thumbnail, playable videoUrl plus downloadUrl / downloadUrlNoWatermark when TikTok exposes them (CDN-signed — check mediaUrlsExpireAt before archiving), hashtags, sound/music, isAd / isPaidPartnership / shopProductUrl when present, and the author's profile (id, secUid, username, display name, followers, verified badge, avatar). Fetch up to 200 posts per call with the limit parameter. hasMore / nextCursor are only set when a leftover row is already in hand. A cursor TikTok rejects comes back as 400 INVALID_CURSOR. Native serves are a flat 2 credits; when the extended pool serves the page (including a labelled stale snapshot), billing scales with returned posts — 1 credit per 20 posts, minimum 2 (200 posts = 10 credits). Failures stay 0 credits.\n\nDocs: https://captapi.com/apis/tiktok-channel-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"How many of the creator's latest videos to return on this page (default 20, max 200). Newest first. Native serves cost a flat 2 credits; extended serves scale with returned posts — 1 credit per 20, minimum 2 (200 posts = 10 credits).","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (TikTok's max_cursor timestamp, e.g. 1783614676000). A null nextCursor means the end of the list.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Latest videos from a TikTok profile.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this posts item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"mediaType":{"type":"string","description":"Media type label for this item (platform-specific enum)."},"contentType":{"type":"string","description":"Content type. Example: \"photo\"."},"width":{"type":"integer","description":"Width in pixels."},"height":{"type":"integer","description":"Height in pixels."},"hasWatermark":{"type":"boolean","description":"Has watermark. Example: false."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this posts item."},"secUid":{"type":"string"},"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer"},"verified":{"type":"boolean"},"profileImage":{"type":"string"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"shares":{"type":"integer"},"saves":{"type":"integer"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"secUid":{"type":"string"},"start":{"type":"integer"},"end":{"type":"integer"}}},"description":"Accounts mentioned in the text."},"musicName":{"type":"string","description":"Name of the soundtrack used."},"musicId":{"type":"string","description":"ID of the soundtrack used."},"musicAuthor":{"type":"string","description":"Music author. Example: \"National Geographic\"."},"locationCreated":{"type":"string","description":"ISO country where the TikTok video was posted/served (item locationCreated). Not the creator's home country — use authorRegion or /tiktok/profile-region for that."},"descLanguage":{"type":"string","description":"Language code TikTok assigns to the video caption when exposed."},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."},"isPaidPartnership":{"type":"boolean","description":"Is paid partnership. Example: false."}}}},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."}}}}},"example":{"success":true,"data":{"url":"https://www.tiktok.com/@natgeo","totalReturned":2,"posts":[{"platform":"tiktok","url":"https://www.tiktok.com/@natgeo/photo/7671655634479156494","id":"7671655634479156494","caption":"There's more to the mad hatterpillar than funky headwear. By wearing the stacked remains of its old head capsules, it confuses predators, giving it more time to escape. 🎩  #Underdogs is streaming on @Disney+ and @hulu.","publishedAt":"2026-08-08T13:42:53.000Z","durationSeconds":31.659,"thumbnailUrl":"https://p16-common-sign.tiktokcdn.com/tos-useast5-p-0068-tx/owCc3tEwJKAiUi5MBsI8wOfCAkBcBBAI9Al1c3~tplv-tiktokx-cropcenter-q:300:400:q70.webp?dr=14782&refresh_token=9b419d9e&x-expires=1786348800&x-signature=AtHD%2FQzBnExrYlaiQ9ATmAC2JSY%3D&t=bacd0480&ps=933b5bde&shp=d05b14bd&shcp=132edbea&idc=my&biz_tag=tt_video&s=PUBLISH&sc=cover","mediaType":"photo","contentType":"photo","width":1080,"height":1920,"hasWatermark":false,"author":{"id":"6780344874811442181","secUid":"MS4wLjABAAAAEf96k3JW8-3eOhgzgQswlFF6ZDnn1dzqWWorJjwDsiNZymqTtvOcFhp_RiYYST6s","username":"natgeo","displayName":"National Geographic","url":"https://www.tiktok.com/@natgeo","followers":9590843,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/324924e171e481040a1ea202962f6e07~tplv-tiktokx-cropcenter-q:1080:1080:q70.webp?dr=10796&refresh_token=ee0a2fa4&x-expires=1786348800&x-signature=GjL1qODTN0sutAGopvXV5kCBjhw%3D&t=223449c4&ps=87d6e48a&shp=d05b14bd&shcp=132edbea&idc=my&sc=avatar&s=PUBLISH"},"engagement":{"views":29128,"likes":2305,"comments":35,"shares":251,"saves":155},"hashtags":["underdogs"],"mentions":[{"userId":"6844178288162063365","secUid":"MS4wLjABAAAAqUNM3kSR5Ftp2-qS8tMXPcOX8sQIrztPZ6xbXF19zZMi805WqA158zLCL15WnGHL","start":200,"end":208},{"userId":"6647632235926503429","secUid":"MS4wLjABAAAAM4MY_0Mngt5neJyXf3HiDcYRyCBv_dMx1DU4OpbQNbNThk2QRZLWPKgSidSUqAd8","start":213,"end":218}],"musicName":"original sound - natgeo","musicId":"7671655849333099278","musicAuthor":"National Geographic","locationCreated":"GB","descLanguage":"en","isAd":false,"isPaidPartnership":false},{"platform":"tiktok","url":"https://www.tiktok.com/@natgeo/photo/7671355385575410958","id":"7671355385575410958","caption":"More than two centuries after excavations began, archaeologists are still uncovering parts of Pompeii. Archaeologists still use methods from the past, but new technology is helping them explore the ancient city while protecting the site.  #PompeiiOutOfTime with Tom Hiddleston is now streaming on @Disney+ and @hulu","publishedAt":"2026-08-07T18:17:23.000Z","durationSeconds":39.574,"thumbnailUrl":"https://p16-common-sign.tiktokcdn.com/tos-useast5-p-0068-tx/o0bRJ4IxLAOGYe8AUCsgALFICO2vBffepFHtHO~tplv-tiktokx-cropcenter-q:300:400:q70.webp?dr=14782&refresh_token=26b45f7e&x-expires=1786348800&x-signature=NCt%2BCGLGMrck73N5qPCDj%2BTryAA%3D&t=bacd0480&ps=933b5bde&shp=d05b14bd&shcp=132edbea&idc=my&sc=cover&biz_tag=tt_video&s=PUBLISH","mediaType":"photo","contentType":"photo","width":1080,"height":1920,"hasWatermark":false,"author":{"id":"6780344874811442181","secUid":"MS4wLjABAAAAEf96k3JW8-3eOhgzgQswlFF6ZDnn1dzqWWorJjwDsiNZymqTtvOcFhp_RiYYST6s","username":"natgeo","displayName":"National Geographic","url":"https://www.tiktok.com/@natgeo","followers":9590843,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/324924e171e481040a1ea202962f6e07~tplv-tiktokx-cropcenter-q:1080:1080:q70.webp?dr=10796&refresh_token=ee0a2fa4&x-expires=1786348800&x-signature=GjL1qODTN0sutAGopvXV5kCBjhw%3D&t=223449c4&ps=87d6e48a&shp=d05b14bd&shcp=132edbea&idc=my&sc=avatar&s=PUBLISH"},"engagement":{"views":9116,"likes":548,"comments":6,"shares":9,"saves":18},"hashtags":["pompeiioutoftime"],"mentions":[{"userId":"6844178288162063365","secUid":"MS4wLjABAAAAqUNM3kSR5Ftp2-qS8tMXPcOX8sQIrztPZ6xbXF19zZMi805WqA158zLCL15WnGHL","start":297,"end":305},{"userId":"6647632235926503429","secUid":"MS4wLjABAAAAM4MY_0Mngt5neJyXf3HiDcYRyCBv_dMx1DU4OpbQNbNThk2QRZLWPKgSidSUqAd8","start":310,"end":315}],"musicName":"original sound - natgeo","musicId":"7671355506610473742","musicAuthor":"National Geographic","locationCreated":"ZA","descLanguage":"en","isAd":false,"isPaidPartnership":false}],"nextCursor":"1786115938373","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/comment-replies":{"get":{"operationId":"tiktok_comment_replies","tags":["TikTok"],"summary":"TikTok Comment Replies API","description":"Replies under a TikTok comment — same authorId/authorSecUid/commentLanguage shape as comments.\n\nPass a TikTok video URL and a parent comment id and get that comment's replies as clean JSON. Each reply includes text, author username, stable authorId/authorSecUid when TikTok exposes them, commentLanguage, like count, and publish time. Fetch up to 500 replies per call, then pass nextCursor to page through the rest — a flat 2 credits per call.\n\nDocs: https://captapi.com/apis/tiktok-comment-replies","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public TikTok video URL, e.g. https://www.tiktok.com/@khaby.lame/video/7646812028874673439. Not a YouTube/Instagram/Facebook URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"commentId","in":"query","required":true,"description":"ID of the parent (top-level) comment to fetch replies for — from the comments endpoint. Legacy alias: comment_id.","schema":{"type":"string"}},{"name":"comment_id","in":"query","required":false,"deprecated":true,"description":"Deprecated alias of commentId.","schema":{"deprecated":true,"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value from the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Replies under a TikTok comment — same authorId/authorSecUid/commentLanguage shape as comments.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"commentId":{"type":"string","description":"Comment id. Example: \"7652622392003003157\"."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"totalReplies":{"type":"integer","description":"Total replies. Example: 22."},"replies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this replies item."},"text":{"type":"string","description":"Text content."},"author":{"type":"string","description":"Author name or handle."},"authorId":{"type":"string","description":"Author id. Example: \"7442964363847697409\"."},"authorSecUid":{"type":"string","description":"Primary artist / sound-owner secUid when TikTok exposes one."},"authorName":{"type":"string","description":"Name of the author."},"commentLanguage":{"type":"string","description":"Comment language. Example: \"id\"."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."}}}},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/@khaby.lame/video/7646812028874673439","commentId":"7652622392003003157","totalReturned":2,"totalReplies":22,"replies":[{"id":"7652704280361403157","text":"tinggal seribu lagi jadi 5jt😹","author":"evan.gunawan2037","authorId":"7442964363847697409","authorSecUid":"MS4wLjABAAAA7ax_OCYs6_dYN6ecF_wfwrsx5MWfm6ZXPq1uBd7JxHRyQV11bE_95NMCWoPh6ryo","authorName":"MAJIN_EVAN⚡","commentLanguage":"id","likeCount":27,"publishedAt":"2026-06-18T12:01:20.000Z","verified":false,"profileImage":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-avt-0068/6ea4cabf09938d71804dd2b430afbdcb~tplv-tiktokx-cropcenter-q:100:100:q70.webp?dr=9606&idc=useast2b&ps=87d6e48a&refresh_token=ac6fedfc&s=COMMENT_LIST&sc=avatar&shcp=ff37627b&shp=30310797&t=223449c4&x-expires=1785927600&x-signature=Zxy%2BmvMJIGVUUYEmnl00HSp3DAw%3D"},{"id":"7653041079252517640","text":"jir Luh gimana pelenger itu nya kalau 1 rb?","author":"oficial_tod","authorId":"7234539502412661762","authorSecUid":"MS4wLjABAAAA_P7z2-T5tb6-7diIytCkwubkz9X3aTjEJRTL3dyqKF4us7kTCfD4xLC-T0U5Y1_i","authorName":"it's me Gung","commentLanguage":"id","likeCount":36,"publishedAt":"2026-06-19T09:48:12.000Z","verified":false,"profileImage":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-avt-0068/34e550efa4bd9aec97d7de21011f1d5d~tplv-tiktokx-cropcenter-q:100:100:q70.webp?dr=9606&idc=useast2b&ps=87d6e48a&refresh_token=2a2de674&s=COMMENT_LIST&sc=avatar&shcp=ff37627b&shp=30310797&t=223449c4&x-expires=1785927600&x-signature=bQkU37mEQOdeUjb3fGbHZXwRf8g%3D"}],"nextCursor":"2","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/user-followers":{"get":{"operationId":"tiktok_user_followers","tags":["TikTok"],"summary":"TikTok User Followers API","description":"List a TikTok user's followers — id, secUid, createTime, region, language, cursor pagination.\n\nPass a TikTok profile URL or @handle and get followers as clean JSON: id + secUid (stable identity — same fields search-users documents), username, displayName, bio, url, followers, following, verified, profileImage, plus createTime/createTimeUnix — and region / language only when TikTok exposes them on the row (keys are omitted, not nulled, when it does not). total is the profile's exact followerCount from statsV2 (universe size) with totalIsApproximate beside it; totalReturned is this page. Cursor pagination via nextCursor + hasMore (TikTok minCursor). Flat 1 credit per call on every path.\n\nDocs: https://captapi.com/apis/tiktok-user-followers","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 1 credit per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor (TikTok minCursor). Leave empty for the first page; then pass nextCursor from the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"List a TikTok user's followers — id, secUid, createTime, region, language, cursor pagination.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"total":{"type":"integer","description":"The profile's exact followerCount from statsV2 (universe size). totalIsApproximate is true only when TikTok exposed nothing but a display-rounded value."},"totalIsApproximate":{"type":"boolean","description":"True when total is a display-rounded figure rather than an exact statsV2 counter."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"followers":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":["string","null"],"description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"id":{"type":"string","description":"Id of this followers item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"createTime":{"type":"string","description":"When the account was created (ISO 8601)."},"createTimeUnix":{"type":"integer","description":"Create time unix. Example: 1649497070."},"language":{"type":"string","description":"Detected or requested language code."}}},"description":"Follower count."}}}}},"example":{"success":true,"data":{"url":"https://www.tiktok.com/@khaby.lame","total":162476412,"totalIsApproximate":false,"totalReturned":2,"hasMore":true,"nextCursor":"1785219170000","followers":[{"username":"abdullah007a3","displayName":"𝄢 ⃝ᶦᵗᶻ•abdullah 亗","bio":"/ মানুষকে বোঝা কঠিন -\nআর বোঝানো তো অসম্ভব..!🖤","url":"https://www.tiktok.com/@abdullah007a3","followers":17500,"following":6,"verified":false,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-alisg-avt-0068/ff95fdfeca275eed2d2984d618a10530~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=d7015725&x-expires=1785405600&x-signature=Zs92egTgumV89yLzYImuFHbHTrI%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2","id":"7084524072541307910","secUid":"MS4wLjABAAAAU2DhFzvcREPkAwTEDm5wYxPFCSf7l7g0GSQHY3rFZCBY1IlFORcpPL4TMDaxjNUq","createTime":"2022-04-09T09:37:50.000Z","createTimeUnix":1649497070,"language":"en"},{"username":"hawulet97","displayName":"ሀያት","bio":null,"url":"https://www.tiktok.com/@hawulet97","followers":41,"following":1239,"verified":false,"profileImage":"https://p19-common-sign.tiktokcdn.com/tos-alisg-avt-0068/5acdd487480e04ffe37f451a62fa134d~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=9e5f5d27&x-expires=1785405600&x-signature=r06fBPyezVcEOXYXR%2Fn5PrC0kQc%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2","id":"7636369819877950485","secUid":"MS4wLjABAAAA-iwqiDRUYsYB6EPWLtkKC7LnR81u_bnHPwV2hjD_6vvHCV5WRlc5imKT_JYNVLCl","createTime":"2026-05-05T11:35:24.000Z","createTimeUnix":1777980924,"language":"en"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/user-followings":{"get":{"operationId":"tiktok_user_followings","tags":["TikTok"],"summary":"TikTok User Followings API","description":"List who a TikTok user follows — id, secUid, createTime, region, language, cursor pagination.\n\nPass a TikTok profile URL or @handle and get followings as clean JSON: id + secUid, username, displayName, bio, url, followers, following, verified, profileImage, plus createTime/createTimeUnix — and region / language only when TikTok exposes them on the row (keys are omitted, not nulled, when it does not). total is the profile's exact followingCount from statsV2 with totalIsApproximate beside it; cursor pagination via nextCursor + hasMore. Flat 1 credit per call on every path.\n\nDocs: https://captapi.com/apis/tiktok-user-followings","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 1 credit per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor (TikTok minCursor). Leave empty for the first page; then pass nextCursor from the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"List who a TikTok user follows — id, secUid, createTime, region, language, cursor pagination.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"total":{"type":"integer","description":"The profile's exact followingCount from statsV2 (universe size). totalIsApproximate is true only when TikTok exposed nothing but a display-rounded value."},"totalIsApproximate":{"type":"boolean","description":"True when total is a display-rounded figure rather than an exact statsV2 counter."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"followings":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"id":{"type":"string","description":"Id of this followings item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"createTime":{"type":"string","description":"When the account was created (ISO 8601)."},"createTimeUnix":{"type":"integer","description":"Create time unix. Example: 1681336933."},"language":{"type":"string","description":"Detected or requested language code."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.tiktok.com/@khaby.lame","total":81,"totalIsApproximate":false,"totalReturned":2,"hasMore":true,"nextCursor":"1661588126000","followings":[{"username":"user927647273","displayName":"user927647273","bio":"secret","url":"https://www.tiktok.com/@user927647273","followers":9282,"following":4,"verified":false,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/c70537d713e096c514e7e8e27be0cf39~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=616e8df2&x-expires=1785405600&x-signature=w%2BadFFsdbgxPDur8Y6yIeu5%2FYU8%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2","id":"7221286453480817706","secUid":"MS4wLjABAAAAg4rTr5twSx0cDvC90WsFq6Zk2HpEcyOVjWMV1rb37RyZkyjSMTpnHzCTsTU2UObL","createTime":"2023-04-12T22:02:13.000Z","createTimeUnix":1681336933,"language":"en"},{"username":"fifaworldcup","displayName":"FIFA World Cup","bio":"🏆 The official #FIFAWorldCup account on TikTok","url":"https://www.tiktok.com/@fifaworldcup","followers":86600000,"following":93,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-useast2a-avt-0068-euttp/d260685754e3ae8139f47e7ec9fda7e9~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=4d3bd79a&x-expires=1785405600&x-signature=UpkTTNy5CO1ckN0jnBQ1jrq4nRo%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my2","id":"7059636734342038534","secUid":"MS4wLjABAAAApf8MKCE246Q60LYymhpec5wPGF-uaGZgzl7W19U-AxtzHzeydNdE8xZedO_gUWDL","createTime":"2022-02-01T16:22:46.000Z","createTimeUnix":1643732566,"language":"en"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/music-posts":{"get":{"operationId":"tiktok_music_posts","tags":["TikTok"],"summary":"TikTok Music Posts API","description":"List TikTok videos that use a specific sound — caption, author, exact engagement, canonical hashtags, and mentions, with cursor pagination.\n\nPaste a TikTok music/sound URL and get the public videos that use that sound as structured JSON. Native and extended paths emit one row schema: permalink is always url (a watch URL never stays in videoUrl), author is the full eight-key card (nulls when unknown — never a four-key shell), and caption / publishedAt / thumbnailUrl / durationSeconds / mediaUrlsExpireAt / hasWatermark / locationCreated are always keyed. Unread engagement counters are null with *IsApproximate: null — never 0 flagged exact. hasMore is true only when nextCursor is present. A next-page miss is 502 UPSTREAM_UNAVAILABLE reason=page_miss (retryable, 0 credits) — not a bad sound URL. Deadline is 110s: timeout is 502 UPSTREAM_UNAVAILABLE at 0 credits (never a billed 200 after the connection has closed). An id-only /music/&lt;id&gt; URL still gets musicName from native music/detail when the fallback path omitted the title. Photomode covers are mediaType=photo with a /photo/ permalink; a positive duration infers video. Flat 2 credits per call.\n\nDocs: https://captapi.com/apis/tiktok-music-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok music/sound URL, e.g. https://tiktok.com/music/name-ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response. hasMore is true only when nextCursor is present.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"List TikTok videos that use a specific sound — caption, author, exact engagement, canonical hashtags, and mentions, with cursor pagination.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical watch permalink. Always this key — never videoUrl for a /@user/video/ id link."},"musicId":{"type":"string","description":"Envelope-level sound id (single-valued across the page — not repeated per row)."},"musicName":{"type":"string","description":"Envelope-level sound title (single-valued across the page — not repeated per row)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical watch permalink. Always this key — never videoUrl for a /@user/video/ id link."},"id":{"type":"string","description":"Id of this posts item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"mediaType":{"type":"string","description":"Media type label for this item (platform-specific enum)."},"width":{"type":"integer","description":"Width in pixels."},"height":{"type":"integer","description":"Height in pixels."},"videoUrl":{"type":"string","description":"Playable CDN URL when TikTok exposes one. A watch permalink is moved to url, not left here."},"downloadUrl":{"type":"string","description":"CDN media URL when present (not a dedicated download API)."},"downloadUrlNoWatermark":{"description":"Download url no watermark."},"hasWatermark":{"type":"boolean","description":"Has watermark. Example: true."},"mediaUrlsExpireAt":{"type":"string","description":"ISO-8601 UTC earliest expiry across signed media URLs in this response (expire= / x-expires / TikTok hex path timestamp). Null when no stamp is parseable — never a guess."},"author":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Id of this posts item."},"secUid":{"type":["string","null"]},"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical watch permalink. Always this key — never videoUrl for a /@user/video/ id link."},"followers":{},"verified":{"type":"boolean"},"profileImage":{"type":"string"},"region":{"type":"string"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"shares":{"type":"integer"},"saves":{"type":"integer"},"viewsIsApproximate":{"type":"boolean"},"likesIsApproximate":{"type":"boolean"},"commentsIsApproximate":{"type":"boolean"},"sharesIsApproximate":{"type":"boolean"},"savesIsApproximate":{"type":"boolean"},"downloads":{"type":"integer"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{},"description":"Accounts mentioned in the text."},"musicAuthor":{"type":"string","description":"Music author. Example: \"Khabane lame\"."},"locationCreated":{"type":"string","description":"ISO country where the TikTok video was posted/served (item locationCreated). Not the creator's home country — use authorRegion or /tiktok/profile-region for that."},"descLanguage":{"description":"Language code TikTok assigns to the video caption when exposed.","type":["string","null"]},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."},"isPaidPartnership":{"type":"boolean","description":"Is paid partnership. Example: false."}}}},"nextCursor":{"type":"string","description":"Pass back as cursor for the next page of videos using this sound. Null when the page cannot continue."},"hasMore":{"type":"boolean","description":"True only when nextCursor is present. Extended pages have no cursor, so hasMore is false — 69 rows is not a promise of a next page."},"source":{"description":"native | extended | cache."}}}}},"example":{"success":true,"data":{"url":"https://www.tiktok.com/music/original-sound-7646812079113898783","musicId":"7646812079113898783","musicName":"original sound - khaby.lame","totalReturned":2,"posts":[{"platform":"tiktok","url":"https://www.tiktok.com/@khaby.lame/video/7646812028874673439","id":"7646812028874673439","caption":"Thank you, please come again!!!🙋🏿‍♂️💸#learnfromkhaby #comedy","publishedAt":"2026-06-02T14:56:35.000Z","durationSeconds":29.534,"thumbnailUrl":"https://p16-common-sign.tiktokcdn.com/tos-useast8-p-0068-tx2/oUAHVIiQDac8uC75AEfyALAA1FrTAqEEQ3GRPe~tplv-tiktokx-cropcenter-q:300:400:q70.webp?dr=14782&refresh_token=dae473d0&x-expires=1785171600&x-signature=fF8KccMCj5i1KJP7krB7JRx2xG0%3D&t=bacd0480&ps=933b5bde&shp=d05b14bd&shcp=f6441914&idc=my2&biz_tag=tt_video&s=MUSIC_AWEME&sc=cover","mediaType":"video","width":576,"height":1024,"videoUrl":"https://v16-webapp-prime.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/osABAiDgQEbQItAyAFeBfiAXnEBQDEfKGQIgSE/?a=1988&expire=1785171600","downloadUrl":"https://v16-webapp-prime.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/osABAiDgQEbQItAyAFeBfiAXnEBQDEfKGQIgSE/?a=1988&expire=1785171600","downloadUrlNoWatermark":null,"hasWatermark":true,"mediaUrlsExpireAt":"2026-07-27T17:00:00.000Z","author":{"id":"127905465618821121","secUid":"MS4wLjABAAAAwAg0rOj4qHjHBN4BQLRlTaNI0dpqRuTrNi-TM0LKNpc","username":"khaby.lame","displayName":"Khabane lame","url":"https://www.tiktok.com/@khaby.lame","followers":null,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter-q:1080:1080:q70.webp?dr=10796&idc=my2&ps=87d6e48a&refresh_token=bc21b726&s=MUSIC_AWEME&sc=avatar&shcp=f6441914&shp=d05b14bd&t=223449c4&x-expires=1785171600&x-signature=D%2FanX%2BEAwPGclXui5sL48ejAGUk%3D","region":"IT"},"engagement":{"views":17042375,"likes":1550817,"comments":16306,"shares":16050,"saves":62013,"viewsIsApproximate":false,"likesIsApproximate":false,"commentsIsApproximate":false,"sharesIsApproximate":false,"savesIsApproximate":false,"downloads":7108},"hashtags":["learnfromkhaby","comedy"],"mentions":[],"musicAuthor":"Khabane lame","locationCreated":"IT","descLanguage":null,"isAd":false,"isPaidPartnership":false},{"platform":"tiktok","url":"https://www.tiktok.com/@babi_batox/video/7657210703262010631","id":"7657210703262010631","caption":"Obrigado, volte sempre; THank you, come again #aprender #khaby #comed #badi_xatox #humor","publishedAt":"2026-06-30T15:28:22.000Z","durationSeconds":16.467,"thumbnailUrl":"https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0037/oYw7iFBEEQ6IgRQz9Hf7QL2ARZkHqDcQBBfSBw~tplv-tiktokx-cropcenter-q:300:400:q70.webp?dr=14782&refresh_token=5cbaa5e5&x-expires=1785171600&x-signature=Zg1zQ4AppOFWvrVz6mtVoWf0Bbk%3D&t=bacd0480&ps=933b5bde&shp=d05b14bd&shcp=f6441914&idc=my2&biz_tag=tt_video&s=MUSIC_AWEME&sc=cover","mediaType":"video","width":576,"height":1024,"videoUrl":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-0037/o4ABCDfQEBgIiAfQnEAXyBQDtAyAeGQIgKE/?a=1988&expire=1785171600","downloadUrl":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-0037/o4ABCDfQEBgIiAfQnEAXyBQDtAyAeGQIgKE/?a=1988&expire=1785171600","downloadUrlNoWatermark":null,"hasWatermark":true,"mediaUrlsExpireAt":"2026-07-27T17:00:00.000Z","author":{"id":null,"secUid":null,"username":"babi_batox","displayName":"Loreno_Cavela","url":"https://www.tiktok.com/@babi_batox","followers":null,"verified":false,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-alisg-avt-0068/12b7a3027b147743a04d2dcd50302b61~tplv-tiktokx-cropcenter-q:1080:1080:q70.webp?dr=10796&idc=my2&ps=87d6e48a&refresh_token=06f16ad2&s=MUSIC_AWEME&sc=avatar&shcp=f6441914&shp=d05b14bd&t=223449c4&x-expires=1785171600&x-signature=QOi7%2FEEgi7Th2wcfyTFLX0QLv%2B4%3D","region":"BR"},"engagement":{"views":2334,"likes":127,"comments":2,"shares":0,"saves":6,"viewsIsApproximate":false,"likesIsApproximate":false,"commentsIsApproximate":false,"sharesIsApproximate":false,"savesIsApproximate":false},"hashtags":["aprender","khaby"],"mentions":[],"musicAuthor":"Khabane lame","locationCreated":"BR","descLanguage":"pt","isAd":false,"isPaidPartnership":false}],"nextCursor":"20","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/top-search":{"get":{"operationId":"tiktok_top_search","tags":["TikTok"],"summary":"TikTok Top Search API","description":"TikTok Top/General search — videos and photo carousels when TikTok includes them, with contentType + images[].\n\nHits TikTok's Top/General search tab (not video-only keyword search). Results can mix videos and photo carousels: each item has mediaType (video | photo); carousels additionally carry contentType: multi_photo + images[] (contentType is omitted when it would just repeat mediaType). Hashtags come from TikTok text_extra (canonical names — no caption-regex emoji bleed) and are lowercase-deduped; mentions[{userId,secUid,username}] when present. Engagement carries per-counter *IsApproximate flags — TikTok's web search display-rounds big counters (18.0M), so each of views/likes/comments/shares/saves is flagged from its own value instead of stamped; exact counters (typical for saves/comments) read false. Supports cursor pagination via nextCursor. TikTok may return duplicate ids across pages — we drop duplicates within a page. Availability ladder: a transient native blip is retried in-request; a longer outage serves the same query's 6h last-good page labelled stale + cached at 0 credits (fetchedAt = scrape time, servedAt = handover); a first-seen query during an outage falls back to the fallback path (degraded: true, video rows only, hasMore null). 502 UPSTREAM_UNAVAILABLE (retryable, 0 credits) only when every path missed. Flat 2 credits on live pages. Not yet: sort_by / publish_time / region filters (use other endpoints or ask).\n\nDocs: https://captapi.com/apis/tiktok-top-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query or keywords (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave 0 for the first page; then pass nextCursor from the previous response. TikTok may return duplicates across pages.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"TikTok Top/General search — videos and photo carousels when TikTok includes them, with contentType + images[].","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this results item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer"},"verified":{"type":"boolean"},"profileImage":{"type":"string"},"id":{"description":"Id of this results item."},"secUid":{}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"shares":{"type":"integer"},"saves":{"type":"integer"},"viewsIsApproximate":{"type":"boolean"},"likesIsApproximate":{"type":"boolean"},"commentsIsApproximate":{"type":"boolean"},"sharesIsApproximate":{"type":"boolean"},"savesIsApproximate":{"type":"boolean"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"musicName":{"type":"string","description":"Name of the soundtrack used."},"mediaType":{"type":"string","description":"Media type label for this item (platform-specific enum)."},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."},"mentions":{"type":"array","items":{},"description":"Accounts mentioned in the text."},"isPaidPartnership":{"type":"boolean","description":"Is paid partnership. Example: false."}}}},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"integer","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."}}}}},"example":{"success":true,"data":{"query":"nasa","totalReturned":2,"results":[{"platform":"tiktok","url":"https://www.tiktok.com/@latinus_us/video/7667344380310670599","id":"7667344380310670599","caption":"Video obtenido por la NASA muestra la verdadera forma de la Tierra según su gravedad. Para que las diferencias sean visibles, fueron exageradas 10 mil veces y se elaboró con información recopilada por 19 satélites durante 15 años. #Latinus #InformaciónParaTi","publishedAt":"2026-07-27T22:52:21.000Z","durationSeconds":47,"thumbnailUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/owknk3giAYK0AIIE0Bi1A4BBwVUmAgNJvfMB7x~tplv-tiktokx-origin.image?dr=9636&x-expires=1785517200&x-signature=bnHCVenSGV0TB7nhxBq8lfWKVe0%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","author":{"username":"latinus_us","displayName":"Latinus","url":"https://www.tiktok.com/@latinus_us","followers":22700000,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/9b1bc4bbfedb3bd917a27ff590234ca0~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=97b8bbe5&x-expires=1785517200&x-signature=1ZGx4llDfPF1ly3oJa0XsXinyoY%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5","id":null,"secUid":null},"engagement":{"views":8400000,"likes":810400,"comments":19000,"shares":145400,"saves":65900,"viewsIsApproximate":true,"likesIsApproximate":true,"commentsIsApproximate":true,"sharesIsApproximate":true,"savesIsApproximate":true},"hashtags":["latinus","informaciónparati"],"musicName":"original sound - Latinus","mediaType":"video","isAd":false,"mentions":[],"isPaidPartnership":false},{"platform":"tiktok","url":"https://www.tiktok.com/@missionartemisnasa/video/7628631080752450849","id":"7628631080752450849","caption":"ARTEMIS II Edit #nasa #artemis2 #fy #fyp #fyptt","publishedAt":"2026-04-14T15:04:52.000Z","durationSeconds":13,"thumbnailUrl":"https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/oAmD8QOCEOzBQ5FQpRIAuVlfpcnRBWE3eIDjrC~tplv-tiktokx-origin.image?dr=9636&x-expires=1785517200&x-signature=JK5MGls0OQFL2ENmqkVKSBo3ajU%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","author":{"username":"missionartemisnasa","displayName":"MissionArtemis","url":"https://www.tiktok.com/@missionartemisnasa","followers":69,"verified":false,"profileImage":"https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-avt-0068-euttp/fbdd74ed519afa76388646251f24ded1~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=6f41b39b&x-expires=1785517200&x-signature=vpJCW3%2B4khpTq%2FDSdGTddKAFRPk%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5","id":null,"secUid":null},"engagement":{"views":14800,"likes":375,"comments":9,"shares":11,"saves":150,"viewsIsApproximate":true,"likesIsApproximate":false,"commentsIsApproximate":false,"sharesIsApproximate":false,"savesIsApproximate":false},"hashtags":["nasa","artemis2"],"musicName":"sonido original","mediaType":"video","isAd":false,"mentions":[],"isPaidPartnership":false}],"hasMore":true,"nextCursor":20}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/search/hashtag":{"get":{"operationId":"tiktok_search_by_hashtag","tags":["TikTok"],"summary":"TikTok Search by Hashtag API","description":"Videos from TikTok's /tag/{name} challenge feed — not keyword or username search.\n\nPass a hashtag (with or without #) and get videos from TikTok's /tag/{name} challenge feed (signed fast path, with a slower fallback) as clean JSON — the same feed as the tag page in the app. This is not keyword search: an @comedy… account with no #comedy tag is dropped. A query with spaces (morocco travel sahara) is 400 — TikTok tags are a single token; use /v1/tiktok/search/top for keywords. A real tag with no videos is 404. Each result must carry the hashtag in structured tags or as #tag in the caption — because results are filtered after fetch, a page can return fewer than limit with hasMore true (keep paging). Fields: url, id, caption, publishedAt, durationSeconds, thumbnail, author (+ author.region when present), engagement with per-counter *IsApproximate flags (the challenge feed display-rounds big counters, so each counter is flagged from its own value), hashtags, musicName, plus locationCreated / shopProductUrl / isPaidPartnership / descLanguage when TikTok exposes them. The envelope names the hashtag once (hashtag) and includes timings{path,via,nativeMs,totalMs}. Cursor pagination via nextCursor + hasMore. The optional region query param only chooses which country the request is made from — it does not filter results by country. Billed per result — about 0.7 credits each.\n\nDocs: https://captapi.com/apis/tiktok-search-by-hashtag","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Single hashtag token for the /tag/{name} challenge feed, with or without # (min 2). Spaces are 400 — use /v1/tiktok/search/top for a keyword query.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Billed per result.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination offset. Leave at 0 (or omit) for the first page; then pass the nextCursor value returned in the previous response. A null nextCursor means the end of the results.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"region","in":"query","required":false,"description":"Two-letter ISO 3166-1 country our request is sent from. Default US. Does not filter results by country.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":14,"perResult":0.7,"label":"~14 credits (0.7/result)","billedOnCacheHit":false},"x-one-liner":"Videos from TikTok's /tag/{name} challenge feed — not keyword or username search.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"hashtag":{"type":"string","description":"Hashtag. Example: \"comedy\"."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"integer","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this results item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer"},"verified":{"type":"boolean"},"profileImage":{"type":"string"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"shares":{"type":"integer"},"saves":{"type":"integer"},"viewsIsApproximate":{"type":"boolean"},"likesIsApproximate":{"type":"boolean"},"commentsIsApproximate":{"type":"boolean"},"sharesIsApproximate":{"type":"boolean"},"savesIsApproximate":{"type":"boolean"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{},"description":"Hashtags extracted from the text."},"musicName":{"type":"string","description":"Name of the soundtrack used."}}}}}}}},"example":{"success":true,"data":{"hashtag":"comedy","totalReturned":2,"hasMore":true,"nextCursor":2,"results":[{"platform":"tiktok","url":"https://www.tiktok.com/@comedy7092/video/7608140015578746142","id":"7608140015578746142","publishedAt":"2026-02-18T09:50:20.000Z","durationSeconds":32,"thumbnailUrl":"https://p16-common-sign.tiktokcdn.com/tos-useast8-p-0068-tx2/oIviaAAABRimBWuVioEEIVaURRRniVLt1xZVY~tplv-tiktokx-origin.image?dr=14575&x-expires=1785405600&x-signature=OKU2GXpXqsBhsKCylTn59HMWbDk%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=my","author":{"username":"comedy7092","displayName":"Comedy","url":"https://www.tiktok.com/@comedy7092","followers":281600,"verified":false,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/f4091ee4a3e184d77536b3493fd444a7~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=64f29985&x-expires=1785405600&x-signature=jG8jorN693uq%2FHXEnFVyfDrBle0%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my"},"engagement":{"views":2200000,"likes":100800,"comments":792,"shares":26700,"saves":9426,"viewsIsApproximate":true,"likesIsApproximate":true,"commentsIsApproximate":false,"sharesIsApproximate":true,"savesIsApproximate":false},"hashtags":[],"musicName":"original sound"},{"platform":"tiktok","url":"https://www.tiktok.com/@comedy7092/video/7607028622318259487","id":"7607028622318259487","publishedAt":"2026-02-15T09:57:37.000Z","durationSeconds":43,"thumbnailUrl":"https://p16-common-sign.tiktokcdn.com/tos-useast8-p-0068-tx2/oUfpTTR6EmDkARPECmFhLE2JEEovIABfZMAVFA~tplv-tiktokx-origin.image?dr=14575&x-expires=1785405600&x-signature=zhrEEs8JX2GlL1em5RJmsg4bu%2F4%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=my","author":{"username":"comedy7092","displayName":"Comedy","url":"https://www.tiktok.com/@comedy7092","followers":281600,"verified":false,"profileImage":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/f4091ee4a3e184d77536b3493fd444a7~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=14579&refresh_token=64f29985&x-expires=1785405600&x-signature=jG8jorN693uq%2FHXEnFVyfDrBle0%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=my"},"engagement":{"views":4700000,"likes":156100,"comments":1140,"shares":4276,"saves":12400,"viewsIsApproximate":true,"likesIsApproximate":true,"commentsIsApproximate":false,"sharesIsApproximate":false,"savesIsApproximate":true},"hashtags":[],"musicName":"original sound"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/search/users":{"get":{"operationId":"tiktok_search_users","tags":["TikTok"],"summary":"TikTok Search Users API","description":"Search TikTok users — distinct creators only, id + secUid, per-counter isApproximate flags, cursor pagination.\n\nPass a search query and get matching creators as clean JSON: id + secUid (stable TikTok identity — secUid is what follower/video list calls need), username, displayName, bio, url, followers, following, videos, likes, verified, profileImage, and items[] sample videos when TikTok includes them. Rows are deduped by id — TikTok repeats users across search cards, so totalReturned can be below limit with hasMore false (the honest count, never padding). Every counter carries a per-row *IsApproximate flag (followersIsApproximate, likesIsApproximate, …) computed from the value itself — search display-rounds big totals on some paths. The four counters are always keyed on every row: when TikTok's card omits one (following on some video-derived rows) both the count and its flag are null — a null pair, never two silently missing keys. items[] views/likes carry the same viewsIsApproximate/likesIsApproximate flags (a sample video's 15000000 plays is 15M display-rounded, not an exact int). Cursor pagination via nextCursor + hasMore — the cursor is an opaque string that carries the search session, not just an offset, so pass it back verbatim; a creator ranking with several videos can repeat across a page boundary, so dedupe by id when stitching many pages. The native path is TikTok's signed web search (~1 s per page, single-digit seconds at any limit): the dedicated user-search API for the exact-match head where the exit allows it, topped up from distinct authors derived from general-search video rankings — timings.via says which served (signer / signer-mixed / signer-general). If the signer is unreachable the default answer is an empty degraded page (0 credits) — degradedReason names the failure: native-unavailable (page 1 can't be served at all) vs cursor-unsupported (a page-2+ request degraded after page 1 worked). Pass fallback=true to opt into the slower fallback path (~2 min, capped at 100 s, degraded-empty on timeout). Prefer id/secUid over @handle for CRM joins — handles change. Envelope includes timings{path,via,nativeMs,totalMs}. Flat 1 credit on every path.\n\nDocs: https://captapi.com/apis/tiktok-search-users","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query matched against usernames, display names and bios (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 1 credit per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Omit (or pass 0) for the first page; then pass the nextCursor value from the previous response verbatim — it carries the search session, not just an offset. A null nextCursor means the end of the results.","schema":{"type":"string","default":"0"}},{"name":"fallback","in":"query","required":false,"description":"Opt into the slower fallback path when native search is unavailable (~2 min, capped at 100 s, degraded-empty on timeout). Default false — return an empty degraded page (0 credits) instead.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Search TikTok users — distinct creators only, id + secUid, per-counter isApproximate flags, cursor pagination.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this users item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"likes":{"type":"integer","description":"Like count (number)."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"followersIsApproximate":{"type":"boolean","description":"True when followers was parsed from a compact Facebook chrome label (e.g. 28M) rather than an exact integer."},"followingIsApproximate":{"type":"boolean","description":"Following is approximate. Example: false."},"likesIsApproximate":{"type":"boolean","description":"True when engagement.likes looks display-rounded rather than exact."}}}}}}}},"example":{"success":true,"data":{"query":"khaby","totalReturned":2,"hasMore":true,"nextCursor":"30:20260809225002ADA0CE0CD6A89","users":[{"id":"127905465618821121","secUid":"MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA","username":"khaby.lame","displayName":"Khabane lame","bio":"Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎","url":"https://www.tiktok.com/@khaby.lame","followers":162476412,"following":81,"likes":2650481169,"verified":true,"profileImage":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=ef0e9f02&x-expires=1786006800&x-signature=7Mx8iglAOcSlnXlc8QyIBifQV0M%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","followersIsApproximate":false,"followingIsApproximate":false,"likesIsApproximate":false},{"id":"6663294979903422470","secUid":"MS4wLjABAAAAbq-1Yqpp1a6u5KbV_sMg93_FK7AN3d6MJeZ3H0Yj3vZXOtqFXXjc2TIkMW7flCxX","username":"espn","displayName":"ESPN","bio":"Serving Sports Fans. Anytime. Anywhere.","url":"https://www.tiktok.com/@espn","followers":60100768,"following":657,"likes":5769632093,"verified":true,"profileImage":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7310257743653240837~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=7e4745a7&x-expires=1786006800&x-signature=cJrkoOAcA8KBqdaAWgBgeaE6f6w%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","followersIsApproximate":false,"followingIsApproximate":false,"likesIsApproximate":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/song-details":{"get":{"operationId":"tiktok_song_details","tags":["TikTok"],"summary":"TikTok Song Details API","description":"TikTok sound metadata — usageCount, artists[{id,secUid,handle}], audio{bpm,loudness,beats}, commerce rights (1 credit; 2 via the fallback path).\n\nPaste a TikTok music/sound URL and get the sound as clean JSON. id is the music id from the URL, kept as a string end to end — never a JS number (19-digit TikTok ids sit past Number.MAX_SAFE_INTEGER and silently round). title, author, artistId/authorSecUid, artists[{id,uid,secUid,handle,displayName,verified,avatarUrl}] (null when unknown — never [] meaning “we know there are none”; a name-only artist is lifted from author when TikTok ships no uid). durationSeconds, coverUrl (canonical cover art; size variants live under raw.cover), playUrl, mediaUrlsExpireAt. playUrl on this surface is typically unsigned (no x-expires, no hex path stamp) and does not expire — mediaUrlsExpireAt stays null then, which is correct; when coverUrl carries x-expires (~48h) the field is that stamp. usageCount (videos using the sound) with usageCountIsApproximate (true on display-rounded totals; null when usageCount is null — never false about a missing count). createdAt, isExplicit/hasLyrics when present, and isOriginalSound. The differentiator: audio{bpm,loudnessLufs,amplitudePeak,beats,strongBeatUrl} — TikTok's own audio analysis when exposed (this is not a play URL). Commerce: isCommerceMusic, hasCommerceRight, commercialRightType decoded to none/commercial/licensed. Label tracks add matchedSong and musicReleaseInfo. Every 200 ships source (native/extended) and timings. Resilience: a transient TikTok mobile-API blip is retried in-request before the fallback path runs, and if the extended row comes back as a mostly-null shell (title but no author, cover or usage count) the native path is tried once more after the fallback's natural delay — so a 40s wait no longer ends in a shell of nulls. Pair with Music Posts to list videos on the sound. 1 credit when served natively; 2 credits when served via the fallback path (X-Captapi-Source: extended, may take longer) — in the last 30 days 38 of 43 calls were served that way and billed 2.\n\nDocs: https://captapi.com/apis/tiktok-song-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok music/sound URL, e.g. https://tiktok.com/music/name-ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit (2 via fallback path)","note":"1 credit when served natively; 2 credits when served via the fallback path (may take longer). In the last 30 days 38 of 43 calls took the fallback path and were billed 2.","billedOnCacheHit":false},"x-one-liner":"TikTok sound metadata — usageCount, artists[{id,secUid,handle}], audio{bpm,loudness,beats}, commerce rights (1 credit; 2 via the fallback path).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of the item."},"author":{"type":"string","description":"Author name or handle."},"artists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this artists item."},"uid":{"type":"string","description":"Uid. Example: \"6749206263416161285\"."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"handle":{"type":"string","description":"Account handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"avatarUrl":{"type":"string","description":"Avatar url URL."}}}},"isOriginalSound":{"type":"boolean","description":"Is original sound. Example: false."},"isAuthorArtist":{"type":"boolean","description":"Is author artist. Example: true."},"album":{"type":"string","description":"Album the track belongs to."},"coverUrl":{"type":"string","description":"Sound cover art. Canonical cover field (size variants under raw.cover). Signed CDN when TikTok stamps x-expires (~48h) — persist the music id, not this URL. See mediaUrlsExpireAt."},"cover":{"type":"object","properties":{"large":{"type":"string","description":"Large URL."},"medium":{"type":"string","description":"Medium URL."},"thumb":{"type":"string","description":"Thumb URL."}}},"playUrl":{"type":"string","description":"Preview audio CDN URL when TikTok exposes one. On this surface the URL is typically unsigned (no x-expires, no hex path stamp) and does not expire. That is a third TikTok URL lifetime, distinct from video ~24h and image ~48h. Persist the music id; the link is refetchable, not a ticking CDN."},"usageCount":{"type":"integer","description":"How many TikTok videos use this sound when TikTok exposes the total. Null when the music/aweme embed and music page omit it — never a fake zero."},"usageCountIsApproximate":{"type":"boolean","description":"true when usageCount is display-rounded (e.g. 11.1K → 11100); false when the integer is exact; null when usageCount is null — never false about a missing count."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"isCommerceMusic":{"type":"boolean","description":"TikTok classifies the track as commercial-relevant music. true with hasCommerceRight false is the \"licensed\" tier — not a contradiction."},"hasCommerceRight":{"type":"boolean","description":"Whether the requesting context holds the commercial usage right — false for anonymous reads of licensed tracks."},"commercialRightType":{"type":"string","description":"Decoded licensing tier: \"none\" (ordinary sound, no commercial clearance), \"commercial\" (Commercial Music Library — pre-cleared, hasCommerceRight true), \"licensed\" (major-label/general-library track — organic use only, hasCommerceRight false), \"unknown\" (upstream 0). Unrecognized future tiers pass through as the raw integer."},"matchedSong":{"type":"object","properties":{"id":{"type":"string","description":"Id of this matched song item."},"title":{"type":"string","description":"Title of this matched song item."},"author":{"type":"string","description":"Author name or handle."},"fullDuration":{"type":"integer","description":"Full duration. Example: 46673."},"chorusInfo":{"type":"object","properties":{"startMs":{"type":"integer"},"durationMs":{"type":"integer"}},"description":"Object with startMs, durationMs."}}},"musicReleaseInfo":{"type":"object","properties":{"groupReleaseDate":{"type":"string","description":"Group release date. Example: \"2026-07-06T00:00:00.000Z\"."},"groupReleaseTimestamp":{"type":"integer","description":"Group release timestamp. Example: 1783296000."},"isNewReleaseSong":{"type":"boolean","description":"Is new release song. Example: true."}}},"audio":{"type":"object","properties":{"bpm":{"description":"Bpm."},"loudnessLufs":{"type":"number","description":"Loudness lufs. Example: -8.160819."},"amplitudePeak":{"type":"number","description":"Amplitude peak. Example: 1.3610525."},"beats":{"type":"object","properties":{"audioEffectOnset":{"type":"string"},"beatsTracker":{"type":"string"},"energyTrace":{"type":"string"},"mergedBeats":{"type":"string"}},"description":"Object with audioEffectOnset, beatsTracker, energyTrace, mergedBeats."},"strongBeatUrl":{"type":"string","description":"Strong beat url URL."}}},"durationSeconds":{"type":"integer","description":"Track length in seconds."},"artistId":{"type":"string","description":"Primary artist / sound-owner user id when TikTok exposes one."},"authorSecUid":{"type":"string","description":"Primary artist / sound-owner secUid when TikTok exposes one."},"isExplicit":{"description":"Is explicit."},"hasLyrics":{"description":"Has lyrics."}}}}},"example":{"success":true,"data":{"platform":"tiktok","url":"https://www.tiktok.com/music/Pumpin-Blood-7659457659034175489","id":"7659457659034175489","title":"Pumpin Blood","author":"TWINSICK & NONONO","artists":[{"id":"6749206263416161285","uid":"6749206263416161285","secUid":"MS4wLjABAAAA38xoRsEaXL5TLeUkSCGHTo-RvU9P485jMPZSIiBjhQ4-uQiq3rS4FIDrP5O_Y0yW","handle":"twinsick","displayName":"TWINSICK","verified":true,"avatarUrl":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/119173022434f9a952213ee3344b3539~tplv-tiktokx-cropcenter-q:168:168:q70.webp?dr=10792&idc=my2&ps=87d6e48a&refresh_token=7dd6ae52&s=MUSIC_AWEME&sc=avatar&shcp=f6441914&shp=d05b14bd&t=223449c4&x-expires=1785783600&x-signature=NqCTSbDLT8umzbrTEziv7%2FkGOI0%3D"},{"id":"7308738121520235553","uid":"7308738121520235553","secUid":"MS4wLjABAAAA4_Viygw3rG9RFqavMKpGvCNaiyjZlizM_LYw1Qe4M5eEo-MLAztgyRwUbK6vYVNT","handle":"nononoofficial","displayName":"NONONO","verified":false,"avatarUrl":"https://p16-common-sign.tiktokcdn.com/tos-useast2a-avt-0068-euttp/0ce5a0d0b5f22cf5d263875e8c0a2702~tplv-tiktokx-cropcenter-q:168:168:q70.webp?dr=10792&idc=my2&ps=87d6e48a&refresh_token=f4958d29&s=MUSIC_AWEME&sc=avatar&shcp=f6441914&shp=d05b14bd&t=223449c4&x-expires=1785783600&x-signature=lhH%2BscwS89J4V4PRehJ%2F3rjbKR8%3D"}],"isOriginalSound":false,"isAuthorArtist":true,"album":"Pumpin Blood","coverUrl":"https://p77-sg.tiktokcdn.com/aweme/720x720/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg","cover":{"large":"https://p77-sg.tiktokcdn.com/aweme/720x720/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg","medium":"https://p77-sg.tiktokcdn.com/aweme/200x200/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg","thumb":"https://p77-sg.tiktokcdn.com/aweme/100x100/tos-alisg-v-2774/ogkAESQZAtNDXBDkBAgFZTWoEfNeqjEB8AV7MC.jpeg"},"playUrl":"https://sf16-ies-music-sg.tiktokcdn.com/obj/tos-alisg-ve-2774/oUBA3erMBM5LhL55CXiLQNZYpBfcqjBIingAtS","usageCount":11100,"usageCountIsApproximate":true,"createdAt":"2026-07-06T16:51:01.000Z","isCommerceMusic":true,"hasCommerceRight":false,"commercialRightType":"licensed","matchedSong":{"id":"7659443114000369680","title":"Pumpin Blood","author":"TWINSICK & NONONO","fullDuration":46673,"chorusInfo":{"startMs":0,"durationMs":30528}},"musicReleaseInfo":{"groupReleaseDate":"2026-07-06T00:00:00.000Z","groupReleaseTimestamp":1783296000,"isNewReleaseSong":true},"audio":{"bpm":null,"loudnessLufs":-8.160819,"amplitudePeak":1.3610525,"beats":{"audioEffectOnset":"https://sf16-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/osAA6oEIIAgqFiTfrVFDceC9UIpRjtCtDBiZAl","beatsTracker":"https://sf77-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/oQEBvfGFLAzjne62AzRQFCuaNJJQQGAeAUXFyI","energyTrace":"https://sf16-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/okGP6eevAu6XULAaetqCFjaIInQB9QOAz2EAJz","mergedBeats":"https://sf77-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/og6OlA6azQsFfaFeJEQAu6GUAhELIBjXCADven"},"strongBeatUrl":"https://sf77-ies-music-sg.tiktokcdn.com/obj/tos-alisg-v-2774/oYQUDfpKtEpQEARfgAqgFBAQErZECAB0BBpAlP"},"durationSeconds":46,"artistId":"6749206263416161285","authorSecUid":"MS4wLjABAAAA38xoRsEaXL5TLeUkSCGHTo-RvU9P485jMPZSIiBjhQ4-uQiq3rS4FIDrP5O_Y0yW","isExplicit":null,"hasLyrics":null}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/trending-feed":{"get":{"operationId":"tiktok_trending_feed","tags":["TikTok"],"summary":"TikTok Trending Feed API","description":"For You by default; pass orderBy/period/page for Creative Center popular videos (like/hot/comment/repost) with totalCount.\n\nDefault: TikTok For You / recommend feed with rank, publishedAt, caption (null when empty), mediaType, durationSeconds, thumbnailUrl, author{}, and engagement{}. mediaType is photo only when the canonical url contains /photo/ (or durationSeconds is null and the payload is an image post) — never because videoUrl is omitted. Session-cookie-bound web URLs (tk=tt_chain_token, or the same check hidden in a base64 policy= param) 403 for callers and are never shipped — when only those exist, videoUrl is omitted and you open the post via url; that row is still a video. author.followers is read from the feed author card when present, then hydrated from /api/user/detail for unique handles still null (8s budget). Photo rows ship images[] + imageCount (numbered-dict slides and bitrate_images included; item/detail when the feed shipped one image). videoUrlExpiresAt / thumbnailUrlExpiresAt are the split CDN windows (~36h on play URLs — the shortest in the catalogue). Envelope matches instagram/trending-reels: platform, country, countryCode, cached, source (for_you | creative_center | cache), totalReturned, requested, hasMore, nextCursor (always null — For You has no stable cursor), truncatedReason (single_page_only when the For You page filled; chart-page on a filled Creative Center page), fetchedAt, timings{path,fetchMs,hydrateMs,totalMs}. hasMore is true with nextCursor null only when truncatedReason names the cap — same rule as truth-social/user-posts. engagement always keys views/likes/comments/shares/saves/downloads plus *IsApproximate on each. Pass orderBy (hot|like|comment|repost — unknown values are 400; vv/views are aliases of hot and the response echoes hot), period (7|30|120), page, or countryCode to switch to the TikTok Creative Center popular-videos chart. A chart miss falls through to For You posts inside the period window, re-sorted by the requested metric (note says so). Hard 110s deadline. A wall with a 6h last-good page is labelled stale 200 at 0 credits; a miss with no snapshot is 502 UPSTREAM_UNAVAILABLE at 0 credits — never a billed 200 we cannot deliver. country / countryCode is the chart market in Creative Center mode; on For You it is a region-availability hint. Flat 2 credits per call.\n\nDocs: https://captapi.com/apis/tiktok-trending-feed","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":false,"description":"Two-letter ISO country (default US). For You: region-availability hint. Creative Center mode: chart market.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"countryCode","in":"query","required":false,"description":"Alias of country. Wins when both are set.","schema":{"type":"string","minLength":2,"maxLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"orderBy","in":"query","required":false,"description":"Creative Center sort: hot (views), like, comment, or repost. Unknown values are 400. vv/views/plays are aliases of hot — the response echoes the public name. Setting this (or period / page>1) switches from For You to the popular-videos chart. On a For You fallthrough the same sort is applied locally.","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Lookback days: 7, 30, or 120 (180→120). Triggers chart mode. Every returned publishedAt is inside this window — a For You fallthrough is filtered the same way.","schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"Creative Center page (default 1). page>1 triggers chart mode.","schema":{"type":"integer","maximum":25,"minimum":1,"default":1}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"For You by default; pass orderBy/period/page for Creative Center popular videos (like/hot/comment/repost) with totalCount.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"countryCode":{"type":"string","description":"ISO-3166 alpha-2 (same as country on this endpoint)."},"cached":{"type":"boolean","description":"true on a cache hit when cache=true. Default fetch is fresh."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"requested":{"type":"integer","description":"The limit you asked for."},"hasMore":{"type":"boolean","description":"True when this page filled the requested limit. nextCursor stays null on For You — then truncatedReason is single_page_only. Never true without a cursor unless that reason (or chart-page) is set."},"nextCursor":{"description":"Always null on For You (no stable cursor). Creative Center uses the page query, not a cursor."},"truncatedReason":{"description":"single_page_only when the For You page filled limit (more exist, unreachable). chart-page when a Creative Center page filled. null when the page is short."},"fetchedAt":{"type":"string","description":"When this request completed (ISO-8601). There is no scrapedAt / createTime twin."},"results":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this results item."},"coverUrl":{"type":"string","description":"Cover image URL."},"author":{"type":"string","description":"Author object {id, secUid, username, displayName, url, followers, verified, profileImage}. Not a handle string — the pre-TK-C author/authorName pair is gone."},"authorName":{"type":"string","description":"Name of the author."},"views":{"type":"integer","description":"View count when the platform exposes one."},"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count."},"shares":{"type":"integer","description":"Share count. On analytics endpoints: null when the platform has no public share metric (stable schema). On single-platform endpoints the key is omitted instead."},"rank":{"type":"integer","description":"Rank position in the list."},"caption":{"type":"string","description":"Always keyed. Null when the post has no caption — not omitted."},"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"createTime":{"type":"integer","description":"When the account was created (ISO 8601)."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"mediaType":{"type":"string","description":"\"video\" | \"photo\". Photo only when url contains /photo/ (or durationSeconds is null on an image post). Not inferred from videoUrl — session-bound play URLs are omitted on videos."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."}}}},"source":{"description":"\"for_you\" (default recommend feed) or \"creative_center\" (popular-videos chart). A chart miss falls through to for_you with note set."},"period":{"description":"Lookback days (7, 30, or 120). Present in chart mode. Every publishedAt is inside this window."},"page":{"description":"Creative Center page. Present in chart mode."},"orderBy":{"description":"Public sort: hot | like | comment | repost. vv is accepted as an alias of hot and echoed as hot. On fallthrough the list is actually sorted by this metric."},"note":{"description":"Present on For You fallthrough: chart unavailable, period window applied, list sorted locally by orderBy."}}}}},"example":{"success":true,"data":{"platform":"tiktok","country":"US","countryCode":"US","cached":false,"totalReturned":2,"requested":20,"hasMore":false,"nextCursor":null,"truncatedReason":null,"fetchedAt":"2026-08-03T11:30:00.000Z","results":[{"url":"https://www.tiktok.com/@adamjones73/video/7660991836407811358","id":"7660991836407811358","coverUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oERcgNIQQgASfTiefnLoipqrkyeCfiAGGKmNEI~tplv-tiktokx-origin.image?dr=9636&x-expires=1785517200&x-signature=FF%2Fhr528f3arMCaHqCr9%2BeBIue0%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","author":"adamjones73","authorName":"Adam","views":5400000,"likes":823500,"comments":4301,"shares":147900,"rank":1,"caption":"#gta #viral #fyp","platform":"tiktok","createTime":1783713660,"publishedAt":"2026-07-10T20:01:00.000Z","mediaType":"video","thumbnailUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oERcgNIQQgASfTiefnLoipqrkyeCfiAGGKmNEI~tplv-tiktokx-origin.image?dr=9636&x-expires=1785517200&x-signature=FF%2Fhr528f3arMCaHqCr9%2BeBIue0%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","isAd":false},{"url":"https://www.tiktok.com/@123court/video/7655473367125855519","id":"7655473367125855519","coverUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oIMffQHCCga9fWiRXUy8JOfP3WVUFGAL7oQtAQ~tplv-tiktokx-origin.image?dr=9636&x-expires=1785517200&x-signature=zF4ZAiNfBFLlLm4zu51g3NjykhI%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","author":"123court","authorName":"123 Court","views":3600000,"likes":133800,"comments":1872,"shares":8999,"rank":2,"caption":"Engaged Mom Demands More Money, But Judge Finds Out The Shocking Truth! ​#CourtroomDrama  ​#FamilyCourt  ​#ChildSupport  ​#ChildSupportCourt  ​#JudgeJules   ​#InstantKarma  ​#Backfired  ​#CaughtInTheAct  ​#PlotTwist  ​#TruckDriverLife  ​#CoParenting  ​#SplitCustody  ​#SiblingDrama  ​#RevengeBackfires","platform":"tiktok","createTime":1782428791,"publishedAt":"2026-06-25T23:06:31.000Z","mediaType":"video","thumbnailUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oIMffQHCCga9fWiRXUy8JOfP3WVUFGAL7oQtAQ~tplv-tiktokx-origin.image?dr=9636&x-expires=1785517200&x-signature=zF4ZAiNfBFLlLm4zu51g3NjykhI%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","isAd":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/popular-hashtags":{"get":{"operationId":"tiktok_popular_hashtags","tags":["TikTok"],"summary":"TikTok Popular Hashtags API","description":"Related TikTok hashtags — Creative Center chart when it answers, otherwise a disclosed niche fallback.\n\nTries TikTok Creative Center's popular-hashtag chart (ads.tiktok.com/business/creativecenter/inspiration/popular/hashtag) for 25s when query is omitted or query=trending — then a service-wide circuit opens: later default calls skip the chart (chartStatus=skipped_circuit_open, chartConsecutiveMisses) until the 60s cooldown (300s after 3 misses) expires and one call re-probes. A chart miss falls through to related-tag co-occurrence seeded with fyp — source is niche_fallback, not a silent substitute. rankDiff and trend[] exist only on a Creative Center hit (source=creative_center); they are omitted on the fallback and have not been observable while the chart stays dark. Pass query=&lt;niche&gt; (e.g. skincare) to skip the chart. A double miss is 502 with stages/ms, consecutiveFailures, and a 60s service-wide negative cache (persistent after 3). Overall 80s deadline. Flat 2 credits on a 200; 5xx stay 0.\n\nDocs: https://captapi.com/apis/tiktok-popular-hashtags","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":false,"description":"Two-letter ISO country for the Creative Center chart. Default US.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"period","in":"query","required":false,"description":"Lookback days: 7, 30, or 120 (180→120). Default 7.","schema":{"type":"integer","default":7}},{"name":"page","in":"query","required":false,"description":"Creative Center page (default 1).","schema":{"type":"integer","maximum":20,"minimum":1,"default":1}},{"name":"sortBy","in":"query","required":false,"description":"Chart sort: popular (default).","schema":{"type":"string","default":"popular"}},{"name":"newOnBoard","in":"query","required":false,"description":"Only hashtags newly on the Top 100.","schema":{"type":"boolean","default":false}},{"name":"industryId","in":"query","required":false,"description":"Optional Creative Center industry_id.","schema":{"type":"string"}},{"name":"query","in":"query","required":false,"description":"Optional niche seed for co-occurrence + challenge/detail enrich. Omit, or pass trending, to try the Creative Center chart (25s); a miss falls through to related tags for fyp (source=niche_fallback) and opens a service-wide chart circuit. Later default calls skip the chart (chartStatus=skipped_circuit_open) until the cooldown expires. Any other value skips the chart.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Related TikTok hashtags — Creative Center chart when it answers, otherwise a disclosed niche fallback.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"Niche seed echoed on the co-occurrence path. Omitted on the Creative Center chart (omit query / query=trending)."},"discovery":{"type":"string","description":"How hashtags were found. popular-hashtags: \"creative_center\" (official chart) or \"co_occurrence\" (related tags from seed videos)."},"discoverySource":{"type":"string","description":"Where the seed video sample came from (hashtag_page, top_search, or extended_hashtag_videos) — co-occurrence path only."},"sampleSize":{"type":"integer","description":"How many seed videos were used for co-occurrence (typically ~20 on discoverySource=top_search or hashtag_page). Not commenter countries and not /tiktok/audience-demographics. Omitted on the Creative Center path."},"rankBy":{"type":"string","description":"Metric used for rank (creative_center_rank on Creative Center; videoCount on co-occurrence enrich)."},"fetchedAt":{"type":"string","description":"When this snapshot was fetched (ISO 8601 UTC)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hashtags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Hashtag without the leading #."},"url":{"type":"string","description":"Canonical URL of the item."},"rank":{"type":"integer","description":"Rank position in the list."},"hashtagId":{"type":"string","description":"TikTok challenge / hashtag id (cid) when available."},"videoCount":{"type":"integer","description":"Population video count when the source is authoritative (e.g. TikTok challenge/detail statsV2 on popular-hashtags, or a channel's uploaded-video total). Never a sample tally — sample sizes use sampleVideoCount / sampleSize."},"totalPlays":{"type":"integer","description":"Population total plays/views for a hashtag when from challenge/detail (statsV2). On popular-hashtags this is not the sample sum — see samplePlays."},"sampleVideoCount":{"type":"integer","description":"How many videos in this response's sample included the hashtag (co-occurrence count). Not the hashtag's TikTok-wide total — see videoCount."},"samplePlays":{"type":"integer","description":"Sum of play/view counts across sample videos that included the hashtag. Not the hashtag's TikTok-wide totalPlays."},"growthRate":{"description":"Hashtag/song growth signal. On Creative Center charts: derived from trend[] when present. On challenge/detail co-occurrence path: null."}}}}}}}},"example":{"success":true,"data":{"query":"skincare","discovery":"co_occurrence","discoverySource":"hashtag_page","sampleSize":20,"rankBy":"videoCount","fetchedAt":"2026-08-03T15:08:07.000Z","totalReturned":2,"hashtags":[{"name":"skincare","url":"https://www.tiktok.com/tag/skincare","rank":1,"hashtagId":"504245","videoCount":56953998,"totalPlays":954780316160,"sampleVideoCount":17,"samplePlays":40305805,"growthRate":null},{"name":"skincareroutine","url":"https://www.tiktok.com/tag/skincareroutine","rank":2,"hashtagId":"42164","videoCount":8200000,"totalPlays":120000000000,"sampleVideoCount":5,"samplePlays":3003805,"growthRate":null}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/popular-songs":{"get":{"operationId":"tiktok_popular_songs","tags":["TikTok"],"summary":"TikTok Popular Songs API","description":"Removed 2026-09-26: TikTok deleted the public Creative Center song chart in its TikTok One migration (September 2026): the music page lost its songs tab and the chart API answers 40101 no-permission to anonymous sessions, so there is no honest data to serve on any path. Returns 410 Gone.\n\nRemoved 26 Sep 2026 — TikTok deleted the public Creative Center song chart in its TikTok One migration.\n\nRemoved on 26 September 2026. This endpoint served TikTok's official Creative Center sound chart (inspiration/popular/music) with rankType=popular|surging, newOnBoard, commercialMusic, country, period and page filters. In its TikTok One migration (September 2026) TikTok deleted that public surface: the music page now lands on a trends hub without a songs tab and the chart API answers 40101 no-permission to anonymous sessions. Native and extended paths scraped the same removed surface, so there is nothing honest to serve — every call now answers a definitive 410 Gone (code ENDPOINT_REMOVED, retryable false) at 0 credits instead of an endless retryable 5xx. If TikTok restores the chart, the endpoint will be re-enabled with the same contract. TikTok popular hashtags, trending videos, and popular creators are unaffected.\n\nDocs: https://captapi.com/apis/tiktok-popular-songs","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":false,"description":"Two-letter ISO country. Default US.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"period","in":"query","required":false,"description":"7, 30, or 120 days (180→120). Default 7.","schema":{"type":"integer","default":7}},{"name":"page","in":"query","required":false,"description":"Creative Center page (1–20). Echoed on a native chart 200 with hasMore. Omitted on the extended path — that list is one page.","schema":{"type":"integer","maximum":20,"minimum":1,"default":1}},{"name":"rankType","in":"query","required":false,"description":"popular | surging. Default popular.","schema":{"type":"string","default":"popular"}},{"name":"newOnBoard","in":"query","required":false,"description":"Only sounds newly on the Top 100.","schema":{"type":"boolean","default":false}},{"name":"commercialMusic","in":"query","required":false,"description":"Only Commercial Music Library–cleared sounds.","schema":{"type":"boolean","default":false}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 20). Flat 2 credits per call.","schema":{"type":"integer","maximum":20,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Removed 26 Sep 2026 — TikTok deleted the public Creative Center song chart in its TikTok One migration.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"total":{"type":"integer","description":"Number of items returned."},"items":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Item title."},"url":{"type":"string","description":"Direct URL to the content."},"views":{"type":"integer","description":"View count."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601)."}}}}}}}},"example":{"success":true,"data":{"total":2,"items":[{"title":"Latest upload","url":"https://example.com/a","views":90120,"publishedAt":"2025-01-12"},{"title":"Previous upload","url":"https://example.com/b","views":75230,"publishedAt":"2025-01-04"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"410":{"description":"The platform removed this surface.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}},"deprecated":true}},"/v1/tiktok/live":{"get":{"operationId":"tiktok_live","tags":["TikTok"],"summary":"TikTok Live API","description":"Check whether a TikTok creator is live right now and get the stream URLs (CMAF/DASH + FLV, HLS when TikTok exposes it) — one GET with an @handle, 1 credit.\n\nSend a profile URL or @handle. isLive is true only when TikTok liveRoom.status === 2 (also top-level status + room.status). A non-empty room does not mean live — offline responses may still include the last broadcast (title, startedAt, totalEnterCount, pull URLs). viewerCount is only set while live (stale concurrent counts are omitted when offline). Parsed streamQualities[{quality,codec,resolution,bitrate,flv,hls,cmaf,dash,lls}] unwrap TikTok's triple-escaped stream_data (prefer hls/cmaf for browsers — FLV will not play in a web player). Also: creator.id/secUid/following, liveSubOnly, gameTagId/hashTagId, paidEvent, streams{}. Flat 1 credit. /live-info is the identical payload at 7 credits — prefer /live.\n\nDocs: https://captapi.com/apis/tiktok-live","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Check whether a TikTok creator is live right now and get the stream URLs (CMAF/DASH + FLV, HLS when TikTok exposes it) — one GET with an @handle, 1 credit.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"username":{"type":"string","description":"Account username / handle."},"isLive":{"type":"boolean","description":"true only when status === 2 — a non-empty room payload does not mean the creator is live."},"status":{"type":"integer","description":"TikTok liveRoom/user status enum. 2 = currently live (isLive true). Other codes (commonly 4) mean the last room payload is ended/stale — still may include title, enter counts, and pull URLs."},"creator":{"type":"object","properties":{"id":{"type":"string","description":"Id of this creator item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"status":{"type":"integer","description":"TikTok liveRoom/user status enum. 2 = currently live (isLive true). Other codes (commonly 4) mean the last room payload is ended/stale — still may include title, enter counts, and pull URLs."}}},"room":{"type":"object","properties":{"id":{"type":"string","description":"Id of this room item."},"streamId":{"type":"string","description":"TikTok live stream id (distinct from room id when both exist)."},"status":{"type":"integer","description":"TikTok liveRoom/user status enum. 2 = currently live (isLive true). Other codes (commonly 4) mean the last room payload is ended/stale — still may include title, enter counts, and pull URLs."},"title":{"type":"string","description":"Title of this room item."},"startedAt":{"type":"string","description":"When the stream, clip, or broadcast segment started (ISO 8601)."},"totalEnterCount":{"type":"integer","description":"Lifetime total entries for the last/current room session. May remain on offline payloads as last-known; viewerCount is only set while isLive."},"coverUrl":{"type":"string","description":"Cover image URL."},"liveSubOnly":{"type":"boolean","description":"Whether the TikTok live is subscribers-only."},"gameTagId":{"type":"integer","description":"TikTok live game category id when the room is a gaming broadcast (0 / omitted when not)."},"liveRoomMode":{"type":"integer","description":"Live room mode. Example: 1."},"paidEvent":{"type":"object","properties":{"eventId":{"type":"integer"},"paidType":{"type":"integer"}},"description":"Paid-live metadata ({eventId, paidType}) when TikTok marks the room as a paid event."},"streamUrls":{"type":"array","items":{"type":"string"},"description":"Flat live stream playback URLs (compat). Prefer streamQualities / streams for quality/codec metadata."},"streamQualities":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"description":"Parsed TikTok live pull qualities ({quality, codec, resolution, bitrate, flv, hls, cmaf, dash, lls}). Prefer hls/cmaf for browsers — FLV is not web-playable."},"streams":{"type":"object","properties":{"hd":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"uhd":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"sd":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"ld":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}}},"description":"TikTok live pull URLs keyed by quality (hd/sd/ld/origin/ao/…); h264 preferred when both codecs exist."}}}}}}},"example":{"success":true,"data":{"platform":"tiktok","username":"tiktok","isLive":false,"status":4,"creator":{"id":"107955","secUid":"MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM","displayName":"TikTok","followers":95001558,"following":0,"verified":true,"avatar":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:1080:1080.webp?dr=14579&refresh_token=fda4fb51&x-expires=1785409200&x-signature=hllLSTX4jvetwRoYU5uQBOOaWpA%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=fdd36af4&idc=my2","bio":"One TikTok can make a big impact","status":4},"room":{"id":"7665499080323353358","streamId":"3578537941258994614","status":4,"title":"In the Mix LIVE with Josh Groban","startedAt":"2026-07-22T23:32:31.000Z","totalEnterCount":74810,"coverUrl":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:720:720.webp?dr=14579&refresh_token=e000a24d&x-expires=1785409200&x-signature=51yzrCy7oc%2Bx3QXPywEmNE7foSU%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=fdd36af4&idc=my2","liveSubOnly":false,"gameTagId":0,"liveRoomMode":1,"paidEvent":{"eventId":7655031505395122000,"paidType":0},"streamUrls":["https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.m3u8?expire=1786446578&sign=f25ce1f7dc0090406b4ce9dd93404abf","https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d"],"streamQualities":[{"quality":"hd","codec":"h264","resolution":"960x540","bitrate":1200000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd.flv?expire=1786446578&sign=4e2983d0d512266f6557d5f7aabe8532","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.m3u8?expire=1786446578&sign=f25ce1f7dc0090406b4ce9dd93404abf","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d"},{"quality":"uhd","codec":"h264","resolution":"1280x720","bitrate":1800000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd.flv?expire=1786446578&sign=9ca252292b4a32583d2a4fcb721ff555","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.m3u8?expire=1786446578&sign=2a607ea575457021435a891b4643e17c","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047"}],"streams":{"hd":{"codec":"h264","resolution":"960x540","bitrate":1200000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd.flv?expire=1786446578&sign=4e2983d0d512266f6557d5f7aabe8532","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.m3u8?expire=1786446578&sign=f25ce1f7dc0090406b4ce9dd93404abf","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d"},"uhd":{"codec":"h264","resolution":"1280x720","bitrate":1800000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd.flv?expire=1786446578&sign=9ca252292b4a32583d2a4fcb721ff555","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.m3u8?expire=1786446578&sign=2a607ea575457021435a891b4643e17c","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047"},"sd":{"codec":"h264","resolution":"960x540","bitrate":800000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd.flv?expire=1786446578&sign=861979ee452b5d3894b3c02920bd96ca","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd/index.m3u8?expire=1786446578&sign=2b0c3c0cea33b5b1c1f16b3cc1522c2b","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd/index.mpd?expire=1786446578&sign=54f12793a9b2ec076d77333e3f87eeb7","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd/index.mpd?expire=1786446578&sign=54f12793a9b2ec076d77333e3f87eeb7"},"ld":{"codec":"h264","resolution":"640x360","bitrate":600000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld.flv?expire=1786446578&sign=33fed68846450e6976f0c3be345a75f9","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld/index.m3u8?expire=1786446578&sign=d8bfbecab958947a7b8ca5f9bf37b3b7","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld/index.mpd?expire=1786446578&sign=00541c1a83a5cd336565ffe7a33f51cf","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld/index.mpd?expire=1786446578&sign=00541c1a83a5cd336565ffe7a33f51cf"}}}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/live-info":{"get":{"operationId":"tiktok_live_info","tags":["TikTok"],"summary":"TikTok Live Info API","description":"Identical to TikTok Live (isLive, creator.id/secUid, streamQualities hls/cmaf).\n\nTrue alias of GET /v1/tiktok/live — same runner, same JSON (isLive/status, creator.id/secUid, room.streamQualities with flv/hls/cmaf/dash when TikTok exposes them). Own billing/cache key only. Flat 1 credit, same as /live.\n\nDocs: https://captapi.com/apis/tiktok-live-info","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok profile URL, @handle, or username, e.g. https://tiktok.com/@username. Not a YouTube channel URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Identical to TikTok Live (isLive, creator.id/secUid, streamQualities hls/cmaf).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"username":{"type":"string","description":"Account username / handle."},"isLive":{"type":"boolean","description":"true only when status === 2 — a non-empty room payload does not mean the creator is live."},"status":{"type":"integer","description":"TikTok liveRoom/user status enum. 2 = currently live (isLive true). Other codes (commonly 4) mean the last room payload is ended/stale — still may include title, enter counts, and pull URLs."},"creator":{"type":"object","properties":{"id":{"type":"string","description":"Id of this creator item."},"secUid":{"type":"string","description":"TikTok secure user ID — required for many platform-internal list endpoints."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"status":{"type":"integer","description":"TikTok liveRoom/user status enum. 2 = currently live (isLive true). Other codes (commonly 4) mean the last room payload is ended/stale — still may include title, enter counts, and pull URLs."}}},"room":{"type":"object","properties":{"id":{"type":"string","description":"Id of this room item."},"streamId":{"type":"string","description":"TikTok live stream id (distinct from room id when both exist)."},"status":{"type":"integer","description":"TikTok liveRoom/user status enum. 2 = currently live (isLive true). Other codes (commonly 4) mean the last room payload is ended/stale — still may include title, enter counts, and pull URLs."},"title":{"type":"string","description":"Title of this room item."},"startedAt":{"type":"string","description":"When the stream, clip, or broadcast segment started (ISO 8601)."},"totalEnterCount":{"type":"integer","description":"Lifetime total entries for the last/current room session. May remain on offline payloads as last-known; viewerCount is only set while isLive."},"coverUrl":{"type":"string","description":"Cover image URL."},"liveSubOnly":{"type":"boolean","description":"Whether the TikTok live is subscribers-only."},"gameTagId":{"type":"integer","description":"TikTok live game category id when the room is a gaming broadcast (0 / omitted when not)."},"liveRoomMode":{"type":"integer","description":"Live room mode. Example: 1."},"paidEvent":{"type":"object","properties":{"eventId":{"type":"integer"},"paidType":{"type":"integer"}},"description":"Paid-live metadata ({eventId, paidType}) when TikTok marks the room as a paid event."},"streamUrls":{"type":"array","items":{"type":"string"},"description":"Flat live stream playback URLs (compat). Prefer streamQualities / streams for quality/codec metadata."},"streamQualities":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"description":"Parsed TikTok live pull qualities ({quality, codec, resolution, bitrate, flv, hls, cmaf, dash, lls}). Prefer hls/cmaf for browsers — FLV is not web-playable."},"streams":{"type":"object","properties":{"hd":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"uhd":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"sd":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}},"ld":{"type":"object","properties":{"codec":{"type":"string"},"resolution":{"type":"string"},"bitrate":{"type":"integer"},"flv":{"type":"string"},"hls":{"type":"string"},"cmaf":{"type":"string"},"dash":{"type":"string"}}}},"description":"TikTok live pull URLs keyed by quality (hd/sd/ld/origin/ao/…); h264 preferred when both codecs exist."}}}}}}},"example":{"success":true,"data":{"platform":"tiktok","username":"tiktok","isLive":false,"status":4,"creator":{"id":"107955","secUid":"MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM","displayName":"TikTok","followers":95001558,"following":0,"verified":true,"avatar":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:1080:1080.webp?dr=14579&refresh_token=fda4fb51&x-expires=1785409200&x-signature=hllLSTX4jvetwRoYU5uQBOOaWpA%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=fdd36af4&idc=my2","bio":"One TikTok can make a big impact","status":4},"room":{"id":"7665499080323353358","streamId":"3578537941258994614","status":4,"title":"In the Mix LIVE with Josh Groban","startedAt":"2026-07-22T23:32:31.000Z","totalEnterCount":74810,"coverUrl":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:720:720.webp?dr=14579&refresh_token=e000a24d&x-expires=1785409200&x-signature=51yzrCy7oc%2Bx3QXPywEmNE7foSU%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=fdd36af4&idc=my2","liveSubOnly":false,"gameTagId":0,"liveRoomMode":1,"paidEvent":{"eventId":7655031505395122000,"paidType":0},"streamUrls":["https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.m3u8?expire=1786446578&sign=f25ce1f7dc0090406b4ce9dd93404abf","https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d"],"streamQualities":[{"quality":"hd","codec":"h264","resolution":"960x540","bitrate":1200000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd.flv?expire=1786446578&sign=4e2983d0d512266f6557d5f7aabe8532","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.m3u8?expire=1786446578&sign=f25ce1f7dc0090406b4ce9dd93404abf","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d"},{"quality":"uhd","codec":"h264","resolution":"1280x720","bitrate":1800000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd.flv?expire=1786446578&sign=9ca252292b4a32583d2a4fcb721ff555","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.m3u8?expire=1786446578&sign=2a607ea575457021435a891b4643e17c","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047"}],"streams":{"hd":{"codec":"h264","resolution":"960x540","bitrate":1200000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd.flv?expire=1786446578&sign=4e2983d0d512266f6557d5f7aabe8532","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.m3u8?expire=1786446578&sign=f25ce1f7dc0090406b4ce9dd93404abf","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_hd/index.mpd?expire=1786446578&sign=0366e791f991487f9c5aaa22382b596d"},"uhd":{"codec":"h264","resolution":"1280x720","bitrate":1800000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd.flv?expire=1786446578&sign=9ca252292b4a32583d2a4fcb721ff555","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.m3u8?expire=1786446578&sign=2a607ea575457021435a891b4643e17c","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_uhd/index.mpd?expire=1786446578&sign=7f9fe4060d52362c260ba310c4a79047"},"sd":{"codec":"h264","resolution":"960x540","bitrate":800000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd.flv?expire=1786446578&sign=861979ee452b5d3894b3c02920bd96ca","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd/index.m3u8?expire=1786446578&sign=2b0c3c0cea33b5b1c1f16b3cc1522c2b","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd/index.mpd?expire=1786446578&sign=54f12793a9b2ec076d77333e3f87eeb7","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_sd/index.mpd?expire=1786446578&sign=54f12793a9b2ec076d77333e3f87eeb7"},"ld":{"codec":"h264","resolution":"640x360","bitrate":600000,"flv":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld.flv?expire=1786446578&sign=33fed68846450e6976f0c3be345a75f9","hls":"https://pull-hls-f16-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld/index.m3u8?expire=1786446578&sign=d8bfbecab958947a7b8ca5f9bf37b3b7","cmaf":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld/index.mpd?expire=1786446578&sign=00541c1a83a5cd336565ffe7a33f51cf","dash":"https://pull-f5-tt01.tiktokcdn.com/activity/stream-3578537941258994614_ld/index.mpd?expire=1786446578&sign=00541c1a83a5cd336565ffe7a33f51cf"}}}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok/popular-creators":{"get":{"operationId":"tiktok_popular_creators","tags":["TikTok"],"summary":"TikTok Popular Creators API","description":"Creative Center creators + createTime / bioLinkRisk / ttSeller hydrate for partnership vetting.\n\nPrimary source: TikTok Creative Center creator chart with official interact rate (engagementRateBasis=creative_center) plus rankDiff. Each creator is profile-hydrated with createTime / createTimeUnix (account age — the #1 bot signal), bioLinkRisk, ttSeller, and contact{emails,links} when present — so Creator Verification and Partnership Qualification actually work. Falls back to the For You feed, then a slower fallback path. sort=follower|engagement|popularity. Flat 2 credits on Creative Center / FYP native. Pass cacheMaxAge=1d|3d|7d|14d|30d for freshness-tolerant caching.\n\nDocs: https://captapi.com/apis/tiktok-popular-creators","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code. Default US.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"sort","in":"query","required":false,"description":"follower, engagement, or popularity. Default follower.","schema":{"type":"string","pattern":"^(follower|engagement|popularity)$","default":"follower"}},{"name":"follower_count","in":"query","required":false,"description":"Optional range on the For You / fallback path: 10k-100k, 100k-1m, 1m-10m, >10m.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Creative Center page (default 1).","schema":{"type":"integer","maximum":20,"minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Creative Center creators + createTime / bioLinkRisk / ttSeller hydrate for partnership vetting.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"sort":{"type":"string","description":"Sort. Example: \"follower\"."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"creators":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"followers":{"type":"integer","description":"Follower count."},"engagementRate":{"type":"number","description":"Engagement rate. Meaning depends on engagementRateBasis — never compare values across different bases. Post/compare analytics: interactions/views (ratio 0–1+). TikTok popular-creators: Creative Center interact rate (percent) or avgLikesPerVideo/followers × 100."},"likes":{"type":"integer","description":"Like count (number)."},"videos":{"type":"integer","description":"Videos related to this result — meaning depends on the endpoint (integer count vs typed asset list). Prefer the field note on this page."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"rank":{"type":"integer","description":"Rank position in the list."},"engagementRateBasis":{"type":"string","description":"Canonical formula key for engagementRate: interactions/views (post analytics) | creative_center | avgLikesPerVideo/followers."},"region":{"description":"Region or country code for this result (meaning depends on the endpoint — market vs creator home)."},"avgViews":{"description":"Average views across the sampled For You videos that surfaced this creator."},"contact":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"}},"links":{"type":"array","items":{}}}}}}}}}}},"example":{"success":true,"data":{"platform":"tiktok","country":"US","sort":"follower","totalReturned":2,"creators":[{"username":"katseyeworld","displayName":"KATSEYE","url":"https://www.tiktok.com/@katseyeworld","bio":"welcome to KATSEYE world 🌐\nAnimal out now\nWILD out august 14","followers":19507494,"engagementRate":4.1314,"likes":1053364775,"videos":1307,"verified":true,"profileImage":"https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/fc2aacc9ec77e5e3290fbfda46e40cd2~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=fdad94e0&x-expires=1785409200&x-signature=jNHL5Y3uuYeocjKv709yl4MyWG8%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","rank":1,"engagementRateBasis":"avgLikesPerVideo/followers","region":null,"avgViews":null},{"username":"samaraispinkk","displayName":"Secret","url":"https://www.tiktok.com/@samaraispinkk","bio":"I am pink diva mermaid queen and Samara \n💌- Samara@tiddle.io\nSnap is lit","followers":6173962,"engagementRate":6.5222,"likes":548849706,"videos":1363,"verified":false,"profileImage":"https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/a5efb96291b21db624033e417de1efc9~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=0982d22c&x-expires=1785409200&x-signature=Wu213hPipMQFhk3VhLFyRMdq7D4%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8","rank":2,"engagementRateBasis":"avgLikesPerVideo/followers","region":null,"avgViews":null,"contact":{"emails":["Samara@tiddle.io"],"links":[]}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/transcript":{"get":{"operationId":"instagram_transcript","tags":["Instagram"],"summary":"Instagram Transcript API","description":"Turn any Instagram Reel's speech into text — the full transcript plus timestamped segments, ready for search, subtitles, or AI pipelines.\n\nSend a Reel URL and the Instagram Transcript API returns everything spoken in the video as clean text: the full transcript, timestamped segments (start time and duration for each line), and word count. Auto-detects the spoken language, or pass an optional language code (like 'tr' or 'en') to pin it — recommended for short clips. A photo or photo carousel is 422 not_a_video (retryable false, 0 credits) with suggestedEndpoint /v1/instagram/details — not a 502. Mixed carousels transcribe a video slide; img_index selects that slide when present. Great for making Reels searchable, generating subtitles, feeding AI tools, or turning video into text. No Instagram login or OAuth required. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/instagram-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram Reel URL, e.g. https://instagram.com/reel/ID/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string","minLength":2,"maxLength":5}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Turn any Instagram Reel's speech into text — the full transcript plus timestamped segments, ready for search, subtitles, or AI pipelines.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"language":{"type":"string","description":"Detected or requested language code."},"text":{"type":"string","description":"Full transcript — segment texts joined with a single space. Same key as YouTube/Rumble transcript endpoints."},"segments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Full transcript — segment texts joined with a single space. Same key as YouTube/Rumble transcript endpoints."},"startMs":{"type":"integer","description":"Start ms. Example: 0."},"endMs":{"type":"integer","description":"End ms. Example: 4640."}}}}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://www.instagram.com/p/DZFsjH9E3gK/","language":"en","text":"Can you guess where we are? We're about to unveil the seven natural wonders of America. Look how close we are. This is amazing. From a geologist standpoint, globally, this is geology and action that is all-inspiring. The touch is something very human. There are myths, there are legends, there are important stories that hold a sacred dish if you will. It's absolutely beautiful. And you just see how lush the vegetation is. There's such a diverse ecosystem. It's incredible. We're having so much fun about to unveil the seven natural wonders of America, just in time for the Fourth of July. Absolutely. You'll see this on ABC National Geographic in NatGeo.com. So guess where we are, comment and let us know what you think and we'll see you on Independence Day. And keep exploring.","segments":[{"text":"Can you guess where we are? We're about to unveil the seven natural wonders of America.","startMs":0,"endMs":4640},{"text":"Look how close we are. This is amazing. From a geologist standpoint,","startMs":5920,"endMs":10640},{"text":"globally, this is geology and action that is all-inspiring. The touch is something very human.","startMs":10640,"endMs":15680},{"text":"There are myths, there are legends, there are important stories that hold a sacred","startMs":16240,"endMs":21600},{"text":"dish if you will. It's absolutely beautiful. And you just see how lush the vegetation is. There's","startMs":21600,"endMs":25840},{"text":"such a diverse ecosystem. It's incredible. We're having so much fun about to unveil the seven","startMs":25840,"endMs":33120},{"text":"natural wonders of America, just in time for the Fourth of July. Absolutely. You'll see this on","startMs":33120,"endMs":37680},{"text":"ABC National Geographic in NatGeo.com. So guess where we are, comment and let us know what you think","startMs":37680,"endMs":43440}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/summarize":{"get":{"operationId":"instagram_summarize","tags":["Instagram"],"summary":"Instagram Summarizer API","description":"Get an AI summary of any Instagram Reel — a short paragraph plus key points, without watching the video.\n\nSend a Reel URL and the Instagram Summarizer API transcribes the video and returns an AI-written summary as clean JSON: a concise paragraph plus a list of key points. Pass an optional language code (like 'tr') to pin the speech language and get the summary in that language — otherwise it auto-detects and summarizes in English. Perfect for content research at scale, briefing tools, and AI agents that need to understand video content without processing media. No Instagram login, no OAuth, and no infrastructure to maintain on your side. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/instagram-summarizer","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram Reel URL, e.g. https://instagram.com/reel/ID/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"ISO code, e.g. \"tr\": pins the speech language and sets the summary output language. Defaults to auto-detect + English summary.","schema":{"type":"string","minLength":2,"maxLength":5}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":4,"label":"4 credits","billedOnCacheHit":false},"x-one-liner":"Get an AI summary of any Instagram Reel — a short paragraph plus key points, without watching the video.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"summary":{"type":"string","description":"AI-generated summary of the content."},"keyPoints":{"type":"array","items":{"type":"string"},"description":"The most important takeaways."},"topics":{"type":"array","items":{"type":"string"},"description":"Detected topics and themes."},"sentiment":{"type":"string","description":"Overall tone (positive, neutral, negative)."}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://www.instagram.com/garyvee/reel/DMpuiXeubFY/","summary":"The speaker emphasizes the importance of self-worth and the belief that everyone has the potential to become significant. They encourage listeners to recognize their own value and to fight for their happiness, suggesting that negative influences from others can diminish one's self-esteem. By surrounding oneself with positivity and cutting out pessimistic influences, individuals can foster a more optimistic outlook on life. The message is ultimately one of empowerment, urging people to acknowledge their worth and strive for personal fulfillment.","keyPoints":["Everyone has the potential to be significant and should recognize their own value.","Negative voices from others can impact self-esteem; it's important to challenge them.","Fighting for happiness is essential and requires active effort.","Surrounding oneself with positivity can lead to a more optimistic mindset.","Cynicism and overanalysis can negatively affect mental well-being.","Being a good person and genuinely trying is commendable and valuable."],"topics":["self-worth","happiness","positivity","optimism","mental health","empowerment"],"sentiment":"positive"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/details":{"get":{"operationId":"instagram_details","tags":["Instagram"],"summary":"Instagram Post & Reel Details API","description":"Get an Instagram post, Reel or carousel — caption, likes, comments, views, media URLs, author, and per-slide children on carousels.\n\nPaste an Instagram post or Reel URL and get the item as clean JSON: caption, like and comment counts, media URLs, author profile, duration when it is a Reel, and publish date (ISO 8601 with milliseconds). postType is customer vocabulary — image | video | carousel (never Meta's internal \"Sidecar\"). productType is clips | feed | carousel (carousel_container is normalized). On Reels, engagement.views is the canonical play count when the media object exposes it, and viewsSource is instagram|facebook whenever views is set. Every present counter carries a precision flag (likesIsApproximate / commentsIsApproximate / viewsIsApproximate — false: Instagram counts are exact integers). Carousels omit durationSeconds, engagement.views, viewsIsApproximate, and children[].videoUrl on image slides — the same rule as views that do not apply. Carousels ship mediaCount plus children[] with per-slide id / mediaType / thumbnailUrl / videoUrl. mediaUrlsExpireAt is the earliest Instagram CDN oe= stamp (typically ~5 days) across media URLs. previewComments is Instagram's embedded preview (usually 2); previewCommentsTruncated is true when engagement.comments is larger — it does not point at /v1/instagram/comments (that path used to return the same preview after a billed hang). Slim preview authors omit avatar/verified — those keys are null, never fabricated false. A 200 is the post only — no source / stages / timings. Fetch is GraphQL first, then the public embed card; if GraphQL misses, a fallback path starts in parallel (55s deadline), so a login-wall window does not 502 just because the fallback never ran. A definitive miss is reason not_found | private | deleted (404, retryable false — fix the URL); a fallback \"Post does not exist\" verdict maps to not_found too, so deleted Reels stop cycling as retryable 502s. A timeout/login-wall cascade is fetch_exhausted (502, retry later). A resolved but hollow body is empty_payload (502, retryable). A public embed/og card is a 200 even when later paths miss. 404/502 are 0 credits. Flat 1 credit on a 200. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/instagram-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram post or reel URL, e.g. https://instagram.com/reel/ID/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Get an Instagram post, Reel or carousel — caption, likes, comments, views, media URLs, author, and per-slide children on carousels.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"postType":{"type":"string","description":"Content type. YouTube community: \"text\" | \"image\" | \"poll\" | \"video\" | \"playlist\" | \"quiz\". Instagram: \"image\" | \"video\" | \"carousel\"."},"productType":{"type":"string","description":"Instagram surface: \"clips\" (Reel), \"feed\" (in-feed video/photo), or \"carousel\". Meta's carousel_container token is normalized to carousel."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description text."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"description":"Reel length in seconds. Omitted on carousels and still images — there is no duration to report."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."}}},"engagement":{"type":"object","properties":{"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count."}}},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{"type":"string"},"description":"Accounts mentioned in the text."}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://www.instagram.com/p/DbYaLffE2DD/","id":"DbYaLffE2DD","postType":"Sidecar","productType":"carousel_container","caption":"Suit up!\n\nThese photos show NASA astronaut candidates @astro_fuhrmann and @astro_lawler preparing for their training flights aboard a high-flying WB-57 aircraft. These high-altitude flights train astronaut candidates to operate in tight spaces while wearing a pressure suit—a feat that prepares them for missions to the @ISS, Moon, or beyond.\n\nWhy are pressure suits necessary? The two main bodily dangers of high altitude are extremely thin air and low oxygen. Pressure suits counteract those dangers and make it possible to survive if something goes wrong in the aircraft.\n\nCredit: NASA\n\n#NASA #FlightSuit #Aircraft","description":"Suit up!\n\nThese photos show NASA astronaut candidates @astro_fuhrmann and @astro_lawler preparing for their training flights aboard a high-flying WB-57 aircraft. These high-altitude flights train astronaut candidates to operate in tight spaces while wearing a pressure suit—a feat that prepares them for missions to the @ISS, Moon, or beyond.\n\nWhy are pressure suits necessary? The two main bodily dangers of high altitude are extremely thin air and low oxygen. Pressure suits counteract those dangers and make it possible to survive if something goes wrong in the aircraft.\n\nCredit: NASA\n\n#NASA #FlightSuit #Aircraft","publishedAt":"2026-07-29T15:12:56Z","durationSeconds":null,"thumbnailUrl":"https://scontent-cdg6-1.cdninstagram.com/v/t51.82787-15/759146473_18631780879049152_2448145103133242635_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=1&ig_cache_key=Mzk1MjAyMzc0MDE1ODgxNjA1Ng%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTQ0MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=BPWQAJMWpuwQ7kNvwGdQP1J&_nc_oc=AdpoHH53slN9fDJSer4UjuFXtie2IU4sLFlWgiGTWkMWn-EWgJmycNqbEl-vSfl9oio&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-cdg6-1.cdninstagram.com&_nc_gid=1yBugmDENcLlZjn1A6HEwA&_nc_ss=7a22e&oh=00_AQBHLNkf4idtmygEvZN9hi2njvz2sW_xF8-tUE-yiJHOBw&oe=6A701485","videoUrl":null,"author":{"username":"nasa","displayName":"NASA","url":"https://instagram.com/nasa","verified":true,"profileImage":"https://scontent-cdg6-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-cdg6-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gG0njRcG3R5cIO9GnRRbYfsbfpvVHqGuePg7pDchBmh38Bj_6EQCeIjnFgc-p5lkTA&_nc_ohc=sUQGBsPKUTMQ7kNvwFOpZpy&_nc_gid=1yBugmDENcLlZjn1A6HEwA&edm=AOmX9WgBAAAA&ccb=7-5&oh=00_AQA7UnNpNR2oyCzn_iZJwhJgHlzakMt5b8t3btT6ne2AUA&oe=6A701229&_nc_sid=bfaa47"},"engagement":{"likes":34510,"comments":178},"hashtags":["NASA","FlightSuit"],"mentions":["astro_fuhrmann","astro_lawler"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/comments":{"get":{"operationId":"instagram_comments","tags":["Instagram"],"summary":"Instagram Post Comments API","description":"Session-paged Instagram comments — a logged-out 2-row preview of a larger thread is 503 SESSION_UNAVAILABLE at 0 credits.\n\nSend a post or Reel URL. A live session pages api/v1/media/{pk}/comments and returns nextCursor with likeCount / publishedAt / replyCount / authorAvatarUrl. Logged-out Polaroid only embeds ~2 preview rows: when totalAvailable is larger that is 503 SESSION_UNAVAILABLE (retryable, 0 credits) — not a billed sample of 0.06% of the thread. hasMore is true when nextCursor is set, or when more exist and cannot be paged (hasMore true, nextCursor null, truncatedReason set — same catalogue rule as tiktok/trending-feed). totalAvailable is the post's comment count (same figure as engagement.comments on /instagram/details). A complete 2-comment thread is still a 200. cached is always keyed. Dead session cookies are dropped from the pool on the request path (the health cron also probes). Hard 110s deadline: timeout is 502 UPSTREAM_UNAVAILABLE at 0 credits. Billing scales with results on a full page (~0.9/comment, 2-credit floor). Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/instagram-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram post or reel URL, e.g. https://instagram.com/reel/ID/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Billed per result.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from the previous nextCursor ({mediaPk}:{minId}). Omit on the first page. hasMore is true when nextCursor is set, or when more exist and cannot be paged (nextCursor null + truncatedReason).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":45,"perResult":0.9,"label":"~45 credits (0.9/result)","billedOnCacheHit":false},"x-one-liner":"Session-paged Instagram comments — a logged-out 2-row preview of a larger thread is 503 SESSION_UNAVAILABLE at 0 credits.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Comments in this response."},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"author":{"type":"string","description":"Author name or handle."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"authorIsVerified":{"type":"boolean","description":"Whether the author is verified."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."}}}}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://www.instagram.com/p/DZFqdAxlkUG/","totalReturned":2,"comments":[{"id":"17928720258124446","url":"https://www.instagram.com/p/DZFqdAxlkUG/c/17928720258124446","text":"❤️❤️❤️❤️","author":"giulianagrichetta","authorAvatarUrl":"https://scontent-atl3-1.cdninstagram.com/v/t51.82787-19/728156182_18607734223047509_7404583005739996663_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=100&ccb=7-5&_nc_sid=f7ccc5&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=cGoAOlkd3_cQ7kNvwH3cesI&_nc_oc=AdoV430X7wZK1hp5x9HI0Hg267Kf8LmyXB11Ej7I4nXePNxGKZduI8DcOoBp0IN0ER4&_nc_zt=24&_nc_ht=scontent-atl3-1.cdninstagram.com&_nc_gid=P5Abwq2UvTMDXokKzG45Jg&_nc_ss=72a8c&oh=00_AQBT4Z-zQV-Z89Kd0BKVNmhs_-iOYakXFRvy-kMFVfLWsA&oe=6A4DA794","authorIsVerified":false,"publishedAt":"2026-07-01T07:49:55.000Z"},{"id":"18083281052356825","url":"https://www.instagram.com/p/DZFqdAxlkUG/c/18083281052356825","text":"Hoppers moment","author":"redkidane","authorAvatarUrl":"https://scontent-atl3-3.cdninstagram.com/v/t51.82787-19/686139918_18580722691039268_2096250779414967342_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=111&ccb=7-5&_nc_sid=f7ccc5&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=5ruLx7cECMUQ7kNvwEw883n&_nc_oc=Adp-jPSBc0mkti93nI0FR-bBBq_hLclzrrRqC70JO7HsI47RMZeVJF159wD-BivgyvM&_nc_zt=24&_nc_ht=scontent-atl3-3.cdninstagram.com&_nc_gid=P5Abwq2UvTMDXokKzG45Jg&_nc_ss=72a8c&oh=00_AQD-UwNDAfkrNje1f_2dMoh9ax8alu8E-J44od76mYrB5g&oe=6A4DA11B","authorIsVerified":false,"publishedAt":"2026-06-24T23:45:01.000Z"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/channel-details":{"get":{"operationId":"instagram_channel_details","tags":["Instagram"],"summary":"Instagram Channel Details API","description":"Instagram profile stats — fixed key set (null fillers), fbid, bioLinks, isBusinessAccount, approx flags.\n\nSend a profile URL or @handle and get clean JSON with a fixed key set on every profile (absent → null, never a missing key): platform, url, id, fbid, username, displayName, bio, bioLinks, followers, following, postCount, verified, avatar, imageExpiresAt, externalUrl, isPrivate, isBusinessAccount, followersIsApproximate, followingIsApproximate, postCountIsApproximate, fetchedAt. Twin aliases handle/name/profileImage and the duplicate profileImageHd key are not emitted — avatar is the single best profile-pic URL (CDN size token upgraded when Instagram only ships s150x150). Approx flags are derived from the source (true when a count came from a K/M/B display string such as og:description \"32K\"). Flat 1 credit. Cold path races WPI/GraphQL/HTML; hard cap 110s → 502, 0 credits. Pass cache / cacheMaxAge for the profile trust layer.\n\nDocs: https://captapi.com/apis/instagram-channel-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram profile URL, @handle, or username, e.g. https://instagram.com/username/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Instagram profile stats — fixed key set (null fillers), fbid, bioLinks, isBusinessAccount, approx flags.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"externalUrl":{"type":"string","description":"Website / link-in-bio URL when present."}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://instagram.com/natgeo","username":"natgeo","displayName":"National Geographic","bio":"Step into wonder and find your inner explorer with National Geographic 🌎","followers":268924266,"following":194,"postCount":32000,"verified":true,"profileImage":"https://scontent-lax3-2.cdninstagram.com/v/t51.82787-19/683576066_18653628823019133_9051036240972105113_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=7-5&_nc_sid=f7ccc5&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy40MDAuQzMifQ%3D%3D&_nc_ohc=T9at3Sd9hNMQ7kNvwHW6BNA&_nc_oc=AdqYT-U_nmEkwIsAAOAVybbiWymNfhdptkU4i18fyBief1CYmoYniQgdmQaUbF338is&_nc_zt=24&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_gid=vK6lnBdGmpQYun0GLPQkMw&_nc_ss=7d689&oh=00_AQAdMXXEL-J8d2FGFzWtWgqSRdOkYJ2EUNLzCnb4SBTiMw&oe=6A7007EB","externalUrl":"http://visitstore.bio/natgeo"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/channel-posts":{"get":{"operationId":"instagram_channel_posts","tags":["Instagram"],"summary":"Instagram Channel Posts API","description":"Latest posts from a public Instagram profile — carousel children[], mediaCount, user{} in one call.\n\nSend a profile URL or @handle and get recent posts as JSON plus a top-level user{} profile block (id, username, displayName, url, verified, followers, avatar, isPrivate) so you do not need a second channel-details call. Profile URLs are always https://www.instagram.com/{username}/ (www + trailing slash) on the envelope, user{}, and author{}. Each item includes postType / productType (image/feed, video/clips, carousel — productType is clips | feed | carousel; Meta's carousel_container is normalized), caption (not a duplicated description), mediaCount (1 for singles; children.length when carousel expansion ran; null on carousel when slides were not expanded — never a fabricated 1), and children[] (per-slide id / mediaType / thumbnailUrl / videoUrl — [] on non-carousels and on unexpanded carousels). Cover thumbnailUrl is the first slide; carousel cover videoUrl stays null — video slides live in children[]. Also likes, comments, and on videos: durationSeconds, hasAudio, music{}, isAd / isAffiliate / isPaidPartnership when Instagram exposes them. accessibilityCaption when Instagram provides alt-text (backfilled from the api/v1 feed overlay — populated e.g. on @instagram/DbbY9pdm6Q2; still often null on nasa/natgeo). Envelope always includes the same keys on both paths: user / userId (null when unknown), degraded, degradedReason (null when healthy; extended, extended-timeout, or extended-timeout-served-stale when soft-fail). The fallback path is hard-capped at ~105s; on timeout we serve the last cached page for that profile (degradedReason=extended-timeout-served-stale + cachedAt) when one exists, else an empty extended-timeout page — never a gateway timeout. Metrics: engagement.views + viewsSource on videos. Cursor pagination via nextCursor + hasMore. Billing ceil(n × 0.3); empty and labelled-stale timeout responses are 0 credits. Pass cache=true for the 24h shared cache (successful fetches always refresh it). Set client timeouts ≥130s.\n\nDocs: https://captapi.com/apis/instagram-channel-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram profile URL, @handle, or username, e.g. https://instagram.com/username/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (e.g. 3937014945555313553_1697296). A null nextCursor means the end of the list.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":6,"perResult":0.3,"label":"~6 credits (0.3/result)","billedOnCacheHit":false},"x-one-liner":"Latest posts from a public Instagram profile — carousel children[], mediaCount, user{} in one call.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this posts item."},"postType":{"type":"string","description":"Content type. YouTube community: \"text\" | \"image\" | \"poll\" | \"video\" | \"playlist\" | \"quiz\". Instagram: \"image\" | \"video\" | \"carousel\"."},"productType":{"type":["string","null"],"description":"Platform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description of this posts item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer"},"verified":{"type":"boolean"},"profileImage":{"type":"string"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":["integer","null"]},"likes":{"type":"integer"},"comments":{"type":"integer"},"viewsInstagram":{"type":"integer"},"viewsFacebook":{"type":"integer"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{"type":"string"},"description":"Accounts mentioned in the text."}}}},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."}}}}},"example":{"success":true,"data":{"url":"https://www.instagram.com/nasa/","totalReturned":2,"posts":[{"platform":"instagram","url":"https://www.instagram.com/reel/DbYmqpplO_N/","id":"3952078729724096461","postType":"Video","productType":"clips","caption":"The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026","description":"The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026","publishedAt":"2026-07-29T17:02:45Z","thumbnailUrl":"https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/760192799_18631809481049152_7782886010573196119_n.jpg?stp=dst-jpg_e15_tt6&_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=104&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=NLXhSIvSAE8Q7kNvwG7hHBp&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQAOYlO_MiU0ymVZP-LUmVyzq1Qfu0qndl3JUXVB6LqVwA&oe=6A6FEEDB&_nc_sid=8b3546","videoUrl":"https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQOkpXQA9C2FhMuyAbNvepC6OP6PrkitJW3nqH3dhIDVm7lu82BvCIZApUA5L2uZr02DWsYDPOvZUymd3s8Q5RQJ_i1Bkk9Qx3VnTwk.mp4?_nc_cat=111&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=DqUQRmuNQ38Q7kNvwEf3m2C&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MzE4MDkzMTAwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6NDQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=d63b773f9b2109a6&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9ENjQ4OTVCRTVEN0I2MDc3MzFGQkNDNUI1MjZDN0RCMl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzlBNDA3ODFBQjMyMTkwODU4OTg3RTNFRUYzNUJBMkE4X2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaAjpb3hOKYQhUCKAJDMywXQEZnztkWhysYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&_nc_ss=7a22e&_nc_zt=28&oh=00_AQDrxCQWJjYdJ_A1wP9NAqwnYMpcGLVAhJP0LpoE3AyyTg&oe=6A6C1F8C","author":{"username":"nasa","displayName":"NASA","url":"https://instagram.com/nasa","followers":104263202,"verified":true,"profileImage":"https://scontent-lga3-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=sUQGBsPKUTMQ7kNvwEjppQT&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQABrOC8fhriT4lnoxQ6_A9newYDo18-mqvkuOv21yGkUQ&oe=6A701229&_nc_sid=8b3546"},"engagement":{"views":51078,"likes":10645,"comments":149,"viewsInstagram":40862,"viewsFacebook":10216},"hashtags":["NASA","Sun"],"mentions":[]},{"platform":"instagram","url":"https://www.instagram.com/p/DbYaLffE2DD/","id":"3952023811948503235","postType":"Sidecar","productType":null,"caption":"Suit up!\n\nThese photos show NASA astronaut candidates @astro_fuhrmann and @astro_lawler preparing for their training flights aboard a high-flying WB-57 aircraft. These high-altitude flights train astronaut candidates to operate in tight spaces while wearing a pressure suit—a feat that prepares them for missions to the @ISS, Moon, or beyond.\n\nWhy are pressure suits necessary? The two main bodily dangers of high altitude are extremely thin air and low oxygen. Pressure suits counteract those dangers and make it possible to survive if something goes wrong in the aircraft.\n\nCredit: NASA\n\n#NASA #FlightSuit #Aircraft","description":"Suit up!\n\nThese photos show NASA astronaut candidates @astro_fuhrmann and @astro_lawler preparing for their training flights aboard a high-flying WB-57 aircraft. These high-altitude flights train astronaut candidates to operate in tight spaces while wearing a pressure suit—a feat that prepares them for missions to the @ISS, Moon, or beyond.\n\nWhy are pressure suits necessary? The two main bodily dangers of high altitude are extremely thin air and low oxygen. Pressure suits counteract those dangers and make it possible to survive if something goes wrong in the aircraft.\n\nCredit: NASA\n\n#NASA #FlightSuit #Aircraft","publishedAt":"2026-07-29T15:12:56Z","thumbnailUrl":"https://scontent-lga3-1.cdninstagram.com/v/t51.82787-15/759146473_18631780879049152_2448145103133242635_n.jpg?stp=dst-jpg_e35_s1080x1080_sh2.08_tt6&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=nvbF_-MRTWYQ7kNvwE_MszZ&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQBJhJwZzwhl7hvGpLhh1jBk2dWyz3xAd05kIR1XwonMrg&oe=6A701485&_nc_sid=8b3546","author":{"username":"nasa","displayName":"NASA","url":"https://instagram.com/nasa","followers":104263202,"verified":true,"profileImage":"https://scontent-lga3-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=sUQGBsPKUTMQ7kNvwEjppQT&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQABrOC8fhriT4lnoxQ6_A9newYDo18-mqvkuOv21yGkUQ&oe=6A701229&_nc_sid=8b3546"},"engagement":{"likes":34106,"comments":177,"views":null},"hashtags":["NASA","FlightSuit"],"mentions":["astro_fuhrmann","astro_lawler"]}],"nextCursor":"3947740140450436425_528817151","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/channel-reels":{"get":{"operationId":"instagram_channel_reels","tags":["Instagram"],"summary":"Instagram Channel Reels API","description":"Latest Reels from a public Instagram profile — pass userId to skip resolve; ceil(n×0.3) credits; nextCursor + hasMore.\n\nSend a profile URL/@handle or a numeric userId and get that account's recent Reels (videos only) plus a top-level user{} profile block (id, username, displayName, url, verified, followers, avatar, isPrivate) so you do not need a second channel-details call. Prefer userId when you already have it (from basic-profile or profile-search) — it skips handle→ID resolve (the old sequential path alone could cost ~80s; url/@handle now uses the same raced resolver as profile-search). instagram.com/handle/ and instagram.com/@handle/ both parse. Each Reel includes videoUrl, thumbnailUrl, caption (not a duplicated description), likes, comments, duration (decoded from the CDN efg blob when the mapper had none), publish date, coauthors[], and split CDN expiry — videoUrlExpiresAt (~1.5d, the tight window) and thumbnailUrlExpiresAt (~4d), never collapsed to one min. reels[].author is the clip owner — the clips tab includes collabs; coauthors[] names the partners, so a reel authored by a collaborator still shows the queried channel there. Read data.user for the requested account — user.id / userId / displayName are lifted from matching reel authors when handle→ID resolve missed (extended path), never from a collab first row. Envelope: requested + totalReturned, and two clocks — fetchedAt is when the data came from Instagram, servedAt is when we handed it over; on a stale last-good page (stale + cached) the gap is the data's age, fetchedAt is never restamped to the request time. Billing is ceil(n × 0.3) credits on the returned reel count (17 → 6, 5 → 2), including a labelled last-good page after a live miss. Metrics when Instagram exposes them: engagement.views + viewsSource; likes:null never ships next to likeAndViewCountsDisabled:false (an unread count makes the flag null — unknown, not a claim). Cursor pagination via nextCursor; hasMore is true until the end of the list, and null on a degraded page (unknown — never a false end). Several fetch paths run in parallel until the 100s wall; the first with reels wins. A 6h last-good page is served stale when live paths miss. A miss with no snapshot is 502 UPSTREAM_UNAVAILABLE at 0 credits. A deleted / renamed / banned account is a non-retryable 404 PROFILE_NOT_FOUND decided at resolve time — never a retryable 502 that sends pollers into all-day loops on a dead handle. Pass cache=true for the 24h shared cache (0 credits on hit).\n\nDocs: https://captapi.com/apis/instagram-channel-reels","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":false,"description":"Instagram profile URL, @handle, or username. Omit when userId is set. The URL platform must match this endpoint's platform.","schema":{"type":"string"}},{"name":"userId","in":"query","required":false,"description":"Instagram numeric user ID (e.g. 173560420). Skips handle→ID resolve (legacy sequential WPI alone could cost ~80s). Prefer when you already have the ID from basic-profile or profile-search.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass nextCursor from the previous response (clips:{userId}:{opaque} on the native Reels path, or legacy {mediaId}_{userId}). Stop when hasMore is false.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":6,"perResult":0.3,"label":"~6 credits (0.3/result)","billedOnCacheHit":false},"x-one-liner":"Latest Reels from a public Instagram profile — pass userId to skip resolve; ceil(n×0.3) credits; nextCursor + hasMore.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"requested":{"type":"integer","description":"The limit you asked for — makes totalReturned readable (asked 50 got 1 vs asked 1 got 1)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"reels":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this reels item."},"shortcode":{"type":"string","description":"Instagram shortcode of the post (posts/reels only)."},"mediaId":{"type":"string","description":"Media id. Example: \"3971891348174241278\"."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Float seconds. When the mapper had no duration, decoded from the video URL's efg blob (duration_s) — no extra fetch."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"videoUrlExpiresAt":{"type":"string","description":"ISO expiry from videoUrl's signed CDN oe= (~1.5 days — the tightest window on the row). Re-pull before it lapses if you archive video."},"thumbnailUrlExpiresAt":{"type":"string","description":"ISO expiry for thumbnailUrl (~4 days). Split from videoUrlExpiresAt — one merged field would collapse both to the tighter window."},"hasAudio":{"type":"boolean","description":"Whether the video has an audio track — not \"uses a licensed library track\". A music attribution (original or licensed) implies true; upstream false next to a music object is reconciled to true."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this reels item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"followers":{"description":"Follower count.","type":["integer","null"]},"isPrivate":{"type":"boolean","description":"Whether the account is private."}},"description":"The reel's owner (post author), never the audio attribution — on original-audio reels author.username and music.artist match because original audio is credited to the poster."},"coauthors":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this reels item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string"}}},"description":"Collab partners (coauthor_producers) on this reel. A reel authored by another account with the queried channel in coauthors is Instagram's Collaborator feature putting one reel on two profiles — filter on author + coauthors, not author alone. [] when solo."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"comments":{"type":"integer"},"views":{"type":"integer"},"likesIsApproximate":{"type":"boolean"},"commentsIsApproximate":{"type":"boolean"},"viewsIsApproximate":{"type":"boolean"},"viewsSource":{"type":"string"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{"type":"string"},"description":"Accounts mentioned in the text."},"isPaidPartnership":{"type":"boolean","description":"Is paid partnership. Example: false."},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."},"isAffiliate":{"type":"boolean","description":"Whether the channel is an affiliate."},"likeAndViewCountsDisabled":{"type":"boolean","description":"True = counts hidden, false = counts shown and likes carries a number, null = unknown. likes:null next to false never ships — an unread count nulls the flag instead of claiming counts are visible."},"music":{"type":"object","properties":{"id":{"type":"string","description":"Id of this reels item."},"title":{"type":"string"},"artist":{"type":"string"},"clusterId":{},"assetId":{},"canonicalId":{},"artistId":{},"durationMs":{},"audioType":{"type":"string"},"coverUrl":{},"isTrendingInClips":{"type":"boolean"},"isExplicit":{},"hasLyrics":{}},"description":"Reel soundtrack metadata (id, type, trackTitle, albumArt) when Facebook exposes it."},"musicId":{"type":"string","description":"ID of the soundtrack used."}}}},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"userId":{"type":"string","description":"Numeric Instagram user id of the requested profile."},"user":{"type":"object","properties":{"id":{"type":"string","description":"Id of this user item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"isPrivate":{"type":"boolean","description":"Whether the account is private."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"followers":{"type":"integer","description":"Follower count."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."}}},"degraded":{"type":"boolean","description":"Degraded. Example: false."},"degradedReason":{"description":"Degraded reason."},"fetchedAt":{"type":"string","description":"When the data came from Instagram — the snapshot clock, never restamped to the request time. Null on a stale page whose snapshot predates the stamp (honest unknown)."}}}}},"example":{"success":true,"data":{"url":"https://www.instagram.com/cristiano/","requested":2,"totalReturned":2,"reels":[{"platform":"instagram","url":"https://www.instagram.com/reel/Dcgs4DvIr3u/","id":"Dcgs4DvIr3u","shortcode":"Dcgs4DvIr3u","mediaId":"3971891348174241278","caption":"CR7 Fragrances. Made to move with you. @cr7cristianoronaldo","publishedAt":"2026-08-27T16:03:11.000Z","durationSeconds":21.68,"thumbnailUrl":"https://scontent.cdninstagram.com/v/t51.71878-15/579431142_18553402342054533_2777016462962wm_n.jpg?...&oe=6AA4A207","videoUrl":"https://scontent.cdninstagram.com/o1/v/t2/f2/m86/AQOZ-XzJOT5OaiKkSWI8_rvZDNem.mp4?efg=eyJkdXJhdGlvbl9zIjogMjF9&oe=6AA0E161","videoUrlExpiresAt":"2026-09-09T04:32:33Z","thumbnailUrlExpiresAt":"2026-09-12T04:51:19Z","hasAudio":true,"author":{"id":"1421738679","username":"cr7cristianoronaldo","displayName":"CR7 Fragrances","url":"https://www.instagram.com/cr7cristianoronaldo/","verified":true,"avatar":"https://scontent.cdninstagram.com/v/t51.2885-19/324775217_1234.jpg?...","followers":null,"isPrivate":false},"coauthors":[{"id":"173560420","username":"cristiano","displayName":"Cristiano Ronaldo","url":"https://www.instagram.com/cristiano/","verified":true,"profileImage":"https://scontent.cdninstagram.com/v/t51.2885-19/472007201_n.jpg?..."}],"engagement":{"likes":1658553,"comments":20928,"views":50204153,"likesIsApproximate":false,"commentsIsApproximate":false,"viewsIsApproximate":false,"viewsSource":"instagram"},"hashtags":[],"mentions":["cr7cristianoronaldo"],"isPaidPartnership":false,"isAd":false,"isAffiliate":false,"likeAndViewCountsDisabled":false,"music":{"id":"28202524666022877","title":"Original audio","artist":"cr7cristianoronaldo","clusterId":null,"assetId":null,"canonicalId":null,"artistId":null,"durationMs":null,"audioType":"original_sounds","coverUrl":null,"isTrendingInClips":false,"isExplicit":null,"hasLyrics":null},"musicId":"28202524666022877"},{"platform":"instagram","url":"https://www.instagram.com/reel/DaU63nnAkoo/","id":"DaU63nnAkoo","shortcode":"DaU63nnAkoo","mediaId":"3933027283400542760","caption":"Toronto ❤️","publishedAt":"2026-07-03T10:18:59.000Z","durationSeconds":46.333,"thumbnailUrl":"https://scontent.cdninstagram.com/v/t51.82787-15/731058572_18747860116056421_n.jpg?...&oe=6AA4CEDE","videoUrl":"https://scontent.cdninstagram.com/o1/v/t2/f2/m86/AQNreyyq7N-5e2XVjCTkh7BFZ0wKTqOp.mp4?...&oe=6AA0F2A1","videoUrlExpiresAt":"2026-09-09T03:44:02Z","thumbnailUrlExpiresAt":"2026-09-12T04:14:49Z","hasAudio":true,"author":{"id":"173560420","username":"cristiano","displayName":"Cristiano Ronaldo","url":"https://www.instagram.com/cristiano/","verified":true,"avatar":"https://scontent.cdninstagram.com/v/t51.2885-19/472007201_1142000150877579_n.jpg?...","followers":679721682,"isPrivate":false},"coauthors":[],"engagement":{"likes":19495500,"comments":368088,"views":217575248,"likesIsApproximate":false,"commentsIsApproximate":false,"viewsIsApproximate":false,"viewsSource":"instagram"},"hashtags":[],"mentions":[],"isPaidPartnership":false,"isAd":false,"isAffiliate":false,"likeAndViewCountsDisabled":false,"music":{"id":"1153749292279414","title":"Original audio","artist":"cristiano","clusterId":null,"assetId":null,"canonicalId":null,"artistId":null,"durationMs":null,"audioType":"original_sounds","coverUrl":null,"isTrendingInClips":false,"isExplicit":null,"hasLyrics":null},"musicId":"1153749292279414"}],"nextCursor":"3971891348174241278_1421738679","hasMore":true,"userId":"173560420","user":{"id":"173560420","username":"cristiano","displayName":"Cristiano Ronaldo","url":"https://www.instagram.com/cristiano/","verified":true,"isPrivate":false,"avatar":"https://scontent.cdninstagram.com/v/t51.2885-19/472007201_1142000150877579_n.jpg?...","followers":679721682,"postCount":4126},"degraded":false,"degradedReason":null,"fetchedAt":"2026-09-07T18:02:44.132Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/reels-search":{"get":{"operationId":"instagram_reels_search","tags":["Instagram"],"summary":"Instagram Reels Search API","description":"Native tag feed first, slower fallback paths on a miss.\n\nSend a hashtag (without the #) and get matching Reels as clean JSON — videos only, one token. A query with spaces (travel blog) is 400 HASHTAG_HAS_SPACES — Instagram tags are a single word; nothing is fetched. The native listing runs first; a slower fallback path runs only when native listed nothing. limit max 50. A wall miss with a last-good grid returns 200 stale (0 credits, 6h) instead of 502. Envelope: source (native | extended | cache), timings{path, nativeMs, totalMs}, requested / listingHits / hydrateFailures / hydrateSkipped / totalReturned / truncatedReason. Hard 110s deadline. Optional datePosted. Flat 2 credits on a 200 with rows; empty is 0. Pass cache=true for the shared cache.\n\nDocs: https://captapi.com/apis/instagram-reels-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Hashtag without the # (min 2 characters). One token — spaces are 400 HASHTAG_HAS_SPACES.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 50). Flat 2 credits per call.","schema":{"type":"integer","maximum":50,"minimum":1,"default":20}},{"name":"datePosted","in":"query","required":false,"description":"last_24_hours | last_week | last_month | last_year (aliases: today, this_week, this_month, this_year).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Native tag feed first, slower fallback paths on a miss.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this results item."},"postType":{"type":"string","description":"Content type. YouTube community: \"text\" | \"image\" | \"poll\" | \"video\" | \"playlist\" | \"quiz\". Instagram: \"image\" | \"video\" | \"carousel\"."},"productType":{"type":"string","description":"Platform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description of this results item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"viewsInstagram":{"type":"integer"},"viewsFacebook":{"type":"integer"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{},"description":"Accounts mentioned in the text."},"isPaidPartnership":{"type":"boolean","description":"Is paid partnership. Example: false."},"isAd":{"type":"boolean","description":"Whether the item is a paid promotion."},"isAffiliate":{"type":"boolean","description":"Whether the channel is an affiliate."}}}}}}}},"example":{"success":true,"data":{"query":"travel","totalReturned":2,"results":[{"platform":"instagram","url":"https://www.instagram.com/p/DayDvvttHtI/","id":"3941229099090213704","postType":"Video","productType":"clips","caption":"🌊 Kıbrıs’ın en yeni aquaparkını keşfettim! 😍\nKaydıraklar, çocuk alanı ve yazın serinlemek için tam bir kaçış noktası. 💦☀️\n\nAquaparkın giriş ücreti, konumu için yoruma \"BİLGİ\" yazman yeterli! 📩💦\n\n📍 Kıbrıs’taki en güzel mekanlar ve keşifler için takip etmeyi unutma. \n\n#reels #viral #fyp #travel #travelreels","description":"🌊 Kıbrıs’ın en yeni aquaparkını keşfettim! 😍\nKaydıraklar, çocuk alanı ve yazın serinlemek için tam bir kaçış noktası. 💦☀️\n\nAquaparkın giriş ücreti, konumu için yoruma \"BİLGİ\" yazman yeterli! 📩💦\n\n📍 Kıbrıs’taki en güzel mekanlar ve keşifler için takip etmeyi unutma. \n\n#reels #viral #fyp #travel #travelreels","publishedAt":"2026-07-14T17:47:27.000Z","durationSeconds":12.333,"thumbnailUrl":"https://scontent-cph2-1.cdninstagram.com/v/t51.82787-15/746421066_18088964012323578_1371556212593119396_n.jpg?...","videoUrl":"https://scontent-cph2-1.cdninstagram.com/o1/v/t2/f2/m86/AQPRKXt1G6vrSNMtCD3y4roRhkZUU-SMO5R75U3-eAFEbtFGU6IzDJptEbfwWLTINTa9ZX5y-KO_OvBo4mp57r_n0PDYo7Wj368K6KU.mp4?...","author":{"username":"bencekibris","displayName":"Melisa Yıldırım","url":"https://instagram.com/bencekibris"},"engagement":{"views":37937,"likes":297,"comments":641,"viewsInstagram":30350,"viewsFacebook":7587},"hashtags":["reels","viral"],"mentions":[],"isPaidPartnership":false,"isAd":false,"isAffiliate":false},{"platform":"instagram","url":"https://www.instagram.com/p/DazJr5PBcC3/","id":"3941536697690734775","postType":"Video","productType":"clips","caption":"It’s officially Hot summer night in mid July just like miss #lanadelray said #hotsummernights #midjuly #travel","description":"It’s officially Hot summer night in mid July just like miss #lanadelray said #hotsummernights #midjuly #travel","publishedAt":"2026-07-15T03:58:01.000Z","durationSeconds":16.972,"thumbnailUrl":"https://scontent-cph2-1.cdninstagram.com/v/t51.82787-15/746042012_18609462409002256_3222197168337217329_n.jpg?...","videoUrl":"https://scontent-cph2-1.cdninstagram.com/o1/v/t2/f2/m86/AQNjviBRPVEuheQRRrMOf2adQ6sKXUyWQeRvrbuKRr3QVWU2sUiizNhM7M5gYgXUSNGk-cDMur_ViWKTYaYps7oQxcxCqohZg4xAuzw.mp4?...","author":{"username":"rammyun","displayName":"⠀⠀⠀✨Ram | 람 Lam 🌎","url":"https://instagram.com/rammyun"},"engagement":{"views":5572,"likes":378,"comments":12,"viewsInstagram":4458,"viewsFacebook":1114},"hashtags":["lanadelray","hotsummernights"],"mentions":[],"isPaidPartnership":false,"isAd":false,"isAffiliate":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/trending-reels":{"get":{"operationId":"instagram_trending_reels","tags":["Instagram"],"summary":"Instagram Trending Reels API","description":"Cache-first trending Reels.\n\nOn-demand trending Reels from Instagram's logged-out /reels Explore feed (not keyword search). Every payload carries listing: \"reels_feed\" is the feed itself; \"hashtag_clips\" means Instagram was not serving the logged-out feed (it has gone dark for every country for days at a time — 6–10 Oct 2026) and the rows are instead the current top clips for the country's hashtags (listingHashtags, e.g. india/bharat/mumbai) merged and ranked by views, with a note saying exactly that. It is a labelled stand-in, not Instagram's own trending signal — branch on listing if that distinction matters to you. Flat 2 credits on a live or cache-fresh 200 of either listing; a miss on both with a last-good snapshot is labelled stale at 0 credits (held 7 days; fetchedAt is the scrape time, servedAt the handover) and only then 502. Default cache=true is cache-first (4h per-country TTL). cache=false forces a live scrape — feed listing ~18s, Polarıs hydrate cut at 50s, then the hashtag grids (~5–10s) if the feed missed; 110s hard ceiling. Envelope: platform, country, countryCode, cached, source (native | cache), listing, requested, totalReturned, hasMore (always false — no cursor), nextCursor null, truncatedReason (hydrate_deadline | age_filter | upstream_supply | null), fetchMs / hydrateMs / totalMs, fetched / hydrated / hydrateSkipped. Each reel splits videoUrlExpiresAt / thumbnailUrlExpiresAt and flags likesIsApproximate / commentsIsApproximate. engagement.views is omitted on reels_feed rows (logged-out /reels never exposes play counts) and present on most hashtag_clips rows. limit max 50 (store caps around 24). No fallback path on this endpoint. For a live hashtag scrape of your own tag use Instagram Reels Search.\n\nDocs: https://captapi.com/apis/instagram-trending-reels","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":false,"description":"Country for Reels localization — full name or ISO code (e.g. 'United States', 'US', 'Turkey', 'TR'). Default United States. Unsupported values return 400 with supportedCountries[].","schema":{"type":"string","default":"United States"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 10, max 50). Flat 2 credits per call.","schema":{"type":"integer","maximum":50,"minimum":1,"default":10}},{"name":"cache","in":"query","required":false,"description":"Default true (cache-first): serve the per-country response cache when present (TTL 4 hours). Every successful call costs 2 credits — including cache hits. Set false to force a live scrape (measured miss 45–75s, hard-capped at 110s). Raise client timeouts above 90s — n8n/Make defaults will fail a miss. The fresh result still refreshes the cache.","schema":{"type":"boolean","default":true}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":true},"x-one-liner":"Cache-first trending Reels.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"country":{"type":"string","description":"Localized country name used for native geo (e.g. United States)."},"countryCode":{"type":"string","description":"ISO-3166 alpha-2 for the same country (e.g. US). Prefer this for joins."},"cached":{"type":"boolean","description":"true when served from the per-country response cache (4h TTL); false on a live scrape. Billing is flat 2 credits either way."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"requested":{"type":"integer","description":"The limit you asked for."},"hasMore":{"type":"boolean","description":"Always false — this Explore window has no cursor."},"nextCursor":{"description":"Always null on this endpoint."},"truncatedReason":{"description":"hydrate_deadline | age_filter | upstream_supply | null. Why totalReturned < requested."},"reels":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this reels item."},"shortcode":{"type":"string","description":"Instagram shortcode of the post (posts/reels only)."},"postType":{"type":"string","description":"Content type. YouTube community: \"text\" | \"image\" | \"poll\" | \"video\" | \"playlist\" | \"quiz\". Instagram: \"image\" | \"video\" | \"carousel\"."},"productType":{"type":"string","description":"Platform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string."},"section":{"description":"Section."},"topic":{"description":"Topic."},"caption":{"type":"string","description":"Reel caption. description is not duplicated on this endpoint."},"description":{"type":"string","description":"Description of this reels item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"description":"Always present on each reel. Float seconds (3dp) when known; null when the source omitted it."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":["integer","null"]},"likes":{"type":"integer"},"comments":{"type":"integer"},"viewsInstagram":{"type":["integer","null"]},"viewsFacebook":{"type":["integer","null"]}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{"type":"string"},"description":"Accounts mentioned in the text."}}}},"note":{"type":"string","description":"Only on listing=hashtag_clips: states that Instagram's logged-out Reels feed was unavailable (and why), that the rows are a labelled hashtag-clips stand-in ranked by views, and that they are not Instagram's own trending feed."},"cachedAt":{"type":"string","description":"Cached at. Example: \"2026-07-29T18:00:00Z\"."},"stale":{"type":"boolean","description":"Stale. Example: true."},"ageHours":{"type":"integer","description":"Age hours. Example: 32."},"source":{"description":"native on a live scrape; cache on a hit."}}}}},"example":{"success":true,"data":{"platform":"instagram","country":"United States","countryCode":"US","cached":true,"totalReturned":2,"requested":10,"hasMore":false,"nextCursor":null,"truncatedReason":null,"reels":[{"platform":"instagram","url":"https://www.instagram.com/reel/DbYmqpplO_N/","id":"3952078729724096461","shortcode":"DbYmqpplO_N","postType":"Video","productType":"clips","section":null,"topic":null,"caption":"The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026","description":"The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026","publishedAt":"2026-07-29T17:02:45Z","durationSeconds":null,"thumbnailUrl":"https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/760192799_18631809481049152_7782886010573196119_n.jpg?stp=dst-jpg_e15_tt6&_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=104&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=NLXhSIvSAE8Q7kNvwG7hHBp&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQAOYlO_MiU0ymVZP-LUmVyzq1Qfu0qndl3JUXVB6LqVwA&oe=6A6FEEDB&_nc_sid=8b3546","videoUrl":"https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQOkpXQA9C2FhMuyAbNvepC6OP6PrkitJW3nqH3dhIDVm7lu82BvCIZApUA5L2uZr02DWsYDPOvZUymd3s8Q5RQJ_i1Bkk9Qx3VnTwk.mp4?_nc_cat=111&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=DqUQRmuNQ38Q7kNvwEf3m2C&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MzE4MDkzMTAwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6NDQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=d63b773f9b2109a6&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9ENjQ4OTVCRTVEN0I2MDc3MzFGQkNDNUI1MjZDN0RCMl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzlBNDA3ODFBQjMyMTkwODU4OTg3RTNFRUYzNUJBMkE4X2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaAjpb3hOKYQhUCKAJDMywXQEZnztkWhysYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&_nc_ss=7a22e&_nc_zt=28&oh=00_AQDrxCQWJjYdJ_A1wP9NAqwnYMpcGLVAhJP0LpoE3AyyTg&oe=6A6C1F8C","author":{"username":"nasa","url":"https://instagram.com/nasa"},"engagement":{"views":51078,"likes":10645,"comments":149,"viewsInstagram":40862,"viewsFacebook":10216},"hashtags":["NASA","Sun"],"mentions":[]},{"platform":"instagram","url":"https://www.instagram.com/reel/DbL6n0ggXDZ/","id":"3948507321457537241","shortcode":"DbL6n0ggXDZ","postType":"Video","productType":"clips","section":null,"topic":null,"caption":"Sound on!\n\nSonifications take images from across the universe and turn them into music, with different notes corresponding to different frequencies of light.\n\nThis sonification of NGC 4736, a bright spiral galaxy found 16 million light-years from Earth, sweeps clockwise around the image. As it reaches neutron stars and black holes (spotted by our @nasachandraxray telescope), it turns them into pitched tones on a glass marimba. Other sources of light are represented by piano notes or a low, ethereal drone.\n\n#NASA #Space #MusicLife","description":"Sound on!\n\nSonifications take images from across the universe and turn them into music, with different notes corresponding to different frequencies of light.\n\nThis sonification of NGC 4736, a bright spiral galaxy found 16 million light-years from Earth, sweeps clockwise around the image. As it reaches neutron stars and black holes (spotted by our @nasachandraxray telescope), it turns them into pitched tones on a glass marimba. Other sources of light are represented by piano notes or a low, ethereal drone.\n\n#NASA #Space #MusicLife","publishedAt":"2026-07-24T18:46:42Z","durationSeconds":null,"thumbnailUrl":"https://scontent-lga3-1.cdninstagram.com/v/t51.82787-15/753557824_18630272896049152_5085604310932259746_n.jpg?stp=dst-jpg_e15_fr_s1080x1080_tt6&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=JXie426E2AIQ7kNvwGlg-Up&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQDfQIt5ChHfvw1haYF6Huy5Tm0DHMMWjvyPqrGpi7_tTA&oe=6A7021E6&_nc_sid=8b3546","videoUrl":"https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQPmdAz9D4QKeO_RBry8I2ja9L4hPZ0xY85OXT_W30_E9E5cOr_RoiOcZHVX6a9Fvjg8qStE7fTYF0T9sgmzJyxUs6ay7J6Bvu0fLb4.mp4?_nc_cat=109&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=9d9-4rCXivsQ7kNvwFJggA4&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MzAyNzI3NzAwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjo0LCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6MzQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=53b7030fc1cf7a2a&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9CODQ0NkUzMkVERDMxMDM4NjFFNDk1OTc4NjM0NzFCQl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyL0JCNEUzREJGMERFRTc3RDY4Nzc5QzA5QzRFQUVCNzkxX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaAkrjozIiYQhUCKAJDMywXQEEAAAAAAAAYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&_nc_ss=7a22e&_nc_zt=28&oh=00_AQBlTouRSWFhKYJdRHR9XtTa3aGhEHVVC578ay32Lrz7mQ&oe=6A6C2F2A","author":{"username":"nasa","url":"https://instagram.com/nasa"},"engagement":{"views":null,"likes":485567,"comments":2174,"viewsInstagram":null,"viewsFacebook":null},"hashtags":["NASA","Space"],"mentions":["nasachandraxray"]}],"note":"Snapshot-backed trending list (typical freshness under 24h). Instagram returns a small overlapping batch per scrape; duplicates across requests are expected. For live keyword search use /v1/instagram/reels-search.","cachedAt":"2026-07-29T18:00:00Z","stale":true,"ageHours":32}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/tagged-posts":{"get":{"operationId":"instagram_tagged_posts","tags":["Instagram"],"summary":"Instagram Tagged Posts API","description":"Posts that tag an Instagram account — author verified/avatar when available, staleFeed when Instagram only exposes an archive.\n\nPass a profile URL or @handle and get the profile's Tagged tab as clean JSON: id/shortcode, postType, caption, publishedAt, author{id,username,displayName,url,verified,profileImage when Instagram exposes them}, engagement{views,likes,comments}, hashtags[], mentions[]. Cursor pagination via nextCursor + hasMore. Every response includes staleFeed plus newestPublishedAt / oldestPublishedAt — when Instagram only exposes a truncated historical window, staleFeed is true and note explains why this is not live brand monitoring. Do not assume a well-known handle will return recent UGC; on this access path the live Tagged tab is login-gated and a 90s call is 503 TAGGED_POSTS_UNAVAILABLE (retryable, Retry-After, 0 credits), not a raw client timeout. Flat 1 credit on the native path; the fallback path is ~0.9/result only when the feed is fresh — archived windows stay flat 1 credit.\n\nDocs: https://captapi.com/apis/instagram-tagged-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram profile URL, @handle, or username, e.g. https://instagram.com/username/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 1 credit per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Posts that tag an Instagram account — author verified/avatar when available, staleFeed when Instagram only exposes an archive.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this posts item."},"shortcode":{"type":"string","description":"Instagram shortcode of the post (posts/reels only)."},"postType":{"type":"string","description":"Content type. YouTube community: \"text\" | \"image\" | \"poll\" | \"video\" | \"playlist\" | \"quiz\". Instagram: \"image\" | \"video\" | \"carousel\"."},"productType":{"type":"string","description":"Platform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description of this posts item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this posts item."},"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"comments":{"type":"integer"},"views":{"type":"integer"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{"type":"string"},"description":"Hashtags extracted from the text."},"mentions":{"type":"array","items":{"type":"string"},"description":"Accounts mentioned in the text."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.instagram.com/nasa/","totalReturned":2,"hasMore":true,"nextCursor":"3600123456789012345_528817151","posts":[{"platform":"instagram","url":"https://www.instagram.com/p/DexampleNasa1/","id":"3600987654321098765","shortcode":"DexampleNasa1","postType":"Image","productType":"feed","caption":"Stunning view from orbit ? thanks @nasa for the inspiration #space #nasa","description":"Stunning view from orbit ? thanks @nasa for the inspiration #space #nasa","publishedAt":"2026-03-31T14:22:10.000Z","thumbnailUrl":"https://scontent.cdninstagram.com/v/t51.29350-15/example_nasa_tagged_1.jpg","author":{"id":"1234567890","username":"spacefan.example","displayName":"Space Fan","url":"https://instagram.com/spacefan.example","verified":false},"engagement":{"likes":18420,"comments":312},"hashtags":["space","nasa"],"mentions":["nasa"]},{"platform":"instagram","url":"https://www.instagram.com/reel/DexampleNasa2/","id":"3599876543210987654","shortcode":"DexampleNasa2","postType":"Video","productType":"clips","caption":"Launch vibes with @nasa #reels","description":"Launch vibes with @nasa #reels","publishedAt":"2025-08-04T09:10:00.000Z","thumbnailUrl":"https://scontent.cdninstagram.com/v/t51.29350-15/example_nasa_tagged_2.jpg","author":{"id":"2345678901","username":"rockets.example","displayName":"Rocket Clips","url":"https://instagram.com/rockets.example"},"engagement":{"views":240150,"likes":9210,"comments":188},"hashtags":["reels"],"mentions":["nasa"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/reels-by-audio-id":{"get":{"operationId":"instagram_reels_by_audio_id","tags":["Instagram"],"summary":"Instagram Reels By Audio ID API","description":"Is this Instagram sound trending?\n\nPass audioId (numeric Instagram audio id) or a https://www.instagram.com/reels/audio/{id}/ URL. The envelope answers whether the sound is trending — isTrendingInClips, and trendRank / previousTrendRank only while it is — plus music{} (id, title, artist, durationMs, audioType, coverUrl, and alternate ids only when they differ from id). Then the public Reels using that sound, same row shape as /instagram/details (shortcode, postType, productType, thumbnailUrl, mediaCount, children, hashtags, mentions, flags). hasMore is true when the listing window filled limit. Billing ~1.4/result. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/instagram-reels-by-audio-id","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"audioId","in":"query","required":true,"description":"Instagram audio/music ID or full audio URL, e.g. 27919946310946207.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":28,"perResult":1.4,"label":"~28 credits (1.4/result)","billedOnCacheHit":false},"x-one-liner":"Is this Instagram sound trending?","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"audioId":{"type":"string","description":"Instagram audio/music id (same value as /reels/audio/{id}/). Query param is audioId, not audio_id."},"audioUrl":{"type":"string","description":"Canonical https://www.instagram.com/reels/audio/{audioId}/ page."},"totalReturned":{"type":"integer","description":"Reels in this response."},"reels":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this reels item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description of this reels item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean"},"profileImage":{"type":"string"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"}},"description":"Engagement metrics for the item."},"musicId":{"type":"string","description":"ID of the soundtrack used."},"musicUrl":{"type":"string","description":"URL of the soundtrack used."},"hasAudio":{"type":"boolean","description":"Has audio. Example: true."},"music":{"type":"object","properties":{"id":{"type":"string","description":"Id of this music item."},"clusterId":{"type":"string","description":"Cluster id. Example: \"27919946310946207\"."},"assetId":{"type":"string","description":"Asset id. Example: \"audio_asset_example\"."},"canonicalId":{"type":"string","description":"Canonical id. Example: \"18455463055100927\"."},"artistId":{"type":"string","description":"Instagram music-artist user id when the audio object exposes one — not a TikTok id."},"title":{"type":"string","description":"Title of this music item."},"artist":{"type":"string","description":"Artist name."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"audioType":{"type":"string","description":"Audio type. Example: \"licensed_music\"."},"coverUrl":{"type":"string","description":"Artwork for this Instagram sound when Instagram ships a cover."},"isTrendingInClips":{"type":"boolean","description":"Whether Instagram currently marks this sound as trending in Reels."},"trendRank":{"type":"integer","description":"Current Reels-trend rank. Present only while isTrendingInClips is true — omitted (not null) otherwise."},"previousTrendRank":{"type":"integer","description":"Previous Reels-trend rank. Present only while isTrendingInClips is true."},"isExplicit":{"type":"boolean","description":"Is explicit. Example: false."},"hasLyrics":{"type":"boolean","description":"Has lyrics. Example: true."}},"description":"Instagram audio object: id, title, artist, durationMs, audioType, coverUrl, isTrendingInClips, isExplicit, hasLyrics. Alternate ids (assetId, canonicalId, clusterId, artistId) only when they differ from id."},"isPaidPartnership":{"type":"boolean","description":"Is paid partnership. Example: false."}}}},"isTrendingInClips":{"type":"boolean","description":"Whether Instagram currently marks this sound as trending in Reels."},"trendRank":{"type":"integer","description":"Current Reels-trend rank. Present only while isTrendingInClips is true — omitted (not null) otherwise."},"previousTrendRank":{"type":"integer","description":"Previous Reels-trend rank. Present only while isTrendingInClips is true."},"music":{"type":"object","properties":{"id":{"type":"string","description":"Id of this music item."},"clusterId":{"type":"string","description":"Cluster id. Example: \"27919946310946207\"."},"assetId":{"type":"string","description":"Asset id. Example: \"audio_asset_example\"."},"canonicalId":{"type":"string","description":"Canonical id. Example: \"18455463055100927\"."},"artistId":{"type":"string","description":"Instagram music-artist user id when the audio object exposes one — not a TikTok id."},"title":{"type":"string","description":"Title of this music item."},"artist":{"type":"string","description":"Artist name."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"audioType":{"type":"string","description":"Audio type. Example: \"licensed_music\"."},"coverUrl":{"type":"string","description":"Artwork for this Instagram sound when Instagram ships a cover."},"isTrendingInClips":{"type":"boolean","description":"Whether Instagram currently marks this sound as trending in Reels."},"trendRank":{"type":"integer","description":"Current Reels-trend rank. Present only while isTrendingInClips is true — omitted (not null) otherwise."},"previousTrendRank":{"type":"integer","description":"Previous Reels-trend rank. Present only while isTrendingInClips is true."},"isExplicit":{"type":"boolean","description":"Is explicit. Example: false."},"hasLyrics":{"type":"boolean","description":"Has lyrics. Example: true."}},"description":"Instagram audio object: id, title, artist, durationMs, audioType, coverUrl, isTrendingInClips, isExplicit, hasLyrics. Alternate ids (assetId, canonicalId, clusterId, artistId) only when they differ from id."}}}}},"example":{"success":true,"data":{"platform":"instagram","audioId":"27919946310946207","audioUrl":"https://www.instagram.com/reels/audio/27919946310946207/","totalReturned":2,"reels":[{"platform":"instagram","url":"https://www.instagram.com/reel/DaSip_jgfgL/","id":"DaSip_jgfgL","caption":"A moment of awe. While searching for the Seven Natural Wonders of America, @debrobertsabc and National Geographic Explorer James Edward Mills (@thejoytripproject) captured this beautiful view. Can you guess where they are? \n\nDiscover more beauty and nature in the final Wonders of America list, revealed during the 24-hour “Disney Celebrates America” live event special on July 4th on ABC, Disney+ and Nat Geo.","description":"A moment of awe. While searching for the Seven Natural Wonders of America, @debrobertsabc and National Geographic Explorer James Edward Mills (@thejoytripproject) captured this beautiful view. Can you guess where they are? \n\nDiscover more beauty and nature in the final Wonders of America list, revealed during the 24-hour “Disney Celebrates America” live event special on July 4th on ABC, Disney+ and Nat Geo.","publishedAt":"2026-07-02T12:00:36.000Z","durationSeconds":11.766,"videoUrl":"https://instagram.fccs3-2.fna.fbcdn.net/o1/v/t2/f2/m86/AQNm7Q5NYwBbSA4Vve0iRre5MLeKDljn9vqPN8i0TZf3FeZZPqrhcercZFtrix4mhl9VzcRx5LCOVhf4ogU2MyOH_nTUdLv7h_iUeT4.mp4?_nc_cat=100&_nc_oc=AdrE6ndC2PBc_gMsOZ_Kgtjkaf5_KFDuoJDmITmMw3mj3yjHFlQAr3pBvdR0JIvug6w&_nc_sid=5e9851&_nc_ht=instagram.fccs3-2.fna.fbcdn.net&_nc_ohc=3xFFvqXL_HYQ7kNvwFxSo5C&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2NzI0ODIzNjgwMTkxMzMsImFzc2V0X2FnZV9kYXlzIjoxNSwidmlfdXNlY2FzZV9pZCI6MTAwOTksImR1cmF0aW9uX3MiOjExLCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&vs=a3ed5364566742cd&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC84NzQ3RjZBOUFBOUUwQTVFQjY1OUY0RUMwQTVBMjZBM192aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzYyNDQ4QjdCMTVDNEVBN0U1OTkzODZFNTAyNUNCQkJEX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACb66vbpwqGrQhUCKAJDMywXQCeIMSbpeNUYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=8zKuWtFwGFSgOstkWmOtlg&_nc_ss=73a8c&_nc_zt=28&oh=00_AQBHLias4bmd0eI1kNYdgi5WshPQ-x5kmeaqvPxjynzSJA&oe=6A5D5355","author":{"username":"natgeo","displayName":"National Geographic","url":"https://instagram.com/natgeo","verified":true,"profileImage":"https://instagram.fccs3-1.fna.fbcdn.net/v/t51.82787-19/683576066_18653628823019133_9051036240972105113_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby40MDAuYzIifQ&_nc_ht=instagram.fccs3-1.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gF-gGYZ-MfzxJDTWdOZNJF07VOZpW47oCWJ_Xr7sVXDZR_2BFehBTIvujAdT7UYoMY&_nc_ohc=hTIYH2ypurAQ7kNvwGMMafs&_nc_gid=8zKuWtFwGFSgOstkWmOtlg&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQDK3uG63OUxWOZVATEg7XlkiG4K8NyYpYrD_jfuEb-XFA&oe=6A614F2B&_nc_sid=10d13b"},"engagement":{"views":3459891,"likes":108662,"comments":914},"musicId":"27919946310946207","musicUrl":"https://www.instagram.com/reels/audio/27919946310946207/","hasAudio":true,"music":{"id":"27919946310946207","clusterId":"27919946310946207","assetId":"audio_asset_example","canonicalId":"18455463055100927","artistId":"42","title":"Freakin Out","artist":"Dexter and The Moonrocks","durationMs":217897,"audioType":"licensed_music","coverUrl":"https://cdn.example/cover.jpg","isTrendingInClips":true,"trendRank":3,"previousTrendRank":7,"isExplicit":false,"hasLyrics":true},"isPaidPartnership":false},{"platform":"instagram","url":"https://www.instagram.com/reel/DaSnBHzRC3m/","id":"DaSnBHzRC3m","caption":"He was found hiding out at a distant relative’s home thousands of miles away after a nearly month-long manhunt.","description":"He was found hiding out at a distant relative’s home thousands of miles away after a nearly month-long manhunt.","publishedAt":"2026-07-02T12:38:33.000Z","durationSeconds":5.038,"videoUrl":"https://instagram.fccs3-1.fna.fbcdn.net/o1/v/t2/f2/m86/AQPPRD5xHKMhcZmNIBLjysrEj-XZEOrhPQKJfM8hmUpf8e4OnkqVc5ZKIdk2qIq2luFMxbcMIEWHyeF3_yXkGTGOhbUDCd6xB17lmXg.mp4?_nc_cat=103&_nc_oc=AdprS4uJLqkxTiTQrg0MfEeYGlrKQmygIkUuIWxhRyG8SeZcnd9dBTjSOc1Goii2v0M&_nc_sid=5e9851&_nc_ht=instagram.fccs3-1.fna.fbcdn.net&_nc_ohc=-N6R5M1VoCAQ7kNvwGw8o0a&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6OTg0OTc0MjkxMTA5NzQwLCJhc3NldF9hZ2VfZGF5cyI6MTUsInZpX3VzZWNhc2VfaWQiOjEwMDk5LCJkdXJhdGlvbl9zIjo1LCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&vs=fee147904b1a37e8&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9DNDQxM0FCRjA4MkI1MkFGMjUyRkZGRDEyNzI4RDc5N192aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzM3NDE4N0YzODA1QjVEMUNFMERDNjM2RUQ1NkY2RkE1X2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACbYneCrhvW_AxUCKAJDMywXQBQhysCDEm8YEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=8zKuWtFwGFSgOstkWmOtlg&_nc_ss=73a8c&_nc_zt=28&oh=00_AQBekUjDG1x8uPwg1xKbymxRs0rWVytjYopoHHHIGogd9g&oe=6A5D3648","author":{"username":"buna0214world","displayName":"Buna's_World","url":"https://instagram.com/buna0214world","verified":false,"profileImage":"https://instagram.fccs3-2.fna.fbcdn.net/v/t51.82787-19/730331656_18187041916348619_1189543852469599393_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=instagram.fccs3-2.fna.fbcdn.net&_nc_cat=111&_nc_oc=Q6cZ2gF-gGYZ-MfzxJDTWdOZNJF07VOZpW47oCWJ_Xr7sVXDZR_2BFehBTIvujAdT7UYoMY&_nc_ohc=bpkyefW5i5cQ7kNvwHcdOrA&_nc_gid=8zKuWtFwGFSgOstkWmOtlg&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQC4hfnlAtaAtaBfVru_e2cHO6b05jxfxNeWNoy5uhxUwQ&oe=6A6151E9&_nc_sid=10d13b"},"engagement":{"views":329,"likes":3,"comments":0},"musicId":"27919946310946207","musicUrl":"https://www.instagram.com/reels/audio/27919946310946207/","hasAudio":true,"music":{"id":"27919946310946207","clusterId":"27919946310946207","assetId":"audio_asset_example","canonicalId":"18455463055100927","artistId":"42","title":"Freakin Out","artist":"Dexter and The Moonrocks","durationMs":217897,"audioType":"licensed_music","coverUrl":"https://cdn.example/cover.jpg","isTrendingInClips":true,"trendRank":3,"previousTrendRank":7,"isExplicit":false,"hasLyrics":true},"isPaidPartnership":false}],"isTrendingInClips":true,"trendRank":3,"previousTrendRank":7,"music":{"id":"27919946310946207","clusterId":"27919946310946207","assetId":"audio_asset_example","canonicalId":"18455463055100927","artistId":"42","title":"Freakin Out","artist":"Dexter and The Moonrocks","durationMs":217897,"audioType":"licensed_music","coverUrl":"https://cdn.example/cover.jpg","isTrendingInClips":true,"trendRank":3,"previousTrendRank":7,"isExplicit":false,"hasLyrics":true}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/hashtag-search":{"get":{"operationId":"instagram_hashtag_search","tags":["Instagram"],"summary":"Instagram Hashtag Search API","description":"Hashtag Explore: native grid first, fallback path only on miss.\n\nPass a hashtag without the # and get posts from Instagram's hashtag Explore as clean JSON. Same native grid as reels-search. A query with spaces (travel blog) is 400 HASHTAG_HAS_SPACES — Instagram tags are one token; nothing is fetched. A slower fallback path runs only when native listed nothing. limit max 50. A wall miss with a last-good grid is 200 stale (0 credits, 6h) instead of 502. Hard 90s deadline. login_wall is remembered 60s; persistent after 3 fresh misses. Optional mediaType=reels. Flat 2 credits. Pass cache=true for the shared cache.\n\nDocs: https://captapi.com/apis/instagram-hashtag-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Hashtag without the # (min 2 characters). One token — spaces are 400 HASHTAG_HAS_SPACES.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 50). Flat 2 credits per call.","schema":{"type":"integer","maximum":50,"minimum":1,"default":20}},{"name":"mediaType","in":"query","required":false,"description":"all (default) or reels — return only Reels/clips when set to reels.","schema":{"type":"string","pattern":"^(all|reels)$","default":"all"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Hashtag Explore: native grid first, fallback path only on miss.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"total":{"type":"integer","description":"Number of results returned."},"results":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Result title."},"url":{"type":"string","description":"Direct URL to the content."},"author":{"type":"string","description":"Creator handle."},"views":{"type":"integer","description":"View count where available."}}}}}}}},"example":{"success":true,"data":{"total":2,"results":[{"title":"Top result","url":"https://example.com/1","author":"@creator","views":530120},{"title":"Second result","url":"https://example.com/2","author":"@maker","views":210430}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/profile-search":{"get":{"operationId":"instagram_profile_search","tags":["Instagram"],"summary":"Instagram Profile Search API","description":"Resolve a brand or @handle to one public Instagram profile — stable id, bio, links, and stats (not niche discovery).\n\nPass an account name, @handle, or profile URL (e.g. nike, @nasa, instagram.com/natgeo) and this endpoint resolves it to the matching public Instagram account — a name→username resolver, not a Google-style niche discovery search (queries like \"fitness coach\" will not return a creator list). A leading underscore on q is stripped (_glowprotocol → glowprotocol); underscores in the middle of a handle stay. Response: mode=resolve (the only mode; Instagram keyword search is login-gated), users[0] with platform, id (numeric), username, displayName, url (canonical https://www.instagram.com/{user}/), bio, bioLinks[], externalUrl, fbid, businessAddress{cityName, streetAddress, latitude, longitude, zipCode} when Instagram exposes them, followers/following/postCount, verified, isPrivate, isBusinessAccount/isProfessionalAccount, avatar, and imageExpiresAt when the CDN oe= param is present. Sparse keys (bio, bioLinks, externalUrl, businessAddress, categoryName, relatedProfiles, likeAndViewCountsDisabled) are omitted, not nulled, when the account has no value. relatedProfiles only appears when Instagram's logged-out graph sends edge_related_profiles — many public accounts including nike omit it, so it is not a creator-search substitute. No nextCursor — resolve returns at most one user. A handle that does not resolve is 200 with users=[] at 0 credits. Flat 1 credit on a hit. Cache is on by default (24h shared cache, 0 credits on hit) because a resolve answer barely changes — pass cache=false to force a fresh upstream lookup. The uncached path resolves the profile live; set client timeouts ≥15s, not 10s.\n\nDocs: https://captapi.com/apis/instagram-profile-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Account name, @handle, or profile URL to resolve (min 2 characters). A leading _ is stripped. Not a niche keyword search.","schema":{"type":"string","minLength":2}},{"name":"cache","in":"query","required":false,"description":"Serve from the 24h shared cache when available (0 credits on hit). Default true — set false to always fetch fresh.","schema":{"type":"boolean","default":true}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Resolve a brand or @handle to one public Instagram profile — stable id, bio, links, and stats (not niche discovery).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this users item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical profile URL: https://www.instagram.com/{username}/ (www + trailing slash) — join-safe with channel-details / basic-profile."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"isPrivate":{"type":"boolean","description":"Whether the account is private. Canonical privacy flag (no separate private alias)."},"isBusinessAccount":{"type":"boolean","description":"Whether the account is a business account."},"isProfessionalAccount":{"type":"boolean","description":"Whether the account is a professional (creator/business) account."},"externalUrl":{"type":"string","description":"Website / link-in-bio URL when present."},"bioLinks":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical profile URL: https://www.instagram.com/{username}/ (www + trailing slash) — join-safe with channel-details / basic-profile."},"linkType":{"type":"string"}}},"description":"External links from the profile bio ({title, url, linkType} on Instagram; {url, verified, linkId} on Threads)."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"profileImageHd":{"type":"string","description":"HD profile picture URL."},"platform":{"type":"string","description":"Always \"instagram\" on each users[] row."},"imageExpiresAt":{"type":"string","description":"ISO-8601 expiry parsed from the CDN oe= hex timestamp when present. Re-host the image for long-term storage — do not treat the CDN URL as permanent."}}}},"mode":{"type":"string","description":"Always \"resolve\". Instagram keyword / multi-result search is login-gated — there is no \"search\" mode and no nextCursor on this endpoint."}}}}},"example":{"success":true,"data":{"query":"nike","totalReturned":1,"users":[{"id":"13460080","username":"nike","displayName":"Nike","url":"https://www.instagram.com/nike/","bio":"Just Do It.","followers":291623659,"following":264,"postCount":1668,"verified":true,"isPrivate":false,"isBusinessAccount":true,"isProfessionalAccount":true,"externalUrl":"http://empli.fi/nike","bioLinks":[{"url":"http://empli.fi/nike","linkType":"external"}],"profileImage":"https://instagram.fadb3-1.fna.fbcdn.net/v/t51.82787-19/551608484_18567162979020081_1135468084872726555_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4zOTkuYzIifQ&_nc_ht=instagram.fadb3-1.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gE3fm8U-4zquMXb-DCa2XFEqsm-rZ_BWOXzqz5HNEFIKiHcxSpjEdlCVP0v32ZLy3tMLEVo2JvIx8SA4xy09gYm&_nc_ohc=jOWQehR8N0kQ7kNvwHCN0UL&_nc_gid=Ov3EEVEX3-M4dSFajR8eTQ&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQE94ajaP7La8AcjJgA2RbClgYMx9xGFF0qoyUObgazGWg&oe=6A764BBA&_nc_sid=8b3546","profileImageHd":"https://instagram.fadb3-1.fna.fbcdn.net/v/t51.82787-19/551608484_18567162979020081_1135468084872726555_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4zOTkuYzIifQ&_nc_ht=instagram.fadb3-1.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gE3fm8U-4zquMXb-DCa2XFEqsm-rZ_BWOXzqz5HNEFIKiHcxSpjEdlCVP0v32ZLy3tMLEVo2JvIx8SA4xy09gYm&_nc_ohc=jOWQehR8N0kQ7kNvwHCN0UL&_nc_gid=Ov3EEVEX3-M4dSFajR8eTQ&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQE94ajaP7La8AcjJgA2RbClgYMx9xGFF0qoyUObgazGWg&oe=6A764BBA&_nc_sid=8b3546","platform":"instagram","imageExpiresAt":"2026-08-07T21:18:50Z"}],"mode":"resolve"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/embed":{"get":{"operationId":"instagram_embed","tags":["Instagram"],"summary":"Instagram Embed HTML API","description":"Classic Instagram embed snippet — blockquote.instagram-media + embed.js.\n\nPass an Instagram post, reel, or profile URL (or an @handle) and get the official oEmbed snippet as html: a &lt;blockquote class=\"instagram-media\"&gt; plus one &lt;script src=\"https://www.instagram.com/embed.js\"&gt;. That is safe to drop into a host page. html is never Instagram's full /embed/captioned/ Facebook document. embedUrl is the player page — point an &lt;iframe src&gt; at it if you want that document isolated. Also returns permalink, shortcode or username, and type (post/reel/profile). Flat 1 credit. Pass cache=true for the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/instagram-embed","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Instagram post, reel, or profile URL (or @handle), e.g. https://instagram.com/reel/ID/ or https://instagram.com/username/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Classic Instagram embed snippet — blockquote.instagram-media + embed.js.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"type":{"type":"string","description":"Content type of the item."},"shortcode":{"type":"string","description":"Instagram shortcode of the post (posts/reels only)."},"permalink":{"type":"string","description":"Canonical Instagram permalink for the embed."},"embedUrl":{"type":"string","description":"Instagram's /embed/ or /embed/captioned/ player URL — use as iframe src if you want that document isolated."},"html":{"type":"string","description":"blockquote.instagram-media + embed.js. Safe to drop into a host page. Never the full /embed/ Facebook document."}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://www.instagram.com/p/DZFqdAxlkUG/","type":"post","shortcode":"DZFqdAxlkUG","permalink":"https://www.instagram.com/p/DZFqdAxlkUG/","embedUrl":"https://www.instagram.com/p/DZFqdAxlkUG/embed/captioned/","html":"[HTML omitted in docs — call the API for the full document. Docs examples must not embed raw HTML documents.]"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/highlights":{"get":{"operationId":"instagram_highlights","tags":["Instagram"],"summary":"Instagram Highlights API","description":"Persistent Story Highlight albums for a public profile — id, title, cover, owner.\n\nPass a profile URL/@handle or numeric userId and get that account's Story Highlight albums as clean JSON — persistent collections (GRWM, Travel, Products…), not live 24h Stories. Each item always keys id, title, coverUrl, itemCount, and owner{id,username,url} — null when that rung did not expose them, never absent. The native tray is often login-gated; we read highlights from the logged-out profile data first, then the mobile highlights tray. Bare /stories/highlights/ ids from public profile HTML are not returned — those ids do not resolve on /v1/instagram/highlights-details, so an HTML-only shelf is 503 ids_unresolvable (retryable, 0 credits) instead of a billed 200 that leads to 404s. userId skips handle→ID resolve; when only userId is set we reverse-resolve the username so the WPI shelf can still run. A live handle that neighbouring endpoints resolve is never 404: resolver miss is 502 (pass userId from /v1/instagram/basic-profile or /v1/instagram/profile-search), tray miss or unresolvable HTML ids is 503 (0 credits). 404 only when Instagram confirms the account is gone. This list and /v1/instagram/highlights-details are a pair: details needs an id only a full shelf (or Instagram's web UI) can give you. Flat 1 credit on a full shelf. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/instagram-highlights","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":false,"description":"Instagram profile URL, @handle, or username. Omit when userId is set.","schema":{"type":"string"}},{"name":"userId","in":"query","required":false,"description":"Numeric Instagram user ID. Prefer when known — skips handle→ID resolve. When only userId is set we reverse-resolve the username so the WPI / profile-HTML shelf can still run.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Persistent Story Highlight albums for a public profile — id, title, cover, owner.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"userId":{"type":"string","description":"Numeric Instagram user id of the profile."},"username":{"type":"string","description":"Profile username."},"totalReturned":{"type":"integer","description":"Number of highlight albums in this response."},"degraded":{"type":"boolean","description":"true when every row is an HTML-ids handoff (no title/cover). false on a full tray or an empty confirmed shelf."},"degradedReason":{"type":"string","description":"\"profile-html-ids-only\" when degraded is true. null otherwise — always keyed."},"highlights":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Numeric highlight id (no highlight: prefix) — pass to /v1/instagram/highlights-details."},"title":{"description":"Album title as shown on the profile (GRWM, Travel, …). Null on the HTML-ids rung."},"coverUrl":{"description":"Cover image URL for the album. Null on the HTML-ids rung."},"itemCount":{"description":"Number of items in the album when Instagram exposes it. Null on the HTML-ids rung."},"owner":{"description":"Album owner {id, username, url}. Null on the HTML-ids rung — not filled from the envelope."}}}}}}}},"example":{"success":true,"data":{"userId":"787132","username":"natgeo","totalReturned":1,"degraded":true,"degradedReason":"profile-html-ids-only","highlights":[{"id":"17895558443196850","title":null,"coverUrl":null,"itemCount":null,"owner":null}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/highlights-details":{"get":{"operationId":"instagram_highlights_details","tags":["Instagram"],"summary":"Instagram Highlights Details API","description":"Items inside one Instagram Story Highlight album — media URLs, type, takenAt.\n\nPass a highlight id from /v1/instagram/highlights (with or without the highlight: prefix) — or from Instagram's web UI — and get the album's items as clean JSON: type (image | video), url, thumbnailUrl, takenAt, dimensions, durationSeconds on videos, plus coverUrl and title. An id we could not resolve is 404 HIGHLIGHT_NOT_FOUND (retryable false). A login wall / timeout / block is 503 HIGHLIGHT_UNAVAILABLE (retryable true, Retry-After). Both bill 0 credits. Two empty Instagram JSON replies fail fast — a miss is not a 10s wait. Flat 1 credit on a hit. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/instagram-highlights-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"query","required":true,"description":"Highlight id from /v1/instagram/highlights (with or without highlight: prefix).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Items inside one Instagram Story Highlight album — media URLs, type, takenAt.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"id":{"type":"string","description":"Stable platform ID for the video."},"title":{"type":"string","description":"Video title."},"author":{"type":"string","description":"Creator handle or channel name."},"views":{"type":"integer","description":"Total view count."},"likes":{"type":"integer","description":"Total like count."},"comments":{"type":"integer","description":"Total comment count."},"durationSec":{"type":"integer","description":"Video length in seconds."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601)."}}}}},"example":{"success":true,"data":{"id":"dQw4w9WgXcQ","title":"Example video","author":"@creator","views":1842203,"likes":95210,"comments":4123,"durationSec":213,"publishedAt":"2024-11-02T10:00:00Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/instagram/basic-profile":{"get":{"operationId":"instagram_basic_profile","tags":["Instagram"],"summary":"Instagram Basic Profile API","description":"Instagram profile by user ID or @handle — camelCase schema aligned with Channel Details (followers, externalUrl, businessAddress).\n\nPass an Instagram numeric user ID (the pk this endpoint returns as id, e.g. 13460080) or a profile URL / @handle and get that account's public profile as clean Captapi JSON — same naming as Channel Details: displayName, bio, followers / following / postCount, verified, isPrivate, profileImage / profileImageHd, externalUrl, bioLinks[], categoryName (Instagram business niche — Entrepreneur, Digital Creator, …), isBusinessAccount / isProfessionalAccount, businessAddress{cityName,latitude,longitude,…}, fbid (Instagram↔Facebook join key), relatedProfiles[] (edge_related_profiles discovery graph), likeAndViewCountsDisabled (distinguishes hidden likes from true zero), highlightReelCount, hasClips, and transparency flags when Instagram exposes them. Resolve prefers web_profile_info (the commercial field set) and only uses HTML-og as an approx-flag overlay — it will not replace a rich profile with the 21-key HTML subset. followersIsApproximate / followingIsApproximate / postCountIsApproximate use the same per-field helper as Channel Details (true when a count came from a K/M/B display string such as og:description \"32K\") — they are added here only; Channel Details is unchanged. The 17 commercial/companion keys plus displayName / bio stay on the payload (null when Instagram withholds them). An empty biography_with_entities object is biographyWithEntities: null, not a hollow {rawText, entities} stub. Flat 1 credit. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh.\n\nDocs: https://captapi.com/apis/instagram-basic-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"userId","in":"query","required":true,"description":"Instagram numeric pk (e.g. 13460080 — the id field on this endpoint), or a profile URL / @handle / username. A Facebook/Graph fbid (17-digit 17841…) is 400 WRONG_ID_TYPE.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Instagram profile by user ID or @handle — camelCase schema aligned with Channel Details (followers, externalUrl, businessAddress).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"pk":{"type":"string","description":"Instagram user primary key (same as id)."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"biographyWithEntities":{"type":"object","properties":{"rawText":{"type":"string","description":"Raw text. Example: \"Just Do It.\"."},"entities":{"type":"array","items":{},"description":"Entities (array)."}}},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"highlightReelCount":{"type":"integer","description":"Number of Story Highlight albums on the profile."},"hasClips":{"type":"boolean","description":"Whether the account has Reels/clips."},"isPrivate":{"type":"boolean","description":"Whether the account is private."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"isBusinessAccount":{"type":"boolean","description":"Whether the account is a business account."},"isProfessionalAccount":{"type":"boolean","description":"Whether the account is a professional (creator/business) account."},"categoryName":{"type":"string","description":"Public category label (e.g. SPORTSWEAR_STORE)."},"shouldShowCategory":{"type":"boolean","description":"Whether Instagram shows the account's category publicly."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"profileImageHd":{"type":"string","description":"HD profile picture URL."},"profileImageUrl":{"type":"string","description":"Standard-resolution profile picture URL."},"externalUrl":{"type":"string","description":"Website / link-in-bio URL when present."},"fbid":{"type":"string","description":"Linked Facebook/Meta ID for the account."},"pronouns":{"type":"array","items":{},"description":"Pronouns listed on the profile."},"bioLinks":{"type":"array","items":{"type":"object","properties":{"title":{"description":"Title of this bio links item."},"url":{"type":"string","description":"Canonical URL of the item."},"linkType":{"type":"string","description":"Link type. Example: \"external\"."}}}},"showAccountTransparencyDetails":{"type":"boolean","description":"Whether Instagram shows account transparency details."},"isEmbedsDisabled":{"type":"boolean","description":"Whether embedding this account's content is disabled."},"isRegulatedC18":{"type":"boolean","description":"Whether the account is age-restricted (18+)."},"businessAddress":{"type":"object","properties":{"cityName":{"type":"string","description":"City name. Example: \"Beaverton, Oregon\"."},"cityId":{"type":"string","description":"City id. Example: \"108410602520455\"."},"streetAddress":{"type":"string","description":"Street address. Example: \"One Bowerman Dr\"."},"latitude":{"type":"number","description":"Latitude. Example: 45.5076448."},"longitude":{"type":"number","description":"Longitude. Example: -122.8269159."},"zipCode":{"type":"string","description":"Zip code. Example: \"97005\"."}}},"businessContactMethod":{"type":"string","description":"Business contact method. Example: \"CALL\"."},"fetchedAt":{"type":"string","description":"When this snapshot was fetched (ISO 8601 UTC)."}}}}},"example":{"success":true,"data":{"platform":"instagram","url":"https://instagram.com/nike","id":"13460080","pk":"13460080","username":"nike","displayName":"Nike","bio":"Just Do It.","biographyWithEntities":{"rawText":"Just Do It.","entities":[]},"followers":291638893,"following":264,"postCount":1668,"highlightReelCount":5,"hasClips":true,"isPrivate":false,"verified":true,"isBusinessAccount":true,"isProfessionalAccount":true,"categoryName":"SPORTSWEAR_STORE","shouldShowCategory":true,"profileImage":"https://instagram.fadb3-1.fna.fbcdn.net/v/t51.82787-19/551608484_18567162979020081_1135468084872726555_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4zOTkuYzIifQ&_nc_ht=instagram.fadb3-1.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gFbXFmp_TeRpCCj6RR0tM15Q0oZBPR6ROg0ngZ8OMxwGUMoGki14pWoXpBkyDth51bqpCSkJFx6YosO0GZyPqK-&_nc_ohc=jOWQehR8N0kQ7kNvwHCN0UL&_nc_gid=k79WPpLD7fgQ0KoqHooi9A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQGLKYnAo8kqPvpjPiPXB6947FKZdPXkp90fLn4BX7sh5w&oe=6A756ABA&_nc_sid=8b3546","profileImageHd":"https://instagram.fadb3-1.fna.fbcdn.net/v/t51.82787-19/551608484_18567162979020081_1135468084872726555_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4zOTkuYzIifQ&_nc_ht=instagram.fadb3-1.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gFbXFmp_TeRpCCj6RR0tM15Q0oZBPR6ROg0ngZ8OMxwGUMoGki14pWoXpBkyDth51bqpCSkJFx6YosO0GZyPqK-&_nc_ohc=jOWQehR8N0kQ7kNvwHCN0UL&_nc_gid=k79WPpLD7fgQ0KoqHooi9A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQGLKYnAo8kqPvpjPiPXB6947FKZdPXkp90fLn4BX7sh5w&oe=6A756ABA&_nc_sid=8b3546","profileImageUrl":"https://instagram.fadb3-1.fna.fbcdn.net/v/t51.82787-19/551608484_18567162979020081_1135468084872726555_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4zOTkuYzIifQ&_nc_ht=instagram.fadb3-1.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gFbXFmp_TeRpCCj6RR0tM15Q0oZBPR6ROg0ngZ8OMxwGUMoGki14pWoXpBkyDth51bqpCSkJFx6YosO0GZyPqK-&_nc_ohc=jOWQehR8N0kQ7kNvwHCN0UL&_nc_gid=k79WPpLD7fgQ0KoqHooi9A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQFUavH_AkjH7xOjK_XCMgEdFI82tO3J-qTmLtfVLMz1GA&oe=6A756ABA&_nc_sid=8b3546","externalUrl":"http://empli.fi/nike","fbid":"17841400602400210","pronouns":[],"bioLinks":[{"title":null,"url":"http://empli.fi/nike","linkType":"external"}],"showAccountTransparencyDetails":true,"isEmbedsDisabled":false,"isRegulatedC18":false,"businessAddress":{"cityName":"Beaverton, Oregon","cityId":"108410602520455","streetAddress":"One Bowerman Dr","latitude":45.5076448,"longitude":-122.8269159,"zipCode":"97005"},"businessContactMethod":"CALL","fetchedAt":"2026-08-02T20:06:56.628Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/details":{"get":{"operationId":"facebook_details","tags":["Facebook"],"summary":"Facebook Post & Reel Details API","description":"Facebook post or Reel — caption, engagement, author id, video{} playback, and music when Facebook exposes them.\n\nPaste a Facebook post or Reel URL and get clean JSON: caption (no description twin), publishedAt, fetchedAt, engagement (likes / comments / views / shares always keyed — null when unknown or not a video; never invent shares:0), author (including stable author.id when present), and video{} as the only playback block (id / url / sdUrl / hdUrl / width / height / captionsUrl). durationSeconds and thumbnailUrl stay on the post for cards. No flat videoUrl / videoSdUrl twins. feedbackId is base64(\"feedback:\" + id) — the token /facebook/comments accepts; fully derivable from id. music when Facebook exposes it. Each keyed likes/comments/shares/views count carries *IsApproximate (false when the count is null). facebook.com/share/&lt;id&gt; links (the mobile Share button — /share/, /share/p/, /share/r/, /share/v/) are resolved automatically: a cheap redirect first, then a full page render that reads Facebook's own og:url/canonical; the share→canonical mapping is cached 30 days so a repeat paste is instant. 400 UNRESOLVED_SHARE_LINK only when Facebook refuses to reveal the canonical URL — never 14–23s of NOT_FOUND for a shape we did not parse. A page URL is 400 WRONG_RESOURCE_TYPE. A fetch or parse miss is 503 FACEBOOK_UNAVAILABLE (retryable) — we do not 404 a URL unless Facebook itself answered 404. Note: for some Reels, the view count on the individual post page can be null or lower than the public Reels grid badge — use Facebook Profile Reels and match by post id if you need that badge count. Flat 2 credits per call.\n\nDocs: https://captapi.com/apis/facebook-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public Facebook video or post URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Facebook post or Reel — caption, engagement, author id, video{} playback, and music when Facebook exposes them.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"caption":{"type":"string","description":"Post text. There is no description twin (the old example copied caption into description)."},"description":{"type":"string","description":"Description text."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."}}},"engagement":{"type":"object","properties":{"views":{"type":"integer","description":"Always keyed. View count on a video/Reel; null on a photo or when unknown — never treat a missing key as 0."},"viewsIsApproximate":{"type":"boolean","description":"Always keyed. true when views came from a compact og label (e.g. 610K views). false when views is null or an exact integer."},"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count."},"shares":{"type":"integer","description":"Always keyed. Share count when Facebook exposes it; null on a photo or when unknown. Never invented 0."}}},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"link":{"type":"string","description":"Link URL."}}}}},"example":{"success":true,"data":{"platform":"facebook","url":"https://www.facebook.com/reel/1376651124309650","id":"1567272851434752","caption":"There will be more than just fireworks to see in the night sky this month!\n\nYou can look forward to these celestial sights in July:\n- A lunar-planetary alignment\n- A visiting comet\n- A good look at Saturn and the Milky Way\n\nHappy skywatching! https://go.nasa.gov/3QvQc4k","description":"There will be more than just fireworks to see in the night sky this month!\n\nYou can look forward to these celestial sights in July:\n- A lunar-planetary alignment\n- A visiting comet\n- A good look at Saturn and the Milky Way\n\nHappy skywatching! https://go.nasa.gov/3QvQc4k","publishedAt":"2026-07-02T15:03:11.000Z","durationSeconds":200.016,"thumbnailUrl":"https://scontent-atl3-3.xx.fbcdn.net/v/t15.5256-10/735149954_4435586749988646_521208314578416779_n.jpg?stp=dst-jpg_tt6&cstp=mx720x405&ctp=s720x405&_nc_cat=111&ccb=1-7&_nc_sid=be8305&_nc_ohc=lkSHcojZDSYQ7kNvwG18v3E&_nc_oc=Ado7Dqia8Fp3TMyoJP-nqzgoUUe3fuNq01u63ZrWrjBdYhVBfwfG-8TDKE-UDnBXYek&_nc_zt=23&_nc_ht=scontent-atl3-3.xx&_nc_gid=Vj-hvWV9W_P8ZRNVd_Lj3A&_nc_ss=7b289&oh=00_AQBLDKBELI40vp0Kckzx4q2eKic8tR46WwPCSFfbY5cwNw&oe=6A6D5E2C","videoUrl":"https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m366/AQOh7ZLRZfB5SIGETu_uz2jbsqvY3dW7G3sGdKsNsX627DpYoTuCxs26FyYE4T4rDzRdvIV2tOCYJi5hs8Gs1EaQEL7_LhQnAXKuILiY508JFg.mp4?_nc_cat=103&_nc_sid=5e9851&_nc_ht=video-atl3-1.xx.fbcdn.net&_nc_ohc=wPmj9ZUq47YQ7kNvwH_JIsW&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuMTI4MC5kYXNoX2gyNjQtYmFzaWMtZ2VuMl83MjBwIiwieHB2X2Fzc2V0X2lkIjoxMzQ3ODY4NzYwMDA4MjE2LCJhc3NldF9hZ2VfZGF5cyI6MjUsInZpX3VzZWNhc2VfaWQiOjEwMTIyLCJkdXJhdGlvbl9zIjoyMDAsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=c53b4168a8d58285&_nc_vs=HBksFQIYRWZiX2VwaGVtZXJhbC80QjQyOEYzOTg3NDFDRkNGM0UzNzQ4QkZDMDY4QTU4QV9tdF8xX3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhAZmJfcGVybWFuZW50LzAxNEExNzM2QkY1RkU3NTNDMjU1QkUyMjg3RUMzOEE0X2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACawmKfqpPjkBBUCKAJDMywXQGkBDlYEGJMYGWRhc2hfaDI2NC1iYXNpYy1nZW4yXzcyMHARAHUCZZSeAQA&_nc_gid=Vj-hvWV9W_P8ZRNVd_Lj3A&_nc_ss=7b289&_nc_zt=28&oh=00_AQAFmAbpq3yKHMxyvUj4LDMndyCfVJXc4d0c8CQZ_UIBUw&oe=6A6D7DF5&bitrate=733579&tag=dash_h264-basic-gen2_720p","author":{"username":"NASA","displayName":"NASA - National Aeronautics and Space Administration","url":"https://www.facebook.com/NASA","profileImage":"https://scontent-atl3-1.xx.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s80x80&_nc_cat=1&ccb=1-7&_nc_sid=2d3e12&_nc_ohc=rc5kNRYek84Q7kNvwEOuwnr&_nc_oc=AdpqXBYPB1HBfYhXUuQXS0HKbYcQ4mDfRxLfg4yx6pslEIjKO3biNVlf9-En1zfMphg&_nc_zt=24&_nc_ht=scontent-atl3-1.xx&_nc_gid=Vj-hvWV9W_P8ZRNVd_Lj3A&_nc_ss=7b289&oh=00_AQC0BgaEp99KKXvgYYd9uVYMHC0XuzO-SVIyen4WTzBkyw&oe=6A6D8255","verified":true},"engagement":{"views":598000,"viewsIsApproximate":true,"likes":6581,"comments":89,"shares":531},"isVideo":true,"link":"https://go.nasa.gov/3QvQc4k"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/summarize":{"get":{"operationId":"facebook_summarize","tags":["Facebook"],"summary":"Facebook Summarizer API","description":"Turn any Facebook video into an AI summary with key points, topics, and sentiment.\n\nThe Facebook Summarizer API lets you generate an AI summary with key points and topics for Facebook summarizer with a single REST call. No OAuth, no infrastructure to maintain, and no platform SDKs — send the request, get clean structured JSON back. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d.\n\nDocs: https://captapi.com/apis/facebook-summarizer","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public Facebook video or post URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":4,"label":"4 credits","billedOnCacheHit":false},"x-one-liner":"Turn any Facebook video into an AI summary with key points, topics, and sentiment.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"summary":{"type":"string","description":"AI-generated summary of the content."},"keyPoints":{"type":"array","items":{"type":"string"},"description":"The most important takeaways."},"topics":{"type":"array","items":{"type":"string"},"description":"Detected topics and themes."},"sentiment":{"type":"string","description":"Overall tone (positive, neutral, negative)."}}}}},"example":{"success":true,"data":{"platform":"facebook","url":"https://www.facebook.com/NASA/posts/pfbid0TBwRTPkxfaLhYBjfsK1xApVksSVHddNrpqUqcqNsKxVvKjqT6dAG8HnxWGA3odp5l","summary":"The video discusses the concept of a galaxy cluster, which consists of multiple galaxies grouped together. Specifically, it focuses on a galaxy cluster made up of two sub-clusters of similar mass that are currently interacting and separating in a complex manner. This dynamic relationship is significant for scientific study, as it provides insights into the behavior of galaxies in close proximity to one another. Eventually, these sub-clusters are expected to merge, further contributing to our understanding of galaxy formation and evolution.\n\nAdditionally, the video highlights the phenomenon of gravitational lensing, where the concentrated mass of the cluster bends light due to its gravitational pull. This effect allows astronomers to observe distant and faint background galaxies and stars that would otherwise be invisible, enhancing our ability to study the universe and its structures. The interplay of these two sub-clusters not only illustrates the chaotic nature of cosmic interactions but also serves as a valuable tool for astronomical research.","keyPoints":["A galaxy cluster consists of multiple galaxies grouped together.","The featured cluster contains two sub-clusters of similar mass interacting and separating.","The relationship between the sub-clusters is complex but crucial for scientific study.","Gravitational lensing occurs due to the cluster's mass, bending and focusing light.","This lensing effect allows the observation of faint background galaxies and stars.","The merging of the sub-clusters will provide further insights into galaxy evolution."],"topics":["galaxy cluster","gravitational lensing","cosmic interactions","astronomy","galaxy formation","space science"],"sentiment":"neutral"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/comments":{"get":{"operationId":"facebook_comments","tags":["Facebook"],"summary":"Facebook Comments API","description":"Facebook post comments with reactionCount, reactions.like when mixed, author.id (pfbid), and replyCount.\n\nPass a post/Reel URL or feedbackId (from /v1/facebook/details) and get top-level comments as clean JSON. reactionCount is the mix total. reactions{} is included only when Facebook exposes a real multi-type mix — likes are reactions.like, not a likeCount twin (that field used to hold the total and is gone). Unused types are omitted, not zeroed. author is an object with stable id (pfbid or numeric), name, shortName, gender, url, and avatarUrl when exposed. replyCount and hasMore are included for threading/loops. Flat 2 credits. Prefer feedbackId when you already fetched details.\n\nDocs: https://captapi.com/apis/facebook-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":false,"description":"Facebook post or Reel URL. Omit when feedbackId is set. The URL platform must match this endpoint's platform. A page/profile URL also works: Facebook renders the page's most recent post first, so you get that post's comments (each comment's url names the actual post).","schema":{"type":"string"}},{"name":"feedbackId","in":"query","required":false,"description":"Post feedback id from /v1/facebook/details (base64 feedback:POSTID). Prefer when you already have it — also accepts feedback_id.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Facebook post comments with reactionCount, reactions.like when mixed, author.id (pfbid), and replyCount.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"name":{"type":"string"},"shortName":{"type":"string"},"gender":{"type":"string"},"avatarUrl":{"type":"string"}},"description":"Nested author (id, name, shortName, gender, url, avatarUrl). author.url is the canonical profile URL."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"replyCount":{"type":"integer","description":"How many replies this comment has. Use Comment Replies with this comment's id to fetch them."},"reactionCount":{"type":"integer","description":"Total of every reaction type Facebook exposed. Not likes."},"reactions":{"type":"object","properties":{"like":{"type":"integer"},"love":{"type":"integer"},"care":{"type":"integer"},"haha":{"type":"integer"},"wow":{"type":"integer"},"sad":{"type":"integer"},"anger":{"type":"integer"},"thankful":{"type":"integer"},"pride":{"type":"integer"},"confused":{"type":"integer"}},"description":"Present only when Facebook exposed a real multi-type mix (love/wow/…). Likes are reactions.like. Unused types are omitted, not zeroed. likeCount is gone — it used to hold this total."}}}},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"feedbackId":{"type":"string","description":"Facebook feedback id for the post (useful for comments threading)."}}}}},"example":{"success":true,"data":{"platform":"facebook","url":"https://www.facebook.com/NASA/posts/pfbid02skzNsrLf5atYZfzvzHAK9gHwDnZC5u4pDZMLQ1u3iJmfoA8tNsGpT7Uj6WPs6K3Rl","totalReturned":2,"comments":[{"id":"1003271445544158","url":"https://www.facebook.com/NASA/posts/pfbid0ozvoLoowKvCysA2CZkXKTAVCRLoVECcrC7W8eQbQYvxBNKMCQAzV8baSgDa8t5Hol?comment_id=1003271445544158","text":"how is this different from JWST?","author":{"id":"pfbid02SdzVLPYTHY2eGMdrwFrLw54sVZdguAGnLUj4RPL3HxFtG2D4PBBjptiMEwpB21Ehl","name":"Robin Bergsagel","shortName":"Robin","gender":"FEMALE","avatarUrl":"https://scontent.fsgn24-1.fna.fbcdn.net/v/t39.30808-1/692472460_26663220403348161_6124206666765972294_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx960x960&ctp=s32x32&_nc_cat=102&ccb=1-7&_nc_sid=e99d92&_nc_ohc=3HNDMjGZhBIQ7kNvwH_Yi6V&_nc_oc=AdoxMiMSoY_ToCduVunc3YCOZtk_SXSgox578bFFqLiP_4rQwkwI465-N_iYgGAJFKc&_nc_zt=24&_nc_ht=scontent.fsgn24-1.fna&_nc_gid=HH_crC25V3cxSQmbs1qi6w&_nc_ss=7b289&oh=00_AQDnijJpCb3QQr1TMy3wnG3ZpT2laUi0wvxSIlu-E9nHXw&oe=6A6C3A29"},"authorAvatarUrl":"https://scontent.fsgn24-1.fna.fbcdn.net/v/t39.30808-1/692472460_26663220403348161_6124206666765972294_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx960x960&ctp=s32x32&_nc_cat=102&ccb=1-7&_nc_sid=e99d92&_nc_ohc=3HNDMjGZhBIQ7kNvwH_Yi6V&_nc_oc=AdoxMiMSoY_ToCduVunc3YCOZtk_SXSgox578bFFqLiP_4rQwkwI465-N_iYgGAJFKc&_nc_zt=24&_nc_ht=scontent.fsgn24-1.fna&_nc_gid=HH_crC25V3cxSQmbs1qi6w&_nc_ss=7b289&oh=00_AQDnijJpCb3QQr1TMy3wnG3ZpT2laUi0wvxSIlu-E9nHXw&oe=6A6C3A29","likeCount":95,"publishedAt":"2026-06-02T19:30:33+00:00","replyCount":1,"reactionCount":95,"reactions":{"like":79,"love":4,"care":0,"haha":1,"wow":11,"sad":0,"anger":0,"thankful":0,"pride":0,"confused":0}},{"id":"1565653145168639","url":"https://www.facebook.com/NASA/posts/pfbid0ozvoLoowKvCysA2CZkXKTAVCRLoVECcrC7W8eQbQYvxBNKMCQAzV8baSgDa8t5Hol?comment_id=1565653145168639","text":"You had me at Roman","author":{"id":"pfbid0exampleAuthorIdFor15656531","name":"Mike Harwick","shortName":"Mike","gender":"MALE","avatarUrl":"https://scontent.fsgn13-1.fna.fbcdn.net/v/t39.30808-1/708345356_26903531449306692_9193818255719987217_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx960x960&ctp=s32x32&_nc_cat=100&ccb=1-7&_nc_sid=e99d92&_nc_ohc=TzWa-f368dwQ7kNvwEMPaUV&_nc_oc=AdpdLHrvXy7m167xxHhinaiUIlBoo2jzN-yKoz2hmtKPDhZMy8t4wFudGRE1dEwFuas&_nc_zt=24&_nc_ht=scontent.fsgn13-1.fna&_nc_gid=HH_crC25V3cxSQmbs1qi6w&_nc_ss=7b289&oh=00_AQCw8rv9R1a-kXHBcH09C7AdRzTbIlhxf4mps8XzaYwIlQ&oe=6A6C1254"},"authorAvatarUrl":"https://scontent.fsgn13-1.fna.fbcdn.net/v/t39.30808-1/708345356_26903531449306692_9193818255719987217_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx960x960&ctp=s32x32&_nc_cat=100&ccb=1-7&_nc_sid=e99d92&_nc_ohc=TzWa-f368dwQ7kNvwEMPaUV&_nc_oc=AdpdLHrvXy7m167xxHhinaiUIlBoo2jzN-yKoz2hmtKPDhZMy8t4wFudGRE1dEwFuas&_nc_zt=24&_nc_ht=scontent.fsgn13-1.fna&_nc_gid=HH_crC25V3cxSQmbs1qi6w&_nc_ss=7b289&oh=00_AQCw8rv9R1a-kXHBcH09C7AdRzTbIlhxf4mps8XzaYwIlQ&oe=6A6C1254","likeCount":3,"publishedAt":"2026-06-03T12:30:24+00:00","replyCount":0,"reactionCount":3,"reactions":{"like":3,"love":0,"care":0,"haha":0,"wow":0,"sad":0,"anger":0,"thankful":0,"pride":0,"confused":0}}],"hasMore":true,"nextCursor":null,"feedbackId":"ZmVlZGJhY2s6MTU0MTc1MzUyMzk4NjY4NQ=="}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/page-details":{"get":{"operationId":"facebook_page_details","tags":["Facebook"],"summary":"Facebook Page Details API","description":"Facebook page profile — likes vs followers (distinct), talkingAbout, category, website, and public email.\n\nPass a Facebook page URL, @handle, or page name and get clean JSON: username, displayName (short brand) + fullName (page title), bio, verified, profileImage/coverImage, category, website, and public email when the page exposes one (CRM/outreach-ready). Metrics are distinct: likes, followers, following, and talkingAbout — each count that is present carries its own *IsApproximate flag (followers often a compact chrome label like 28M → followersIsApproximate=true; exact og likes like 28,695,557 → likesIsApproximate=false). Likes are never copied into followers. Flat 2 credits. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/facebook-page-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook page URL, @handle, or page name, e.g. https://facebook.com/PageName. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Facebook page profile — likes vs followers (distinct), talkingAbout, category, website, and public email.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"fullName":{"type":"string","description":"Full display name."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"followers":{"type":"integer","description":"Follower count."},"followersIsApproximate":{"type":"boolean","description":"True when followers came from a compact chrome label (e.g. 28M). False when Facebook exposed an exact integer."},"following":{"type":"integer","description":"Number of accounts followed."},"likes":{"type":"integer","description":"Like count (number)."},"likesIsApproximate":{"type":"boolean","description":"False when likes is an exact og/chrome digit string (e.g. 28,695,557). True when parsed from a compact label (28M likes)."},"talkingAbout":{"type":"integer","description":"Facebook 'people talking about this' count for the page when exposed (distinct from likes/followers)."},"talkingAboutIsApproximate":{"type":"boolean","description":"False when talkingAbout is an exact digit string. True when parsed from a compact label."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"coverImage":{"type":"string","description":"Cover image URL."},"category":{"type":"string","description":"Generic category label for the item or community."},"website":{"type":"string","description":"Website listed on the profile."},"email":{"type":"string","description":"Public email when the Facebook Page About section exposes one. Null when omitted."}}}}},"example":{"success":true,"data":{"platform":"facebook","url":"https://www.facebook.com/NASA","username":"NASA","displayName":"NASA","fullName":"NASA - National Aeronautics and Space Administration","bio":"Explore the universe and discover our home planet. \nThere's space for everybody. ✨","followers":28000000,"followersIsApproximate":true,"following":52,"likes":28657418,"likesIsApproximate":false,"talkingAbout":87542,"talkingAboutIsApproximate":false,"verified":true,"profileImage":"https://scontent-ams2-1.xx.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=dst-png&cstp=mx800x800&ctp=s200x200&_nc_cat=1&ccb=1-7&_nc_sid=f907e8&_nc_ohc=p-I5WtLvyPIQ7kNvwGNqQPz&_nc_oc=AdrHdhh-STMw354rnrjuFVcB_iniLxrLE45ODKhANclECwfCGQeoggO3Y69bFTeV3u0&_nc_zt=24&_nc_ht=scontent-ams2-1.xx&_nc_gid=zOsU00hAz3vIE0xLeuEEjA&_nc_ss=7b289&oh=00_AQG0XVSduh4nqyw_0PUHNXFrPsaQWgImWMlBgnFHw-mkCQ&oe=6A764C55","coverImage":"https://scontent-ams2-1.xx.fbcdn.net/v/t39.30808-6/663298991_1496429661852405_5171518456419416626_n.jpg?stp=dst-jpg_tt6&cstp=mx2048x1366&ctp=s960x960&_nc_cat=105&ccb=1-7&_nc_sid=cc71e4&_nc_ohc=jJ1aogFmMrAQ7kNvwEgUz8r&_nc_oc=AdpCeQFsutnpqxSVozuP96M4esxiGp_E5LtUwYSr-XGvAxD-YEWuH7-t6kuRXoOl2hI&_nc_zt=23&_nc_ht=scontent-ams2-1.xx&_nc_gid=zOsU00hAz3vIE0xLeuEEjA&_nc_ss=7b289&oh=00_AQFVelTF7GeR-4rMFhrEk2wwf2DLSBrFT0qUkp3H6V8uKg&oe=6A7628E3","category":"Government organization","website":"https://nasa.gov/nasa-app","email":"public-inquiries@hq.nasa.gov"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/profile-posts":{"get":{"operationId":"facebook_profile_posts","tags":["Facebook"],"summary":"Facebook Profile Posts API","description":"Latest posts and Reels from a Facebook page — listingHits / timings.phase; 60s deadline, failures 0 credits.\n\nPass a Facebook page URL or @handle and get that page's recent posts as clean JSON (text posts and Reels mixed). author.username uses one consistent vanity casing across the page (no nasa vs NASA split). engagement always includes views and shares (null when unknown / not a video) — never invents shares:0 from listing noise. The envelope names the yield: requested, totalReturned, listingHits, hydrateFailures, hydrateSkipped, hasMore, truncatedReason=listing-window | hydrate-budget | deadline | null (always keyed), timings{listingMs,hydrateMs,phase,totalMs}, and fetchedAt (not a second scrapedAt). When hasMore is false: listingHits − hydrateFailures − hydrateSkipped = totalReturned. When hasMore is true: min(listingHits, requested) − hydrateFailures − hydrateSkipped = totalReturned. Listing starts with a 1s-wait first-paint hop (~10–16s) so shop-heavy pages (nike) are not spent on a 40s scrolled miss; the scrolled hop and a light /posts tab still run when that paint is empty. Each permalink hydrate is typically 6–10s (can be ~100ms when listing already carried the post) and is capped at 12s. Hydration is sequential and clock-aware: keep going while elapsed + 12s < 60s (the cap, not the typical 6–10s), then return what fits with truncatedReason=hydrate-budget. If the 60s deadline fires after posts have already finished, those posts ship as a 200 with truncatedReason=deadline instead of a 503 with nothing. limit default 4 / max 4 (422 above that); the cap is the ceiling, not a promise. A 503 carries the same timings so phase=listing vs phase=hydrate is readable; phase=listing forces hydrateMs=0. Hard 60s deadline: hang with no posts is 503 unless a 6h last-good page exists (stale 200, 0 credits). Empty live page is 502. Failures are 0 credits. A failed page with no last-good is remembered for 60s so retries are an instant 502/503 with the same timings. Flat 2 credits on the native path.\n\nDocs: https://captapi.com/apis/facebook-profile-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook profile/page URL, @handle, or page name. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 4, max 4). The logged-out listing hop is ~23–29s typical, hard-capped at 40s. Each hydrate is typically 6–10s (can be ~100ms when listing already carried the post) and is capped at 12s. The next-item fit check uses that 12s cap, not the typical 6–10s, so a call cannot exceed 60s. The loop stops when the next item would miss the 60s deadline and returns what it has (truncatedReason=hydrate-budget | deadline). Asking for 20 cannot return 20 inside that ceiling. Flat 2 credits per call.","schema":{"type":"integer","maximum":4,"minimum":1,"default":4}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Latest posts and Reels from a Facebook page — listingHits / timings.phase; 60s deadline, failures 0 credits.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Facebook page URL you queried."},"totalReturned":{"type":"integer","description":"Posts in this response (length of posts[])."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Facebook page URL you queried."},"id":{"type":"string","description":"Id of this posts item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description of this posts item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Facebook page URL you queried."},"profileImage":{"type":"string"},"verified":{"type":"boolean"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"comments":{"type":"integer"},"views":{"type":["integer","null"]},"shares":{"type":["integer","null"]}},"description":"Engagement metrics for the item."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"durationSeconds":{"type":"number"},"videoUrl":{"type":"string"},"link":{"type":"string"}}}},"scrapedAt":{"type":"string","description":"When this response was collected (ISO 8601). Envelope-level freshness on listings that expose it (e.g. Facebook profile-reels) — not a per-row stamp on Spotify search. facebook/profile-posts uses fetchedAt; there is no scrapedAt twin."}}}}},"example":{"success":true,"data":{"url":"https://www.facebook.com/NASA","totalReturned":2,"posts":[{"platform":"facebook","url":"https://www.facebook.com/NASA/posts/pfbid0TBwRTPkxfaLhYBjfsK1xApVksSVHddNrpqUqcqNsKxVvKjqT6dAG8HnxWGA3odp5l","id":"1587644189397618","caption":"This is messy 😬\n \nA galaxy cluster is exactly what you'd think: a bunch of galaxies grouped together. This galaxy cluster is made of two sub-clusters with similar mass, locked in a messy process of interacting and separating. Eventually, they'll merge. Though their relationship is… complicated, it helps us study the region.\n \nThe cluster's extreme and concentrated mass curves light with its gravity. This is called gravitational lensing, and it works like a glass lens bending and focusing light. Objects are magnified and their brightness is enhanced, so if they lie in exactly the right place, background galaxies and even individual stars that would have been far too faint and distant to spot will be made visible.","description":"This is messy 😬\n \nA galaxy cluster is exactly what you'd think: a bunch of galaxies grouped together. This galaxy cluster is made of two sub-clusters with similar mass, locked in a messy process of interacting and separating. Eventually, they'll merge. Though their relationship is… complicated, it helps us study the region.\n \nThe cluster's extreme and concentrated mass curves light with its gravity. This is called gravitational lensing, and it works like a glass lens bending and focusing light. Objects are magnified and their brightness is enhanced, so if they lie in exactly the right place, background galaxies and even individual stars that would have been far too faint and distant to spot will be made visible.","publishedAt":"2026-07-27T15:33:07.000Z","thumbnailUrl":"https://scontent-dfw5-2.xx.fbcdn.net/v/t39.99422-6/758964186_1384158170473704_9008748322111971488_n.png?stp=dst-jpg_tt6&cstp=mx2047x1012&ctp=s1080x2048&_nc_cat=1&ccb=1-7&_nc_sid=12...","author":{"username":"NASA","displayName":"NASA - National Aeronautics and Space Administration","url":"https://www.facebook.com/NASA"},"engagement":{"likes":1861,"comments":84,"views":null,"shares":null},"isVideo":false},{"platform":"facebook","url":"https://www.facebook.com/reel/1380134307388381","id":"1584419709720066","caption":"During his eight months aboard the International Space Station, NASA astronaut Chris Williams conducted numerous experiments to improve life on Earth and prepare us for missions to the Moon and Mars.\n\nFrom cancer research to advancing technology, read about Williams’ work during his first time in space: https://go.nasa.gov/3RavGXj","description":"During his eight months aboard the International Space Station, NASA astronaut Chris Williams conducted numerous experiments to improve life on Earth and prepare us for missions to the Moon and Mars.\n\nFrom cancer research to advancing technology, read about Williams’ work during his first time in space: https://go.nasa.gov/3RavGXj","publishedAt":"2026-07-23T16:31:54.000Z","durationSeconds":112.946,"thumbnailUrl":"https://scontent-sea5-1.xx.fbcdn.net/v/t15.5256-10/754970839_803020196231197_5928609298551288000_n.jpg?stp=dst-jpg_tt6&cstp=mx720x405&ctp=s720x405&_nc_cat=102&ccb=1-7&_nc_sid=be830...","videoUrl":"https://video-sea1-1.xx.fbcdn.net/o1/v/t2/f2/m366/AQNNFuni8clCeMB5VeV07ZDIzXWkhBI5ozM_78otCALjoD72HsRW7yvnWXM_b0WGcKAjPk-KGDhCqRkGsaoZ57noEirZQ7LpYHZZbTVu3jMMQg.mp4?_nc_cat=106&_nc...","author":{"username":"NASA","displayName":"NASA - National Aeronautics and Space Administration","url":"https://www.facebook.com/NASA","profileImage":"https://scontent-sea5-1.xx.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s80x80&_nc_cat=108&ccb=1-7&_nc_sid=2d3e12&...","verified":true},"engagement":{"views":411000,"likes":5594,"comments":170,"shares":240},"isVideo":true,"link":"https://go.nasa.gov/3RavGXj"}],"scrapedAt":"2026-08-03T11:00:00Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/profile-reels":{"get":{"operationId":"facebook_profile_reels","tags":["Facebook"],"summary":"Facebook Profile Reels API","description":"Latest Facebook page Reels — views, likes, comments, shares; newest-first without archive padding.\n\nPass a Facebook page or profile URL and get that account's recent Reels as clean JSON: caption, publishedAt, duration, thumbnail / video URL, author, and full engagement (views, likes, comments, shares). Results are newest-first. Listing uses the Reels tab when available (else Videos), with a shallow scroll so years-old archive videos from deep /videos history are not mixed in; a >1 year gap between consecutive items stops the page (recency cliff). Includes scrapedAt so you can compare counts with Profile Posts from the same moment. Flat 2 credits per call. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh. Hard deadline 90s → 503 with a body (0 credits), not a raw client timeout.\n\nDocs: https://captapi.com/apis/facebook-profile-reels","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook profile/page URL, @handle, or page name. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Latest Facebook page Reels — views, likes, comments, shares; newest-first without archive padding.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"reels":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this reels item."},"caption":{"type":"string","description":"Post or creative caption when the platform exposes one."},"description":{"type":"string","description":"Description of this reels item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"number","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"profileImage":{"type":"string"},"verified":{"type":"boolean"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"shares":{"type":"integer"}},"description":"Engagement metrics for the item."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"link":{"type":"string","description":"Link URL."}}}},"scrapedAt":{"type":"string","description":"When this response was collected (ISO 8601). Envelope-level freshness on listings that expose it (e.g. Facebook profile-reels) — not a per-row stamp on Spotify search. facebook/profile-posts uses fetchedAt; there is no scrapedAt twin."}}}}},"example":{"success":true,"data":{"url":"https://www.facebook.com/NASA","totalReturned":2,"reels":[{"platform":"facebook","url":"https://www.facebook.com/reel/1380134307388381","id":"1584419709720066","caption":"During his eight months aboard the International Space Station, NASA astronaut Chris Williams conducted numerous experiments to improve life on Earth and prepare us for missions to the Moon and Mars.\n\nFrom cancer research to advancing technology, read about Williams’ work during his first time in space: https://go.nasa.gov/3RavGXj","description":"During his eight months aboard the International Space Station, NASA astronaut Chris Williams conducted numerous experiments to improve life on Earth and prepare us for missions to the Moon and Mars.\n\nFrom cancer research to advancing technology, read about Williams’ work during his first time in space: https://go.nasa.gov/3RavGXj","publishedAt":"2026-07-23T16:31:54.000Z","durationSeconds":112.946,"thumbnailUrl":"https://scontent-iad6-1.xx.fbcdn.net/v/t15.5256-10/754970839_803020196231197_5928609298551288000_n.jpg?stp=dst-jpg_tt6&cstp=mx720x405&ctp=s720x405&_nc_cat=102&ccb=1-7&_nc_sid=be830...","videoUrl":"https://video-iad6-1.xx.fbcdn.net/o1/v/t2/f2/m366/AQNNFuni8clCeMB5VeV07ZDIzXWkhBI5ozM_78otCALjoD72HsRW7yvnWXM_b0WGcKAjPk-KGDhCqRkGsaoZ57noEirZQ7LpYHZZbTVu3jMMQg.mp4?_nc_cat=106&_nc...","author":{"username":"NASA","displayName":"NASA - National Aeronautics and Space Administration","url":"https://www.facebook.com/NASA","profileImage":"https://scontent-iad3-1.xx.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s40x40&_nc_cat=108&ccb=1-7&_nc_sid=2d3e12&...","verified":true},"engagement":{"views":411000,"likes":5597,"comments":170,"shares":240},"isVideo":true,"link":"https://go.nasa.gov/3RavGXj"},{"platform":"facebook","url":"https://www.facebook.com/reel/1376651124309650","id":"1567272851434752","caption":"There will be more than just fireworks to see in the night sky this month!\n\nYou can look forward to these celestial sights in July:\n- A lunar-planetary alignment\n- A visiting comet\n- A good look at Saturn and the Milky Way\n\nHappy skywatching! https://go.nasa.gov/3QvQc4k","description":"There will be more than just fireworks to see in the night sky this month!\n\nYou can look forward to these celestial sights in July:\n- A lunar-planetary alignment\n- A visiting comet\n- A good look at Saturn and the Milky Way\n\nHappy skywatching! https://go.nasa.gov/3QvQc4k","publishedAt":"2026-07-02T15:03:11.000Z","durationSeconds":200.016,"thumbnailUrl":"https://scontent-iad3-2.xx.fbcdn.net/v/t15.5256-10/735149954_4435586749988646_521208314578416779_n.jpg?stp=dst-jpg_tt6&cstp=mx720x405&ctp=s720x405&_nc_cat=111&ccb=1-7&_nc_sid=be830...","videoUrl":"https://video-iad3-2.xx.fbcdn.net/o1/v/t2/f2/m366/AQOh7ZLRZfB5SIGETu_uz2jbsqvY3dW7G3sGdKsNsX627DpYoTuCxs26FyYE4T4rDzRdvIV2tOCYJi5hs8Gs1EaQEL7_LhQnAXKuILiY508JFg.mp4?_nc_cat=103&_nc...","author":{"username":"NASA","displayName":"NASA - National Aeronautics and Space Administration","url":"https://www.facebook.com/NASA","profileImage":"https://scontent-iad3-1.xx.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s40x40&_nc_cat=108&ccb=1-7&_nc_sid=2d3e12&...","verified":true},"engagement":{"views":598000,"likes":6582,"comments":89,"shares":531},"isVideo":true,"link":"https://go.nasa.gov/3QvQc4k"}],"scrapedAt":"2026-08-03T11:00:00Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/group-posts":{"get":{"operationId":"facebook_group_posts","tags":["Facebook"],"summary":"Facebook Group Posts API","description":"Public Facebook group posts — listingHits / hydrateFailures / hydrateSkipped, sortBy, and per-count *IsApproximate.\n\nPass a public Facebook group URL and get recent posts as clean JSON: caption, publishedAt, author (id when Facebook exposes it — never the group slug as username), url (the post — there is no permalink twin), thumbnailUrl when Facebook exposes a still, optional topComments Facebook embedded on the post, and engagement. sortBy maps to Facebook's sorting_setting (TOP_POSTS | RECENT_ACTIVITY | CHRONOLOGICAL default | CHRONOLOGICAL_LISTINGS). The envelope names the yield: requested, totalReturned, listingHits (distinct candidate posts in this HTML window), hydrateFailures (attempted hydrates that did not become a row), hydrateSkipped (found but not hydrated — the listing hop ate the budget), hasMore (true only when listingHits > limit — raise limit; there is no cursor), truncatedReason=listing-window | hydrate-budget, and fetchedAt (not a second scrapedAt). When hasMore is false: listingHits − hydrateFailures − hydrateSkipped = totalReturned. likes / comments / views / shares are always keyed (null when unknown — never treat a missing key as 0). Every keyed likes/comments/shares count carries *IsApproximate, including when the count is null (then false — unknown is not a compact token). Flat 2 credits. Pass cache=true for the 24h shared cache. The logged-out group feed is intermittently gated — a 200 with posts is not a promise the next call will succeed. Failures are 502 (listing hop finished, Facebook withheld extractable posts) or 503 (90s deadline), both with a body and 0 credits. Retry the call; do not treat a single 200 as a stable integration.\n\nDocs: https://captapi.com/apis/facebook-group-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public Facebook group URL, e.g. https://facebook.com/groups/ID. Must contain /groups/ — profile/page URLs are a definitive 400 (use /v1/facebook/profile-posts for those). The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"sortBy","in":"query","required":false,"description":"TOP_POSTS | RECENT_ACTIVITY | CHRONOLOGICAL (default) | CHRONOLOGICAL_LISTINGS. Maps to Facebook sorting_setting.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Public Facebook group posts — listingHits / hydrateFailures / hydrateSkipped, sortBy, and per-count *IsApproximate.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Public Facebook group URL you queried."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"This post's Facebook URL (https://www.facebook.com/groups/{slug}/posts/{id}). There is no permalink twin — that key was an embed-alias of url and did not ship."},"id":{"type":"string","description":"Id of this posts item."},"caption":{"type":"string","description":"Post text. There is no description twin (the old example copied caption into description)."},"description":{"type":"string","description":"Description of this posts item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"author":{"type":"object","properties":{"displayName":{"type":"string"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"comments":{"type":"integer"}},"description":"Engagement metrics for the item."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"permalink":{"type":"string","description":"Canonical Instagram permalink for the embed."},"thumbnailUrl":{"type":"string"}}}},"sortBy":{"type":"string","description":"Facebook sorting_setting echoed back: TOP_POSTS | RECENT_ACTIVITY | CHRONOLOGICAL | CHRONOLOGICAL_LISTINGS."}}}}},"example":{"success":true,"data":{"url":"https://www.facebook.com/groups/dogspotting","totalReturned":2,"posts":[{"platform":"facebook","url":"https://www.facebook.com/groups/dogspotting/posts/10165927007174467/","id":"10165927007174467","caption":"Dog in a basket…I repeat…dog in a basket!","description":"Dog in a basket…I repeat…dog in a basket!","publishedAt":"2026-07-27T16:34:51.000Z","author":{"displayName":"Beth Oxford"},"engagement":{"likes":87,"comments":0},"isVideo":false,"permalink":"https://www.facebook.com/groups/dogspotting/posts/10165927007174467/"},{"platform":"facebook","url":"https://www.facebook.com/groups/dogspotting/posts/10165913663824467/","id":"10165913663824467","caption":"Waiting patiently in the Mustang.","description":"Waiting patiently in the Mustang.","publishedAt":"2026-07-24T22:16:11.000Z","thumbnailUrl":"https://scontent-iad6-1.xx.fbcdn.net/v/t39.30808-6/754824625_10163571025602896_890543610805686018_n.jpg?stp=dst-jpg_tt6&cstp=mx2048x1536&ctp=p600x600&_nc_cat=107&ccb=1-7&_nc_sid=63...","author":{"displayName":"Chet Rhodes"},"engagement":{"likes":36,"comments":2},"isVideo":false,"permalink":"https://www.facebook.com/groups/dogspotting/posts/10165913663824467/"}],"sortBy":"CHRONOLOGICAL"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/comment-replies":{"get":{"operationId":"facebook_comment_replies","tags":["Facebook"],"summary":"Facebook Comment Replies API","description":"Pull replies under a Facebook comment — author, text, likes, and time.\n\nThe Facebook Comment Replies API lets you pull comments with author, text, likes, and replies for Facebook comment replies with a single REST call. No OAuth, no infrastructure to maintain, and no platform SDKs — send the request, get clean structured JSON back. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d.\n\nDocs: https://captapi.com/apis/facebook-comment-replies","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook post URL the comment belongs to. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"commentId","in":"query","required":true,"description":"ID of the parent (top-level) comment to fetch replies for — from the comments endpoint. Legacy alias: comment_id.","schema":{"type":"string"}},{"name":"comment_id","in":"query","required":false,"deprecated":true,"description":"Deprecated alias of commentId.","schema":{"deprecated":true,"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Pull replies under a Facebook comment — author, text, likes, and time.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"commentId":{"type":"string","description":"Comment id. Example: \"1009195248315125\"."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"replies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this replies item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"author":{"type":"string","description":"Author name or handle."},"authorUrl":{"type":"string","description":"Profile URL of the author."},"authorAvatarUrl":{"type":"string","description":"Profile picture URL of the person who wrote the comment."},"likeCount":{"type":"integer","description":"Like count as an integer. Compact UI labels (\"727K\") are expanded here; see likeCountText for the original string."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."}}}}}}}},"example":{"success":true,"data":{"platform":"facebook","url":"https://www.facebook.com/NASA/posts/pfbid02skzNsrLf5atYZfzvzHAK9gHwDnZC5u4pDZMLQ1u3iJmfoA8tNsGpT7Uj6WPs6K3Rl","commentId":"1009195248315125","totalReturned":1,"replies":[{"id":"1042165238137511","url":"https://www.facebook.com/NASA/posts/pfbid0ozvoLoowKvCysA2CZkXKTAVCRLoVECcrC7W8eQbQYvxBNKMCQAzV8baSgDa8t5Hol?comment_id=1009195248315125&reply_comment_id=1042165238137511","text":"Richard Alexandrowich why?","author":"Lachlan Cryer","authorUrl":"https://www.facebook.com/people/Lachlan-Cryer/pfbid0375uAsq1qky7hMLXQqGc7jjTkqBfPXimoWiegNFtifpGUVNAbGSCJUfTuE2pFLUbrl/","authorAvatarUrl":"https://scontent.fgua9-1.fna.fbcdn.net/v/t1.30497-1/453178253_471506465671661_2781666950760530985_n.png?stp=cp0_dst-png&cstp=mx2048x2048&ctp=s32x32&_nc_cat=1&ccb=1-7&_nc_sid=136b72&_nc_ohc=YYd_HsBfn6kQ7kNvwExKFZn&_nc_oc=AdqMYmSyRUE01D1xr5lyzA2HCr-qEDfBccvNnTFqTcwN9d6sZq2e9gUxP6FqN2yBlOg&_nc_zt=24&_nc_ht=scontent.fgua9-1.fna&_nc_ss=7b289&oh=00_AQC7tyTMaBqs0n4gldLDuXTonuW4u8g9hyfiQqxHLmbKJA&oe=6A8DC8BA","likeCount":1,"publishedAt":"2026-06-03T07:43:21+00:00"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/profile-photos":{"get":{"operationId":"facebook_profile_photos","tags":["Facebook"],"summary":"Facebook Profile Photos API","description":"Photo grid from a Facebook Page — full image URL plus accessibilityCaption (alt-text, not a post caption).\n\nPass a Facebook Page URL or @handle and get photos from the public /photos grid as clean JSON: id, url, image (full-size CDN), width/height (always keyed; null when Facebook omits them), and accessibilityCaption — Facebook's image alt-text, not a user-written post caption. Publish time and likes/comments are usually absent on this surface (platform limit, not a Captapi gap). Facebook does not expose a separate thumbnail on this grid — image is the delivered CDN URL. limit (default 20, max 200) is your cap; the /photos SSR grid is a single batch (often ~8). Every 200 includes limit, totalReturned, retrievableCount (unique Photo nodes in this batch), hasMore, and nextCursor (always null — a missing cursor key is a bug; null is the end). hasMore is true only when we sliced below the batch. truncatedReason=photos-grid-batch when the grid bound you — not \"the Page only has 8\" and not \"limit was ignored.\" Flat 2 credits. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/facebook-profile-photos","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook profile/page URL, @handle, or page name. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). The public /photos grid is a single SSR batch (often ~8) — retrievableCount is that batch, not a promise Facebook will fill limit. Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Photo grid from a Facebook Page — full image URL plus accessibilityCaption (alt-text, not a post caption).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Facebook Page URL you queried."},"totalReturned":{"type":"integer","description":"Photos in this response (length of photos[])."},"photos":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Numeric Facebook photo id (fbid)."},"url":{"type":"string","description":"Permalink https://www.facebook.com/photo.php?fbid={id}."},"image":{"type":"string","description":"Full-size CDN URL Facebook delivered for this photo. There is no separate thumbnailUrl on this surface."},"width":{"type":"integer","description":"Width in pixels. Always keyed; null when Facebook omits the dimension."},"height":{"type":"integer","description":"Height in pixels. Always keyed; null when Facebook omits the dimension."},"accessibilityCaption":{"type":"string","description":"Facebook image alt-text / accessibility description — not a user-written post caption. Date and engagement are usually unavailable on the /photos surface."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.facebook.com/NASA","totalReturned":2,"photos":[{"platform":"facebook","id":"1587644152730955","url":"https://www.facebook.com/photo.php?fbid=1587644152730955","image":"https://scontent-dfw6-2.xx.fbcdn.net/v/t39.99422-6/758964186_1384158170473704_9008748322111971488_n.png?stp=dst-jpg_tt6&cstp=mx2047x1012&ctp=s2047x1012&_nc_cat=1&ccb=1-7&_nc_sid=12...","width":2047,"height":1012,"accessibilityCaption":"A galaxy cluster in deep space. It is filled with elliptical galaxies: small, bright white glowing ovals. The two largest elliptical galaxies, left and right of center, are bright cores that radiate light. Unrelated, distant galaxies are scattered around as red smudges and dots. Many of these are stretched out into red arcs and lines by the galaxy cluster’s strong gravity, creating multiple images in places. Numerous spiral galaxies and bright stars appear in the foreground. Credit: ESA/Webb, NASA & CSA, S. Fujimoto"},{"platform":"facebook","id":"1586655189496518","url":"https://www.facebook.com/photo.php?fbid=1586655189496518","image":"https://scontent-dfw6-2.xx.fbcdn.net/v/t39.30808-6/756229023_1586655192829851_1923291187225748989_n.jpg?stp=dst-jpg_tt6&cstp=mx1884x1054&ctp=s1884x1054&_nc_cat=110&ccb=1-7&_nc_sid=...","width":1884,"height":1054,"accessibilityCaption":"An aerial view of a spacecraft about to land on Earth; the capsule is barely visible, but a large white-and-red parachute billows above it. The plain around it is flat and featureless. Credit: NASA+"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitter/tweet-details":{"get":{"operationId":"twitter_tweet_details","tags":["Twitter / X"],"summary":"Twitter/X Tweet Details API","description":"One tweet as JSON — text, author (followers), likes/replies/retweets/quotes, media, ISO publishedAt.\n\nPaste a tweet URL and get clean JSON using the same tweet contract as User Tweets and Community Tweets: text, language, ISO-8601 publishedAt, author (username, displayName, verified, avatar, followers when exposed), engagement{likes,replies,retweets,quotes} plus views/bookmarks when GraphQL exposes them (omitted, not nulled, when it does not), isReply / isRetweet / isQuote, hashtags[], and media[]. Guest GraphQL TweetResultByRestId fills views/bookmarks when available; otherwise we hydrate retweets/quotes/followers from the popular timeline / profile. Flat 1 credit per call.\n\nDocs: https://captapi.com/apis/twitter-tweet-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public tweet URL, e.g. https://x.com/user/status/ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"One tweet as JSON — text, author (followers), likes/replies/retweets/quotes, media, ISO publishedAt.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"text":{"type":"string","description":"Text content."},"lang":{"type":"string","description":"Language code of the content."},"publishedAt":{"type":"string","description":"Tweet publish time as ISO-8601 UTC."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."}}},"isReply":{"type":"boolean","description":"Whether the tweet is a reply."},"isRetweet":{"type":"boolean","description":"Whether the tweet is a retweet."},"possiblySensitive":{"type":"boolean","description":"Possibly sensitive. Example: false."},"conversationId":{"type":"string","description":"Conversation id. Example: \"2078224758781751775\"."},"engagement":{"type":"object","properties":{"views":{"description":"View count when the platform exposes one."},"likes":{"type":"integer","description":"Like count (number)."},"replies":{"type":"integer","description":"Number of replies."},"retweets":{"type":"integer","description":"Retweet count."},"quotes":{"type":"integer","description":"Quote count."},"bookmarks":{"description":"Bookmark count."}}},"hashtags":{"type":"array","items":{},"description":"Hashtag texts without #. Always an array (empty when none)."},"media":{"type":"array","items":{"type":"string"},"description":"Media attached to the item."}}}}},"example":{"success":true,"data":{"platform":"twitter","url":"https://x.com/NASASpox/status/2078224758781751775","id":"2078224758781751775","text":"Full steam ahead this week at @NASA 🚀\n\n🧑‍🚀 @Astro_Anil arrives at the ISS\n🪐 Dragonfly progress\n✈️ Future of autonomous flight\n🤝 70 Artemis Accords signatories\n\nHere's your NASA Minute! https://t.co/GAZ4sUqfbZ","lang":"en","publishedAt":"2026-07-17T21:06:08.000Z","author":{"id":"1907894348319973378","username":"NASASpox","displayName":"Bethany Stevens","url":"https://x.com/NASASpox","followers":19464,"verified":true,"profileImage":"https://pbs.twimg.com/profile_images/2030158374625759233/3fWyLDjS_normal.jpg"},"isReply":false,"isRetweet":false,"possiblySensitive":false,"conversationId":"2078224758781751775","engagement":{"views":null,"likes":606,"replies":52,"retweets":117,"quotes":6,"bookmarks":null},"hashtags":[],"media":["https://pbs.twimg.com/media/HNdWSZ3XsAEekpT.jpg"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitter/transcript":{"get":{"operationId":"twitter_transcript","tags":["Twitter / X"],"summary":"Twitter/X Transcript API","description":"Tweet text as a transcript — timingSource none (not speech-to-text).\n\nPaste a public tweet URL and get the tweet body as structured text. timingSource is always \"none\" today — syndication text only, not speech-to-text or captions. When timingSource is \"none\", segment start/duration/timestamp are omitted (returned only when timingSource is \"captions\"). Paragraph-split transcriptSegments include index, wordCount, charStart/charEnd; estimatedReadSeconds is a top-level 200 wpm estimate — never inside duration. The dead segments count key is gone (same as reddit/post-transcript). Flat 1 credit.\n\nDocs: https://captapi.com/apis/twitter-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public tweet URL, e.g. https://x.com/user/status/ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Tweet text as a transcript — timingSource none (not speech-to-text).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"tweetId":{"type":"string","description":"Tweet id. Example: \"2078224758781751775\"."},"transcript":{"type":"string","description":"Complete text transcript (file-upload endpoints). Timed caption/ASR endpoints use text instead."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"index":{"type":"integer","description":"0-based segment order."},"wordCount":{"type":"integer","description":"Word count (emoji-only tokens count as 0; URLs count as 1)."},"charStart":{"type":"integer","description":"Start offset into transcript (transcript.slice(charStart, charEnd) === text)."},"charEnd":{"type":"integer","description":"End offset into transcript (exclusive)."}}}},"wordCount":{"type":"integer","description":"Word count (emoji-only tokens count as 0; URLs count as 1)."},"segments":{"type":"integer","description":"Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."}}},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"timingSource":{"type":"string","description":"Always \"none\" today. \"captions\" is reserved — do not branch on it; nothing emits it yet."},"estimatedReadSeconds":{"type":"integer","description":"Whole-transcript reading-time estimate at 200 wpm. Not per-segment duration."}}}}},"example":{"success":true,"data":{"platform":"twitter","url":"https://x.com/NASASpox/status/2078226501024227542","tweetId":"2078224758781751775","transcript":"Full steam ahead this week at @NASA 🚀\n\n🧑‍🚀 @Astro_Anil arrives at the ISS\n🪐 Dragonfly progress\n✈️ Future of autonomous flight\n🤝 70 Artemis Accords signatories\n\nHere's your NASA Minute! https://t.co/GAZ4sUqfbZ","transcriptSegments":[{"text":"Full steam ahead this week at @NASA 🚀","index":0,"wordCount":7,"charStart":0,"charEnd":37},{"text":"🧑‍🚀 @Astro_Anil arrives at the ISS\n🪐 Dragonfly progress\n✈️ Future of autonomous flight\n🤝 70 Artemis Accords signatories","index":1,"wordCount":15,"charStart":39,"charEnd":158},{"text":"Here's your NASA Minute! https://t.co/GAZ4sUqfbZ","index":2,"wordCount":5,"charStart":160,"charEnd":208}],"wordCount":27,"segments":3,"author":{"username":"NASASpox","displayName":"Bethany Stevens","url":"https://x.com/NASASpox","verified":false,"profileImage":"https://pbs.twimg.com/profile_images/2030158374625759233/3fWyLDjS_normal.jpg"},"publishedAt":"2026-07-17T21:06:08.000Z","timingSource":"none","estimatedReadSeconds":8}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitter/profile":{"get":{"operationId":"twitter_profile","tags":["Twitter / X"],"summary":"Twitter/X Profile API","description":"X profile: verified + blue/legacy/identity, displayName, avatar/banner, tipjar→contact{}, expanded website.\n\nPaste a profile URL or @handle and get clean JSON. Canonical profile core: platform, id, username, url, displayName, bio, avatar, banner, followers, following, postCount, verified, createdAt. No handle/name/profileImage/bannerImage/tweetCount twins — those names are gone, not a one-release alias window. Identity-card keys stay on the set when unpublished: location, website, businessAffiliatesCount, creatorSubscriptionsCount, affiliate, bioUrls[], withheldInCountries are null/0/empty, never missing. null vs 0/false: present none is 0/false; omitted is null on the HTML fallback. Guest GraphQL (source=native, stages.graphqlStatus=ok) omits empty parents (no business_account object) — those independent counts and verification bits become 0/false because Twitter did not send a distinguishable unknown. Split fields (fastFollowers / normalFollowers) stay null when omitted so we never invent 0+0 against followers. verified is derived: isBlueVerified OR isLegacyVerified OR isIdentityVerified OR (affiliate != null). A null bit is treated as false in that OR — it cannot hide a known badge. Verification lives once, on verification{isBlueVerified, isLegacyVerified, isIdentityVerified, verifiedType, reason, verifiedSince}; affiliate is a sibling (object or null). reason is the tooltip text with X's \"Learn more\" CTA stripped. Trust signals: followers = normalFollowers + fastFollowers when both splits are present; possiblySensitive. followersIsApproximate / followingIsApproximate / postCountIsApproximate use CP-F (true when v ≥ 10000 and v % 100 === 0). Outreach: tipjarSettings (camelCase isEnabled) + contact{emails,paymentHandles,links} always keyed. Cashtags like $NPCBRO land in paymentHandles, not links; links does not repeat website. website / bioUrls[].expandedUrl are expanded (not raw t.co). Twitter-surface extras (fastFollowers, listedCount, pinnedTweetIds, tipjarSettings, profileImageShape, …) stay at the top level — they are not a second contract and are not namespaced under raw. Also listedCount, mediaCount, likesCount, pinnedTweetIds, highlightedTweets. source + stages + timings on every 200 (native | cache). Flat 1 credit. cache=true uses the 1-hour profile TTL (0 credits on hit); pass cacheMaxAge=1d|3d|7d|14d|30d for a longer window. Envelope includes cached, creditsUsed, requestId, fetchedAt, cachedAt.\n\nDocs: https://captapi.com/apis/twitter-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Twitter/X profile URL or @handle, e.g. https://x.com/username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to use the 1-hour profile cache (0 credits on hit). Default false — always fetch fresh. Prefer cacheMaxAge for 1d–30d.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"X profile: verified + blue/legacy/identity, displayName, avatar/banner, tipjar→contact{}, expanded website.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"username":{"type":"string","description":"Canonical @handle without @. No handle twin."},"displayName":{"type":"string","description":"Profile display name. No name twin — that alias window is closed."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"location":{"type":"string","description":"Profile location string. Always keyed; null when unpublished."},"verified":{"type":"boolean","description":"Derived — isBlueVerified OR isLegacyVerified OR isIdentityVerified OR (affiliate != null). Not a separate Twitter field. A null bit is treated as false in the OR."},"isBlueVerified":{"type":"boolean","description":"Whether the account has blue-check verification."},"isIdentityVerified":{"type":"boolean","description":"Is identity verified. Example: false."},"verification":{"type":"object","properties":{"isBlueVerified":{"type":"boolean","description":"Whether the account has blue-check verification."},"isIdentityVerified":{"type":"boolean","description":"Is identity verified. Example: false."},"verifiedType":{"type":"string","description":"Verified type. Example: \"Government\"."},"reason":{"type":"string","description":"Why X shows this account as verified. Tooltip CTA (\"Learn more\") is stripped; leftover whitespace is collapsed."},"verifiedSince":{"type":"string","description":"Verified since. Example: \"2009-08-07T19:53:50.000Z\"."}}},"followers":{"type":"integer","description":"Total followers. Equals normalFollowers + fastFollowers when both splits are present (X's own split; fastFollowers is the suspicious-follower bucket)."},"following":{"type":"integer","description":"Number of accounts followed."},"fastFollowers":{"type":"integer","description":"Fast followers. Example: 0."},"normalFollowers":{"type":"integer","description":"Normal followers. Example: 92239064."},"tweetCount":{"type":"integer","description":"Total number of tweets."},"likesCount":{"type":"integer","description":"Likes count. Example: 16904."},"mediaCount":{"type":"integer","description":"Total number of media posts."},"listedCount":{"type":"integer","description":"Listed count. Example: 97014."},"pinnedTweetIds":{"type":"array","items":{"type":"string"},"description":"Pinned tweet ids (array)."},"website":{"type":"string","description":"Expanded profile website (not raw t.co). Always keyed; null when unpublished. Not repeated in contact.links."},"contact":{"type":"object","properties":{"links":{"type":"array","items":{"type":"string"},"description":"Links listed on the page."}}},"tipjarSettings":{"type":"object","properties":{"is_enabled":{"type":"boolean","description":"Is enabled. Example: false."}}},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"bannerImage":{"type":"string","description":"Banner image URL. Deprecated alias of banner on Twitter (one release)."},"profileImageShape":{"type":"string","description":"Profile image shape. Example: \"Square\"."},"possiblySensitive":{"type":"boolean","description":"Possibly sensitive. Example: false."},"highlightedTweets":{"type":"integer","description":"Highlighted tweets. Example: 265."},"creatorSubscriptionsCount":{"type":"integer","description":"Creator-subscriptions count. Always keyed. Same null-vs-0 rule as businessAffiliatesCount — both are 0 or both are null on a given path, never mixed."},"businessAffiliatesCount":{"type":"integer","description":"X business-affiliates count. Always keyed. Present none is 0. GraphQL omit → 0 (empty business_account is dropped). HTML omit → null."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."}}}}},"example":{"success":true,"data":{"platform":"twitter","url":"https://x.com/NASA","id":"11348282","username":"NASA","displayName":"NASA","name":"NASA","bio":"Making the seemingly impossible, possible. ✨","location":"Pale Blue Dot","verified":true,"isBlueVerified":true,"isIdentityVerified":false,"verification":{"isBlueVerified":true,"isIdentityVerified":false,"verifiedType":"Government","reason":"This account is verified because it is a government or multilateral organization account.  Learn more","verifiedSince":"2009-08-07T19:53:50.000Z"},"followers":92239064,"following":119,"fastFollowers":0,"normalFollowers":92239064,"tweetCount":74288,"likesCount":16904,"mediaCount":28058,"listedCount":97014,"pinnedTweetIds":["2082511887757881648"],"website":"http://www.nasa.gov/","contact":{"links":["http://www.nasa.gov/"]},"tipjarSettings":{"is_enabled":false},"profileImage":"https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_400x400.jpg","bannerImage":"https://pbs.twimg.com/profile_banners/11348282/1775567134","profileImageShape":"Square","possiblySensitive":false,"highlightedTweets":265,"creatorSubscriptionsCount":0,"businessAffiliatesCount":89,"createdAt":"2007-12-19T20:20:32.000Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitter/user-tweets":{"get":{"operationId":"twitter_user_tweets","tags":["Twitter / X"],"summary":"Twitter/X User Tweets API","description":"Most popular public tweets from a Twitter/X profile (~100 cap) — not chronological.\n\nPass a profile URL or @handle and get the tweets Twitter's public timeline embed exposes as clean JSON. Important: this is not a chronological or latest feed — Twitter publicly returns on the order of ~100 of the account's most popular posts. Do not use this endpoint to detect new tweets. There is no cursor: the envelope names the window (requested / listingHits / hasMore / truncatedReason=popular-window). hasMore means raise limit, not pass a cursor. Each tweet uses the shared contract: ISO-8601 publishedAt, author, engagement{likes,replies,retweets,quotes} — views and bookmarks are omitted on this surface (syndication never exposes them; community-tweets / tweet-details do via GraphQL), isReply / isRetweet / isQuote, conversationId, source when present, hashtags[] and media[]. Flat 2 credits per call. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh. Empty verdicts are honest 200s at 0 credits: truncatedReason no-tweets (profile reports 0 tweets) or embed-empty (the embed renders the account without posts — deterministic, retrying does not change it). When the embed does not answer at all (transport miss, or the 45s ceiling), the last answer we fetched for that handle in the previous 26h is replayed as stale:true / cached:true with fetchedAt (scrape time) and servedAt, plus a note, at 0 credits — the popular window moves slowly, so yesterday's snapshot beats a retryable 502. Only a handle with no snapshot gets the 502/503.\n\nDocs: https://captapi.com/apis/twitter-user-tweets","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Twitter/X profile URL or @handle. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max tweets to return (default 20, max 200). Twitter's public surface usually caps around ~100 most popular posts — not chronological latest. Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Most popular public tweets from a Twitter/X profile (~100 cap) — not chronological.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"handle":{"type":"string","description":"Account handle."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"tweets":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this tweets item."},"text":{"type":"string","description":"Text content."},"lang":{"type":"string","description":"Language code of the content."},"publishedAt":{"type":"string","description":"Tweet publish time as ISO-8601 UTC (e.g. 2022-04-28T00:56:58.000Z). Not Twitter's raw created_at string."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this tweets item."},"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer"},"verified":{"type":"boolean"},"profileImage":{"type":"string"}},"description":"Author name or handle."},"isReply":{"type":"boolean","description":"Whether the tweet is a reply."},"isRetweet":{"type":"boolean","description":"Whether the tweet is a retweet."},"possiblySensitive":{"type":"boolean","description":"Possibly sensitive. Example: false."},"conversationId":{"type":"string","description":"Thread root id (conversation_id_str) for grouping replies."},"engagement":{"type":"object","properties":{"views":{},"likes":{"type":"integer"},"replies":{"type":"integer"},"retweets":{"type":"integer"},"quotes":{"type":"integer"},"bookmarks":{}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{},"description":"Hashtag texts without #. Always an array (empty when the tweet has none)."},"media":{"type":"array","items":{},"description":"Media image/video preview URLs when present. Always an array (empty when none)."}}}}}}}},"example":{"success":true,"data":{"handle":"elonmusk","totalReturned":2,"tweets":[{"platform":"twitter","url":"https://x.com/elonmusk/status/2084274899065897011","id":"2084274899065897011","text":"Worth noting that any USAID funding that appeared to have the slightest merit whatsoever for helping people in need was moved to the State Department. \n\nOnly the funding where they provided no evidence at all for who would receive the money was stopped.\n\nhttps://t.co/qGUew8TyKD","lang":"en","publishedAt":"2026-08-03T13:47:14.000Z","author":{"id":"44196397","username":"elonmusk","displayName":"Elon Musk","url":"https://x.com/elonmusk","followers":241148496,"verified":true,"profileImage":"https://pbs.twimg.com/profile_images/2053244804520427520/m8mdWZCG_normal.jpg"},"isReply":false,"isRetweet":false,"possiblySensitive":false,"conversationId":"2084274899065897011","engagement":{"views":null,"likes":51392,"replies":2623,"retweets":6975,"quotes":344,"bookmarks":null},"hashtags":[],"media":[]},{"platform":"twitter","url":"https://x.com/elonmusk/status/1519480761749016577","id":"1519480761749016577","text":"Next I’m buying Coca-Cola to put the cocaine back in","lang":"en","publishedAt":"2022-04-28T00:56:58.000Z","author":{"id":"44196397","username":"elonmusk","displayName":"Elon Musk","url":"https://x.com/elonmusk","followers":241148496,"verified":true,"profileImage":"https://pbs.twimg.com/profile_images/2053244804520427520/m8mdWZCG_normal.jpg"},"isReply":false,"isRetweet":false,"possiblySensitive":false,"conversationId":"1519480761749016577","engagement":{"views":null,"likes":4209989,"replies":168055,"retweets":579720,"quotes":168169,"bookmarks":null},"hashtags":[],"media":[]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitter/community":{"get":{"operationId":"twitter_community","tags":["Twitter / X"],"summary":"Twitter/X Community API","description":"X Community metadata — ISO createdAt, flat creator handle, isNsfw + bannerImage, rules[].\n\nPaste an X community URL (x.com/i/communities/ID) or community ID — not a tweet URL — and get clean JSON: name, description, memberCount, ISO-8601 createdAt (.000Z), creator as a flat handle (not nested creator_results), joinPolicy, isNsfw, bannerImage, and rules[{name,description}]. Pair with Community Tweets to list posts. Flat 1 credit.\n\nDocs: https://captapi.com/apis/twitter-community","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"X community URL (x.com/i/communities/ID) or community ID — not a tweet/status URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"X Community metadata — ISO createdAt, flat creator handle, isNsfw + bannerImage, rules[].","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"description":{"type":"string","description":"Description text."},"memberCount":{"type":"integer","description":"How many members the community has."},"createdAt":{"type":"string","description":"When the community was created (ISO-8601 UTC, e.g. 2022-02-15T04:47:27.000Z)."},"creator":{"type":"string","description":"X handle of the community founder (normalized from GraphQL creator_results)."},"joinPolicy":{"type":"string","description":"Who can join (e.g. \"Open\")."},"isNsfw":{"type":"boolean","description":"Whether X marks the community as NSFW."},"bannerImage":{"type":"string","description":"Community banner image URL when exposed."},"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name of this rules item."},"description":{"type":"string","description":"Description of this rules item."}}}}}}}},"example":{"success":true,"data":{"platform":"twitter","id":"1493446837214187523","url":"https://x.com/i/communities/1493446837214187523","name":"Build in Public","description":"Share what you're working on. Get feedback. Help each other move forward. – Sponsored by bolt.new ⚡","memberCount":264138,"createdAt":"2022-02-15T04:47:27.000Z","creator":"marckohlbrugge","joinPolicy":"Open","isNsfw":false,"bannerImage":"https://pbs.twimg.com/community_banner_img/1915033378811772928/KdaKUaRP?format=png&name=orig","rules":[{"name":"Share what you're working on","description":"Don't be scared to share unfinished work"},{"name":"Screenshots, screencasts, drafts, etc","description":"Visual tweets tend to grab people's attention"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitter/community-tweets":{"get":{"operationId":"twitter_community_tweets","tags":["Twitter / X"],"summary":"Twitter/X Community Tweets API","description":"Posts in an X Community — same 6-metric tweet shape as search.\n\nPass an X community URL (x.com/i/communities/ID) or community ID — not a tweet/status URL — and get recent posts as clean JSON. Response includes url + communityId + communityName + memberCount (so you often skip a second Community call) plus the listing-window envelope (requested / listingHits / hasMore / truncatedReason=listing-window). There is no cursor — hasMore means raise limit. tweets[] use the shared contract: ISO-8601 publishedAt, engagement{views,likes,replies,retweets,quotes,bookmarks}, isReply / isRetweet / isQuote, hashtags[], media[]. Flat 2 credits (same guest GraphQL surface as Search). Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/twitter-community-tweets","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"X community URL (x.com/i/communities/ID) or community ID — not a tweet/status URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Posts in an X Community — same 6-metric tweet shape as search.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"communityId":{"type":"string","description":"Community id. Example: \"1493446837214187523\"."},"url":{"type":"string","description":"Canonical URL of the item."},"communityName":{"type":"string","description":"Display name of the X Community."},"memberCount":{"type":"integer","description":"How many members the community has (same signal as /community)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"tweets":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this tweets item."},"text":{"type":"string","description":"Text content."},"lang":{"type":"string","description":"Language code of the content."},"publishedAt":{"type":"string","description":"Tweet publish time as ISO-8601 UTC."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer"},"verified":{"type":"boolean"},"profileImage":{"type":"string"}},"description":"Author name or handle."},"isReply":{"type":"boolean","description":"Whether the tweet is a reply."},"isRetweet":{"type":"boolean","description":"Whether the tweet is a retweet."},"isQuote":{"type":"boolean","description":"Is quote. Example: false."},"possiblySensitive":{"type":"boolean","description":"Possibly sensitive. Example: false."},"conversationId":{"type":"string","description":"Conversation id. Example: \"2082466198495662562\"."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"replies":{"type":"integer"},"retweets":{"type":"integer"},"quotes":{"type":"integer"},"bookmarks":{"type":"integer"}},"description":"Engagement metrics for the item."},"hashtags":{"type":"array","items":{},"description":"Hashtags extracted from the text."},"media":{"type":"array","items":{"type":"string"},"description":"Media attached to the item."}}}}}}}},"example":{"success":true,"data":{"communityId":"1493446837214187523","url":"https://x.com/i/communities/1493446837214187523","communityName":"Build in Public","memberCount":264133,"totalReturned":2,"tweets":[{"platform":"twitter","url":"https://x.com/FilipPanoski/status/2082466198495662562","id":"2082466198495662562","text":"a little over a year ago: $0 MRR, no customers, 10 followers.\n\ntoday: $7k MRR, 70+ customers, 3k followers.\n\nnot the smartest or fastest founder.\njust consistent. https://t.co/9BmKeqbcNi","lang":"en","publishedAt":"2026-07-29T14:00:06.000Z","author":{"username":"FilipPanoski","displayName":"Filip Panoski","url":"https://x.com/FilipPanoski","followers":3584,"verified":true,"profileImage":"https://pbs.twimg.com/profile_images/1842181486587297792/Ia5ilmNs_normal.jpg"},"isReply":false,"isRetweet":false,"isQuote":false,"possiblySensitive":false,"conversationId":"2082466198495662562","engagement":{"views":27877,"likes":339,"replies":108,"retweets":5,"quotes":3,"bookmarks":131},"hashtags":[],"media":["https://pbs.twimg.com/media/HOZn-JwXcAASz1f.png"]},{"platform":"twitter","url":"https://x.com/ericdjav/status/2082216601059770771","id":"2082216601059770771","text":"I launched my first app in 2026...\n\nToday, I finally crossed $10k revenue with it 🎊 https://t.co/hziIEliJn1","lang":"en","publishedAt":"2026-07-28T21:28:18.000Z","author":{"username":"ericdjav","displayName":"Eric Djavid","url":"https://x.com/ericdjav","followers":9792,"verified":true,"profileImage":"https://pbs.twimg.com/profile_images/1884705640246915072/4Y39VboE_normal.jpg"},"isReply":false,"isRetweet":false,"isQuote":false,"possiblySensitive":false,"conversationId":"2082216601059770771","engagement":{"views":10720,"likes":319,"replies":94,"retweets":5,"quotes":1,"bookmarks":36},"hashtags":[],"media":["https://pbs.twimg.com/media/HOWE9npXQAAqfUH.jpg"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/subreddit-posts":{"get":{"operationId":"reddit_subreddit_posts","tags":["Reddit"],"summary":"Reddit Subreddit Posts API","description":"List posts from a subreddit with sort, timeframe, and cursor pagination — title, score, upvote ratio, flair, and more.\n\nPass a subreddit URL or r/name and get its posts as clean JSON. Choose sort (best/hot/new/top/rising) and, for top, a timeframe (hour/day/week/month/year/all). Each post includes title, selftext, author + authorFullname, Reddit's authoritative score + upvoteRatio + scoreHidden, comment count, subscriberCount, isVideo, flair, nsfw, thumbnail, and ISO publishedAt. downs, totalAwardsReceived, and the upvotes twin of score are omitted — Reddit does not publish downvotes, retired awards in 2023, and ups equals score. Cursor pagination via nextCursor + hasMore. Flat 2 credits.\n\nDocs: https://captapi.com/apis/reddit-subreddit-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Subreddit URL, r/name, or bare name, e.g. r/technology. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"sort","in":"query","required":false,"description":"Feed sort: best, hot, new (default), top, or rising.","schema":{"type":"string","default":"new"}},{"name":"timeframe","in":"query","required":false,"description":"For sort=top: hour, day (default), week, month, year, or all.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"List posts from a subreddit with sort, timeframe, and cursor pagination — title, score, upvote ratio, flair, and more.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"sort":{"type":"string","description":"Sort. Example: \"hot\"."},"timeframe":{"description":"Timeframe."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this posts item."},"name":{"type":"string","description":"Name of this posts item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this posts item."},"text":{"type":"string","description":"Text content."},"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"author":{"type":"string","description":"Author name or handle."},"authorFullname":{"type":"string","description":"Stable Reddit account fullname (t2_…). Prefer this over author for joins."},"upvotes":{"type":"integer","description":"Upvote count."},"score":{"type":"integer","description":"Reddit's authoritative post score field (not ups−downs). hide_score does not zero this field — there is no upvotes twin."},"upvoteRatio":{"type":"number","description":"Post upvote ratio (0–1) when Reddit exposes it."},"comments":{"type":"integer","description":"Comment count."},"subscriberCount":{"type":"integer","description":"Subscriber count (channel, subreddit, or similar)."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"flair":{"description":"Post flair.","type":["string","null"]},"nsfw":{"type":"boolean","description":"Whether the content is marked NSFW."},"thumbnail":{"description":"Thumbnail image URL.","type":["string","null"]}}}}}}}},"example":{"success":true,"data":{"subreddit":"space","sort":"hot","timeframe":null,"totalReturned":2,"nextCursor":"t3_1vdd2k6","hasMore":true,"posts":[{"platform":"reddit","id":"1v7b3xg","name":"t3_1v7b3xg","url":"https://www.reddit.com/r/space/comments/1v7b3xg/all_space_questions_thread_for_week_of_july_26/","title":"All Space Questions thread for week of July 26, 2026","text":"Please sort comments by 'new' to find questions that would otherwise be buried.\n\nIn this thread you can ask any space related question that you may have.\n\nTwo examples of potential questions could be; \"How do rockets work?\", or \"How do the phases of the Moon work?\"\n\nIf you see a space related question posted in another subreddit or in this subreddit, then please politely link them to this thread.\n\n​\n\nAsk away!","subreddit":"space","author":"AutoModerator","authorFullname":"t2_6l4z3","upvotes":11,"score":11,"upvoteRatio":0.67,"comments":38,"subscriberCount":27937807,"isVideo":false,"publishedAt":"2026-07-26T18:00:07.000Z","flair":null,"nsfw":false,"thumbnail":null},{"platform":"reddit","id":"1vd1sxs","name":"t3_1vd1sxs","url":"https://www.reddit.com/r/space/comments/1vd1sxs/gum_nebula_in_tuscany/","title":"Gum nebula in Tuscany","text":"Stacked/Tracked/Blended\n\nhttps://www.instagram.com/flory.ro?igsh=b3Y4ZTU3Nmk0cTBt&utm\\_source=qr\n\nThe Edge\n\nThis was my winter goal: to capture the Gum nebula over the Tuscan coast.\n\nFor months the weather refused to cooperate.\n\nCountless trips ended in nothing.\n\nThen one night, after a long descent through the woods, driven only by stubbornness and a bit of recklessness, I finally reached this beach.\n\nI rarely edit my photos right away. Most of the time I leave them sleeping.\n\nWhen the feeling returns, I choose one memory and bring it back to life.\n\nThis is one of those nights.\n\nCanon R\n\nCanon 6D\n\nSigma 24mm f1.4\n\nForeground 2x120s iso 3200 f2.8\n\nSky  3x120s iso 1600 f 2.00\n\nHa 6x120s iso 3200 f2.8","subreddit":"space","author":"flory_ro","authorFullname":"t2_22o0rottmc","upvotes":3334,"score":3334,"upvoteRatio":0.98,"comments":25,"subscriberCount":27937807,"isVideo":false,"publishedAt":"2026-08-01T23:16:42.000Z","flair":"image/gif","nsfw":false,"thumbnail":"https://preview.redd.it/1c7e0qngjugh1.jpeg?width=140&height=140&crop=1:1,smart&auto=webp&s=904837be378093471aad053d9ce99316becf8ad9"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/post-details":{"get":{"operationId":"reddit_post_details","tags":["Reddit"],"summary":"Reddit Post Details API","description":"Get a Reddit post — title, body, score, comments count, subreddit, and author as structured JSON.\n\nPaste a Reddit post URL and get the post as clean JSON: title, body text, score, comment count, subreddit, author, and flair when available. Flat 1 credit per call.\n\nDocs: https://captapi.com/apis/reddit-post-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Reddit post URL, e.g. https://reddit.com/r/sub/comments/ID/... The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Get a Reddit post — title, body, score, comments count, subreddit, and author as structured JSON.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of the item."},"text":{"type":"string","description":"Text content."},"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"author":{"type":"string","description":"Author name or handle."},"upvotes":{"type":"integer","description":"Upvote count."},"comments":{"type":"integer","description":"Comment count."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"flair":{"type":"string","description":"Post flair."},"nsfw":{"type":"boolean","description":"Whether the content is marked NSFW."},"thumbnail":{"description":"Thumbnail image URL."}}}}},"example":{"success":true,"data":{"platform":"reddit","id":"1ukq10z","url":"https://www.reddit.com/r/explainlikeimfive/comments/1ukq10z/eli5_monthly_current_events_megathread/","title":"ELI5: Monthly Current Events Megathread","text":"Hi Everyone,\n\nThis is your monthly megathread for current/ongoing events. We recognize there is a lot of interest in objective explanations to ongoing events so we have created this space to allow those types of questions.\n\nPlease ask your question as top level comments (replies to the post) for others to reply to. The rules are still in effect, so no politics, no soapboxing, no medical advice, etc. We will ban users who use this space to make political, bigoted, or otherwise inflammatory points rather than objective topics/explanations.","subreddit":"explainlikeimfive","author":"AutoModerator","upvotes":14,"comments":47,"publishedAt":"2026-07-01T16:10:09+00:00","flair":"Other","nsfw":false,"thumbnail":null}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/post-comments":{"get":{"operationId":"reddit_post_comments","tags":["Reddit"],"summary":"Reddit Post Comments API","description":"Flat Reddit comment threads with depth/parentId, cursor pagination, and the parent post in one call.\n\nFetch comments on a Reddit post as a flat list with depth and parentId (easy to store, rebuild the tree when you need it). publishedAt is ISO 8601 UTC. Each comment includes score and authorFullname (t2_…) when Reddit exposes them. Page with cursor / nextCursor — hasMore is true only when nextCursor is set (pass it back; do not raise limit to invent a page). downs and totalAwardsReceived are omitted — Reddit does not publish downvotes and retired awards in 2023. The response includes the parent post. Flat 2 credits per call. Max 500 comments per request.\n\nDocs: https://captapi.com/apis/reddit-post-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Reddit post URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Flat Reddit comment threads with depth/parentId, cursor pagination, and the parent post in one call.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this comments item."},"author":{"type":"string","description":"Author name or handle."},"authorFullname":{"type":"string","description":"Stable Reddit account fullname (t2_…). Prefer this over author for joins."},"text":{"type":"string","description":"Text content."},"upvotes":{"type":"integer","description":"Upvote count."},"score":{"type":"integer","description":"Vote score. On Reddit this is the platform's authoritative score field (not ups−downs — public JSON almost always zeros downs). Posts no longer ship an upvotes twin; comments still expose both."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"url":{"type":"string","description":"Canonical URL of the item."},"parentId":{"type":"string","description":"ID of the parent comment for replies."},"depth":{"type":"integer","description":"Depth. Example: 0."},"isSubmitter":{"type":"boolean","description":"Is submitter. Example: false."},"edited":{"type":"boolean","description":"Whether the comment was edited."},"stickied":{"type":"boolean","description":"Whether the comment is stickied."},"distinguished":{"type":["string","null"],"description":"moderator/admin distinction when present."},"controversiality":{"type":"integer","description":"Reddit controversiality flag (0 or 1)."},"subreddit":{"type":"string","description":"Subreddit the post belongs to."}}},"description":"Comment count."},"post":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this post item."},"name":{"type":"string","description":"Name of this post item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this post item."},"text":{"description":"Text content."},"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"author":{"type":"string","description":"Author name or handle."},"authorFullname":{"type":"string","description":"Stable Reddit account fullname (t2_…). Prefer this over author for joins."},"upvotes":{"type":"integer","description":"Upvote count."},"score":{"type":"integer","description":"Vote score. On Reddit this is the platform's authoritative score field (not ups−downs — public JSON almost always zeros downs). Posts no longer ship an upvotes twin; comments still expose both."},"upvoteRatio":{"type":"number","description":"Post upvote ratio (0–1) when Reddit exposes it."},"comments":{"type":"integer","description":"Comment count."},"subscriberCount":{"type":"integer","description":"Subscriber count (channel, subreddit, or similar)."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"flair":{"description":"Post flair."},"nsfw":{"type":"boolean","description":"Whether the content is marked NSFW."},"thumbnail":{"type":"string","description":"Thumbnail image URL."}}}}}}},"example":{"success":true,"data":{"totalReturned":2,"comments":[{"id":"p0gnsr6","author":"AutoModerator","authorFullname":"t2_6l4z3","text":"Users often report submissions from this site for sensationalized articles. Readers have a responsibility to be skeptical, check sources, and comment on any flaws.\n\nYou can help improve this thread by linking to media that verifies or questions this article's claims. Your link could help readers better understand this issue.\n\n*I am a bot, and this action was performed automatically. Please [contact the moderators of this subreddit](/message/compose/?to=/r/worldnews) if you have any questions or concerns.*","upvotes":1,"score":1,"publishedAt":"2026-07-29T13:12:05.000Z","url":"https://www.reddit.com/r/worldnews/comments/1v9vtop/japans_population_falls_below_120_million_for/p0gnsr6/","parentId":"t3_1v9vtop","depth":0,"isSubmitter":false,"edited":false,"stickied":true,"distinguished":"moderator","controversiality":0,"subreddit":"worldnews"},{"id":"p0gpy2l","author":"Donnicton","authorFullname":"t2_8iha3","text":"Sorry, best we can do about it is symbolically send you home early one day this month to go make a kid or whatever.","upvotes":10014,"score":10014,"publishedAt":"2026-07-29T13:22:22.000Z","url":"https://www.reddit.com/r/worldnews/comments/1v9vtop/japans_population_falls_below_120_million_for/p0gpy2l/","parentId":"t3_1v9vtop","depth":0,"isSubmitter":false,"edited":false,"stickied":false,"distinguished":null,"controversiality":0,"subreddit":"worldnews"}],"post":{"platform":"reddit","id":"1v9vtop","name":"t3_1v9vtop","url":"https://www.reddit.com/r/worldnews/comments/1v9vtop/japans_population_falls_below_120_million_for/","title":"Japan's population falls below 120 million for first time in 42 years as birth crisis deepens","text":null,"subreddit":"worldnews","author":"rdh2dmd","authorFullname":"t2_2i0a3navkp","upvotes":24395,"score":24395,"upvoteRatio":0.95,"comments":2932,"subscriberCount":47503811,"isVideo":false,"publishedAt":"2026-07-29T13:12:05+00:00","flair":null,"nsfw":false,"thumbnail":"https://external-preview.redd.it/z1-dgwVNE_wakjIdcx8RRK7U5pnn5xhdXdXqCAQGY6U.jpeg?width=140&height=78&auto=webp&s=51c84bd9c71d792505f54b10d4023457a63d5495"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/post-transcript":{"get":{"operationId":"reddit_post_transcript","tags":["Reddit"],"summary":"Reddit Post Transcript API","description":"Written post text — title, body and top comments.\n\nReturns the post's written content — title, body and top comments — as text. Reddit does not expose speech transcripts for v.redd.it video, so this is not a speech transcript. timingSource is always \"none\"; transcriptSegments use character offsets (charStart/charEnd), not invented timestamps. estimatedReadSeconds is a top-level 200 wpm estimate. commentsIncluded and wordCount describe the written bundle. Flat 2 credits.\n\nDocs: https://captapi.com/apis/reddit-post-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Reddit post URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":0,"default":50}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Written post text — title, body and top comments.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"post":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this post item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this post item."},"text":{"type":"string","description":"Text content."},"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"author":{"type":"string","description":"Author name or handle."},"upvotes":{"type":"integer","description":"Upvote count."},"comments":{"type":"integer","description":"Comment count."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"flair":{"type":"string","description":"Post flair."},"nsfw":{"type":"boolean","description":"Whether the content is marked NSFW."},"thumbnail":{"description":"Thumbnail image URL."}}},"transcript":{"type":"string","description":"Complete text transcript (file-upload endpoints). Timed caption/ASR endpoints use text instead."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"speaker":{"type":"string","description":"Speaker label for the segment."},"index":{"type":"integer","description":"0-based segment order."},"wordCount":{"type":"integer","description":"Word count (emoji-only tokens count as 0; URLs count as 1)."},"charStart":{"type":"integer","description":"Start offset into transcript (transcript.slice(charStart, charEnd) === text)."},"charEnd":{"type":"integer","description":"End offset into transcript (exclusive)."}}}},"wordCount":{"type":"integer","description":"Word count (emoji-only tokens count as 0; URLs count as 1)."},"segments":{"type":"integer","description":"Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list."},"commentsIncluded":{"type":"integer","description":"Comments included. Example: 5."},"timingSource":{"type":"string","description":"Always \"none\" today. \"captions\" is reserved — do not branch on it; nothing emits it yet."},"estimatedReadSeconds":{"type":"integer","description":"Whole-transcript reading-time estimate at 200 wpm. Not per-segment duration."}}}}},"example":{"success":true,"data":{"platform":"reddit","url":"https://www.reddit.com/r/space/comments/1umfd43/radiation_exposure_may_become_the_biggest/","post":{"platform":"reddit","id":"1umfd43","url":"https://www.reddit.com/r/space/comments/1umfd43/radiation_exposure_may_become_the_biggest/","title":"Radiation exposure may become the biggest challenge for future Moon and Mars missions","text":"[removed]","subreddit":"space","author":"Low-Mathematician137","upvotes":0,"comments":65,"publishedAt":"2026-07-03T14:04:13+00:00","flair":"Discussion","nsfw":false,"thumbnail":null},"transcript":"Title: Radiation exposure may become the biggest challenge for future Moon and Mars missions\n\n[removed]\n\nEffingWasps: Insert that very recent but weirdly broadly applicable “this has been talked about extensively you’re just 21” meme\n\nb407driver: Become? It has always been the greatest (unsolved) challenge.\n\nWaarm: The current biggest challenge is funding.","transcriptSegments":[{"text":"Title: Radiation exposure may become the biggest challenge for future Moon and Mars missions","speaker":"post","index":0,"wordCount":14,"charStart":0,"charEnd":92},{"text":"[removed]","speaker":"Low-Mathematician137","index":1,"wordCount":1,"charStart":94,"charEnd":103},{"text":"EffingWasps: Insert that very recent but weirdly broadly applicable “this has been talked about extensively you’re just 21” meme","speaker":"EffingWasps","index":2,"wordCount":19,"charStart":105,"charEnd":233},{"text":"b407driver: Become? It has always been the greatest (unsolved) challenge.","speaker":"b407driver","index":3,"wordCount":10,"charStart":235,"charEnd":308},{"text":"Waarm: The current biggest challenge is funding.","speaker":"Waarm","index":4,"wordCount":7,"charStart":310,"charEnd":358}],"wordCount":51,"segments":5,"commentsIncluded":5,"timingSource":"none","estimatedReadSeconds":15}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/search":{"get":{"operationId":"reddit_search","tags":["Reddit"],"summary":"Reddit Search API","description":"Reddit site-wide post search — sort + timeframe + cursor, score/upvoteRatio, authorFullname.\n\nPass a keyword and get matching public posts across Reddit as clean JSON. Sort with sort=relevance|new|top|hot|comments (alias comment_count); for top/comments use timeframe=hour|day|week|month|year|all (default all). The response echoes sort and timeframe. Each result includes id, name (always \"t3_\" + id — nextCursor is the last row's name), title, text, subreddit, author + authorFullname (t2_…), Reddit's authoritative score, upvoteRatio, scoreHidden (UI flag — it does not zero score), comments, subscriberCount, isVideo, ISO publishedAt, flair, nsfw, thumbnail, crosspostOf (Reddit parent id when this row is a crosspost), and duplicateOfId (first same-author+title row on this page, else null). We do not drop Reddit's duplicate hits. downs, totalAwardsReceived, and the upvotes twin of score are omitted. Cursor pagination via nextCursor/hasMore. This endpoint returns posts only — not a comments[] or media[] search surface. A miss is 502 UPSTREAM_UNAVAILABLE within 12s at 0 credits. Flat 2 credits. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/reddit-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keyword or phrase to search Reddit posts site-wide (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"sort","in":"query","required":false,"description":"relevance (default) | new | top | hot | comments (alias: comment_count).","schema":{"type":"string","default":"relevance"}},{"name":"timeframe","in":"query","required":false,"description":"For sort=top or comments: hour | day | week | month | year | all (default all).","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Reddit site-wide post search — sort + timeframe + cursor, score/upvoteRatio, authorFullname.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"sort":{"type":"string","description":"Sort. Example: \"relevance\"."},"timeframe":{"description":"Timeframe."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this results item."},"name":{"type":"string","description":"Name of this results item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this results item."},"text":{"description":"Text content."},"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"author":{"type":"string","description":"Author name or handle."},"authorFullname":{"type":"string","description":"Stable Reddit account fullname (t2_…). Prefer this over author for joins."},"upvotes":{"type":"integer","description":"Upvote count."},"score":{"type":"integer","description":"Reddit's authoritative post score field (not ups−downs). Public JSON almost always zeros downs. hide_score does not zero this field — there is no upvotes twin."},"upvoteRatio":{"type":"number","description":"Upvote ratio 0–1 when Reddit exposes it — an independent controversy signal, not a stand-in for a hidden score."},"scoreHidden":{"type":"boolean","description":"true when Reddit hide_score is set (typically new posts). This is a UI flag — it does not mean score is 0."},"comments":{"type":"integer","description":"Comment count."},"subscriberCount":{"type":"integer","description":"Subscriber count (channel, subreddit, or similar)."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"flair":{"description":"Post flair."},"nsfw":{"type":"boolean","description":"Whether the content is marked NSFW."},"thumbnail":{"type":"string","description":"Thumbnail image URL."}}}}}}}},"example":{"success":true,"data":{"query":"james webb","sort":"relevance","timeframe":null,"totalReturned":2,"nextCursor":"t3_1s1neio","hasMore":true,"results":[{"platform":"reddit","id":"1rh4u8o","name":"t3_1rh4u8o","url":"https://www.reddit.com/r/todayilearned/comments/1rh4u8o/til_the_james_webb_space_telescope_has_found_over/","title":"TIL the James Webb Space Telescope has found over 300 \"Little Red Dots\", objects that existed between 13.2 an 12.2 billion years ago, and whose nature is currently uncertain","text":null,"subreddit":"todayilearned","author":"brazzy42","authorFullname":"t2_mh77j","upvotes":13637,"score":13637,"upvoteRatio":0.98,"scoreHidden":false,"comments":204,"subscriberCount":41571692,"isVideo":false,"publishedAt":"2026-02-28T15:03:10.000Z","flair":null,"nsfw":false,"thumbnail":"https://external-preview.redd.it/jv4EtU_QZlM0w1ZSlNWfvuzvkL-FJ00HGsTsl07LPss.jpeg?width=140&height=139&auto=webp&s=94311e1eec8a572c48b01d8b5cbae2f371396318"},{"platform":"reddit","id":"1ucll2e","name":"t3_1ucll2e","url":"https://www.reddit.com/r/worldnews/comments/1ucll2e/james_webb_telescope_detects_galaxykilling_wind/","title":"James Webb telescope detects 'galaxy-killing wind' near the dawn of time","text":null,"subreddit":"worldnews","author":"shdw_fght","authorFullname":"t2_4zuqklab","upvotes":1472,"score":1472,"upvoteRatio":0.97,"scoreHidden":false,"comments":160,"subscriberCount":47507091,"isVideo":false,"publishedAt":"2026-06-22T14:08:15.000Z","flair":null,"nsfw":false,"thumbnail":"https://external-preview.redd.it/MvcbMbmZOw99iMdDsy1JbsvZKf_5VGs-WQ1y5lrYGwo.jpeg?width=140&height=78&auto=webp&s=ff7d6360b316c1006ac4c27398dfc41df784e772"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/subreddit-details":{"get":{"operationId":"reddit_subreddit_details","tags":["Reddit"],"summary":"Reddit Subreddit Details API","description":"Subreddit card — id (t5_…), members, activeUsers, rules[], ISO createdAt, nsfw/type.\n\nPass a subreddit URL, r/name, or bare name (case-insensitive — AskReddit and askreddit both resolve; response name is Reddit's canonical casing) and get clean JSON: stable id (t5_…), name, title, public description, members, activeUsers (accounts currently online — Reddit active_user_count, not weekly uniques), category (advertiser niche), language, type (public/restricted/private), ISO-8601 createdAt, nsfw, submitText, rules[{name,description,kind,violationReason,priority}] from about/rules, icon, and banner. Flat 1 credit. Use it to map communities before sampling posts or comments.\n\nDocs: https://captapi.com/apis/reddit-subreddit-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Subreddit URL, r/name, or bare name (case-insensitive), e.g. r/technology or AskReddit. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Subreddit card — id (t5_…), members, activeUsers, rules[], ISO createdAt, nsfw/type.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable Reddit fullname (t5_…). Prefer this over name for joins."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"members":{"type":"integer","description":"Subscriber count (Reddit subscribers)."},"activeUsers":{"description":"Accounts currently online (Reddit active_user_count / accounts_active). Null when Reddit hides the online count — not a mapping miss."},"category":{"type":"string","description":"Reddit advertiser_category niche label (e.g. Lifestyles). Empty/null when Reddit omits it — not a SponsorBlock enum."},"language":{"type":"string","description":"Detected or requested language code."},"type":{"type":"string","description":"Subreddit access type: \"public\" | \"restricted\" | \"private\" | \"archived\" when Reddit exposes it."},"createdAt":{"type":"string","description":"When the subreddit was created (ISO-8601 UTC, e.g. 2008-01-26T06:07:54.000Z)."},"nsfw":{"type":"boolean","description":"Whether Reddit marks the community over-18."},"submitText":{"type":"string","description":"Text shown when submitting a post (community posting guidelines) when configured."},"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name of this rules item."},"description":{"type":"string","description":"Description of this rules item."},"kind":{"type":"string","description":"Kind. Example: \"link\"."},"violationReason":{"type":"string","description":"Violation reason."},"priority":{"type":"integer","description":"Priority. Example: 0."}}}},"icon":{"type":"string","description":"Icon URL."},"banner":{"type":"string","description":"Banner / cover image URL. Canonical across profile endpoints."}}}}},"example":{"success":true,"data":{"platform":"reddit","id":"t5_2qh87","name":"space","url":"https://www.reddit.com/r/space","title":"/r/space: news, articles and discussion","description":"Share & discuss informative content on:\n\n* Astrophysics\n* Cosmology\n* Space Exploration\n* Planetary Science\n* Astrobiology","members":27940319,"activeUsers":null,"category":"Lifestyles","language":"en","type":"public","createdAt":"2008-01-26T06:07:54.000Z","nsfw":false,"submitText":"PLEASE **[READ THE SIDEBAR](https://www.reddit.com/r/space/wiki/sidebar_template)** BEFORE POSTING.","rules":[{"name":"Submissions must be related to Space/Cosmology","description":"This includes \"circlejerky\" submissions or space-related art, with the exception of art from space agencies or historically-significant art.","kind":"link","violationReason":"Submissions must be related to Space/Cosmology","priority":0},{"name":"No sensationalist/misleading/unscientific content or titles","description":"Post titles need to be descriptive and non-clickbait.  When submitting images titles need to accurately describe the content of the image (e.g. if an image is a composite this needs to be clearly stated), and without attempting to draw in upvotes or comments.  The image should stand on it's own.","kind":"all","violationReason":"No sensationalist/misleading/unscientific content or titles","priority":1}],"icon":"https://styles.redditmedia.com/t5_2qh87/styles/communityIcon_ub69d1lpjlf51.png","banner":"https://styles.redditmedia.com/t5_2qh87/styles/bannerBackgroundImage_n7bxapsg3kq81.png"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/reddit/subreddit-search":{"get":{"operationId":"reddit_subreddit_search","tags":["Reddit"],"summary":"Reddit Subreddit Post Search API","description":"Search posts inside one subreddit — not subreddit discovery.\n\nSearch posts inside one subreddit (r/name + q). This is not subreddit discovery — results are the same post shape as site-wide /reddit/search (score, not an upvotes twin; crosspostOf / duplicateOfId; name is t3_ + id), restricted to that community. Same sort (relevance/new/top/hot/comments), timeframe, and cursor pagination. A legitimate empty page is 200 results:[]. An upstream miss is 503 UPSTREAM_UNAVAILABLE (retryable, Retry-After) within 12s at 0 credits. Flat 2 credits.\n\nDocs: https://captapi.com/apis/reddit-subreddit-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Subreddit URL, r/name, or bare name, e.g. r/technology. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"q","in":"query","required":true,"description":"Keywords or search query (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"sort","in":"query","required":false,"description":"relevance (default) | new | top | hot | comments (alias: comment_count).","schema":{"type":"string","default":"relevance"}},{"name":"timeframe","in":"query","required":false,"description":"For sort=top or comments: hour | day | week | month | year | all (default all).","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Search posts inside one subreddit — not subreddit discovery.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"query":{"type":"string","description":"The search query you sent."},"sort":{"type":"string","description":"Sort. Example: \"new\"."},"timeframe":{"type":"string","description":"Timeframe. Example: \"month\"."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this results item."},"name":{"type":"string","description":"Name of this results item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this results item."},"text":{"description":"Text content.","type":["string","null"]},"subreddit":{"type":"string","description":"Subreddit the post belongs to."},"author":{"type":"string","description":"Author name or handle."},"authorFullname":{"type":"string","description":"Stable Reddit account fullname (t2_…). Prefer this over author for joins."},"upvotes":{"type":"integer","description":"Upvote count."},"score":{"type":"integer","description":"Reddit's authoritative post score field (not ups−downs). hide_score does not zero this field — there is no upvotes twin."},"upvoteRatio":{"type":"number","description":"Post upvote ratio (0–1) when Reddit exposes it."},"comments":{"type":"integer","description":"Comment count."},"subscriberCount":{"type":"integer","description":"Subscriber count (channel, subreddit, or similar)."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"flair":{"description":"Post flair.","type":["string","null"]},"nsfw":{"type":"boolean","description":"Whether the content is marked NSFW."},"thumbnail":{"type":["string","null"],"description":"Thumbnail image URL."}}}}}}}},"example":{"success":true,"data":{"subreddit":"space","query":"moon","sort":"new","timeframe":"month","totalReturned":2,"nextCursor":"t3_1vcuw1e","hasMore":true,"results":[{"platform":"reddit","id":"1vdyhxe","name":"t3_1vdyhxe","url":"https://www.reddit.com/r/space/comments/1vdyhxe/defunct_part_of_spacex_falcon_9_rocket_will_slam/","title":"Defunct part of SpaceX Falcon 9 rocket will slam into the moon","text":null,"subreddit":"space","author":"DoremusJessup","authorFullname":"t2_612zd","upvotes":0,"score":0,"upvoteRatio":0.36,"comments":17,"subscriberCount":27939274,"isVideo":false,"publishedAt":"2026-08-03T00:37:18.000Z","flair":null,"nsfw":false,"thumbnail":"https://external-preview.redd.it/H53j3-I3jiW5Qq6JAAR1ywvsYvBmTh5Qlvj2j8mj61E.jpeg?width=140&height=78&auto=webp&s=238c7b5582fe44c2bb3b46390d8e70d9fa3346f3"},{"platform":"reddit","id":"1vdxtae","name":"t3_1vdxtae","url":"https://www.reddit.com/r/space/comments/1vdxtae/why_the_near_and_far_sides_of_the_moon_are_so/","title":"Why the near and far sides of the moon are so different","text":"I have never seen the explanations for this difference as believable past the obvious crust being thinner on the near side allowing eruptions of magma (the dark areas) that didn't happen on the far side.\n\nI asked questions of five different sites before DeepSeek gave me the key to understanding what happened. That key is degree-one mantle convection. \n\nAfter the impact of Theia with the young Earth that resulted in the creation of the Moon, both the Earth and the Moon were molten balls of magma, with the Moon in an eccentric orbit very close to the earth. \n\nTidal friction rapidly caused the Moon to be tidally locked to the Earth so that one side continually faced Earth. However the moon was still in an eccentric orbit, so as the Moon came closer and further from Earth it flexed, causing frictional heating keeping it molten longer. However the Earth, still being enormously hot, slightly heated the surface of the moon facing it by radiative heating. The moon was some twenty times closer to earth than it is now. \n\nThis radiative heating was just enough to keep the close side a little bi …","subreddit":"space","author":"grahamsuth","authorFullname":"t2_17edr0epez","upvotes":0,"score":0,"upvoteRatio":0.26,"comments":5,"subscriberCount":27939274,"isVideo":false,"publishedAt":"2026-08-03T00:06:35.000Z","flair":"Discussion","nsfw":false,"thumbnail":null}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/threads/profile":{"get":{"operationId":"threads_profile","tags":["Threads"],"summary":"Threads Profile API","description":"Threads profile — displayName, private/isPrivate, bioLinks (Meta verified), isThreadsOnlyUser, transparencyLabel, bioFragments, HD avatars (1 credit).\n\nPass a Threads profile URL or @handle and get the public profile as clean JSON. Canonical core: platform, id, handle, url, displayName, bio, avatar, followers, verified — plus deprecated username/name/profileImage aliases for one release. Also: isThreadsOnlyUser (Threads-only vs Instagram-linked — pair with Instagram fbid for an IG↔FB↔Threads identity chain when Meta exposes it), private/isPrivate, bioLinks[] ({url, verified, linkId} — verified means Meta confirmed the bio link), bioFragments[] (parsed plaintext/link/mention/tag pieces from text_app_biography), transparencyLabel (state-affiliated media etc.), profileImageVersions[] ({url,width,height}), and hasOnboarded. Flat 1 credit. following and post counts are not publicly exposed on this surface.\n\nDocs: https://captapi.com/apis/threads-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Threads profile URL or @handle, e.g. https://threads.net/@username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Threads profile — displayName, private/isPrivate, bioLinks (Meta verified), isThreadsOnlyUser, transparencyLabel, bioFragments, HD avatars (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"username":{"type":"string","description":"Account username / handle."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"displayName":{"type":"string","description":"Profile display name (same concept as TikTok/IG/YouTube; name kept for compatibility)."},"name":{"type":"string","description":"Alias of displayName (kept for older clients)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"verified":{"type":"boolean","description":"Whether Meta shows a verified badge on this Threads profile."},"followers":{"type":"integer","description":"Follower count."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"isThreadsOnlyUser":{"description":"true when the account exists only on Threads (no Instagram twin). Pair with Instagram fbid for an IG↔FB↔Threads identity chain when all three are present."},"private":{"type":"boolean","description":"Whether the Threads account is private (same signal as isPrivate; TikTok-style key)."},"isPrivate":{"type":"boolean","description":"Whether the Threads account is private (same signal as private; Instagram-style key)."},"bioLinks":{"type":"array","items":{},"description":"External links from the Threads bio. Each item is {url, verified, linkId} — verified means Meta confirmed the link (fake/impersonation signal)."},"bioFragments":{"type":"array","items":{},"description":"Parsed bio pieces from Meta text_app_biography (plaintext / link / mention / tag) when the web hydrate exposes them."},"transparencyLabel":{"description":"Meta transparency / state-affiliated media label when exposed — brand-safety signal. Often null on logged-out hydrate."},"profileImageVersions":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"width":{"type":"integer","description":"Width in pixels."},"height":{"type":"integer","description":"Height in pixels."}}}},"hasOnboarded":{"type":"boolean","description":"Whether the account has onboarded to Threads (text post app)."}}}}},"example":{"success":true,"data":{"platform":"threads","username":"zuck","url":"https://www.threads.net/@zuck","id":"63055343223","displayName":"Mark Zuckerberg","name":"Mark Zuckerberg","bio":"Mostly superintelligence and MMA takes","verified":true,"followers":5691292,"profileImage":"https://scontent-lax3-2.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg?stp=dst-jpg_s640x640_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=100&_nc_oc=Q6cZ2gEeXugh5SzVlR3-SM7yE5Ymx4mleUIUQVrFLOJAyo4Pai-q3Q4Babsn5npHNxps9Zg&_nc_ohc=2ejw17SwZhoQ7kNvwFX521e&_nc_gid=dmOcoQ5owB8qGvpTG7PZZA&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQGktZYLExtnyRLt29v5FtvhGpx_oXGGlsI4Dt45cx4yWA&oe=6A74FA7E&_nc_sid=10d13b","isThreadsOnlyUser":null,"private":false,"isPrivate":false,"bioLinks":[],"bioFragments":[],"transparencyLabel":null,"profileImageVersions":[{"url":"https://scontent-lax3-2.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=100&_nc_oc=Q6cZ2gEeXugh5SzVlR3-SM7yE5Ymx4mleUIUQVrFLOJAyo4Pai-q3Q4Babsn5npHNxps9Zg&_nc_ohc=2ejw17SwZhoQ7kNvwFX521e&_nc_gid=dmOcoQ5owB8qGvpTG7PZZA&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQFU2s6roeLRVTBK1hBGzljKdg1GndlM6ZamolBrQr2S0Q&oe=6A74FA7E&_nc_sid=10d13b","width":320,"height":320},{"url":"https://scontent-lax3-2.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg?stp=dst-jpg_s640x640_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=100&_nc_oc=Q6cZ2gEeXugh5SzVlR3-SM7yE5Ymx4mleUIUQVrFLOJAyo4Pai-q3Q4Babsn5npHNxps9Zg&_nc_ohc=2ejw17SwZhoQ7kNvwFX521e&_nc_gid=dmOcoQ5owB8qGvpTG7PZZA&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQGktZYLExtnyRLt29v5FtvhGpx_oXGGlsI4Dt45cx4yWA&oe=6A74FA7E&_nc_sid=10d13b","width":640,"height":640}],"hasOnboarded":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/threads/user-posts":{"get":{"operationId":"threads_user_posts","tags":["Threads"],"summary":"Threads User Posts API","description":"Recent Threads posts — engagement{views,likes,replies,reposts,quotes}, threadId/isReply.\n\nPass a Threads profile URL or @handle and get recent public posts as clean JSON: id, code, url, text, ISO publishedAt, threadId / replyToId / isReply / isQuote (rebuild multi-part Threads), top-level author{} (full card once — per-post rows keep slim author without repeating profileImage), engagement{views,likes,replies,reposts,quotes} (views null when Meta omits them on hydrate), and media[] (carousel-aware). Threads exposes only a short window of recent public posts on this surface — limit caps what you receive; it cannot increase what Threads returns. Native trades count for freshness (recent timeline) vs the extended path (fewer recent rows is not a regression). Several fetch paths are tried in order, the slowest last. Envelope includes source (native | extended | cache), stages/ms per tier, and timings.path / timings.totalMs. Instagram usernames often differ on Threads (@womenshealth is @womenshealthmag) — known aliases remap without a scrape; other empty handles retry a related threads.com/@ link from the Instagram profile and set requestedHandle when remapped. A JS boot shell is unavailable, not empty. Flat 2 credits on every successful path. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/threads-user-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Threads profile URL or @handle. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Threads exposes only a short window of recent public posts on this surface. limit caps what you receive; it cannot increase what Threads returns. Flat 2 credits on every successful path (native and extended).","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Recent Threads posts — engagement{views,likes,replies,reposts,quotes}, threadId/isReply.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"handle":{"type":"string","description":"Account handle."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"verified":{"type":"boolean","description":"Whether Meta shows a verified badge on the post author."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."}},"description":"Top-level: full profile card for the requested handle (once). Per-post author is slim (username/displayName/verified, no profileImage) to avoid repeating CDN URLs."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this posts item."},"code":{"type":"string","description":"Code. Example: \"DakyAavlKLZ\"."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Post publish time as ISO-8601 UTC."},"threadId":{"type":"string","description":"Id of the thread root post. Multi-part Threads share one threadId — group by this to rebuild the chain."},"replyToId":{"description":"Parent post id when this row is a reply in a multi-part Thread (null on the root).","type":["string","null"]},"quoteId":{"description":"Quote id."},"isReply":{"type":"boolean","description":"true when the post replies to another post in a Thread chain."},"isQuote":{"type":"boolean","description":"true when the post quotes another post."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"verified":{"type":"boolean","description":"Whether Meta shows a verified badge on the post author."}},"description":"Top-level: full profile card for the requested handle (once). Per-post author is slim (username/displayName/verified, no profileImage) to avoid repeating CDN URLs."},"engagement":{"type":"object","properties":{"views":{},"likes":{"type":"integer"},"replies":{"type":"integer"},"reposts":{"type":"integer"},"quotes":{"type":"integer"}},"description":"Engagement metrics for the item."},"media":{"type":"array","items":{"type":"string"},"description":"Media attached to the item."}}}}}}}},"example":{"success":true,"data":{"handle":"zuck","author":{"username":"zuck","displayName":"Mark Zuckerberg","verified":true,"profileImage":"https://scontent-cdg4-2.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-cdg4-2.cdninstagram.com&_nc_cat=100&_nc_oc=Q6cZ2gHf4XJXymdRHno1xv4ZWDptPQ_F47AvofZR9ZypzIXJ5_ggqvnOJ4NFY10teCcuKSw&_nc_ohc=vLH8jAZMCqoQ7kNvwFFwBjL&_nc_gid=wkyjiyQ2aEsOml1qJ-3q-Q&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQBvZqkyiiQ8DOAXcD-rNsrA7GYbSMXCSzCPUIBJWAPwew&oe=6A6E2ABE&_nc_sid=10d13b"},"totalReturned":2,"posts":[{"platform":"threads","id":"3937491905269768921","code":"DakyAavlKLZ","url":"https://www.threads.net/@zuck/post/DakyAavlKLZ","text":"Today we're releasing Muse Spark 1.1 -- a strong agentic and coding model at a very low price. It's available through our new Meta Model API and in Meta AI.","publishedAt":"2026-07-09T14:00:34.000Z","threadId":"3937491905269768921","replyToId":null,"quoteId":null,"isReply":false,"isQuote":false,"author":{"username":"zuck","displayName":"Mark Zuckerberg","verified":true},"engagement":{"views":null,"likes":2852,"replies":765,"reposts":196,"quotes":63},"media":[]},{"platform":"threads","id":"3937491928497827415","code":"DakyAwYFK5X","url":"https://www.threads.net/@zuck/post/DakyAwYFK5X","text":"Muse Spark 1.1 is strongest at agentic performance, tool use, and computer use. It does well on long-running tasks with 1M token context window, can delegate execution to sub-agents running in parallel, and is trained to use computer interfaces on desktop, mobile, or browser.","publishedAt":"2026-07-09T14:00:37.000Z","threadId":"3937491905269768921","replyToId":"3937491905269768921","quoteId":null,"isReply":true,"isQuote":false,"author":{"username":"zuck","displayName":"Mark Zuckerberg","verified":true},"engagement":{"views":null,"likes":912,"replies":91,"reposts":59,"quotes":14},"media":["https://scontent-cdg4-3.cdninstagram.com/v/t51.82787-15/741068464_17977387650103224_214669101615299168_n.webp?_nc_cat=110&ig_cache_key=MzkzNzQ5MTkyODQ5NzgyNzQxNQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuMTYyMC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=BnavDWIpJKMQ7kNvwGW14gJ&_nc_oc=Ado5sxMS3V9I9TFA6KpOo5ZTsDLrt2liAWKAxWtcz-ea50_hZb2YjO_d70TiTHhjkGA&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-cdg4-3.cdninstagram.com&_nc_gid=wkyjiyQ2aEsOml1qJ-3q-Q&_nc_ss=7a22e&oh=00_AQDyLjCkW1XRN7kshX0Uybz1QIy_tJdKTcfMdl2WJNISyA&oe=6A6E32AC"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/threads/post-details":{"get":{"operationId":"threads_post_details","tags":["Threads"],"summary":"Threads Post Details API","description":"Threads post — engagement (views when exposed), comments[], relatedPosts[], threadId/isReply.\n\nPass a Threads post URL and get one enriched post as clean JSON: id, code, url, text, ISO publishedAt, author{}, engagement{views,likes,replies,reposts,quotes}, threadId/replyToId/isReply/isQuote, media[], plus comments[] (inline replies when Meta embeds them on the permalink) and relatedPosts[] (BarcelonaLoggedOutRelatedPosts — algorithmic related threads, no extra call). Flat 1 credit. This is not an alias of user-posts: relatedPosts and comments are only on this endpoint.\n\nDocs: https://captapi.com/apis/threads-post-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Threads post URL, e.g. https://threads.net/@user/post/CODE. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Threads post — engagement (views when exposed), comments[], relatedPosts[], threadId/isReply.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"code":{"type":"string","description":"Code. Example: \"DZ7eGA1G7wU\"."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Post publish time as ISO-8601 UTC."},"threadId":{"type":"string","description":"Id of the thread root post."},"replyToId":{"description":"Parent post id when this post is a reply."},"quoteId":{"description":"Quote id."},"isReply":{"type":"boolean","description":"true when the post replies to another post."},"isQuote":{"type":"boolean","description":"true when the post quotes another post."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"verified":{"type":"boolean","description":"Whether Meta shows a verified badge on the post author."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"description":"Public view count when Meta exposes it. Often null on logged-out permalink hydrate even when the Threads app shows views."},"likes":{"type":"integer","description":"Heart count on the Threads post (engagement.likes)."},"replies":{"type":"integer","description":"Number of replies."},"reposts":{"type":"integer","description":"Repost count."},"quotes":{"type":"integer","description":"Quote count."}},"description":"Engagement metrics for the item."},"media":{"type":"array","items":{"type":"string"},"description":"Media attached to the item."},"comments":{"type":"array","items":{},"description":"Inline reply posts when Meta embeds them on the permalink. Always an array — [] when the logged-out hydrate omits the reply tree (common on viral posts)."},"relatedPosts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this related posts item."},"code":{"type":"string","description":"Code. Example: \"DbmhnLxFxWE\"."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Post publish time as ISO-8601 UTC."},"threadId":{"type":"string","description":"Id of the thread root post."},"replyToId":{"description":"Parent post id when this post is a reply."},"quoteId":{"description":"Quote id."},"isReply":{"type":"boolean","description":"true when the post replies to another post."},"isQuote":{"type":"boolean","description":"true when the post quotes another post."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"verified":{"description":"Whether Meta shows a verified badge on the post author."}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{"description":"Public view count when Meta exposes it. Often null on logged-out permalink hydrate even when the Threads app shows views."},"likes":{"type":"integer","description":"Heart count on the Threads post (engagement.likes)."},"replies":{"description":"Number of replies.","type":["integer","null"]},"reposts":{"description":"Repost count.","type":["integer","null"]},"quotes":{"description":"Quote count."}},"description":"Engagement metrics for the item."},"media":{"type":"array","items":{},"description":"Media attached to the item."}}}}}}}},"example":{"success":true,"data":{"platform":"threads","id":"3925863854786722836","code":"DZ7eGA1G7wU","url":"https://www.threads.net/@zuck/post/DZ7eGA1G7wU","text":"Our new line of @metaglasses is available today. Three shapes, 26 style combos, with our most advanced Meta AI built in. Plus, three custom styles designed by @kyliejenner.","publishedAt":"2026-06-23T12:57:42.000Z","threadId":"3925863854786722836","replyToId":null,"quoteId":null,"isReply":false,"isQuote":false,"author":{"username":"zuck","displayName":"Mark Zuckerberg","verified":true,"profileImage":"https://scontent-arn2-1.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gFsMxaeE1_m_Q_Q0eLf64nCG364CCEvIvzu9jsBCHKpQUWN0bClo9JEGGd5l3LhCQ8&_nc_ohc=2ejw17SwZhoQ7kNvwHwwhmI&_nc_gid=vNCBwQPT-0NDIFQsV3MGZQ&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQFuCMUtskb3YHQEeVcugbTVFCIEBGnplQquZ3GzBmvhDA&oe=6A77D5BE&_nc_sid=10d13b"},"engagement":{"views":null,"likes":3693,"replies":1408,"reposts":243,"quotes":119},"media":["https://scontent-arn2-1.cdninstagram.com/v/t51.71878-15/729466804_1549760159886177_1883659439515397370_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=105&ig_cache_key=MzkyNTg1NzYxNDQ3NTQyMzA5NQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuNjQwLnNkci52aWRlb19kZWZhdWx0X2NvdmVyX2ZyYW1lLkMzIn0%3D&_nc_ohc=gwtwKMHXGY0Q7kNvwFs8O_B&_nc_oc=AdoeAgtu1iFjbAXZR03M0jk5mHDyXG-V4YkfEgAhFcL9ShW87MFpF6dbSvT0ivhLv8A&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_gid=vNCBwQPT-0NDIFQsV3MGZQ&_nc_ss=7a22e&oh=00_AQGstcY-xX--otMYSGqFyYqoIP73kZ_8D8RHL_quEES13w&oe=6A77F376","https://scontent-arn2-1.cdninstagram.com/o1/v/t16/f2/m84/AQOTRrCQTl1fyJz7fqBninvUdgWeil7BncTOhD-RfiP256I4PY_ioi8UAxdGl0WLEByzkS3XiObR8E2yNiSbmnE634ktoS1hPNebBYI.mp4?_nc_cat=107&_nc_sid=5e9851&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_ohc=fSXEPxW14JIQ7kNvwHBncdf&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0FST1VTRUxfSVRFTS5DMy43MjAuZGFzaF9iYXNlbGluZV8xX3YxIiwieHB2X2Fzc2V0X2lkIjoxNzk2ODE3MTU3ODA4OTg4OCwiYXNzZXRfYWdlX2RheXMiOjQwLCJ2aV91c2VjYXNlX2lkIjoxMDE2NCwiZHVyYXRpb25fcyI6MjQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=cefa3ff17e61a968&_nc_vs=HBksFQIYTGlnX2JhY2tmaWxsX3RpbWVsaW5lX3ZvZC81NDQyODFEMkZCRDg0MzU4MzZBQUE0QzI5MzE4MzlBRF92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzYwNEVGNDk2M0EwQzdFNTY4QTIyNDRDRkI4MDZBMkIwX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACbAhufCnv3qPxUCKAJDMywXQDgF41P3ztkYEmRhc2hfYmFzZWxpbmVfMV92MREAde4HZeieAQA&_nc_gid=vNCBwQPT-0NDIFQsV3MGZQ&_nc_zt=28&_nc_ss=7a22e&oh=00_AQHxRBBUCqh74vHFVtIRloUxKv6fQJnkF0rhbfQ9oLWYUw&oe=6A73E2B5"],"comments":[],"relatedPosts":[{"platform":"threads","id":"3955997150920775044","code":"DbmhnLxFxWE","url":"https://www.threads.net/@thelexlibris/post/DbmhnLxFxWE","text":"The lack of accountability in that teas and tropes post is so wild. The signing lines is all that needs improvements?? I know not.","publishedAt":"2026-08-04T02:47:11.000Z","threadId":"3955997150920775044","replyToId":null,"quoteId":null,"isReply":false,"isQuote":false,"author":{"username":"thelexlibris","displayName":"Lex 🌱","verified":null},"engagement":{"views":null,"likes":1,"replies":null,"reposts":null,"quotes":null},"media":[]},{"platform":"threads","id":"3955973937109715838","code":"DbmcVYOIMt-","url":"https://www.threads.net/@xaylibarclay/post/DbmcVYOIMt-","text":"WOW!! 😮 >> Out of approximately 41,000 to 47,000 active psychiatrists in the U.S., Black women make up less than 1% of the total. \n\nExact counts place the number of practicing Black female psychiatrists between 600 and 850 nationwide, meaning you are looking for a very rare, specialized group of professionals.\n\n🤯🤯","publishedAt":"2026-08-04T02:01:04.000Z","threadId":"3955973937109715838","replyToId":null,"quoteId":null,"isReply":false,"isQuote":false,"author":{"username":"xaylibarclay","displayName":"XayLi Barclay - Tech, Cameras, Life At 40 Yrs old","verified":null},"engagement":{"views":null,"likes":32,"replies":7,"reposts":3,"quotes":null},"media":[]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/threads/search":{"get":{"operationId":"threads_search","tags":["Threads"],"summary":"Threads Post Search API","description":"Threads keyword search — posts with engagement + media.\n\nPass a keyword and get public Threads posts from Meta's Top SERP hydrate as clean JSON: id, code, url, text, ISO publishedAt, author{username,displayName,verified}, engagement{views,likes,replies,reposts,quotes}, threadId/isReply/isQuote, and media[] (carousel children deduped — the same image never appears twice in different crops). orderBy=relevant (default) keeps Meta's query ranking; post_dated sorts that fetched window by publishedAt newest-first; engagement ranks by likes+replies+reposts+quotes+views. Unknown orderBy is 400. The sort is the returned page, not a second crawl of Threads. Flat 2 credits (parity with twitter/search). When Meta's search page itself renders 'No results' the answer is an immediate empty 200 at 0 credits — a definitive verdict, not an outage, so there is nothing to retry. A transient Meta miss is retried in-request, then rescued by the same query's 6h last-good page (labelled stale:true + cached:true, fetchedAt = scrape time, servedAt = now, 0 credits), then the fallback path. A retryable 502 UPSTREAM_UNAVAILABLE (0 credits) is returned only when every path missed — the endpoint never answers 404 “No posts found” for an upstream outage. Pass cache=true for the 24h shared cache (0 credits on hit).\n\nDocs: https://captapi.com/apis/threads-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keyword or phrase to search public Threads posts (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"orderBy","in":"query","required":false,"description":"Sort the fetched page: relevant (default, Meta Top / similar to query), post_dated (newest publishedAt first), or engagement (likes+replies+reposts+quotes+views). Unknown values are 400.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Threads keyword search — posts with engagement + media.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this results item."},"code":{"type":"string","description":"Code. Example: \"DbkGsmYk-Ah\"."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Post publish time as ISO-8601 UTC (Meta Top SERP — may be months old)."},"threadId":{"type":"string","description":"Thread id. Example: \"3955315825888714785\"."},"replyToId":{"description":"Reply to id."},"quoteId":{"description":"Quote id."},"isReply":{"type":"boolean","description":"Whether the tweet is a reply."},"isQuote":{"type":"boolean","description":"Is quote. Example: false."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"verified":{"type":"boolean"}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"views":{},"likes":{"type":"integer"},"replies":{"type":"integer"},"reposts":{"type":"integer"},"quotes":{"type":"integer"}},"description":"Engagement metrics for the item."},"media":{"type":"array","items":{"type":"string"},"description":"CDN URLs for the post's images/videos. Carousel children are deduped by file — the same image never repeats in a different crop."}}}}}}}},"example":{"success":true,"data":{"query":"artificial intelligence","totalReturned":2,"results":[{"platform":"threads","id":"3955315825888714785","code":"DbkGsmYk-Ah","url":"https://www.threads.net/@iansh04_/post/DbkGsmYk-Ah","text":"All Paid Courses (Free for First 4500 People)\n𝗣𝗮𝗶𝗱 𝗖𝗼𝘂𝗿𝘀𝗲 𝗙𝗥𝗘𝗘 (PART - 1)\n1. Artificial Intelligence\n2. Machine Learning\n3. Prompt Engineering\n4. Claude,Chatgpt,Grok\n5. Data Analytics\n6. AWS Certified\n7. Data Science\n8. BIG DATA\n9. Python\n10. Ethical Hacking\n(72 Hours only )\nLike + Repost + comment ' Drive '\nMust Follow @iansh04_ so I can DM you.","publishedAt":"2026-08-03T04:13:31.000Z","threadId":"3955315825888714785","replyToId":null,"quoteId":null,"isReply":false,"isQuote":false,"author":{"username":"iansh04_","displayName":"Ansh Bhatnagar","verified":false},"engagement":{"views":null,"likes":651,"replies":790,"reposts":412,"quotes":4},"media":["https://scontent-arn2-1.cdninstagram.com/v/t51.82787-15/763355760_17982304443106462_6808022601370922517_n.jpg?stp=c0.162.799.799a_dst-jpg_e35_s799x799_tt6&_nc_cat=1&ig_cache_key=Mzk1NTMxNTgyNTg4ODcxNDc4NQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzk5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=W6xISNbePogQ7kNvwFHyufm&_nc_oc=Adpj2_PItVsSle0pXBx8J50TeHA2rVgNKt5K3ykIx7ldNtte-CnSNdBYH26W0xnr9tc&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_gid=2OcSzrbqz_izuGJcwi-1qQ&_nc_ss=7a22e&oh=00_AQGLu1pgLEJU7smbOpdzIyAzqlyw6AtR4JFDxcgyr2gJzA&oe=6A77FBBD"]},{"platform":"threads","id":"3557348422268871722","code":"DFePYrboeQq","url":"https://www.threads.net/@theartificialintelligence/post/DFePYrboeQq","text":"🇨🇳🇺🇸 DeepSeek tells the world that artificial intelligence is not American intelligence, and the United States has no right to monopolize the development of AI that belongs to all mankind.\n\n-Dr. Victor Gao","publishedAt":"2025-01-31T02:04:57.000Z","threadId":"3557348422268871722","replyToId":null,"quoteId":null,"isReply":false,"isQuote":false,"author":{"username":"theartificialintelligence","displayName":"Artificial Intelligence | AI","verified":true},"engagement":{"views":null,"likes":10777,"replies":823,"reposts":759,"quotes":50},"media":["https://scontent-arn2-1.cdninstagram.com/o1/v/t16/f2/m84/AQPR4zUqReqf-s4ildWOQeBb718tDuYqeErpvd3aGhr4jI7THlrcuR7esStJjWXCkmLl-XURcNSrf7AsUKFmac0NgM-QfunN0v1quQo.mp4?_nc_cat=109&_nc_sid=5e9851&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_ohc=wtd19Chl-HEQ7kNvwGng7Cc&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uRkVFRC5DMy4xMjgwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6OTU1NDY3MDkxNzkyNDE0MiwiYXNzZXRfYWdlX2RheXMiOjU1MCwidmlfdXNlY2FzZV9pZCI6MTAxNjQsImR1cmF0aW9uX3MiOjI2MiwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&vs=6df3e1b4c37b0184&_nc_vs=HBksFQIYTGlnX2JhY2tmaWxsX3RpbWVsaW5lX3ZvZC9FRjRCRkY3RkY3NEM5REZERjE1QUJDQUI1OEU4Rjk4Ql92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYOnBhc3N0aHJvdWdoX2V2ZXJzdG9yZS9HTFRwVkJ6VThfSDFnalVIQUtJNTJLZkhlbVZ2YmtZTEFBQUYVAgLIARIAKAAYABsCiAd1c2Vfb2lsATEScHJvZ3Jlc3NpdmVfcmVjaXBlATEVAAAm3NSR4IX7-CEVAigCQzMsF0BwYAAAAAAAGBJkYXNoX2Jhc2VsaW5lXzFfdjERAHXqB2XongEA&_nc_gid=2OcSzrbqz_izuGJcwi-1qQ&_nc_zt=28&_nc_ss=7a22e&oh=00_AQF8bFsn29XzqRjQkrRFQrTZklFBON9dC84Y-XO4UOk-iw&oe=6A73E02B","https://scontent-arn2-1.cdninstagram.com/v/t51.71878-15/474888843_486869244173785_943828438724363456_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=111&ig_cache_key=MzU1NzM0ODQyMjI2ODg3MTcyMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNjQwLnNkci52aWRlb19kZWZhdWx0X2NvdmVyX2ZyYW1lLkMzIn0%3D&_nc_ohc=3FblhuYndyEQ7kNvwEjz1O7&_nc_oc=Adp7qot7ziRgosQn26lzhfHrzzD_m2TOH814YQ1H8ASPezYzNdAr9tGFpJn46kg9I_o&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_gid=2OcSzrbqz_izuGJcwi-1qQ&_nc_ss=7a22e&oh=00_AQEidlufgTbrLRvAeY_lttMaLW7uUuDWfGwhwIjT5ImsRQ&oe=6A77F4AA"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/threads/search-users":{"get":{"operationId":"threads_search_users","tags":["Threads"],"summary":"Threads Search Users API","description":"Threads user discovery from keyword search — id, handle, avatar, verified.\n\nPass a keyword and get distinct Threads authors who appear in Meta's keyword post search as clean JSON: id (pk when embedded), username, displayName, url, verified, profileImage, and followers (usually null on this surface — call Threads Profile for counts). Flat 1 credit (parity with TikTok search-users). This is not a semantic people-search: users are unique authors of posts that matched the keyword on Top SERP, so handles may not contain the query. Pass cache=true for the 24h shared cache (0 credits on hit).\n\nDocs: https://captapi.com/apis/threads-search-users","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keyword to find Threads users / creators (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 1 credit per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Threads user discovery from keyword search — id, handle, avatar, verified.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this users item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"true/false when Meta embeds the badge flag; null when omitted (unknown)."},"profileImage":{"type":"string","description":"Avatar URL when Meta embeds it on the search-post author card."},"followers":{"description":"Follower count when present on the author blob — usually null on search; use Threads Profile for counts."}}}}}}}},"example":{"success":true,"data":{"query":"tech","totalReturned":2,"users":[{"id":"63419899106","username":"3dfreelancing","displayName":"DesignX3D","url":"https://www.threads.net/@3dfreelancing","verified":false,"profileImage":"https://scontent-fml20-1.cdninstagram.com/v/t51.2885-19/358048371_611813460748673_7424252667534087950_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-fml20-1.cdninstagram.com&_nc_cat=105&_nc_oc=Q6cZ2gEuCNzOQBL3WLzHjDVRIUD7nfx3k_HdX2EBkqaiTQ4PmTXyR_B_-1b8j4rN_XouC9U&_nc_ohc=ClRgc8VdrWUQ7kNvwGYy0bX&_nc_gid=BMY7SQQ5QtTZglymKPVK5A&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQFt9IQAYLyjaUWIxFVZ1Soax9syl38lEYeCSesfZ69jGQ&oe=6A77DF17&_nc_sid=10d13b","followers":null},{"id":"69067321051","username":"sgt.edsmia","displayName":"Eds Mia","url":"https://www.threads.net/@sgt.edsmia","verified":false,"profileImage":"https://scontent-fml20-1.cdninstagram.com/v/t51.82787-19/616077711_17908752390297052_8918972735608639981_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDIyLmMyIn0&_nc_ht=scontent-fml20-1.cdninstagram.com&_nc_cat=104&_nc_oc=Q6cZ2gEuCNzOQBL3WLzHjDVRIUD7nfx3k_HdX2EBkqaiTQ4PmTXyR_B_-1b8j4rN_XouC9U&_nc_ohc=PVTn-IDWAVsQ7kNvwFHmDGu&_nc_gid=BMY7SQQ5QtTZglymKPVK5A&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQFFSvfmo4CklK7KwP_B_B-6LlLzoy9Vf5bVT9IRy_MtTQ&oe=6A77D171&_nc_sid=10d13b","followers":null}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/bluesky/profile":{"get":{"operationId":"bluesky_profile","tags":["Bluesky"],"summary":"Bluesky Profile API","description":"Bluesky profile — handle, did, bio, counts, banner, verification{}, labels[], and associated{} (1 credit).\n\nGive a Bluesky profile URL, @handle, or handle and get the public AT Protocol profile as clean JSON. Canonical profile core (same keys on every Captapi profile endpoint): platform, id, handle, url, displayName, bio, avatar, banner, followers, following, postCount, verified, createdAt. Bluesky also returns did (same as id), deprecated aliases name/posts for one release, indexedAt (AppView last indexed the profile record — not last activity), pinnedPost{uri,cid,rkey} when the account featured a post, joinedViaStarterPack when present, verified + verification{verifications[{issuer, issuerHandle, issuerDisplayName, uri, isValid, createdAt}], verifiedStatus, trustedVerifierStatus} (issuer DIDs resolved to handle/display name), moderation labels[{src, uri, cid, val, neg, createdAt, expiresAt}], and associated{lists, feedgens, starterPacks, labeler, chat, activitySubscription} so you can tell feed/labeler service accounts from people. Accepts cache / cacheMaxAge like other profile trust-layer endpoints. Flat 1 credit per call.\n\nDocs: https://captapi.com/apis/bluesky-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Bluesky profile URL, @handle, or handle, e.g. bsky.app/profile/handle. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Bluesky profile — handle, did, bio, counts, banner, verification{}, labels[], and associated{} (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"handle":{"type":"string","description":"Bluesky handle (e.g. bsky.app)."},"url":{"type":"string","description":"Canonical URL of the item."},"did":{"type":"string","description":"AT Protocol DID. Same as id; kept for Bluesky-native clients."},"name":{"type":"string","description":"Deprecated alias of displayName — prefer displayName. Removed after one release."},"bio":{"type":"string","description":"Profile description / bio text."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Following count."},"posts":{"type":"integer","description":"Deprecated alias of postCount — prefer postCount. Removed after one release."},"avatar":{"type":"string","description":"Avatar image URL."},"banner":{"type":"string","description":"Banner image URL."},"verified":{"type":"boolean","description":"Prefer verifiedStatus / verification on Bluesky — this boolean is a coarse summary when present."},"verification":{"type":"object","properties":{"verifications":{"type":"array","items":{"type":"object","properties":{"issuer":{"type":"string"},"issuerHandle":{"type":"string"},"issuerDisplayName":{"type":"string"},"uri":{"type":"string"},"isValid":{"type":"boolean"},"createdAt":{"type":"string","description":"When the account was created (ISO-8601)."}}},"description":"Array of objects with issuer, issuerHandle, issuerDisplayName, uri, isValid, createdAt."},"verifiedStatus":{"type":"string","description":"Bluesky verification status string (e.g. valid, none)."},"trustedVerifierStatus":{"type":"string","description":"Whether this account is a trusted verifier (e.g. valid, none)."}}},"labels":{"type":"array","items":{},"description":"Moderation labels: [{src, uri, cid, val, neg, createdAt, expiresAt}]. src = labeler DID; val = label value; neg = negation; expiresAt when the label expires."},"associated":{"type":"object","properties":{"lists":{"type":"integer","description":"Lists. Example: 0."},"feedgens":{"type":"integer","description":"Number of custom feeds (feed generators) this account publishes."},"starterPacks":{"type":"integer","description":"Number of starter packs this account publishes."},"labeler":{"type":"boolean","description":"Whether this account is a Bluesky labeler (moderation service)."},"chat":{"type":"object","properties":{"allowIncoming":{"type":"string"},"allowGroupInvites":{}},"description":"Object with allowIncoming, allowGroupInvites."},"activitySubscription":{"type":"object","properties":{"allowSubscriptions":{"type":"string"}},"description":"Object with allowSubscriptions."}}},"createdAt":{"type":"string","description":"When the account was created (ISO-8601)."},"indexedAt":{"type":"string","description":"When the Bluesky AppView last indexed this profile record (ISO-8601). Not last activity — createdAt is account age; use user-posts for recent posts."}}}}},"example":{"success":true,"data":{"platform":"bluesky","handle":"jay.bsky.team","url":"https://bsky.app/profile/jay.bsky.team","did":"did:plc:oky5czdrnfjpqslsw2a5iclo","name":"Jay 🦋","bio":"Founder & Chief Innovation Officer @ Bluesky\n\nWorking on @attie.ai\n\n🌱 🪴 🌳","followers":595179,"following":3974,"posts":4110,"avatar":"https://cdn.bsky.app/img/avatar/plain/did:plc:oky5czdrnfjpqslsw2a5iclo/bafkreihxtnc37g7jqdcgidtkknwuswtjiijcdnc6cx4imc4oq33cnsc5da","banner":"https://cdn.bsky.app/img/banner/plain/did:plc:oky5czdrnfjpqslsw2a5iclo/bafkreicgnmvhtmj4arcvwhueygbwvkucd3odvom3lxtfmn6wlqbh3yf7p4","verified":true,"verification":{"verifications":[{"issuer":"did:plc:z72i7hdynmk6r22z27h6tvur","issuerHandle":"bsky.app","issuerDisplayName":"Bluesky","uri":"at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.graph.verification/3lndslpegeo2f","isValid":true,"createdAt":"2025-04-21T11:35:53.359Z"}],"verifiedStatus":"valid","trustedVerifierStatus":"none"},"labels":[],"associated":{"lists":0,"feedgens":0,"starterPacks":0,"labeler":false,"chat":{"allowIncoming":"following","allowGroupInvites":null},"activitySubscription":{"allowSubscriptions":"followers"}},"createdAt":"2022-11-17T06:31:40.296Z","indexedAt":"2026-03-29T21:16:33.460Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/bluesky/user-posts":{"get":{"operationId":"bluesky_user_posts","tags":["Bluesky"],"summary":"Bluesky User Posts API","description":"Author feed — posts and reposts (isRepost marked), quote/external/images embeds, opaque cursor.\n\nSend a Bluesky profile URL, @handle, or handle and get that account's public author feed (app.bsky.feed.getAuthorFeed) as clean JSON — original posts and reposts. Reposts keep the original author{} and engagement; they are marked isRepost=true with repostedBy{handle,displayName,did,avatar} and repostedAt so analytics do not credit someone else's likes to the profile you queried. Pass includeReposts=false to drop reposts. Optional filter maps to Bluesky's feed filter (posts_with_replies | posts_no_replies | posts_with_media | posts_and_author_threads | posts_with_video) — that controls replies/media/threads, not reposts. Each row: uri/url/cid, text, publishedAt, indexedAt, author{}, engagement{likes,reposts,replies,quotes}, and embed as one of type external | images | video | quote (quotes include uri/url/text/author — never a raw lexicon NSID). Rows are ordered by effective timestamp — repostedAt for reposts, publishedAt otherwise — matching Bluesky's author-feed order; re-sorting by publishedAt alone yields a different feed. nextCursor is Bluesky's opaque cursor (do not derive it from publishedAt). Billed ~0.1 credits per returned row (limit max 100). Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/bluesky-user-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Bluesky profile URL, @handle, or handle, e.g. https://bsky.app/profile/handle.bsky.social. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 100). Billed per result.","schema":{"type":"integer","maximum":100,"minimum":1,"default":25}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor from the previous nextCursor. Leave empty for the first page. Do not invent a cursor from publishedAt — the feed is ordered by feed time (reposts sort by repost time).","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Bluesky getAuthorFeed filter: posts_with_replies (default), posts_no_replies, posts_with_media, posts_and_author_threads, or posts_with_video. Controls replies/media/threads — not reposts. Use includeReposts=false to drop reposts.","schema":{"type":"string"}},{"name":"includeReposts","in":"query","required":false,"description":"When false, omit repost rows (reasonRepost). Default true — reposts are included and marked with isRepost / repostedBy / repostedAt.","schema":{"type":"boolean","default":true}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":3,"perResult":0.1,"label":"~3 credits (0.1/result)","billedOnCacheHit":false},"x-one-liner":"Author feed — posts and reposts (isRepost marked), quote/external/images embeds, opaque cursor.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"handle":{"type":"string","description":"The actor whose author feed you requested."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Opaque AppView cursor for the next page. Pass it through unchanged — do not build a cursor from publishedAt (feed order includes repost time)."},"hasMore":{"type":"boolean","description":"true when nextCursor is present."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"uri":{"type":"string","description":"AT URI of the post (at://did…/app.bsky.feed.post/rkey)."},"url":{"type":"string","description":"bsky.app permalink for the post."},"cid":{"type":"string","description":"Content ID (CID) of this post record — stable content-addressed hash."},"text":{"type":"string","description":"Post text body. Long URLs may be truncated here — use links[] from facets for the full URI."},"publishedAt":{"type":"string","description":"When the original post was created (record createdAt). Not repost time — feed order uses repostedAt for isRepost rows."},"indexedAt":{"type":"string","description":"When the AppView indexed this post. For reposts, feed order follows repostedAt — not this field."},"author":{"type":"object","properties":{"handle":{"type":"string","description":"The actor whose author feed you requested."},"displayName":{"type":"string"},"did":{"type":"string"},"avatar":{"type":"string"}},"description":"Author of the underlying post: {handle, displayName, did, avatar}. On reposts this is the original author — not the profile you queried. For verification/labels use post-details."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"reposts":{"type":"integer"},"replies":{"type":"integer"},"quotes":{"type":"integer"}},"description":"Engagement on the underlying post: {likes, reposts, replies, quotes}. On isRepost rows these counts are the original author's — do not average them onto the requested handle without filtering. No view count on Bluesky."},"embed":{"description":"Normalized embed: type external {url,title,description,thumb} | images {images[{url,alt}]} | video {playlist,thumbnail,alt} | quote {uri,url,text,author,cid,publishedAt}. Never a raw lexicon NSID.","type":["object","null"],"properties":{"type":{"type":"string"},"url":{"type":"string","description":"bsky.app permalink for the post."},"title":{"type":"string"},"description":{"type":"string"},"thumb":{"type":"string"}}}}}}}}}},"example":{"success":true,"data":{"handle":"jay.bsky.team","totalReturned":2,"nextCursor":"2026-06-26T14:25:33.024Z","hasMore":true,"posts":[{"platform":"bluesky","uri":"at://did:plc:fpruhuo22xkm5o7ttr2ktxdo/app.bsky.feed.post/3mqjnjafz2s2k","url":"https://bsky.app/profile/danabra.mov/post/3mqjnjafz2s2k","cid":"bafyreib46qdetrzwrcu35fqynwkiw6tscptkvlxcujk5f745jmzqox5jz4","text":"i want to do a little ✨ ama about atproto ✨ in this thread. no question is too simple\n\nif you’ve been curious about atproto but don’t know much (anything?) about it, ask any question and i’ll try to explain it in my own words.\n\n(+ would love to hear from friends who aren’t very active on bsky)","publishedAt":"2026-07-13T12:02:47.424Z","indexedAt":"2026-07-13T12:02:47.867Z","author":{"handle":"danabra.mov","displayName":"dan","did":"did:plc:fpruhuo22xkm5o7ttr2ktxdo","avatar":"https://cdn.bsky.app/img/avatar/plain/did:plc:fpruhuo22xkm5o7ttr2ktxdo/bafkreif43mhqajnbnl62u3ezf37g6x22nd762im54thxbil4ga46eugcga"},"engagement":{"likes":340,"reposts":82,"replies":104,"quotes":9},"embed":null},{"platform":"bluesky","uri":"at://did:plc:xtg6uhgsy2j7k2a6qtcood2w/app.bsky.feed.post/3mqsnmkorxc2l","url":"https://bsky.app/profile/karlbode.com/post/3mqsnmkorxc2l","cid":"bafyreih62va7pjdlbcij4nwp55hatyr73glrjr52eocvxkxwdd72i5phea","text":"meanwhile...","publishedAt":"2026-07-17T01:58:36.505Z","indexedAt":"2026-07-17T01:58:38.070Z","author":{"handle":"karlbode.com","displayName":"Karl Bode","did":"did:plc:xtg6uhgsy2j7k2a6qtcood2w","avatar":"https://cdn.bsky.app/img/avatar/plain/did:plc:xtg6uhgsy2j7k2a6qtcood2w/bafkreigf276i3ejipydii2glvywuymqwj4usu5noz4rw7lirgxrtbbcibi"},"engagement":{"likes":973,"reposts":216,"replies":41,"quotes":107},"embed":{"type":"external","url":"https://www.seattletimes.com/seattle-news/meet-jimothy-seattles-internet-famous-raccoon/?fbclid=Iwb21leATGa4ljbGNrBMZrgWV4dG4DYWVtAjExAHNydGMGYXBwX2lkDDM1MDY4NTUzMTcyOAABHnlF6kiFK1hm4n5G5_BMmAcqRVTUV6qoBX4qZCw1rworU3stQwUoZZFw3yXL_aem_eUBpvFSYXBAwVjchn5qVyA","title":"Meet ‘Jimothy,’ Seattle’s internet-famous raccoon","description":"The tiny beast has been spotted twice in Ballard this summer and appears to be doing well, despite a likely congenital deformity, an animal expert said.","thumb":"https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:xtg6uhgsy2j7k2a6qtcood2w/bafkreidmxsn5szs7i4vpq7kpjbwh44kwnkwu5b2n44vjhtye4hfpqfhzxq"}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/bluesky/post-details":{"get":{"operationId":"bluesky_post_details","tags":["Bluesky"],"summary":"Bluesky Post Details API","description":"Post thread via getPostThread — nested replies[], facet links/mentions/hashtags, rich author (1 credit).\n\nPass a Bluesky post URL and get the public thread (app.bsky.feed.getPostThread) — not a duplicate of a user-posts row. Beyond the list card you get: nested replies[] with per-reply author/text/engagement (depth, default 1, max 6), parentUri/rootUri/isReply so a reply is never mistaken for a root post, facet-derived links[] (full URIs — Bluesky truncates long URLs inside text), mentions[] with did, and hashtags[], post-level labels[] + langs[], and a rich author{handle,displayName,did,avatar,createdAt,labels[],verification{},verified} matching bluesky/profile (including !no-unauthenticated compliance labels). Embeds use the same normalized type namespace as user-posts (external | images | video | quote). Flat 1 credit. This is the only Captapi surface that returns Bluesky reply content.\n\nDocs: https://captapi.com/apis/bluesky-post-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Bluesky post URL, e.g. https://bsky.app/profile/handle/post/RKEY. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"depth","in":"query","required":false,"description":"Reply nesting levels under the post (0 = post only with no replies[], default 1, max 6). Maps to Bluesky getPostThread depth.","schema":{"type":"integer","maximum":6,"minimum":0,"default":1}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Post thread via getPostThread — nested replies[], facet links/mentions/hashtags, rich author (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"uri":{"type":"string","description":"AT URI of the post (at://did…/app.bsky.feed.post/rkey)."},"url":{"type":"string","description":"bsky.app permalink for the post."},"cid":{"type":"string","description":"Content ID (CID) of this post record — stable content-addressed hash."},"text":{"type":"string","description":"Post text body. Long URLs may be truncated here — prefer links[].url from facets."},"publishedAt":{"type":"string","description":"When the post record was created (ISO-8601)."},"indexedAt":{"type":"string","description":"When the AppView indexed this post (ISO-8601)."},"author":{"type":"object","properties":{"handle":{"type":"string","description":"Account handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"did":{"type":"string","description":"Did. Example: \"did:plc:fpruhuo22xkm5o7ttr2ktxdo\"."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."}}},"engagement":{"type":"object","properties":{"likes":{"type":"integer","description":"Like count (number)."},"reposts":{"type":"integer","description":"Repost count."},"replies":{"type":"integer","description":"Nested reply tree from getPostThread. Each node matches the post shape (rich author, facets, engagement) plus its own replies[]. Depth controlled by the depth query param."},"quotes":{"type":"integer","description":"Quote count."}}},"embed":{"description":"Normalized embed: type external | images | video | quote (same namespace as user-posts)."}}}}},"example":{"success":true,"data":{"platform":"bluesky","uri":"at://did:plc:fpruhuo22xkm5o7ttr2ktxdo/app.bsky.feed.post/3mqjnjafz2s2k","url":"https://bsky.app/profile/danabra.mov/post/3mqjnjafz2s2k","cid":"bafyreib46qdetrzwrcu35fqynwkiw6tscptkvlxcujk5f745jmzqox5jz4","text":"i want to do a little ✨ ama about atproto ✨ in this thread. no question is too simple\n\nif you’ve been curious about atproto but don’t know much (anything?) about it, ask any question and i’ll try to explain it in my own words.\n\n(+ would love to hear from friends who aren’t very active on bsky)","publishedAt":"2026-07-13T12:02:47.424Z","indexedAt":"2026-07-13T12:02:47.867Z","author":{"handle":"danabra.mov","displayName":"dan","did":"did:plc:fpruhuo22xkm5o7ttr2ktxdo","avatar":"https://cdn.bsky.app/img/avatar/plain/did:plc:fpruhuo22xkm5o7ttr2ktxdo/bafkreif43mhqajnbnl62u3ezf37g6x22nd762im54thxbil4ga46eugcga"},"engagement":{"likes":340,"reposts":82,"replies":104,"quotes":9},"embed":null}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/pinterest/pin-details":{"get":{"operationId":"pinterest_pin_details","tags":["Pinterest"],"summary":"Pinterest Pin Details API","description":"Get a Pinterest pin — title, description, link, board, origin creator, and engagement as structured JSON.\n\nPass a Pinterest pin URL and get clean JSON: title, description, seoAltText, link (outbound URL — there is no destinationUrl twin), createdAt (ISO-8601 — there is no publishedAt twin), board{name,url,pinCount,followers}, author (board pinner), originAuthor (native creator / original uploader), saves plus repinCount/shareCount/reactionCount, image plus imageOriginal plus images{236x,564x,originals}. Detail is a strict superset of list rows — title and description are filled from the pin page (headline / JSON-LD) even when the widget card is blank. Flat 1 credit. timings{nativeMs,enrichMs,totalMs} name which stage ran. shareCount and reactionCount come from the pin page, not the widget. They are omitted only when that page's pin object does not expose them — a shell fetch is retried, so absence is pin-level, not call-level.\n\nDocs: https://captapi.com/apis/pinterest-pin-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Pinterest pin URL, e.g. https://pinterest.com/pin/ID/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Get a Pinterest pin — title, description, link, board, origin creator, and engagement as structured JSON.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"domain":{"type":"string","description":"Domain. Example: \"Uploaded by user\"."},"image":{"type":"string","description":"Image URL."},"images":{"type":"object","properties":{"236x":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"width":{"type":"integer"},"height":{"type":"integer"}},"description":"Object with url, width, height."},"237x":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"width":{"type":"integer"},"height":{"type":"integer"}},"description":"Object with url, width, height."},"564x":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"width":{"type":"integer"},"height":{"type":"integer"}},"description":"Object with url, width, height."},"originals":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Object with url."}}},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"dominantColor":{"type":"string","description":"Dominant color. Example: \"#a87147\"."},"saves":{"type":"integer","description":"How many times the pin was saved/repinned — Pinterest's primary engagement metric."},"repinCount":{"type":"integer","description":"Repin count. Example: 2140."},"board":{"type":"object","properties":{"name":{"type":"string","description":"Name of this board item."},"url":{"type":"string","description":"Canonical URL of the item."},"pinCount":{"type":"integer","description":"Pin count. Example: 5."},"followers":{"type":"integer","description":"Follower count."}}},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"pinCount":{"type":"integer","description":"Pin count. Example: 265."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."}}},"originAuthor":{"type":"object","properties":{"id":{"type":"string","description":"Id of this origin author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"pinCount":{"type":"integer","description":"Pin count. Example: 66723."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"about":{"type":"string","description":"About."}}},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"seoAltText":{"type":"string","description":"Seo alt text."},"createdAt":{"type":"string","description":"Pin created time as ISO-8601 UTC. There is no publishedAt twin."},"shareCount":{"type":"integer","description":"Share count."},"reactionCount":{"type":"integer","description":"Reaction count. Example: 588."},"imageOriginal":{"type":"string","description":"Full-resolution pin image via i.pinimg.com/originals/… when available under images.originals. Always keyed on this endpoint (list-row superset)."}}}}},"example":{"success":true,"data":{"platform":"pinterest","id":"422281212828530","url":"https://www.pinterest.com/pin/422281212828530/","domain":"Uploaded by user","image":"https://i.pinimg.com/564x/51/a2/0e/51a20efe23e50376920012d832a191a2.jpg","images":{"236x":{"url":"https://i.pinimg.com/236x/51/a2/0e/51a20efe23e50376920012d832a191a2.jpg","width":236,"height":419},"237x":{"url":"https://i.pinimg.com/236x/51/a2/0e/51a20efe23e50376920012d832a191a2.jpg","width":236,"height":419},"564x":{"url":"https://i.pinimg.com/564x/51/a2/0e/51a20efe23e50376920012d832a191a2.jpg","width":564,"height":1002},"originals":{"url":"https://i.pinimg.com/originals/51/a2/0e/51a20efe23e50376920012d832a191a2.webp"}},"isVideo":false,"dominantColor":"#a87147","saves":9606,"repinCount":2140,"board":{"name":"Sala","url":"https://www.pinterest.com/camilarmoutinho/sala/","pinCount":5,"followers":6},"author":{"id":"422418623531974","username":"camilarmoutinho","displayName":"Camila Moutinho","url":"https://www.pinterest.com/camilarmoutinho/","followers":7,"pinCount":265,"avatar":"https://i.pinimg.com/60x60_RS/80/48/e0/8048e086101e0b18790160b4251d00bc.jpg"},"originAuthor":{"id":"1049198181847459163","username":"HomedecorInteriorDesigntips","displayName":"B O E | Home, Bedroom, Living Room, Kitchen, Fashion & Bathroom","url":"https://www.pinterest.com/HomedecorInteriorDesigntips/","followers":2956,"pinCount":66723,"avatar":"https://i.pinimg.com/60x60_RS/8f/b3/53/8fb3538984206cebf310b7a979006bae.jpg","about":"At BOE, we inspire stylish and functional home living. Discover the latest home improvement ideas, timeless bedroom and living room décor, practical kitchen and bathroom tips, and cozy laundry room inspiration. Explore curated collections of furniture, lighting, fashion accents, and accessories that blend beauty with utility. Get expert guides, DIY projects, and sustainable design practices to transform every space."},"title":"Bauhaus Interior","description":"May 6, 2026 — A living room with a brown sofa and a yellow armchair. The space features a colorful rug with geometric patterns and a round glass coffee table. Funky mid century modern, Living spaces, Home interior design","seoAltText":"a living room filled with lots of furniture next to a wall mounted book shelf and lamp","createdAt":"2026-06-10T11:31:28.000Z","shareCount":94,"reactionCount":588,"imageOriginal":"https://i.pinimg.com/originals/51/a2/0e/51a20efe23e50376920012d832a191a2.webp"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/pinterest/user-pins":{"get":{"operationId":"pinterest_user_pins","tags":["Pinterest"],"summary":"Pinterest User Pins API","description":"Pins from a Pinterest profile — offset cursor, pidgets window ~100.\n\nPass a Pinterest profile URL or username and get that profile's public pins as clean JSON. Cursor pagination via nextCursor + hasMore (numeric offset); a null nextCursor means the end of the retrievable window. The envelope names requested / listingHits / totalReturned / truncatedReason=pidgets-window. Native pidgets returns one dump (~25–100 pins) — that is the ceiling, not the board's full pinCount. ~0.5 credits/result (min 2). timings{nativeMs,enrichMs,totalMs} name which stage ran.\n\nDocs: https://captapi.com/apis/pinterest-user-pins","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Pinterest profile URL or username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (numeric offset, e.g. 25). A null nextCursor means the end of the retrievable window (pidgets ~100).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":13,"perResult":0.5,"label":"~13 credits (0.5/result)","billedOnCacheHit":false},"x-one-liner":"Pins from a Pinterest profile — offset cursor, pidgets window ~100.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"pins":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this pins item."},"url":{"type":"string","description":"Canonical URL of the item."},"description":{"type":"string","description":"Description of this pins item."},"image":{"type":"string","description":"Image URL."},"board":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Object with name, url."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string"},"followers":{"type":"integer"}},"description":"Author name or handle."},"link":{"type":"string","description":"Outbound link on the pin (product/article URL). There is no destinationUrl twin."},"imageOriginal":{"type":"string","description":"Image original URL."},"images":{"type":"object","properties":{"564x":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."}}},"originals":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."}}}},"description":"Attached image URL list for this item."},"saves":{"type":"integer","description":"How many times the pin was saved/repinned — Pinterest's primary engagement metric."},"repinCount":{"type":"integer","description":"Repin count. Example: 1."},"originAuthor":{"type":"object","properties":{"id":{"type":"string","description":"Id of this pins item."}},"description":"Object with id."},"dominantColor":{"type":"string","description":"Dominant color. Example: \"#3f2712\"."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"domain":{"type":"string","description":"Domain. Example: \"Uploaded by user\"."},"title":{"type":"string","description":"Title of this pins item."}}}},"requested":{"type":"integer","description":"limit you asked for."},"listingHits":{"type":"integer","description":"Pins in this pidgets window (may be larger than the page)."},"hasMore":{"type":"boolean","description":"true when nextCursor is set. Pass that value as cursor for the next page."},"nextCursor":{"description":"Numeric offset cursor (e.g. 25). Null means the end of the pidgets window (~100)."},"truncatedReason":{"type":"string","description":"pidgets-window when the native dump is exhausted."}}}}},"example":{"success":true,"data":{"username":"potterybarn","totalReturned":2,"pins":[{"platform":"pinterest","id":"264938390611768286","url":"https://www.pinterest.com/pin/264938390611768286/","description":"Our Rockport Metal Rectangular Outdoor Dining Table is the perfect table to gather around, share everyday meals, and create everlasting memories. Layer with your favorite dinnerware, table linens, and decor. Tap to shop our table.","image":"https://i.pinimg.com/564x/c5/3c/d8/c53cd8cbf2c9ac113541297716ea4f79.jpg","board":{"name":"Rustic Lodge Lookbook","url":"https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/"},"author":{"username":"potterybarn","displayName":"Pottery Barn","followers":1122723},"link":"https://www.potterybarn.com/pages/lookbook/fall/rustic-lodge/?cm_ven=OrganicSocial&cm_cat=Pinterest&cm_pla=stpin&cm_ite=rusticlodgeoutdoordining","imageOriginal":"https://i.pinimg.com/originals/c5/3c/d8/c53cd8cbf2c9ac113541297716ea4f79.jpg","images":{"564x":{"url":"https://i.pinimg.com/564x/c5/3c/d8/c53cd8cbf2c9ac113541297716ea4f79.jpg"},"originals":{"url":"https://i.pinimg.com/originals/c5/3c/d8/c53cd8cbf2c9ac113541297716ea4f79.jpg"}},"saves":2,"repinCount":1,"originAuthor":{"id":"264938527987338255"},"dominantColor":"#3f2712","isVideo":false,"domain":"Uploaded by user","title":"Rockport Metal Rectangular Outdoor Dining Table"},{"platform":"pinterest","id":"264938390611768285","url":"https://www.pinterest.com/pin/264938390611768285/","description":"Turn your home into a cozy retreat with our Faux Fur Mink Throw Blankets. Available in over 10 colors, this soft throw blanket is perfect for cozying up on the couch, layering on a bed, or adding warmth and texture to any living room or bedroom. Tap to shop!","image":"https://i.pinimg.com/564x/92/11/09/92110909d4268cb415bfb10ae6281f50.jpg","board":{"name":"Rustic Lodge Lookbook","url":"https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/"},"author":{"username":"potterybarn","displayName":"Pottery Barn","followers":1122723},"link":"https://www.potterybarn.com/pages/lookbook/fall/rustic-lodge/?cm_ven=OrganicSocial&cm_cat=Pinterest&cm_pla=stpin&cm_ite=rusticlodgeblankets","imageOriginal":"https://i.pinimg.com/originals/92/11/09/92110909d4268cb415bfb10ae6281f50.jpg","images":{"564x":{"url":"https://i.pinimg.com/564x/92/11/09/92110909d4268cb415bfb10ae6281f50.jpg"},"originals":{"url":"https://i.pinimg.com/originals/92/11/09/92110909d4268cb415bfb10ae6281f50.jpg"}}}],"requested":5,"listingHits":5,"hasMore":false,"nextCursor":null,"truncatedReason":"pidgets-window"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/pinterest/search":{"get":{"operationId":"pinterest_search","tags":["Pinterest"],"summary":"Pinterest Search API","description":"Keyword pin search — offset cursor, SERP window 40.\n\nSearch public Pinterest pins by keyword (logged-out Pinterest search is empty, so results come from a public search-results window of pin pages, each hydrated). Cursor pagination via nextCursor + hasMore; a null nextCursor means the end of the SERP window (max 40). Envelope: requested / listingHits / truncatedReason=serp-window. timings{serpMs,hydrateMs,enrichMs,totalMs} show which stage burned the seconds — search is the slow endpoint in this block. ~0.5 credits/result.\n\nDocs: https://captapi.com/apis/pinterest-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keywords or search query (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (numeric offset, e.g. 25). A null nextCursor means the end of the SERP window (max 40).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":13,"perResult":0.5,"label":"~13 credits (0.5/result)","billedOnCacheHit":false},"x-one-liner":"Keyword pin search — offset cursor, SERP window 40.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this results item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this results item."},"description":{"type":"string","description":"Description of this results item."},"image":{"type":"string","description":"Image URL."},"saves":{"type":"integer","description":"How many times the pin was saved/repinned — Pinterest's primary engagement metric."},"board":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Object with name, url."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"followers":{"type":"integer"}},"description":"Author name or handle."},"link":{"type":"string","description":"Outbound link on the pin (product/article URL). There is no destinationUrl twin."},"imageOriginal":{"type":"string","description":"Image original URL."},"images":{"type":"object","properties":{"originals":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."}}}},"description":"Attached image URL list for this item."}}}},"requested":{"type":"integer","description":"limit you asked for."},"listingHits":{"type":"integer","description":"Hydrated pins in this SERP window (may be limit+1 when probing hasMore)."},"hasMore":{"type":"boolean","description":"true when nextCursor is set. Pass that value as cursor for the next page."},"nextCursor":{"description":"Numeric offset cursor (e.g. 25). Null means the end of the SERP window (max 40)."},"truncatedReason":{"type":"string","description":"serp-window when the SERP window is exhausted or you are at the 40 cap."}}}}},"example":{"success":true,"data":{"query":"living room decor","totalReturned":2,"results":[{"platform":"pinterest","id":"7036943163632532","url":"https://www.pinterest.com/pin/7036943163632532/","title":"Kimberly Square Coffee Table","description":"Kimberly Square Marble Coffee Table","image":"https://i.pinimg.com/originals/7f/68/af/7f68af1e9476e0a762ed9fcccd66cd24.jpg","saves":2,"board":{"name":"pretty furniture","url":"https://www.pinterest.com/anrureck/pretty-furniture/"},"author":{"username":"anrureck","displayName":"Anna Reckelhoff","followers":27},"link":"https://www.luluandgeorgia.com/products/kimberly-coffee-table?variant=41218898952291#m24480845889635","imageOriginal":"https://i.pinimg.com/originals/7f/68/af/7f68af1e9476e0a762ed9fcccd66cd24.jpg","images":{"originals":{"url":"https://i.pinimg.com/originals/7f/68/af/7f68af1e9476e0a762ed9fcccd66cd24.jpg"}}},{"platform":"pinterest","id":"1266706141814841","url":"https://www.pinterest.com/pin/1266706141814841/","title":"Scandinavian Living Room: Turoy Ivory Bouclé Swivel Chair","description":"Sit like a Bond villain whose only real diabolical concern is comfort. Photo by @amyepeters: lounge chair, chair, scandinavian, scandinavian living room, living room, living room designs, living room inspo, decor home living room, neutral living room, cozy corner, reading nook","image":"https://i.pinimg.com/originals/bc/ea/89/bcea896786826d048bdb6f4d486fc241.jpg","saves":91,"board":{"name":"Baddie","url":"https://www.pinterest.com/christigia/baddie/"},"author":{"username":"christigia","displayName":"Christi Giannetti","followers":255},"link":"https://www.article.com/product/13941/turoy-ivory-boucle-swivel-chair?utm_medium=social&utm_source=pinterest&utm_campaign=evergreen&utm_content=igc","imageOriginal":"https://i.pinimg.com/originals/bc/ea/89/bcea896786826d048bdb6f4d486fc241.jpg","images":{"originals":{"url":"https://i.pinimg.com/originals/bc/ea/89/bcea896786826d048bdb6f4d486fc241.jpg"}}}],"requested":5,"listingHits":3,"hasMore":false,"nextCursor":null,"truncatedReason":"serp-window"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/pinterest/board":{"get":{"operationId":"pinterest_board","tags":["Pinterest"],"summary":"Pinterest Board API","description":"Pins on a Pinterest board — saves, imageOriginal, destinationUrl, top-level author.\n\nPass a Pinterest board URL (.../username/board-name/ — not a /pin/ URL) and get that board's public pins as clean JSON. Response includes board + boardName, a top-level author{} (pinner card with followers, once), and pins[] with id/url, title when Pinterest exposes it, description, link (outbound URL — no destinationUrl twin), domain, saves, image + imageOriginal + images{236x,564x,originals,…}, and a slim per-pin author{username,displayName}. Cursor pagination via nextCursor + hasMore; a null nextCursor means the end of the pidgets window (~100). Envelope: requested / listingHits / truncatedReason=pidgets-window. ~0.5 credits/pin (min 2).\n\nDocs: https://captapi.com/apis/pinterest-board","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Pinterest board URL (.../username/board-name/), not a /pin/ URL. Example: https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (numeric offset, e.g. 25). A null nextCursor means the end of the retrievable window (pidgets ~100).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":13,"perResult":0.5,"label":"~13 credits (0.5/result)","billedOnCacheHit":false},"x-one-liner":"Pins on a Pinterest board — saves, imageOriginal, destinationUrl, top-level author.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"board":{"type":"string","description":"Board URL."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"pins":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this pins item."},"url":{"type":"string","description":"Canonical URL of the item."},"description":{"type":"string","description":"Description of this pins item."},"domain":{"type":"string","description":"Domain. Example: \"Uploaded by user\"."},"image":{"type":"string","description":"Display image URL (typically 564x or 736x CDN size). Prefer imageOriginal for archival/analysis."},"images":{"type":"object","properties":{"564x":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"width":{"type":"integer"},"height":{"type":"integer"}}},"originals":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."}}}},"description":"Attached image URL list for this item."},"isVideo":{"type":"boolean","description":"Whether the item is a video."},"dominantColor":{"type":"string","description":"Dominant color. Example: \"#3f2712\"."},"repinCount":{"type":"integer","description":"Repin count. Example: 1."},"board":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"pinCount":{"type":"integer","description":"Pin count. Example: 19312448."},"followers":{"type":"integer","description":"Follower count."}},"description":"Object with name, url, pinCount, followers."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."}},"description":"Top-level: full pinner card (username, displayName, followers). Per-pin author is slim (username/displayName) to avoid repeating followers on every row."},"originAuthor":{"type":"object","properties":{"id":{"type":"string","description":"Id of this pins item."}},"description":"Object with id."},"saves":{"type":"integer","description":"How many times the pin was saved/repinned — Pinterest's primary engagement metric."},"imageOriginal":{"type":"string","description":"Full-resolution pin image via i.pinimg.com/originals/… (derived when Pinterest only ships sized CDN URLs)."}}}},"boardName":{"type":"string","description":"Board name. Example: \"Rustic Lodge Lookbook\"."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"pinCount":{"type":"integer","description":"Pin count. Example: 19312448."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"about":{"type":"string","description":"About."}},"description":"Top-level: full pinner card (username, displayName, followers). Per-pin author is slim (username/displayName) to avoid repeating followers on every row."},"requested":{"type":"integer","description":"limit you asked for."},"listingHits":{"type":"integer","description":"Pins in this pidgets window (may be larger than the page)."},"hasMore":{"type":"boolean","description":"true when nextCursor is set. Pass that value as cursor for the next page."},"nextCursor":{"description":"Numeric offset cursor (e.g. 25). Null means the end of the pidgets window (~100)."},"truncatedReason":{"type":"string","description":"pidgets-window when the native dump is exhausted."}}}}},"example":{"success":true,"data":{"board":"https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/","totalReturned":2,"pins":[{"platform":"pinterest","id":"264938390611779142","url":"https://www.pinterest.com/pin/264938390611779142/","description":"Add texture and dimension to any console table with our Woven Vine Vase. Available in two sizes, this handcrafted piece is sure to make a statement. Complete the moment with some faux branches or florals. Tap to shop!","domain":"Uploaded by user","image":"https://i.pinimg.com/564x/22/f4/da/22f4da6ab05a70aabcda594a7d004883.jpg","images":{"564x":{"url":"https://i.pinimg.com/564x/22/f4/da/22f4da6ab05a70aabcda594a7d004883.jpg","width":564,"height":846},"originals":{"url":"https://i.pinimg.com/originals/22/f4/da/22f4da6ab05a70aabcda594a7d004883.jpg"}},"isVideo":false,"dominantColor":"#3f2712","repinCount":1,"board":{"name":"Rustic Lodge Lookbook","url":"https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/","pinCount":13,"followers":1021580},"author":{"username":"potterybarn","displayName":"Pottery Barn"},"originAuthor":{"id":"264938527987338255"},"saves":2,"imageOriginal":"https://i.pinimg.com/originals/22/f4/da/22f4da6ab05a70aabcda594a7d004883.jpg"},{"platform":"pinterest","id":"264938390611779129","url":"https://www.pinterest.com/pin/264938390611779129/","description":"Rustic meets refined with our expertly crafted Bozeman Console Table—perfect for any entryway or living room. Layer home decor with varying textures and heights to add dimension and character. Tap to shop our exclusive Fall collection.","domain":"Uploaded by user","image":"https://i.pinimg.com/564x/cc/2a/6a/cc2a6a49424bedc1aa29cdeb6195a48b.jpg","images":{"564x":{"url":"https://i.pinimg.com/564x/cc/2a/6a/cc2a6a49424bedc1aa29cdeb6195a48b.jpg","width":564,"height":846},"originals":{"url":"https://i.pinimg.com/originals/cc/2a/6a/cc2a6a49424bedc1aa29cdeb6195a48b.jpg"}},"isVideo":false,"dominantColor":"#3a220f","board":{"name":"Rustic Lodge Lookbook","url":"https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/","pinCount":13,"followers":1021580},"author":{"username":"potterybarn","displayName":"Pottery Barn"},"originAuthor":{"id":"264938527987338255"},"saves":1,"imageOriginal":"https://i.pinimg.com/originals/cc/2a/6a/cc2a6a49424bedc1aa29cdeb6195a48b.jpg","repinCount":0}],"boardName":"Rustic Lodge Lookbook","author":{"id":"264938527987338255","username":"potterybarn","displayName":"Pottery Barn","url":"https://www.pinterest.com/potterybarn/","followers":1122739,"pinCount":19312448,"avatar":"https://i.pinimg.com/60x60_RS/c0/c2/52/c0c252100791f0a4ed29e7bb31b85a0f.jpg","about":"Ideas & inspiration for real life. Mindfully made. Crafted to last."},"requested":5,"listingHits":4,"hasMore":false,"nextCursor":null,"truncatedReason":"pidgets-window"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/pinterest/user-boards":{"get":{"operationId":"pinterest_user_boards","tags":["Pinterest"],"summary":"Pinterest User Boards API","description":"Boards on a Pinterest profile — pinCount, coverImage (474x), privacy, sections.\n\nPass a Pinterest profile URL or username and get that profile's public boards as clean JSON. Every board row uses the same shape: id, name, url, description, privacy, pinCount, followers, sectionCount, coverImage (prefers Pinterest's 474x HD cover), createdAt (ISO-8601 UTC), and owner{username,displayName}. followers is the board-scoped follower count when available — Pinterest's logged-out board.follower_count is account-scale (identical on every board) and is never echoed here (null until a board-scoped source is wired). Cursor pagination via nextCursor + hasMore (ceiling 200). Envelope: requested / listingHits / truncatedReason=profile-window. ~0.5 credits/board (min 2).\n\nDocs: https://captapi.com/apis/pinterest-user-boards","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Pinterest profile URL or username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":25}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (numeric offset, e.g. 25). A null nextCursor means the end of the retrievable window (max 200).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":13,"perResult":0.5,"label":"~13 credits (0.5/result)","billedOnCacheHit":false},"x-one-liner":"Boards on a Pinterest profile — pinCount, coverImage (474x), privacy, sections.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"boards":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this boards item."},"name":{"type":"string","description":"Name of this boards item."},"url":{"type":"string","description":"Canonical URL of the item."},"description":{"description":"Description of this boards item."},"privacy":{"type":"string","description":"Board privacy: public or secret when exposed."},"pinCount":{"type":"integer","description":"Number of pins on the board."},"followers":{"description":"Board-scoped follower count when available. Null on the logged-out hydrate — Pinterest's board.follower_count there is account-scale (same value on every board) and is never returned."},"sectionCount":{"type":"integer","description":"Number of sections on the board."},"coverImage":{"type":"string","description":"Board cover image URL. Prefers Pinterest's image_cover_hd_url (474x) when present; may fall back to 200x150."},"createdAt":{"type":"string","description":"Board creation time as ISO-8601 UTC (normalized from Pinterest's RFC 2822)."},"owner":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string"}},"description":"Board owner card: username + displayName."}}}},"requested":{"type":"integer","description":"limit you asked for."},"listingHits":{"type":"integer","description":"Boards in this profile window (may be larger than the page)."},"hasMore":{"type":"boolean","description":"true when nextCursor is set. Pass that value as cursor for the next page."},"nextCursor":{"description":"Numeric offset cursor (e.g. 25). Null means the end of the window (max 200)."},"truncatedReason":{"type":"string","description":"profile-window when the /_boards/ dump is exhausted."}}}}},"example":{"success":true,"data":{"username":"potterybarn","totalReturned":2,"boards":[{"platform":"pinterest","id":"264938459268358811","name":"Cozy Home Inspiration","url":"https://www.pinterest.com/potterybarn/cozy-home-inspiration/","description":null,"privacy":"public","pinCount":26,"followers":null,"sectionCount":0,"coverImage":"https://i.pinimg.com/474x/88/13/6d/88136d3c8ce2b489f83f4b70a7afba8a.jpg","createdAt":"2026-07-29T17:28:42Z","owner":{"username":"potterybarn","displayName":"Pottery Barn"}},{"platform":"pinterest","id":"264938459268358699","name":"Rustic Lodge Lookbook","url":"https://www.pinterest.com/potterybarn/rustic-lodge-lookbook/","description":null,"privacy":"public","pinCount":13,"followers":null,"sectionCount":0,"coverImage":"https://i.pinimg.com/474x/13/37/dd/1337dd421b303196c96002b735618cc3.jpg","createdAt":"2026-07-27T18:39:04Z","owner":{"username":"potterybarn","displayName":"Pottery Barn"}}],"requested":5,"listingHits":5,"hasMore":false,"nextCursor":null,"truncatedReason":"profile-window"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkedin/profile":{"get":{"operationId":"linkedin_profile","tags":["LinkedIn"],"summary":"LinkedIn Profile API","description":"LinkedIn person profile with experience[], education[], skills[], similarProfiles[] — masked guest text becomes restricted:true.\n\nPublic LinkedIn person profile as clean JSON for B2B sales intel. Core identity: name, headline, about, followers, currentCompany — about from the real bio (JSON-LD), never LinkedIn's og:description SEO blurb. headline is the member's free-text line — it is not a structured title and can disagree with experience[0].title. The URL slug is resolved as-is; we do not rematch on name. currentCompany is the current experience[].company; when LinkedIn's company-page name differs it is currentCompanyLegalName. connections is exact below 500; LinkedIn's public cap (displayed 500+, often sent as 501) is returned as 500 with connectionsIsApproximate:true. education[] is always keyed and populated from the same sections as the profile page (school, degree, fieldOfStudy, startDate, endDate). Year-only rows stay \"1995\" — we do not invent a month. startDate can be null (a certification year). skills[] is always keyed from the same page section. experience[].startDate/endDate are ISO YYYY or YYYY-MM (never a Python dict repr). profileImage carries mediaUrlsExpireAt from LinkedIn's e= stamp (~19 days, midnight UTC). cached is always keyed. Section enrichment leads — the guest page almost never has experience/education; the native page is an 8s backup only when enrichment is thin. When enrichment returns experience but drops education, a full-sections pass still runs. Guest-masked asterisk descriptions (******* …) are description:null with restricted:true. timings{nativeMs,enrichMs,totalMs} — nativeMs is omitted when native did not run. Section enrichment is 2 credits.\n\nDocs: https://captapi.com/apis/linkedin-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"LinkedIn profile URL, e.g. https://www.linkedin.com/in/paul-martin-a5aa98. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"LinkedIn person profile with experience[], education[], skills[], similarProfiles[] — masked guest text becomes restricted:true.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Content type of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"username":{"type":"string","description":"Account username / handle."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"headline":{"type":"string","description":"Member-authored free text. It is not a structured title — it can say Developer while experience[0].title says Engineer."},"location":{"type":"string","description":"Location shown on the profile or item."},"about":{"description":"About."},"followers":{"type":"integer","description":"Follower count."},"connections":{"type":"integer","description":"Exact integer below 500. LinkedIn never displays 501 — that value is the 500+ cap and is returned as 500 with connectionsIsApproximate true."},"connectionsIsApproximate":{"type":"boolean","description":"true on the 500+ cap. false when LinkedIn exposed an exact count. null when connections is null (guest limit)."},"profileImage":{"type":"string","description":"Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release)."},"currentCompany":{"description":"Same string as the current experience[].company. Use currentCompanyLegalName when LinkedIn's company-page name differs."},"education":{"type":"array","items":{},"description":"Always keyed. {school, degree, fieldOfStudy, startDate, endDate}. Year-only stays YYYY. [] means this profile listed no schools — not that the field is out of scope."},"cached":{"type":"boolean","description":"Always keyed. true on a cache=true hit. Default cache=false — live calls each bill."}}}}},"example":{"success":true,"data":{"platform":"linkedin","type":"person","url":"https://www.linkedin.com/in/paul-martin-a5aa98","username":"paul-martin-a5aa98","name":"Paul Martin","headline":"Culver City, California, United States | Professional Profile","location":"Culver City, California, United States","about":null,"followers":5532,"connections":500,"connectionsIsApproximate":true,"profileImage":"https://media.licdn.com/dms/image/v2/C5603AQERBmOpeQdTJg/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1603153614207?e=2147483647&v=beta&t=jmt32YrTWx2FRGXeRg6yYkMBcNR7iGokOvlfuVH5d3U","currentCompany":null,"education":[],"cached":false}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkedin/company":{"get":{"operationId":"linkedin_company","tags":["LinkedIn"],"summary":"LinkedIn Company API","description":"Company page for B2B intel — specialties, similarPages, employeeCount, founded, slogan, cover.\n\nPass a LinkedIn company URL and get B2B-ready JSON: name, industry, description, website, followers, employeeCount (the headcount), founded, organizationType (Public Company / …), specialties[], location{city,state,country}, slogan, coverImage, logo, similarPages[{name,link,image}] (discovery graph — same pattern as profile similarProfiles), funding when upstream exposes rounds/investors, and employees[] only when LinkedIn exposes featured people (omitted when empty — not a roster of employeeCount). type stays the entity discriminator \"company\" — organizationType is the About \"Type\" field. There is no size display string (\"10,001+ employees\") and no headquarters twin of location{}. timings{nativeMs,enrichMs,totalMs} name which stage burned the seconds. The guest page bills 1 credit; enrichment for slogan/cover (and rare funding) bills 2. Recent posts live on /linkedin/company-posts, not inlined here.\n\nDocs: https://captapi.com/apis/linkedin-company","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"LinkedIn company URL, e.g. https://www.linkedin.com/company/shopify. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Company page for B2B intel — specialties, similarPages, employeeCount, founded, slogan, cover.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Entity discriminator — always \"company\". Organization legal/type label is organizationType."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"industry":{"type":"string","description":"LinkedIn industry from the About section (e.g. Software Development)."},"description":{"type":"string","description":"Description text."},"website":{"type":"string","description":"Website listed on the profile."},"followers":{"type":"integer","description":"Follower count."},"employeeCount":{"type":"integer","description":"LinkedIn headcount estimate for the company. The only size figure — there is no size display string."},"employees":{"type":"array","items":{},"description":"Featured employees [{name,title,link}] when LinkedIn exposes them. Omitted when empty — not a roster of employeeCount."},"size":{"type":"string","description":"Size. Example: \"10,001+ employees\"."},"founded":{"type":"integer","description":"Founding year when present on the About section."},"organizationType":{"type":"string","description":"About \"Type\" (e.g. Public Company). Distinct from type:\"company\"."},"specialties":{"type":"array","items":{"type":"string"},"description":"About specialties list."},"headquarters":{"type":"string","description":"Headquarters. Example: \"Ottawa, ON, CA\"."},"location":{"type":"object","properties":{"city":{"type":"string","description":"City. Example: \"Ottawa\"."},"state":{"type":"string","description":"State. Example: \"ON\"."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."}}},"slogan":{"type":"string","description":"Company tagline."},"coverImage":{"type":"string","description":"Company cover/background image URL."},"logo":{"type":"string","description":"Logo image URL."},"funding":{"description":"Funding rounds/investors when upstream exposes them; null when no funding data is public."},"similarPages":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name of this similar pages item."},"link":{"type":"string","description":"Link URL."},"image":{"description":"Image URL."}}}}}}}},"example":{"success":true,"data":{"platform":"linkedin","type":"company","url":"https://ca.linkedin.com/company/shopify","name":"Shopify","industry":"Software Development","description":"Shopify is a leading global commerce company, providing trusted tools to start, grow, market, and manage a retail business of any size. Shopify makes commerce better for everyone with a platform and services that are engineered for reliability, while delivering a better shopping experience for consumers everywhere. Shopify powers millions of businesses in more than 175 countries and is trusted by brands such as Allbirds, Gymshark, PepsiCo, Staples, and many more.\n\nFind all our jobs here: www.shopify.com/careers","website":"https://www.shopify.com","followers":1100174,"employeeCount":29621,"employees":[],"size":"10,001+ employees","founded":2006,"organizationType":"Public Company","specialties":["ecommerce","API"],"headquarters":"Ottawa, ON, CA","location":{"city":"Ottawa","state":"ON","country":"CA"},"slogan":"Make commerce better for everyone","coverImage":"https://media.licdn.com/dms/image/v2/D561BAQHhgj9vXYPfGw/company-background_10000/B56ZanR4DlHUAg-/0/1746563203645/shopify_cover?e=1786471200&v=beta&t=ipMJX6bvyB3cy61qNb70u0k09GOWqudh6eQnnrtv3RM","logo":"https://media.licdn.com/dms/image/v2/D560BAQG_KjTcNcrLVw/company-logo_200_200/B56ZZolTV.HUAU-/0/1745511331439/shopify_logo?e=2147483647&v=beta&t=D2saVg58cKnwEiDQgFgzvwL24mTRM_cPuU1ndv6kL2U","funding":null,"similarPages":[{"name":"Stripe","link":"https://www.linkedin.com/company/stripe","image":null},{"name":"Spotify","link":"https://se.linkedin.com/company/spotify","image":null}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkedin/post-details":{"get":{"operationId":"linkedin_post_details","tags":["LinkedIn"],"summary":"LinkedIn Post Details API","description":"Get a LinkedIn post — text, author, reactions, and comments count as structured JSON.\n\nThe LinkedIn Post Details API lets you fetch full metadata and key stats for LinkedIn post details with a single REST call. No OAuth, no infrastructure to maintain, and no platform SDKs — send the request, get clean structured JSON back. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d.\n\nDocs: https://captapi.com/apis/linkedin-post-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"LinkedIn post or activity URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Get a LinkedIn post — text, author, reactions, and comments count as structured JSON.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Content type of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"author":{"type":"object","properties":{"name":{"type":"string","description":"Name of this author item."},"headline":{"type":"string","description":"Profile headline."},"url":{"type":"string","description":"Canonical URL of the item."}}},"engagement":{"type":"object","properties":{"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count."},"reposts":{"type":"integer","description":"Repost count."}}}}}}},"example":{"success":true,"data":{"platform":"linkedin","type":"post","url":"https://www.linkedin.com/posts/microsoft_the-most-meaningful-breakthroughs-happen-activity-7477715981667086336-x68i","text":"The most meaningful breakthroughs happen when technology is built with people in mind.\n \nThat was the message at Microsoft Build this month, where we announced a host of new tools to help developers build, dream and create. \n \nIn June’s edition of The Monthly Tech-In, we’re sharing stories from Build and beyond about the developers, founders and communities who are using AI to tackle real-world challenges, from helping creators protect their work to advancing more inclusive AI systems.\n \nRead more about the people and innovations who are shaping what's next:","publishedAt":"2026-07-04 13:19:24","author":{"name":"Microsoft","headline":"28,652,029 followers","url":"https://www.linkedin.com/company/microsoft/posts"},"engagement":{"likes":1012,"comments":82,"reposts":49}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkedin/post-transcript":{"get":{"operationId":"linkedin_post_transcript","tags":["LinkedIn"],"summary":"LinkedIn Post Transcript API","description":"LinkedIn post text as a transcript — paragraph segments, timingSource none.\n\nPaste a LinkedIn post/activity URL and get the public post body as structured text: transcript, wordCount, author, publishedAt, and transcriptSegments split on blank-line paragraphs (including NBSP gaps). timingSource is always \"none\" today (on every path) — no caption track or speech-to-text. When timingSource is \"none\", segment start/duration/timestamp are omitted (returned only when timingSource is \"captions\"). Each segment has index, wordCount, charStart/charEnd into transcript. estimatedReadSeconds is a single top-level 200 wpm estimate — never inside duration. There is no segments count key and no language key — LinkedIn does not expose a speech language, and we do not guess from the body. timings{nativeMs,enrichMs,totalMs} name the fetch. Flat 1 credit.\n\nDocs: https://captapi.com/apis/linkedin-post-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"LinkedIn post or activity URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"LinkedIn post text as a transcript — paragraph segments, timingSource none.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"transcript":{"type":"string","description":"Full LinkedIn post body text (not speech-to-text from a video)."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"index":{"type":"integer","description":"0-based segment order within transcriptSegments."},"wordCount":{"type":"integer","description":"Word count of the full transcript (emoji-only tokens count as 0; URLs count as 1)."},"charStart":{"type":"integer","description":"Start offset into transcript (transcript.slice(charStart, charEnd) === text)."},"charEnd":{"type":"integer","description":"End offset into transcript (exclusive)."}}}},"wordCount":{"type":"integer","description":"Word count of the full transcript (emoji-only tokens count as 0; URLs count as 1)."},"segments":{"type":"integer","description":"Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list."},"author":{"type":"object","properties":{"name":{"type":"string","description":"Name of this author item."},"url":{"type":"string","description":"Canonical URL of the item."}}},"publishedAt":{"type":"string","description":"ISO-8601 when guest HTML/JSON-LD exposes it (including VideoObject datePublished on ugcPost URLs)."},"timingSource":{"type":"string","description":"Always \"none\" on this endpoint today (on every path). \"captions\" is reserved for future cue support — do not branch on it; nothing emits it yet."},"estimatedReadSeconds":{"type":"integer","description":"Whole-transcript reading-time estimate at 200 wpm. Not per-segment duration."},"language":{"description":"Omitted — LinkedIn text posts have no speech language. We do not guess from the body."}}}}},"example":{"success":true,"data":{"platform":"linkedin","url":"https://www.linkedin.com/posts/microsoft_the-most-meaningful-breakthroughs-happen-activity-7477715981667086336-x68i","transcript":"The most meaningful breakthroughs happen when technology is built with people in mind.\n \nThat was the message at Microsoft Build this month, where we announced a host of new tools to help developers build, dream and create. \n \nIn June’s edition of The Monthly Tech-In, we’re sharing stories from Build and beyond about the developers, founders and communities who are using AI to tackle real-world challenges, from helping creators protect their work to advancing more inclusive AI systems.\n \nRead more about the people and innovations who are shaping what's next:","transcriptSegments":[{"text":"The most meaningful breakthroughs happen when technology is built with people in mind.","index":0,"wordCount":13,"charStart":0,"charEnd":86},{"text":"That was the message at Microsoft Build this month, where we announced a host of new tools to help developers build, dream and create.","index":1,"wordCount":24,"charStart":89,"charEnd":223},{"text":"In June’s edition of The Monthly Tech-In, we’re sharing stories from Build and beyond about the developers, founders and communities who are using AI to tackle real-world challenges, from helping creators protect their work to advancing more inclusive AI systems.","index":2,"wordCount":40,"charStart":227,"charEnd":490},{"text":"Read more about the people and innovations who are shaping what's next:","index":3,"wordCount":12,"charStart":493,"charEnd":564}],"wordCount":89,"segments":4,"author":{"name":"Microsoft","url":"https://www.linkedin.com/company/microsoft/posts"},"publishedAt":"2026-07-04 13:19:24","timingSource":"none","estimatedReadSeconds":27,"language":null}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkedin/company-posts":{"get":{"operationId":"linkedin_company_posts","tags":["LinkedIn"],"summary":"LinkedIn Company Posts API","description":"Company posts with engagement{likes,comments} — cursor pages up to 100.\n\nPass a LinkedIn company URL and get recent public posts as clean JSON. Each row always includes id, url (www.linkedin.com — locale hosts like fr. are canonicalised), text, publishedAt, author{name,url}, and engagement{likes,comments,reposts}. likes and comments are real public counts (0 is a real zero). reposts stays keyed but is null on this surface — LinkedIn's guest company listing has not been observed to expose shares; we do not invent zeros. Homepage JSON-LD often ships text without counts; we hydrate each permalink for reaction/comment totals. Every 200 includes totalReturned, nextCursor, and hasMore (numeric offset; null nextCursor means the end of the list, max 100). timings{nativeMs,serpMs,totalMs} name which stage burned the seconds — including on 502/503. Native listing is budgeted at 85s inside a 110s ceiling. When the clock runs out we return the posts already in hand with degraded=true and degradedReason=deadline instead of 503ing a listing that exists. An empty withheld listing is 502; a hang with zero rows is 503 at 0 credits. Billing: 1 credit when served natively (the typical path). When the fallback path contributes rows (X-Captapi-Source: extended, may take longer) it is billed per result: 0.8 credits per post returned, rounded up, minimum 2 — up to 80 at limit=100. In the last 30 days those calls cost 3–16 credits. A confirmed-empty page (truncatedReason=no_public_posts) is 0 credits. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/linkedin-company-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"LinkedIn company URL, e.g. https://linkedin.com/company/slug. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 1 credit per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (numeric offset, e.g. 20). A null nextCursor means the end of the list (max 100 posts).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit (fallback: 0.8/post, min 2)","note":"1 credit when served natively. When the fallback path contributes rows (may take longer) the call is billed per result: 0.8 credits per post returned, rounded up, minimum 2 — up to 80 at limit=100. Observed in the last 30 days: 3–16 credits on fallback calls. A confirmed-empty page is 0 credits.","billedOnCacheHit":false},"x-one-liner":"Company posts with engagement{likes,comments} — cursor pages up to 100.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"company":{"type":"string","description":"Company. Example: \"microsoft\"."},"totalReturned":{"type":"integer","description":"Posts on this page (length of posts[]). Always present on 200."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Content type of the item."},"url":{"type":"string","description":"Canonical https://www.linkedin.com/posts/… — locale subdomains (fr., de., uk.) are rewritten to www."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"author":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Canonical https://www.linkedin.com/posts/… — locale subdomains (fr., de., uk.) are rewritten to www."}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"comments":{"type":"integer"},"reposts":{}},"description":"Always keyed {likes,comments,reposts}. likes/comments from permalink hydrate when homepage JSON-LD omits them; 0 is a real zero. reposts has not been observed non-null on this guest surface."},"id":{"type":"string","description":"Id of this posts item."}}}},"nextCursor":{"type":"string","description":"Numeric offset for the next page (e.g. \"20\"). null means this is the end of the list (max 100) — not a missing key."},"hasMore":{"type":"boolean","description":"true when nextCursor is set. false + nextCursor null means the whole fetched feed is in hand."}}}}},"example":{"success":true,"data":{"company":"microsoft","totalReturned":2,"posts":[{"platform":"linkedin","type":"post","url":"https://www.linkedin.com/posts/microsoft_july-2026-activity-7487862338335801344-bBsC","text":"Doctors are busy, visits can seem rushed. Many people – especially women – can feel like their doctor hasn’t really heard them.\n \nIn July's edition of The Monthly Tech-In, we explore how AI is helping clinicians spend more time listening to their patients and less time on administrative tasks. Beyond healthcare, we share stories about how farmers, researchers and executives are using AI to meet real-world challenges. \n \nLearn more about the people putting AI into practice.","publishedAt":"2026-07-28T13:31:39.195Z","author":{"name":"Microsoft","url":"https://www.linkedin.com/company/microsoft"},"engagement":{"likes":966,"comments":76,"reposts":null},"id":"7487862338335801344"},{"platform":"linkedin","type":"post","url":"https://www.linkedin.com/posts/satyanadella_just-wrapped-our-earnings-call-it-was-a-activity-7488369807969370112-3kA1","text":"Just wrapped our earnings call. It was a very strong close to what was a record fiscal year for Microsoft.\n  \n· Annual revenue: $331B, +18%\n· MS Cloud: $214B, + 27%\n· And Azure: $100B+, +41%\n  \nAnd even bigger opportunity ahead!\n  \nI wanted to share some more perspective on two areas of focus for us:\n  \nFirst, we are building a new model system, where the harness, context, memory, and action space are separate from any one model family, thereby moving the frontier on the cost -to-outcome curve. \n  \nAnd it’s not just about cost. It also has the added benefit of business continuity and resilience because every model is substitutable. \n  \nThis is the system we are using in our products, with great results. And we are making it available for our customers via Foundry too.\n\nYou can read more about this from Mustafa Suleyman here: https://lnkd.in/gQwfAbuc\n \nSecond, when it comes to Copilot, we are innovating rapidly, from chat to Cowork to Autopilots.\n  \nWe have also been super focused on improving the quality and performance of Copilot. Over the last three quarters, user satisfaction scor …","publishedAt":"2026-07-29T23:08:09.380Z","author":{"name":"Satya Nadella","url":"https://www.linkedin.com/in/satyanadella"},"engagement":{"likes":10710,"comments":436,"reposts":null},"id":"7488369807969370112"}],"nextCursor":"2","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkedin/search-posts":{"get":{"operationId":"linkedin_search_posts","tags":["LinkedIn"],"summary":"LinkedIn Search Posts API","description":"Keyword search of public LinkedIn posts — offset cursor, ceiling 50.\n\nSearch public LinkedIn posts by keyword (LinkedIn's own content search needs a login, so results come from a public search-results window of post permalinks, each hydrated — not LinkedIn's full index). Each row is the same post card as post-details minus media. author.id is the /in or /company vanity (or ACoAA… urn); author.headline is the job title when the post page exposes it. engagement.likes / comments are read locale-proof from the post page's DOM counters (guest pages arrive in random languages — \"9 réactions\" used to null likes on a post with 9 reactions) and always carry their *IsApproximate pair (null flag when the count is null — the key never disappears row to row); reposts is omitted when LinkedIn hides shares. Cursor pagination via nextCursor + hasMore (numeric offset, same as company-posts); hasMore is true only when nextCursor is present. A null nextCursor means the end of this SERP window (max 50), not that LinkedIn has no more posts. sort=relevance (default) is the search-engine rank — publishedAt can span years; sort=date is recency. The envelope names query / sort / requested / listingHits / totalReturned / truncatedReason=serp-window plus serpMs / hydrateMs / totalMs. Every successful call bills ~0.8/result (10 posts → 8, 20 → 16) — the path does not change the rate.\n\nDocs: https://captapi.com/apis/linkedin-search-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query or keywords (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"sort","in":"query","required":false,"description":"relevance (default, search-engine rank — dates can span years) or date (recency).","schema":{"type":"string","pattern":"^(relevance|date)$","default":"relevance"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 50). Billed per result.","schema":{"type":"integer","maximum":50,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (numeric offset, e.g. 20). A null nextCursor means the end of the list (max 50 posts).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":16,"perResult":0.8,"label":"~16 credits (0.8/result)","billedOnCacheHit":false},"x-one-liner":"Keyword search of public LinkedIn posts — offset cursor, ceiling 50.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"Keyword that was searched (echo)."},"sort":{"type":"string","description":"relevance (default, search-engine rank) or date (recency). Echo of the request."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Content type of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"author":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Author name or handle."},"engagement":{"type":"object","properties":{"likes":{"type":"integer"},"comments":{"type":"integer"}},"description":"Engagement metrics for the item."},"id":{"type":"string","description":"Id of this posts item."}}}}}}}},"example":{"success":true,"data":{"query":"artificial intelligence","sort":"relevance","totalReturned":2,"posts":[{"platform":"linkedin","type":"post","url":"https://www.linkedin.com/posts/edward-hallett-9aa4406b_ai-is-a-tool-we-need-to-remember-that-activity-7460399963181617152-BX0D","text":"AI is a tool. \n\nWe need to remember that because it presents as intelligence. But intelligence is sentient.\n\nThat’s why we call it *artificial* intelligence \n\nIt’s artificial because ai only appears to create meaning. \n\nIn fact, there can be no meaning created by ai. \n\nMeaning only ever persists in the humans who engage with ai. (Meaning is the unique condition of being human).  \n\nThink of ai as a ‘magic mirror’ or an ‘echo chamber’. It returns our words and images to us with heightened grandeur and clarity.\n\nI’m grateful for AI. \n\nAi can help with the task of route optimization or translation.\n\nBut it cannot establish whether the destination is worth getting to, or whether the translated text is moving (for that someone needs to be moved). \n\nSo what? \n\nRemembering that this intelligence is artificial helps us delineate what within the province of human productivity cannot for structural reasons be substituted for by ai.\n\nThis is because human beings value intelligence (sentience) in the realm of productivity.\n\nI return to my chosen advisor (broker, therapist, architect) not just bec …","publishedAt":"2026-05-13T18:45:58.726Z","author":{"name":"Edward Hallett","url":"https://www.linkedin.com/in/edward-hallett-9aa4406b"},"engagement":{"likes":57,"comments":3},"id":"7460399963181617152"},{"platform":"linkedin","type":"post","url":"https://www.linkedin.com/posts/ebender_when-people-ask-me-what-the-phrase-artificial-activity-7480663649716494336-Wnbx","text":"When people ask me what the phrase \"artificial intelligence\" means, my short answer is, it means \"venture capitalists, give me some money\".\n\nBut OUP asked me for a longer answer, given here and summarized in the section headings:\n\nhttps://lnkd.in/gb28PW5k\n\nPreprint available from my publications page:\nhttps://lnkd.in/gW-KW9DY","publishedAt":"2026-07-08T16:46:38.081Z","author":{"name":"Emily M. Bender","url":"https://www.linkedin.com/in/ebender"},"engagement":{"likes":524,"comments":18},"id":"7480663649716494336"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/rumble/video-details":{"get":{"operationId":"rumble_video_details","tags":["Rumble"],"summary":"Rumble Video Details API","description":"Rumble video metadata — uniform streams[] with rendition meta, captions[], audioStreams.\n\nPaste a Rumble video URL and get clean JSON: title, description, views, likes/dislikes/comments (null when Rumble does not expose them — never fake zeros), durationSeconds + durationText, publishedAt, thumbnail, width/height, channel name/url/handle plus channelFollowers and channelVerified, numericId/embedId/shareUrl/embedUrl (real embed id, not the page permalink), captions[{code,language,url}], streams[{url,type,quality,width,height,bitrateKbps,sizeBytes}] built from embed metadata height/bitrate (two 1080p bitrates stay two rows — no fabricated 1081 keys; metadata-less and timeline strips are dropped), audioStreams[] (width/height/quality null — bitrateKbps carries the rate), and thumbnailTrack when Rumble ships a timeline sprite. type is video/mp4 (MIME-style). Rumble CDN URLs are unsigned, so media rows carry no expiresAt — the links do not expire. The raw quality-keyed media dump is not returned. Flat 1 credit. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/rumble-video-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Rumble video URL, e.g. https://rumble.com/vXXXX-title.html. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Rumble video metadata — uniform streams[] with rendition meta, captions[], audioStreams.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"numericId":{"type":"integer","description":"Numeric id. Example: 441201242."},"embedId":{"type":"string","description":"Rumble's player embed id (may differ from the /v… page id)."},"url":{"type":"string","description":"Canonical URL of the item."},"type":{"type":"string","description":"Content kind: \"video\" | \"short\" | \"live\"."},"embedUrl":{"type":"string","description":"Real Rumble embed URL (/embed/{embedId}/). embedId is often different from the page permalink id — never invent from id alone."},"shareUrl":{"type":"string","description":"Share url URL."},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"channel":{"type":"string","description":"Channel display name (string), e.g. The Dan Bongino Show — not an object."},"channelUrl":{"type":"string","description":"URL of the channel."},"channelHandle":{"type":"string","description":"Channel handle. Example: \"bongino\"."},"channelFollowers":{"type":"integer","description":"Follower count of the channel."},"channelVerified":{"type":"boolean","description":"Whether the channel is verified."},"views":{"type":"integer","description":"View count from JSON-LD / page chrome; null when impossible (0 with engagement)."},"likes":{"type":"integer","description":"Rumble upvotes when the vote UI is present; null when unknown (never invent 0)."},"dislikes":{"type":"integer","description":"Rumble downvotes when present; null when unknown."},"comments":{"type":"integer","description":"Public comment count when Rumble exposes it; null when unknown."},"durationSeconds":{"type":"integer","description":"Length in seconds (integer). Canonical with durationText — same pair as channel-videos."},"durationText":{"type":"string","description":"Human clock duration (e.g. 1:26:25). Not zero-padded HH:MM:SS."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"thumbnail":{"type":"string","description":"Thumbnail image URL."},"width":{"type":"integer","description":"Width in pixels."},"height":{"type":"integer","description":"Height in pixels."},"captions":{"type":"object","properties":{"en-auto":{"type":"object","properties":{"language":{"type":"string"},"path":{"type":"string"}},"description":"Object with language, path."}}},"media":{"type":"object","properties":{"mp4":{"type":"object","properties":{"240":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}},"360":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}},"480":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}},"720":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}},"1080":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}},"1081":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}}},"description":"Object with 240, 360, 480, 720, 1080, 1081."},"timeline":{"type":"object","properties":{"180":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}}},"description":"Object with 180."},"audio":{"type":"object","properties":{"192":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"meta":{"type":"object","properties":{"bitrate":{"type":"integer"},"size":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}}}}}},"description":"Object with 192."}}},"isLive":{"type":"boolean","description":"true while the upload is a livestream; false for VODs."},"streams":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"type":{"type":"string","description":"Content kind: \"video\" | \"short\" | \"live\"."},"quality":{"type":"string","description":"Quality tier of the format."}}}}}}}},"example":{"success":true,"data":{"platform":"rumble","id":"v7cv2cc","numericId":441201242,"embedId":"v7aoh22","url":"https://rumble.com/v7cv2cc-now-i-can-finally-talk-about-it-ep.-2555-07172026.html","type":"video","embedUrl":"https://rumble.com/embed/v7aoh22/","shareUrl":"https://rumble.com/share/v7cv2cc?src=pEKvigixSA18kCOHqJfLmJzJ7JBZcpQdtcNMOQ_0_L2s9WPwl09OdA","title":"Now I Can Finally Talk About It (Ep. 2555) - 07/17/2026","description":"In this episode, I'll discuss the groundbreaking information President Trump revealed in his speech last night and what it means for our elections movingforward. 1776 Live Club: No purchase necessary.","channel":"The Dan Bongino Show","channelUrl":"https://rumble.com/c/bongino","channelHandle":"bongino","channelFollowers":3660000,"channelVerified":true,"views":943676,"likes":15500,"dislikes":194,"comments":1050,"durationSeconds":5185,"durationText":"1:26:25","publishedAt":"2026-07-17T12:18:39+00:00","thumbnail":"https://1a-1791.com/video/fwe2/7c/s8/1/C/w/c/H/CwcHA.qR4e-small-Now-I-Can-Finally-Talk-Abou..jpg","width":1920,"height":1080,"captions":{"en-auto":{"language":"English (auto)","path":"https://1a-1791.com/video/fwe2/7c/s8/11/C/w/c/H/CwcHA.fn8Si.vtt"}},"media":{"mp4":{"240":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.oaa.rec.mp4","meta":{"bitrate":203,"size":131950161,"w":640,"h":360}},"360":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.baa.rec.mp4","meta":{"bitrate":636,"size":412534201,"w":640,"h":360}},"480":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.caa.rec.mp4","meta":{"bitrate":1005,"size":651781271,"w":854,"h":480}},"720":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.gaa.rec.mp4","meta":{"bitrate":2067,"size":1340090002,"w":1280,"h":720}},"1080":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.haa.rec.mp4","meta":{"bitrate":3985,"size":2583714297,"w":1920,"h":1080}},"1081":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.aaa.rec.mp4","meta":{"bitrate":8051,"size":5219124253,"w":1920,"h":1080}}},"timeline":{"180":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.Faa.rec.mp4","meta":{"bitrate":11,"size":7777789,"w":320,"h":180}}},"audio":{"192":{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.Gaa.rec.aac","meta":{"bitrate":192,"size":124450817,"w":0,"h":0}}}},"isLive":false,"streams":[{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.aaa.rec.mp4","type":"mp4","quality":"1081p"},{"url":"https://1a-1791.com/video/fwe2/7c/s8/2/C/w/c/H/CwcHA.haa.rec.mp4","type":"mp4","quality":"1080p"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/rumble/video/transcript":{"get":{"operationId":"rumble_video_transcript","tags":["Rumble"],"summary":"Rumble Video Transcript API","description":"Rumble published captions as timed segments — parses the .vtt from video-details (not speech-to-text).\n\nFetches the caption track Rumble already exposes on /video-details (unsigned .vtt URLs), parses cues into segments[{text,startMs,endMs}], and returns the full text. source is always \"captions\". Pass language to require that track (en matches en-auto); mismatch → 404 language_not_available with availableLanguages (never a silent fallback). No tracks → 404 no_captions. 404 costs 0 credits. No STT fallback on this endpoint. Flat 1 credit on success. Segment shape is shared with /v1/youtube/audio-transcript.\n\nDocs: https://captapi.com/apis/rumble-video-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Rumble video URL, e.g. https://rumble.com/vXXXX-title.html. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Preferred caption language as an ISO code, e.g. \"en\". Defaults to auto-detect.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Rumble published captions as timed segments — parses the .vtt from video-details (not speech-to-text).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"rumble\" on this endpoint."},"id":{"type":"string","description":"Rumble video id (e.g. v7cv2cc)."},"url":{"type":"string","description":"Canonical URL of the item."},"language":{"type":"string","description":"Caption track code actually returned (e.g. en-auto)."},"languageName":{"type":"string","description":"Human label from the track (e.g. English (auto))."},"durationSeconds":{"type":"integer","description":"Video length in seconds when known (from video-details)."},"segments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Full transcript — segment texts joined with a single space."},"startMs":{"type":"integer","description":"Cue start in integer milliseconds."},"endMs":{"type":"integer","description":"Cue end in integer milliseconds (always > startMs)."}}}},"text":{"type":"string","description":"Full transcript — segment texts joined with a single space."},"source":{"description":"Always \"captions\" — this endpoint parses Rumble's published .vtt only (no STT)."}}}}},"example":{"success":true,"data":{"platform":"rumble","id":"v7cv2cc","url":"https://rumble.com/v7cv2cc-now-i-can-finally-talk-about-it-ep.-2555-07172026.html","language":"en-auto","languageName":"English (auto)","durationSeconds":5185,"segments":[{"text":"All America all the time sit down buckle up and get ready for the Dan Bongino show","startMs":52240,"endMs":59760},{"text":"team is like","startMs":65750,"endMs":71960},{"text":"Thank you. Mr. President for","startMs":71960,"endMs":74280},{"text":"Declassifying a lot of this folks","startMs":75080,"endMs":77080},{"text":"Obviously","startMs":79390,"endMs":81720},{"text":"Was like itching to get on the air today","startMs":81720,"endMs":85240},{"text":"When you go and take a job in the government, especially in the executive branch","startMs":85880,"endMs":92530},{"text":"The president is the ultimate declassifier the job is not about you","startMs":93420,"endMs":98140}],"text":"All America all the time sit down buckle up and get ready for the Dan Bongino show team is like Thank you. Mr. President for Declassifying a lot of this folks Obviously Was like itching to get on the air today When you go and take a job in the government, especially in the executive branch The president is the ultimate declassifier the job is not about you"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/rumble/channel-videos":{"get":{"operationId":"rumble_channel_videos","tags":["Rumble"],"summary":"Rumble Channel Videos API","description":"Rumble channel uploads — lean streams[{url,type}]; call video-details for rendition meta.\n\nList a channel's uploads as clean JSON. Each row: id, url, type (video|short|live), title, channel/channelUrl/channelHandle, views/likes/dislikes/comments, durationSeconds + durationText (same pair as video-details), publishedAt, thumbnail, streams[{url,type}] — unsigned playback URLs that do not expire, so no expiresAt key. Per-rendition quality/height/bitrate/sizeBytes require /v1/rumble/video-details — the channel scrape does not ship that metadata. shareUrl. embedUrl/embedId are present only when Rumble exposes a distinct embed id — page permalink ids are never used to invent /embed/{id}/ URLs (those 404). Flat ~0.6 credits per returned video (min 2).\n\nDocs: https://captapi.com/apis/rumble-channel-videos","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Rumble channel URL, e.g. https://rumble.com/c/name. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":12,"perResult":0.6,"label":"~12 credits (0.6/result)","billedOnCacheHit":false},"x-one-liner":"Rumble channel uploads — lean streams[{url,type}]; call video-details for rendition meta.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"channel":{"type":"string","description":"Top-level: channel slug you queried. Per-video channel is the display name string."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"videos":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this videos item."},"url":{"type":"string","description":"Canonical URL of the item."},"type":{"type":"string","description":"Content kind: \"video\" | \"short\" | \"live\" (from /shorts/ URL or isLive)."},"title":{"type":"string","description":"Title of this videos item."},"channel":{"type":"string","description":"Top-level: channel slug you queried. Per-video channel is the display name string."},"channelUrl":{"type":"string","description":"URL of the channel."},"channelHandle":{"type":"string","description":"Channel handle. Example: \"bongino\"."},"channelFollowers":{"type":"integer","description":"Follower count of the channel."},"channelVerified":{"type":"boolean","description":"Whether the channel is verified."},"views":{"type":"integer","description":"View count for the upload."},"likes":{"type":"integer","description":"Upvotes when the channel scrape exposes rumbleVotes; null when unknown."},"dislikes":{"type":"integer","description":"Dislike count."},"durationSeconds":{"type":"integer","description":"Length in seconds (integer). Same pair as video-details."},"durationText":{"type":"string","description":"Human clock duration (e.g. 1:30:56)."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"thumbnail":{"type":"string","description":"Thumbnail image URL."},"comments":{"type":"integer","description":"Comment count."},"isLive":{"type":"boolean","description":"Always present. true only when upstream marks the row live; false otherwise (including fresh VODs with 0 views — not omitted)."},"streams":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"type":{"type":"string","description":"Content kind: \"video\" | \"short\" | \"live\" (from /shorts/ URL or isLive)."},"quality":{"type":"string"}}},"description":"Lean signed playback rows ({url, type, expiresAt}). expiresAt comes from the JWT exp claim. For quality/height/bitrate/sizeBytes call /v1/rumble/video-details."},"shareUrl":{"type":"string","description":"Share url URL."}}}}}}}},"example":{"success":true,"data":{"channel":"Bongino","totalReturned":2,"videos":[{"platform":"rumble","id":"v7dfegc","url":"https://rumble.com/v7dfegc-the-democrat-civil-war-is-getting-intense-ep.-2563-07292026.html","type":"video","title":"The Democrat Civil War Is Getting Intense (Ep. 2563) - 07/29/2026","channel":"The Dan Bongino Show","channelUrl":"https://rumble.com/c/bongino","channelHandle":"bongino","channelFollowers":3661298,"channelVerified":true,"views":230174,"likes":4178,"dislikes":43,"durationSeconds":5456,"durationText":"1:30:56","publishedAt":"2026-07-29T12:29:52+00:00","thumbnail":"https://1a-1791.com/video/fwe2/83/s8/1/S/_/P/K/S_PKA.OvCc-small-The-Democrat-Civil-War-Is-G..jpg","comments":91,"isLive":false,"streams":[{"url":"https://rumble.com/live-hls-dvr/BE4yqeSGJMg/playlist.m3u8","type":"hls","quality":"auto"}],"shareUrl":"https://rumble.com/share/v7dfegc"},{"platform":"rumble","id":"v7det4g","url":"https://rumble.com/shorts/v7det4g","type":"short","title":"Just Wait Until You Read TRUMP’S Diary...","channel":"The Dan Bongino Show","channelUrl":"https://rumble.com/c/bongino","channelHandle":"bongino","channelFollowers":3661298,"channelVerified":true,"views":8242,"likes":234,"dislikes":7,"durationSeconds":55,"durationText":"0:55","publishedAt":"2026-07-29T02:21:55+00:00","thumbnail":"https://1a-1791.com/video/fwe2/b4/s8/1/W/p/J/K/WpJKA.OvCc-small-Just-Wait-Until-You-Read-TR..jpg","comments":11,"isLive":false,"streams":[{"url":"https://1a-1791.com/video/fwe2/b4/s8/2/W/p/J/K/WpJKA.haa.mp4?b=1&u=6","type":"mp4","quality":"1080p"},{"url":"https://1a-1791.com/video/fwe2/b4/s8/2/W/p/J/K/WpJKA.gaa.mp4?b=1&u=6","type":"mp4","quality":"720p"}],"shareUrl":"https://rumble.com/share/v7det4g"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/rumble/search":{"get":{"operationId":"rumble_search","tags":["Rumble"],"summary":"Rumble Search API","description":"Rumble keyword search — same video card shape as channel-videos (type, durationSeconds + durationText, UTC publishedAt).\n\nSearch Rumble videos by keyword. Every result has the same key set (null when scrape miss): id, url, type, title, channel/channelUrl/channelHandle/channelVerified, views/likes/dislikes/comments, durationSeconds + durationText, publishedAt UTC (+00:00), thumbnail, isLive, shareUrl. views is null when unknown or impossible (e.g. 0 with likes/comments). Flat ~0.6 credits per returned video (min 2).\n\nDocs: https://captapi.com/apis/rumble-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keywords or search query (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":12,"perResult":0.6,"label":"~12 credits (0.6/result)","billedOnCacheHit":false},"x-one-liner":"Rumble keyword search — same video card shape as channel-videos (type, durationSeconds + durationText, UTC publishedAt).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this results item."},"url":{"type":"string","description":"Canonical URL of the item."},"type":{"type":"string","description":"Content kind: \"video\" | \"short\" | \"live\"."},"title":{"type":"string","description":"Title of this results item."},"channel":{"type":"string","description":"Channel display name string when present."},"channelUrl":{"type":"string","description":"URL of the channel."},"views":{"type":"integer","description":"View count when known; null when unknown or impossible (0 with non-zero likes/comments/dislikes)."},"likes":{"type":"integer","description":"Like count (number)."},"dislikes":{"description":"Dislike count.","type":["integer","null"]},"durationSeconds":{"type":"integer","description":"Length in seconds when known. Same pair as video-details / channel-videos."},"durationText":{"type":"string","description":"Human clock duration when known."},"publishedAt":{"type":"string","description":"ISO-8601 UTC (+00:00). Search HTML offsets (e.g. -04:00) are normalized."},"thumbnail":{"type":"string","description":"Thumbnail image URL."},"comments":{"type":"integer","description":"Comment count."}}}}}}}},"example":{"success":true,"data":{"query":"space","totalReturned":2,"results":[{"platform":"rumble","id":"v7dbdz0","url":"https://rumble.com/v7dbdz0-flat-earth-fake-space.html","type":"video","title":"FLAT EARTH - FAKE SPACE","channel":"Flat Earth Clock app","channelUrl":"https://rumble.com/c/flatearthclock","views":954,"likes":17,"dislikes":null,"durationSeconds":485,"durationText":"8:05","publishedAt":"2026-07-27T08:08:00-04:00","thumbnail":"https://1a-1791.com/video/fwe2/96/s8/1/8/r/8/J/8r8JA.oq1b-small-FLAT-EARTH-FAKE-SPACE..jpg","comments":1},{"platform":"rumble","id":"v7dbg7s","url":"https://rumble.com/v7dbg7s-dummyvision-2-just-asking-questions-and-closing-arguments-from-baron-colema.html","type":"video","title":"SUNDAY SLOWS - Listening To a Special Spaces on Tyler Robinson - Misunderstanding Trial 101","channel":"Rekieta Law","channelUrl":"https://rumble.com/c/RekietaLaw","views":7720,"likes":113,"dislikes":6,"durationSeconds":14139,"durationText":"3:55:39","publishedAt":"2026-07-27T00:18:40-04:00","thumbnail":"https://1a-1791.com/video/fww1/89/s8/6/y/_/8/J/y_8JA.oq1b.37.jpg","comments":7}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/rumble/comments":{"get":{"operationId":"rumble_comments","tags":["Rumble"],"summary":"Rumble Comments API","description":"Rumble top-level comments — publishedAt ISO-8601 UTC from title= on the comment time link.\n\nPaste a Rumble video URL and get top-level comments as clean JSON: id, text, author{name,url,verified}, likes, replyCount, publishedAt (ISO-8601 UTC parsed from a.comments-meta-post-time title=, e.g. Friday, July 17, 2026 08:33 AM -04 — minute precision; relative textContent like 2 weeks ago is never returned). createdAt is not emitted. Flat 2 credits.\n\nDocs: https://captapi.com/apis/rumble-comments","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Rumble video URL, e.g. https://rumble.com/vXXXX-title.html. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 50, max 500). Flat 2 credits per call.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Rumble top-level comments — publishedAt ISO-8601 UTC from title= on the comment time link.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"comments":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this comments item."},"text":{"type":"string","description":"Text content."},"author":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean"}},"description":"Author name or handle."},"likes":{"type":"integer","description":"Like count (number)."},"replyCount":{"type":"integer","description":"How many replies this comment has. Use Comment Replies with this comment's id to fetch them."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."}}}}}}}},"example":{"success":true,"data":{"url":"https://rumble.com/v7cv2cc-now-i-can-finally-talk-about-it-ep.-2555-07172026.html","totalReturned":2,"comments":[{"platform":"rumble","id":"614445110","text":"Ballot harvesting at nursing homes is a prime reason the Dems fight against election integrity","author":{"name":"KMac170","url":"https://rumble.com/user/KMac170","verified":false},"likes":216,"replyCount":14,"createdAt":"Friday, July 17, 2026 08:33 AM -04"},{"platform":"rumble","id":"614648184","text":"And guess how that aid votes 🙄","author":{"name":"Bonniekost","url":"https://rumble.com/user/Bonniekost","verified":false},"likes":0,"replyCount":1,"createdAt":"Monday, July 20, 2026 07:48 PM -04"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok-shop/shop-search":{"get":{"operationId":"tiktok_shop_search","tags":["TikTok Shop"],"summary":"TikTok Shop Search API","description":"TikTok Shop keyword search — priced products with sold, rating/reviews, typed discount, seller id.\n\nSearch TikTok Shop by keyword and get products as clean JSON: id, url, title, price + originalPrice + discountPercent + savingsAmount, currency (only when an amount exists), sold when the PDP exposes a per-product figure, rating + reviews (always keyed; null when the PDP has no score yet), image, and seller{id,name,url}. Native search is a single search-results window of product pages, each hydrated — TikTok's own Shop search is gated, so this is not TikTok's full catalog and there is no cursor. limit equals windowMax: default 10, max 10. Asking for more than 10 is a 422. The envelope names the yield: requested, totalReturned, serpHits, windowMax=10, hydrateFailures (SERP ids that did not become a priced row), hasMore (serp-pdp: true only when you sliced below the 10-cap — raise limit, do not pass a cursor; extended: also true on a full page, since a full fallback page is not proof the catalog is exhausted), windowKind (serp-pdp, or extended when the native window missed and the fallback path served), and truncatedReason=serp-window when the window is exhausted. timings{serpMs,hydrateMs,totalMs} show where the seconds went. top-level region is an echo of the region query param you sent (default US) — market selection, not a creator country and not AI-inferred. price is the SERP promo-min (priceBasis=serp-promo-min) — a different promo tier than Product Details' pdp-promo-min on the same product. sold is a list-row field here and on Shop Products; Product Details omits it. Flat 2 credits per call. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/tiktok-shop-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Product search query (min 2 characters), e.g. phone case.","schema":{"type":"string","minLength":2}},{"name":"region","in":"query","required":false,"description":"Two-letter market region for the search (default US). Echoed on the response as data.region — not a creator home country. Native search is a SERP window (not TikTok's full catalog); compare requested to serpHits / windowMax.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 10, max 10). Flat 2 credits per call.","schema":{"type":"integer","maximum":10,"minimum":1,"default":10}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"TikTok Shop keyword search — priced products with sold, rating/reviews, typed discount, seller id.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"region":{"type":"string","description":"Echo of the region query parameter you sent (default US) — the market used for this search. Not a creator country, not AI-inferred, and there is no regionSource on this endpoint."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"products":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this products item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this products item."},"price":{"type":"number","description":"SERP promo-min (priceBasis=serp-promo-min) at fetch time. Not the same number as Product Details' pdp-promo-min — details is always a bit higher and the ratio drifts. TikTok may also move promos between calls."},"originalPrice":{"type":"number","description":"Pre-discount price on the SERP promo-min tier; null when there is no promo. Same basis as price — not Product Details' pdp-promo-min."},"currency":{"type":"string","description":"ISO currency of price / originalPrice. Omitted when both amounts are unknown — a row with no price does not assert USD."},"discount":{"type":"string","description":"Discount amount, percentage, or display string when the platform exposes one."},"sold":{"type":"integer","description":"List-row field. Per-product units sold (sold_info.sold_count, or product_model.sold_count when it is not the shop total). Omitted when the only number on the page is shop sold. Product Details never returns sold — compare units here or on Shop Products."},"image":{"type":"string","description":"Primary product image URL (TikTok Shop search has no separate thumbnail field)."},"seller":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Seller shop card: id, name, and store url — not a content author."},"rating":{"type":"number","description":"Product star score from the PDP when TikTok exposes one; null when the product has no reviews yet."},"reviews":{"type":"integer","description":"Product review count from the PDP when exposed; null when unknown/zero with no score."},"savings":{"description":"Savings.","type":["string","null"]}}}}}}}},"example":{"success":true,"data":{"query":"phone case","region":"US","totalReturned":2,"products":[{"platform":"tiktok_shop","id":"1732313842426745420","url":"https://shop.tiktok.com/us/pdp/plum-polka-dot-cute-phone-case-for-iphone-x-17-tough-stylish/1732313842426745420?source=product_detail&enter_method=url_semantic_301","title":"Plum Polka Dot Cute Phone Case for iPhone - Durable & Stylish","price":12.68,"originalPrice":21.2,"currency":"USD","discount":"40%","sold":532,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/db875350dd404f64bb4b6bc79ae26a09~tplv-fhlh96nyum-crop-webp:1290:1290.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839","seller":{"id":"7495626050433419852","name":"Anthony Z Sierra Store","url":"https://www.tiktok.com/shop/store/Anthony%20Z%20Sierra%20Store/7495626050433419852"},"rating":4.8,"reviews":2493,"savings":null},{"platform":"tiktok_shop","id":"1731098552908944370","url":"https://shop.tiktok.com/us/pdp/trendy-pink-ed-hardy-tough-phone-cases-impact-resistant-wireless-charging-shock-absorption/1731098552908944370?source=product_detail&enter_method=url_semantic_301","title":"Trendy Pink Ed Hardy Inspired Tough Phone Cases, Phone Durable, Gift, Accessories Top Trendy Phone Cases Phone Cover Hard Case Tough 2-piece Phone Case","price":22.54,"originalPrice":24.09,"currency":"USD","discount":"6%","sold":512,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/cc79ccfd6a324d548de31cb761b6c3c4~tplv-fhlh96nyum-crop-webp:794:794.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","seller":{"id":"7496126292994264050","name":"Timeless Teapot Creations","url":"https://www.tiktok.com/shop/store/timeless-teapot-creations/7496126292994264050"},"rating":4.6,"reviews":48,"savings":"Saving $1.55"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok-shop/shop-products":{"get":{"operationId":"tiktok_shop_products","tags":["TikTok Shop"],"summary":"TikTok Shop Products API","description":"Store catalog with shopInfo (sold/followers/rating) + products priced with sold, rating, typed discount.\n\nPass a TikTok Shop store URL and get that shop's public catalog as clean JSON — products and the store card from the same SSR call. Top-level shopInfo: sold + formatSold (e.g. 5.6M), reviews, followers, rating, productCount, videoCount, isOfficial + identityLabel (OFFICIAL SHOP), region, logo, storeScores[]. Each products[] row: id/url/slug, title, numeric price + originalPrice + discountPercent + savingsAmount (same typed promo fields as Shop Search / Product Details — not \"21%\" / \"Saving $4.02\" strings), currency, sold, rating, reviews, image, seller{id,name,url}. Optional region (default US). Billing: 2 credits when served natively (limit ≤ 30 and the store page loads). With limit above 30, or when the native page misses, the fallback path serves it (X-Captapi-Source: extended, may take longer) and bills per result: 2.8 credits per product returned, rounded up, minimum 2 — up to 560 at limit=200. In the last 30 days those calls cost 17–28 credits, and 14 of 21 calls took that path. No cursor/sort_by yet. Non-US coverage depends on TikTok exposing that shop in the selected region — empty results outside the US are often a platform limit, not a Captapi bug.\n\nDocs: https://captapi.com/apis/tiktok-shop-products","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok Shop store URL with numeric shop id, e.g. https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079. A slug-only /shop/store/{name} URL is a definitive 400 — TikTok's catalog SSR is keyed by shop id. Get the full URL from /v1/tiktok-shop/user-showcase or a product's seller.url. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"Two-letter market region (default US). Non-US coverage depends on TikTok exposing that shop in the selected region — empty results outside the US are often a platform limit, not a Captapi bug.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits (fallback: 2.8/product, min 2)","note":"2 credits when served natively (limit ≤ 30 and the store page loads). With limit above 30, or when the native page misses, the fallback path serves it (may take longer) and bills per result: 2.8 credits per product returned, rounded up, minimum 2 — up to 560 at limit=200. Observed in the last 30 days: 17–28 credits on fallback calls (14 of 21 calls).","billedOnCacheHit":false},"x-one-liner":"Store catalog with shopInfo (sold/followers/rating) + products priced with sold, rating, typed discount.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"region":{"type":"string","description":"Echo of the region query parameter you sent (default US) — the market used for this catalog fetch. Not a creator country, not AI-inferred, and there is no regionSource here."},"shopInfo":{"type":"object","properties":{"id":{"type":"string","description":"Id of this shop info item."},"name":{"type":"string","description":"Name of this shop info item."},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string","description":"Logo image URL."},"sold":{"type":"integer","description":"Units sold (product row) or lifetime shop sold (inside shopInfo)."},"formatSold":{"type":"string","description":"Compact shop sold string from TikTok (e.g. \"5.6M\")."},"reviews":{"type":"integer","description":"Review count (product or shop)."},"followers":{"type":"integer","description":"Follower count."},"rating":{"type":"number","description":"Star rating (product or shop)."},"productCount":{"type":"integer","description":"Product count. Example: 55."},"videoCount":{"type":"integer","description":"Population video count when the source is authoritative (e.g. TikTok challenge/detail statsV2 on popular-hashtags, or a channel's uploaded-video total). Never a sample tally — sample sizes use sampleVideoCount / sampleSize."},"identityLabel":{"type":"string","description":"Identity label. Example: \"OFFICIAL SHOP\"."},"isOfficial":{"type":"boolean","description":"true when identityLabel indicates an official shop (e.g. \"OFFICIAL SHOP\")."},"region":{"type":"string","description":"Echo of the region query parameter you sent (default US) — the market used for this catalog fetch. Not a creator country, not AI-inferred, and there is no regionSource here."},"storeScores":{"type":"array","items":{"type":"object","properties":{"score":{"type":"number"},"scorePercentage":{"type":"string"},"type":{"type":"integer"}}},"description":"TikTok store sub-scores [{score, scorePercentage, type}]."}}},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"products":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"tiktok_shop\" on this endpoint (not youtube/instagram)."},"id":{"type":"string","description":"Id of this products item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this products item."},"price":{"type":"number","description":"Catalog tile sale price from store SSR (product_price_info). Not labelled with priceBasis — this is not the SERP or PDP promo tier."},"originalPrice":{"type":"integer","description":"List/original price before discount (numeric when unmasked)."},"currency":{"type":"string","description":"Currency code."},"discountPercent":{"type":"integer","description":"Integer percent off vs originalPrice when both prices exist (e.g. 21). Derived — not a \"21%\" display string. Omitted when either price is unknown."},"savingsAmount":{"type":"number","description":"Numeric amount saved (originalPrice − price) when both prices exist (e.g. 4.02). Omitted when either price is unknown."},"slug":{"type":"string","description":"SEO slug from seo_url.slug (also embedded in the product URL)."},"rating":{"type":"number","description":"Star rating (product or shop)."},"reviews":{"type":"integer","description":"Review count (product or shop)."},"sold":{"type":"integer","description":"Units sold (product row) or lifetime shop sold (inside shopInfo)."},"image":{"type":"string","description":"Image URL."},"seller":{"type":"object","properties":{"id":{"type":"string","description":"Id of this shop info item."},"name":{"type":"string","description":"Name of this shop info item."},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Object with id, name, url."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079","region":"US","shopInfo":{"id":"7495794203056835079","name":"Goli Nutrition","url":"https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079","logo":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/e7478d3e93d4487a9e772fa74e10f506~tplv-fhlh96nyum-resize-webp:300:300.webp?dr=12185&t=555f072d&ps=933b5bde&shp=905da467&shcp=a6e80448&idc=useast5&from=2422056039","sold":5645819,"formatSold":"5.6M","reviews":401072,"followers":590436,"rating":4.6,"productCount":55,"videoCount":3919,"identityLabel":"OFFICIAL SHOP","isOfficial":true,"region":"US","storeScores":[{"score":0.9935951457947075,"scorePercentage":"99","type":1},{"score":0,"scorePercentage":"0","type":2}]},"totalReturned":2,"products":[{"platform":"tiktok_shop","id":"1729527313880355335","url":"https://www.tiktok.com/shop/pdp/ashwagandha-gummies-by-goli-ksm-66-mixed-berry-vegan-non-gmo/1729527313880355335","title":"Goli Ashwagandha & Vitamin D Gummy - Mixed Berry, KSM-66, Vegan, Plant Based, Non-GMO, Gluten-Free & Gelatin Free. America's #1 Ashwagandha Brand","price":14.98,"originalPrice":19,"currency":"USD","discountPercent":21,"savingsAmount":4.02,"slug":"ashwagandha-gummies-by-goli-ksm-66-mixed-berry-vegan-non-gmo","rating":4.5,"reviews":94492,"sold":1297377,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/2bc69aa9f6084480beee1bb4a8db3a69~tplv-fhlh96nyum-crop-webp:1500:1500.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=a6e80448&idc=useast5&from=2378011839","seller":{"id":"7495794203056835079","name":"Goli Nutrition","url":"https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079"}},{"platform":"tiktok_shop","id":"1731194857673101831","url":"https://www.tiktok.com/shop/pdp/zero-sugar-best-seller-trio-goli-ashwagandha-gummies-vegan-non-gmo/1731194857673101831","title":"Zero Sugar Best Seller Trio - World's First 3-in-1 Pre, Post, Probiotic, Apple Cider Vinegar with Vitamin B12 and Probiotics To Address Bloating, Ashwagandha & L-Theanine, Vitamin D gummies. Gluten-Free, Vegan, Non-GMO & Gelatin-Free","price":35.8,"originalPrice":105,"currency":"USD","discountPercent":66,"savingsAmount":69.2,"slug":"zero-sugar-best-seller-trio-goli-ashwagandha-gummies-vegan-non-gmo","rating":4.5,"reviews":45249,"sold":992721,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/d3ab128a9f65482d9d8d288ccd252d50~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=a6e80448&idc=useast5&from=2378011839","seller":{"id":"7495794203056835079","name":"Goli Nutrition","url":"https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079"}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok-shop/product-details":{"get":{"operationId":"tiktok_shop_product_details","tags":["TikTok Shop"],"summary":"TikTok Shop Product Details API","description":"PDP — price (sku_min when guest min is *), sold vs stock, seller id/url, images[].\n\nPass a TikTok Shop product URL and get the PDP as clean JSON. Price is the field this endpoint exists for: promotion_product_price.min_price.sale_price_decimal first, then per-SKU sale prices when the guest min is masked as *, then product_price_info, then a slower fallback path (native title without a price is not a finished call). priceStatus is extracted | region_restricted | not_extracted — region_restricted means TikTok shipped * / a region-locked shell (try another region); not_extracted means no path returned a number (retrying will not help). currency only when an amount exists. originalPrice + discountPercent + savingsAmount when a seller deduction exists. sold is per-product sold_info.sold_count (or the fallback path's product-level 'stock' when skus[] is empty — that number is units sold, the opposite of inventory). stock is the sum of SKU available_quantity and is omitted when TikTok does not expose variant qty. seller includes id, name, store url, rating, productCount, and logo — id/url come from seller_model and store URLs in the PDP HTML, not only product_model.seller_id. images[] are Shop CDN URLs; t=555f072d is a build token identical across the gallery, not an expiry — mediaUrlsExpireAt is present and null. Accepts www /pdp/{id} and shop.tiktok.com/view/product/{id}?region=BR — the id is the path segment; region / oec_region on the TikTok URL wins over the API default US. An unresolved product is HTTP 404 at 0 credits (never a 200 empty shell with priceStatus=not_extracted). Flat 2 credits when the product exists. relatedVideos[] and seller.tiktokUrl are not in US PDP SSR today.\n\nDocs: https://captapi.com/apis/tiktok-shop-product-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok Shop product URL, e.g. https://shop.tiktok.com/view/product/1731410956394792439?region=BR or https://www.tiktok.com/shop/pdp/1731098552908944370. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"Two-letter market region (default US). A region= or oec_region= query on the product URL wins over this default so a BR share URL is not fetched as US. Echoed as data.region.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"PDP — price (sku_min when guest min is *), sold vs stock, seller id/url, images[].","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always tiktok_shop for this endpoint."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"price":{"type":"number","description":"PDP promo-min (priceBasis=pdp-promo-min). Source order: sale_price_decimal, then per-SKU sale prices when the guest min is *, then product_price_info, then a slower fallback path. Always a bit higher than Shop Search's serp-promo-min on the same product; the ratio drifts (~0.7–1.1%). Null with priceStatus=region_restricted means TikTok masked the amount (often a region/session shell) — retry with another region. Null with priceStatus=not_extracted means the product exists but no path returned an amount; retrying will not help. The 2-credit charge still applies because the product resolved. A URL that does not resolve is 404 at 0 credits — there is no priceStatus on that path."},"originalPrice":{"type":"number","description":"List / pre-discount price when TikTok exposes a seller deduction or origin price; null when the PDP has no promo. Same pdp-promo-min tier as price."},"currency":{"type":"string","description":"ISO currency of the priced amounts. Omitted when price is unknown."},"discount":{"type":"string","description":"Discount amount, percentage, or display string when the platform exposes one."},"savings":{"type":"string","description":"Savings. Example: \"Saving $1.55\"."},"rating":{"type":"number","description":"Average rating."},"reviews":{"type":"integer","description":"Number of reviews."},"priceBasis":{"type":"string","description":"\"pdp-promo-min\" — the full-PDP promo tier. Distinct from Shop Search's serp-promo-min. Both are legitimate; they are not the same number."},"priceStatus":{"type":"string","description":"extracted when price is a number. region_restricted when TikTok shipped * / a region-locked guest shell (try region=US or the product's market). not_extracted when the product exists but no path returned an amount — retrying the same region will not help. Absent on 404 (the product did not resolve)."},"sold":{"type":"integer","description":"Per-product units sold from sold_info.sold_count (never the shop header). The fallback path names this field stock — when skus[] is empty we remap that number here. High sold is demand, not inventory."},"stock":{"type":"integer","description":"Sum of available_quantity across skus[] (use skus[].stock for per-variant inventory). Omitted when TikTok does not expose SKU quantities — not null. A lone product-level 'stock' with empty skus[] is sold, not this field (TSP-2)."},"mediaUrlsExpireAt":{"description":"Always keyed. Null here — Shop image t= tokens are build ids, not CDN expiry. Contrast TikTok video CDN, where this is a real timestamp."},"image":{"type":"string","description":"Image URL."},"seller":{"type":"object","properties":{"id":{"type":"string","description":"Id of this seller item."},"name":{"type":"string","description":"Name of this seller item."},"url":{"type":"string","description":"Canonical URL of the item."},"rating":{"type":"number","description":"Average rating."},"productCount":{"type":"integer","description":"Product count. Example: 85."},"logo":{"type":"string","description":"Logo image URL."}}},"skus":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this skus item."},"stock":{"type":"integer","description":"Sum of available_quantity across skus[] (use skus[].stock for per-variant inventory). Omitted when TikTok does not expose SKU quantities — not null. A lone product-level 'stock' with empty skus[] is sold, not this field (TSP-2)."},"price":{"type":"number","description":"PDP promo-min (priceBasis=pdp-promo-min). Source order: sale_price_decimal, then per-SKU sale prices when the guest min is *, then product_price_info, then a slower fallback path. Always a bit higher than Shop Search's serp-promo-min on the same product; the ratio drifts (~0.7–1.1%). Null with priceStatus=region_restricted means TikTok masked the amount (often a region/session shell) — retry with another region. Null with priceStatus=not_extracted means the product exists but no path returned an amount; retrying will not help. The 2-credit charge still applies because the product resolved. A URL that does not resolve is 404 at 0 credits — there is no priceStatus on that path."},"originalPrice":{"description":"List / pre-discount price when TikTok exposes a seller deduction or origin price; null when the PDP has no promo. Same pdp-promo-min tier as price."},"status":{"type":"string","description":"Status value for this endpoint (see the field note on this page for enum meaning)."},"warehouseId":{"type":"string","description":"Warehouse id. Example: \"7495541999400830766\"."},"purchaseLimit":{"description":"Purchase limit."},"saleProps":{"type":"array","items":{"type":"object","properties":{"propName":{"type":"string"},"propValue":{"type":"string"}}},"description":"Array of objects with propName, propValue."}}}},"images":{"type":"array","items":{"type":"string"},"description":"Product gallery image URLs from the PDP (not a single OG thumbnail). t=555f072d is a build/version token identical across the gallery — not a timestamp and not a per-URL signature. These Shop CDN links are durable; mediaUrlsExpireAt is present and null so the key matches popular-songs. Persist the URLs. TikTok video CDN is the surface that expires."},"saleProperties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this sale properties item."},"name":{"type":"string","description":"Name of this sale properties item."},"values":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable platform ID for the item."},"name":{"type":"string","description":"Name of this seller item."}}},"description":"Array of objects with id, name."}}}},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this categories item."},"name":{"type":"string","description":"Name of this categories item."}}}},"region":{"type":"string","description":"Market used for the lookup. A region= / oec_region= query on the product URL wins over the API region parameter (default US). Not a creator country and not AI-inferred."},"source":{"description":"native when SSR produced the price; extended when a follow-on fill supplied the price."}}}}},"example":{"success":true,"data":{"platform":"tiktok_shop","id":"1731098552908944370","url":"https://shop.tiktok.com/us/pdp/trendy-pink-ed-hardy-tough-phone-cases-impact-resistant-wireless-charging-shock-absorption/1731098552908944370?source=product_detail&enter_method=url_semantic_301","title":"Trendy Pink Ed Hardy Inspired Tough Phone Cases, Phone Durable, Gift, Accessories Top Trendy Phone Cases Phone Cover Hard Case Tough 2-piece Phone Case","description":"Protect your phone in style with this tough phone case. This lightweight phone case is impact resistant and comes with the perfect surface in vivid detail as well as crisp color. Compatible with iPhone X, 11, 12, 13, 14, 15, 16 & more - check our available sizes.\n• 2-piece design with impact resistance and shock dispersion.\n• Materials: polycarbonate (shell), TPU (lining).\n• Interior rubber liner for extra protection (appearance may vary across phone models.\n• Supports wireless charging (not including MagSafe)\n• Lexan plastic: Developed by GE Plastics, this material is extremely strong, durable and impact resistant\n• Lay-flat bezel: Protects the screen from small scratches\n• Flexible rubber liner: Absorbs shock from impacts\n• Glossy Finish: Full color decoration with glossy finish\n• UV protected: Excellent resistance to outdoor weathering, long-term optical quality.\n• Glossy Finish: Full color decoration with glossy finish","price":22.54,"originalPrice":24.09,"currency":"USD","discount":"6%","savings":"Saving $1.55","rating":4.6,"reviews":48,"priceBasis":"pdp-promo-min","priceStatus":"extracted","sold":5801,"stock":2692,"mediaUrlsExpireAt":null,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/cc79ccfd6a324d548de31cb761b6c3c4~tplv-fhlh96nyum-crop-webp:794:794.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","seller":{"id":"7496126292994264050","name":"Timeless Teapot Creations","url":"https://www.tiktok.com/shop/store/timeless-teapot-creations/7496126292994264050","rating":4.6,"productCount":85,"logo":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/587383daaf8a4eaaa4dfb4c8f2b5944f~tplv-fhlh96nyum-resize-png:300:300.png?dr=12184&t=555f072d&ps=933b5bde&shp=905da467&shcp=6ce186a1&idc=useast5&from=2422056039"},"skus":[{"id":"1731098558045590514","stock":84,"price":22.54,"originalPrice":null,"status":"1","warehouseId":"7495541999400830766","purchaseLimit":null,"saleProps":[{"propName":"Phone Models","propValue":"iPhone 16 E"}]},{"id":"1731098558045656050","stock":51,"price":22.54,"originalPrice":null,"status":"1","warehouseId":"7495541999400830766","purchaseLimit":null,"saleProps":[{"propName":"Phone Models","propValue":"iPhone 16"}]}],"images":["https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/cc79ccfd6a324d548de31cb761b6c3c4~tplv-fhlh96nyum-crop-webp:794:794.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/4fe011977a9d4350ba9d7acf0e502f52~tplv-fhlh96nyum-crop-webp:794:794.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839"],"saleProperties":[{"id":"7494493199692793646","name":"Phone Models","values":[{"id":"7474656136961246982","name":"iPhone 16 E"},{"id":"7495574204532655878","name":"iPhone 16"}]}],"categories":[{"id":"601739","name":"Phones & Electronics"},{"id":"909064","name":"Mobile Phone Accessories"}],"region":"US"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok-shop/product-reviews":{"get":{"operationId":"tiktok_shop_product_reviews","tags":["TikTok Shop"],"summary":"TikTok Shop Product Reviews API","description":"TikTok Shop product reviews — star rating, text, SKU variant, verified purchase, country, and review photos.\n\nPass a TikTok Shop product URL and get customer reviews as clean JSON — not a video comment thread. Each review includes the per-review star rating (1–5), review text, createdAt (UTC ISO with Z), verifiedPurchase, the SKU / variant label the buyer selected (e.g. \"Thicc 16oz | Ice Cream\"), review country, masked author name when TikTok exposes one, and images[] of photos the reviewer attached. Envelope: totalReturned, hasMore, totalAvailable (PDP product_review_count when known), windowKind (ssr-preview | extended — extended is the fallback path). There is no redeemable cursor yet — hasMore + totalAvailable tell you the set is larger; you cannot walk past this page. Native PDP SSR returns a short preview (~3) for 2 credits; deeper pages use the fallback path (may take longer) and bill about 2.25 credits per review returned (e.g. ~45 for limit=20). Reviewer identity is a deliberate TikTok privacy mask (e.g. \"C**e\") — omitted author is not a missing scrape. There is no Comment Replies endpoint for Shop reviews — these are product reviews, not nested social comments, and like counts are not exposed.\n\nDocs: https://captapi.com/apis/tiktok-shop-product-reviews","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok Shop product URL, e.g. https://www.tiktok.com/shop/pdp/1731962298839634826. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":45,"perResult":2.25,"label":"~45 credits (2.25/result)","billedOnCacheHit":false},"x-one-liner":"TikTok Shop product reviews — star rating, text, SKU variant, verified purchase, country, and review photos.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"reviews":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this reviews item."},"rating":{"type":"integer","description":"This review's star score (1–5). Not the product's average rating — that lives on Product Details / Shop Search as products[].rating."},"text":{"type":"string","description":"Review body text."},"createdAt":{"type":"string","description":"When the review was posted, UTC ISO-8601 with milliseconds and Z (e.g. 2026-05-15T21:49:56.991Z)."},"verifiedPurchase":{"type":"boolean","description":"true when TikTok marks the reviewer as a verified buyer."},"sku":{"type":"string","description":"Variant / SKU label the buyer selected (e.g. \"Thicc 16oz | Ice Cream\")."},"country":{"type":"string","description":"ISO country of the reviewer when TikTok exposes it (e.g. US). Not a request-market param and not related to popular-creators feeds."},"author":{"type":"object","properties":{"name":{"type":"string"}},"description":"Reviewer display when TikTok exposes one — usually a privacy mask (e.g. \"C**e\"). Full handle/avatar/profile URL are not on public Shop reviews; omitted author is a deliberate platform limit, not a scrape gap."},"images":{"type":"array","items":{"type":"string"},"description":"Photo URLs the reviewer attached to this review (empty/omitted when none)."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.tiktok.com/shop/pdp/1731962298839634826","totalReturned":2,"reviews":[{"platform":"tiktok_shop","id":"7640239119020558093","rating":5,"text":"I love it. It’s cute. Fits in both my small Mini Cooper and Mini Countryman cup holders. It does fit a small drink like a freeze or shake from bk,if you take off the lid.","createdAt":"2026-05-15T21:49:56.991Z","verifiedPurchase":true,"sku":"Thicc 16oz | Ice Cream","country":"US","author":{"name":"C**e"},"images":["https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/bc7a80f5766e438e8698430bdff2b55c~tplv-fhlh96nyum-crop-webp:300:300.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839","https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/7c513b397e2f4b019995d95dd7506914~tplv-fhlh96nyum-crop-webp:300:300.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839"]},{"platform":"tiktok_shop","id":"7599033354029254413","rating":4,"text":"This cup is indeed visually appealing. Although it does exhibit some minor flaws, specifically where the 'frost buddy' wording is engraved into the cup and the logo is not included on the engraving on the opposite side, overall it is a well-made cup. I am satisfied with my purchase.","createdAt":"2026-01-24T20:50:51.887Z","verifiedPurchase":true,"sku":"To-Go | Duck-It","country":"US","author":{"name":"M**e"},"images":["https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/c51c9bdf430e4991aaa5d947300410de~tplv-fhlh96nyum-crop-webp:300:300.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839","https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/f3ef2a7c10ec4dc7bd3446c373868f7e~tplv-fhlh96nyum-crop-webp:300:300.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/tiktok-shop/user-showcase":{"get":{"operationId":"tiktok_shop_user_showcase","tags":["TikTok Shop"],"summary":"TikTok Shop User Showcase API","description":"Creator Shop showcase — affiliate shelf products with per-product sold, rating, typed discount, and seller name/url.\n\nPass a TikTok username (with or without @, or a profile URL) and the TikTok Shop User Showcase API returns the products that creator is featuring in their TikTok Shop showcase as clean JSON. This is the affiliate / creator storefront shelf — not the full inventory of a brand store. ttSeller is the merchant-storefront bit (user.ttSeller); affiliate creators are ttSeller:false and still have a shelf — we always fetch it. sellerStatus tells you what an empty list means: no_shop (looked, no merchant shop and no affiliate products), shop_empty (has a shop, zero listed products), has_products (the shelf). An undetermined empty fetch is 502 SHOWCASE_UNAVAILABLE with sellerStatus=unavailable — never a bare products:[] 200. Envelope: source / stages{profileStatus,showcaseStatus} / timings{path,profileMs,showcaseMs,totalMs} / ttSeller. Each product includes id/url/slug, title, price + originalPrice + discountPercent + savingsAmount, currency (only when an amount exists), sold when a per-product figure exists, rating/reviews, image, and seller{id,name,url}. sold is a list-row field here (same rule as Shop Search / Shop Products); Product Details omits it. sold is never the shop's lifetime total stamped onto every tile — if the PDP only exposes shop sold_count, the field is omitted. For a brand's full catalog (where per-product sold is already correct), use TikTok Shop Products with a store URL instead. For stock / skus[] / categories, call Product Details with a product URL. Billed per result when products return; no_shop / shop_empty is 1 credit. Pass cache=true for the 24h shared cache.\n\nDocs: https://captapi.com/apis/tiktok-shop-user-showcase","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"TikTok username, @handle, or profile URL, e.g. jeffreestar or https://www.tiktok.com/@jeffreestar.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Billed per result.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":45,"perResult":2.25,"label":"~45 credits (2.25/result)","billedOnCacheHit":false},"x-one-liner":"Creator Shop showcase — affiliate shelf products with per-product sold, rating, typed discount, and seller name/url.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"products":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this products item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this products item."},"price":{"type":"integer","description":"Price of the item."},"originalPrice":{"type":"integer","description":"Pre-discount price when a promo exists — pdp-promo-min, same tier as Product Details."},"currency":{"type":"string","description":"Currency code."},"discount":{"type":"string","description":"Discount amount, percentage, or display string when the platform exposes one."},"savings":{"type":"string","description":"Savings. Example: \"Saving $2.00\"."},"rating":{"description":"Product star score when the PDP exposes one; null otherwise."},"reviews":{"description":"Product review count when exposed; null otherwise."},"sold":{"type":"integer","description":"List-row field. Per-product units sold from PDP sold_info. Omitted when the tile has no per-product figure — never null, never the shop lifetime total."},"image":{"type":"string","description":"Product image from the showcase shelf (or PDP when the shelf omits one)."},"seller":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Seller shop card {id,name,url} — id from the showcase shelf, name/url from PDP hydrate when available."},"skus":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"stock":{"type":"integer"},"price":{"type":"integer","description":"Price of the item."},"originalPrice":{"description":"Pre-discount price when a promo exists — pdp-promo-min, same tier as Product Details."},"status":{"type":"string"},"warehouseId":{"type":"string"},"purchaseLimit":{},"saleProps":{"type":"array","items":{"type":"object","properties":{"propName":{"type":"string"},"propValue":{"type":"string"}}}}}},"description":"Per-variant SKU rows ({id, stock, price, originalPrice, status})."},"images":{"type":"array","items":{"type":"string"},"description":"Attached image URL list for this item."},"saleProperties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"name":{"type":"string"},"values":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"name":{"type":"string"}}}}}},"description":"Array of objects with id, name, values."},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"name":{"type":"string"}}},"description":"Array of objects with id, name."}}}}}}}},"example":{"success":true,"data":{"username":"jeffreestar","totalReturned":2,"products":[{"platform":"tiktok_shop","id":"1732506746746606533","url":"https://shop.tiktok.com/us/pdp/1732506746746606533","title":"Mini Velour Liquid Lipstick","price":14,"originalPrice":16,"currency":"USD","discount":"12%","savings":"Saving $2.00","rating":null,"reviews":null,"sold":17,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/9ceb4f5dd37846abb870a60e99161448~tplv-fhlh96nyum-crop-webp:1080:1080.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","seller":{"id":"7494986018328054725","name":"Jeffree Star Cosmetics","url":"https://www.tiktok.com/shop/store/jeffree-star-cosmetics/7494986018328054725"},"skus":[{"id":"1732506746708267973","stock":934,"price":14,"originalPrice":null,"status":"1","warehouseId":"7275630065640408878","purchaseLimit":null,"saleProps":[{"propName":"Shade","propValue":"Unicorn Blood"}]},{"id":"1732506746708333509","stock":933,"price":14,"originalPrice":null,"status":"1","warehouseId":"7275630065640408878","purchaseLimit":null,"saleProps":[{"propName":"Shade","propValue":"Weirdo"}]}],"images":["https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/9ceb4f5dd37846abb870a60e99161448~tplv-fhlh96nyum-crop-webp:1080:1080.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/100fdb52dee4424893af31d2ff333ad9~tplv-fhlh96nyum-crop-webp:1080:1080.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839"],"saleProperties":[{"id":"7647188030129948433","name":"Shade","values":[{"id":"7034726533239670529","name":"Unicorn Blood"},{"id":"7135522200253449990","name":"Weirdo"}]}],"categories":[{"id":"601450","name":"Beauty & Personal Care"},{"id":"848648","name":"Makeup"}]},{"platform":"tiktok_shop","id":"1732528747218572229","url":"https://shop.tiktok.com/us/pdp/1732528747218572229","title":"Mini Velour Liquid Lipstick Duo - Unicorn Blood & Weirdo","price":23,"originalPrice":27,"currency":"USD","discount":"15%","savings":"Saving $4.00","rating":null,"reviews":null,"sold":58,"image":"https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/ee371e4e4208468881dcc275d0679f4b~tplv-fhlh96nyum-crop-webp:1080:1080.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","seller":{"id":"7494986018328054725","name":"Jeffree Star Cosmetics","url":"https://www.tiktok.com/shop/store/jeffree-star-cosmetics/7494986018328054725"},"skus":[{"id":"1732528742194582469","stock":933,"price":23,"originalPrice":null,"status":"1","warehouseId":"7275630065640408878","purchaseLimit":null,"saleProps":[{"propName":"Combined Variations","propValue":"Unicorn Blood & Weirdo"}]}],"images":["https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/ee371e4e4208468881dcc275d0679f4b~tplv-fhlh96nyum-crop-webp:1080:1080.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839","https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/3cd1ce9f5c3444309ba86a47485e04cf~tplv-fhlh96nyum-crop-webp:1080:1080.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839"],"saleProperties":[{"id":"101212","name":"Combined Variations","values":[{"id":"7669580526982022925","name":"Unicorn Blood & Weirdo"}]}],"categories":[{"id":"601450","name":"Beauty & Personal Care"},{"id":"848648","name":"Makeup"}]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/marketplace-search":{"get":{"operationId":"facebook_marketplace_search","tags":["Facebook Marketplace"],"summary":"Facebook Marketplace Search API","description":"Search Marketplace by keyword + city — filters, isLocal/shipsOutsideRadius, opaque cursor (2 credits).\n\nSearch Facebook Marketplace with a product keyword and a required search-origin city (searchLocation, or the location alias — no backend default city, no lat/lng required). Major US metros resolve to Facebook's numeric city-page id (verified hub scoping). Smaller US towns are geocoded and snapped to the nearest baked metro (Millington, NJ → New York) — an unknown vanity slug does not 404, it silently searches a default location (that is how a Millington guitar query returned Wisconsin vehicles). Non-US places and far unique single-word US towns still use a vanity slug. The origin is echoed as searchLocation on the envelope and inside filters — listings[].location is a different object (where the item is). Each result: title, price + priceAmount (minor units), categoryId, location{name,city,state,countryCode,latitude,longitude}, deliveryTypes, status (available|pending|sold) with isSold/isPending/isHidden, cover image, createdAt, mediaUrlsExpireAt from Meta CDN oe= (~4.4 days), plus isLocal and shipsOutsideRadius so nationwide shipped listings (SHIPPING / SHIPPING_ONSITE) are not mistaken for nearby pickups. Facebook can surface shipped inventory outside radiusMiles and can broaden the keyword (a Rawlings search may include other brands — that is Facebook, not our matcher; sortBy=creation_time is recency, not relevance). daysSinceListed is Facebook's calendar-day window (1 = since the start of yesterday, not a rolling 24 hours). Optional filters: minPrice, maxPrice, sortBy, daysSinceListed, condition, deliveryMethod, availability, radiusMiles, category. hasMore is true only when nextCursor is present (same rule as tiktok/trending-feed and truth-social/user-posts; nextCursor is always keyed, null when exhausted). Default list path is flat 2 credits (cover photo in image — photos[] only when the card has more than one). Pass details=true for description, condition, coordinates, full photo gallery, seller{} when Facebook exposes it, and distanceMiles — billed as 2 + 2 credits per listing. timings{path,fetchMs,parseMs,resolveMs,totalMs} is the catalogue template — no root fetchMs/totalMs twins. cached is always keyed (true on cache=true hit or labelled last-good; default cache=false so identical live calls each bill). A first call typically takes ~28s (up to ~50s when cold); read timings.fetchMs. Facebook's own empty search (no listings that match) is an empty 200 at 0 credits — timings.path=search_no_results — not a 56–70s 502. A login shell or parse miss with a 6h last-good page is labelled stale at 0 credits. A miss with no snapshot is 502 UPSTREAM_UNAVAILABLE or 504 UPSTREAM_TIMEOUT (0 credits) with timings.\n\nDocs: https://captapi.com/apis/facebook-marketplace-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Product or keyword to search Facebook Marketplace for.","schema":{"type":"string","minLength":2}},{"name":"searchLocation","in":"query","required":true,"description":"Search-origin city or place name, e.g. 'Austin, TX'. Required — there is no default city. Echoed on the envelope and inside filters. Not listings[].location. Names that don't resolve to a real place are a definitive 400 UNKNOWN_LOCATION (Facebook would otherwise silently search an unrelated metro) — /v1/facebook/marketplace-location-search finds valid ones.","schema":{"type":"string","minLength":2}},{"name":"location","in":"query","required":false,"description":"Alias of searchLocation. Prefer searchLocation. Either one is required.","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"How many listings to return (1–200). Flat 2 credits when details=false; details=true billed as 2 + 2 per listing.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"minPrice","in":"query","required":false,"description":"Minimum price in local currency units.","schema":{"type":"number","minimum":0}},{"name":"maxPrice","in":"query","required":false,"description":"Maximum price in local currency units.","schema":{"type":"number","minimum":0}},{"name":"sortBy","in":"query","required":false,"description":"suggested | distance | creation_time | price_ascend | price_descend.","schema":{"type":"string"}},{"name":"daysSinceListed","in":"query","required":false,"description":"Facebook calendar-day recency: 1 = since the start of yesterday (not a rolling 24 hours), 7, or 30.","schema":{"type":"string"}},{"name":"condition","in":"query","required":false,"description":"new, like_new, good, fair (comma-separated ok).","schema":{"type":"string"}},{"name":"deliveryMethod","in":"query","required":false,"description":"local_pickup | shipping | all. Shipped listings can appear nationwide outside radiusMiles — use local_pickup for nearby-only; rows expose isLocal / shipsOutsideRadius.","schema":{"type":"string"}},{"name":"availability","in":"query","required":false,"description":"available | sold | all.","schema":{"type":"string"}},{"name":"radiusMiles","in":"query","required":false,"description":"Radius in miles: 1,2,5,10,20,40,60,80,100,250,500. Does not exclude nationwide shipped inventory.","schema":{"type":"integer"}},{"name":"category","in":"query","required":false,"description":"Top-level category slug, e.g. electronics.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor from a previous nextCursor.","schema":{"type":"string"}},{"name":"details","in":"query","required":false,"description":"When true, adds description/condition/coordinates/full photo gallery/seller/distanceMiles — billed as 2 + 2 credits per listing. Default false → flat 2 credits; cover photo is still in image.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Search Marketplace by keyword + city — filters, isLocal/shipsOutsideRadius, opaque cursor (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"searchLocation":{"type":"string","description":"Search-origin city you sent (or the location alias). Always echoed here and inside filters — not a silent default. Distinct from listings[].location."},"filters":{"type":"object","properties":{"minPrice":{"type":"string","description":"Min price. Example: \"50\"."},"maxPrice":{"type":"string","description":"Max price. Example: \"200\"."},"sortBy":{"type":"string","description":"Sort by. Example: \"price_ascend\"."},"daysSinceListed":{"type":"string","description":"Days since listed. Example: \"30\"."},"searchLocation":{"type":"string","description":"Search-origin city you sent (or the location alias). Always echoed here and inside filters — not a silent default. Distinct from listings[].location."}}},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"True only when nextCursor is present. Same catalogue rule as tiktok/trending-feed and truth-social/user-posts (those two may set hasMore true with a null cursor only when truncatedReason=single_page_only)."},"cached":{"type":"boolean","description":"Always keyed. true on a cache=true hit or labelled last-good. Default cache=false — identical live calls each bill 2 credits."},"nextCursor":{"type":"string","description":"Always keyed. Opaque skip token within the fetched SSR page, or null when exhausted. Pass as cursor."},"listings":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this listings item."},"title":{"type":"string","description":"Title of this listings item."},"url":{"type":"string","description":"Canonical URL of the item."},"price":{"type":"integer","description":"Price of the item."},"priceFormatted":{"type":"string","description":"Formatted price string."},"priceAmount":{"type":"integer","description":"Price in minor units (cents) for exact arithmetic — prefer over float price."},"currency":{"type":"string","description":"Currency code."},"categoryId":{"type":"string","description":"Category id when the platform exposes one."},"location":{"type":"object","properties":{"name":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"countryCode":{"type":"string"},"latitude":{},"longitude":{}},"description":"Removed from the envelope root (collided with listings[].location). Read searchLocation. Each listing.location is {name,city,state,countryCode,latitude,longitude}."},"cityPageId":{"type":"string","description":"City page id. Example: \"109791499039942\"."},"isSold":{"type":"boolean","description":"Convenience bool for status === sold."},"isPending":{"type":"boolean","description":"Convenience bool for status === pending."},"isHidden":{"type":"boolean","description":"Is hidden. Example: false."},"deliveryTypes":{"type":"array","items":{"type":"string"},"description":"Facebook delivery enums (e.g. IN_PERSON, SHIPPING_ONSITE)."},"image":{"type":"string","description":"Cover photo URL. Signed Meta CDN — check mediaUrlsExpireAt (~4.4 days from oe=)."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"status":{"type":"string","description":"Listing availability: \"available\" | \"pending\" | \"sold\". Prefer this over isPublished."},"isPublished":{"type":"boolean","description":"Whether Facebook still publishes the listing page (their is_live). Not a livestream. Omitted when status is sold/pending — prefer status."},"isLocal":{"type":"boolean","description":"true when the listing's city/state matches the search origin (or distanceMiles ≤ radiusMiles when coords exist)."},"shipsOutsideRadius":{"type":"boolean","description":"true when the listing offers shipping and isLocal is false — typical nationwide SHIPPING_ONSITE inventory."}}}}}}}},"example":{"success":true,"data":{"query":"desk chair","searchLocation":"Austin, TX","filters":{"minPrice":"50","maxPrice":"200","sortBy":"price_ascend","daysSinceListed":"30","searchLocation":"Austin, TX"},"totalReturned":2,"hasMore":true,"cached":false,"nextCursor":"eyJ2IjoxLCJxIjoiZGVzayBjaGFpciIsImxvYyI6IkF1c3RpbiwgVFgiLCJmIjp7Im1pblByaWNlIjoiNTAiLCJtYXhQcmljZSI6IjIwMCIsInNvcnRCeSI6InByaWNlX2FzY2VuZCIsImRheXNTaW5jZUxpc3RlZCI6IjMwIn0sInNraXAiOjUsImVjIjoie1wicGdcIjowLFwiYjJjXCI6e1wiYnJcIjpcIlwiLFwiaXRcIjowLFwiaG1zclwiOmZhbHNlLFwidGJpXCI6MH0sXCJjMmNcIjp7XCJiclwiOlwiQWJwaXVWdElpSVhFajlWV0ZVZEl4czFJUi13SldycGx1NWlNTGNYOURiMTBTQzhFQk93YzFXZi1RcmpOcDM3elBFWlg5ZGJNdlNDa0ZUay1sclBucTlCTnJGWURUdHg5bFZlMFhGd2FGdEQ0RG03T3RkemJBMU5MVWdkLUFrclRhc3hPZHVmWldmVkJTZlJTTG1SYmZydWVBVW85QTRNZXBqc1I0cm0zV09FejNSYlhIVnRrcm9SV21JZ1liUUZYN0Y0WnpfNnlhQTRkdThSY1BRbzJJeUwtcC1Ca3hlTVhHblFLSHZ1ZXJyZ2J2alN0M2hXNEFNdDZlclE1UkpGOUhSdFk3b1RLbGI2bTVfTUZEd2FqcXdMbUJhSzBKWlVKN3ZsUnczVFlQMm9SSjVoMDFxSndUU2Z6enduMkFodEFlcVFaUEs0eWV5OEc0WGZ0bm81cERJYzZDUWNzTWtRdEJjZDE2R3FNanQwQXhybkNJM1A0OFZINmZqcG9vM3hGTnJqU3ZvRDhOOGNxbVFMaVJzVy1SRlF2am9CNTdGWkkzVkpMLXhLN204cUVNaUczcnZKUlRJd2ZLS2VHdTlBckJXbi1SODJuNkVPUU9MU2loUkppTlY4Q0Rxamw0WnIyUVJmcXFMN3hmNzZPSnBzaEVxWi05Z1JWRWlzaFdJcUx1eWY0YzF6NE1zMUZ5YTNDeUZxamgtdDBtei1nR3dTZGhEOEhxelloQXhYWGZsU0NkdGUxVWIwaVBiRVctSUhqQmVjXCIsXCJpdFwiOjI0LFwicnBi …","listings":[{"platform":"facebook","id":"4482233215369733","title":"Vintage 1980s Postmodern \"American Lighting\" Gooseneck Desk Lamp","url":"https://www.facebook.com/marketplace/item/4482233215369733/","price":50,"priceFormatted":"$50","priceAmount":5000,"currency":"USD","categoryId":"1569171756675761","location":{"name":"Benson, AZ","city":"Benson","state":"AZ","countryCode":"US","latitude":null,"longitude":null},"cityPageId":"109791499039942","isSold":false,"isPending":false,"isHidden":false,"deliveryTypes":["IN_PERSON","SHIPPING_ONSITE"],"image":"https://scontent-atl3-3.xx.fbcdn.net/v/t39.84726-6/748718464_1472100928021023_7004614235492134530_n.jpg?stp=c0.87.526.526a_dst-jpg_p526x395_tt6&_nc_cat=109&ccb=1-7&_nc_sid=92e707&_nc_ohc=Osco_iBPSHsQ7kNvwE88Z2B&_nc_oc=AdrnNrq4GxtoKGWCDi_qxKj2BfO-OcysnTpk7mDO5d-84zPauj6YWLhxJPZuiRErURoSW7OUci-LjqdvjivdYc4u&_nc_zt=14&_nc_ht=scontent-atl3-3.xx&_nc_gid=48UkL5OoevcKmJAZmxtYnw&_nc_ss=7b289&oh=00_AQFTCh3FFtSTB-AA28V6Jr1NtrTs9PSVie1b1KW_xUkkNw&oe=6A753B85","createdAt":"2026-07-16T06:02:16+00:00","status":"available","isPublished":true,"isLocal":false,"shipsOutsideRadius":true},{"platform":"facebook","id":"2467979733629080","title":"Gaiam Classic Balance Ball Chair - Ergonomic Office/Desk Chair","url":"https://www.facebook.com/marketplace/item/2467979733629080/","price":50,"priceFormatted":"$50","priceAmount":5000,"currency":"USD","categoryId":"1383948661922113","location":{"name":"Fresno, CA","city":"Fresno","state":"CA","countryCode":"US","latitude":null,"longitude":null},"cityPageId":"107983435897193","isSold":false,"isPending":false,"isHidden":false,"deliveryTypes":["IN_PERSON","SHIPPING_ONSITE"],"image":"https://scontent-atl3-3.xx.fbcdn.net/v/t39.84726-6/749286700_1116782047845292_1788708914246608626_n.jpg?stp=c0.81.526.526a_dst-jpg_p526x395_tt6&_nc_cat=110&ccb=1-7&_nc_sid=92e707&_nc_ohc=gbzkYGqnXmYQ7kNvwGzH1qf&_nc_oc=AdqLUHLAdzpxyU4TF9F6Xf5v9Tib9M6UCrmYThgY8kMR7j8y-uMyvFm3zwMzYYMwX1rcrfF1-yMiBdhJbknk-W2-&_nc_zt=14&_nc_ht=scontent-atl3-3.xx&_nc_gid=48UkL5OoevcKmJAZmxtYnw&_nc_ss=7b289&oh=00_AQHJWOlgp25sCHb9Xzuo5yQVzSCjOZpSF6EaQpKDCudKZA&oe=6A751DFD","createdAt":"2026-07-18T17:45:28+00:00","status":"available","isPublished":true,"isLocal":false,"shipsOutsideRadius":true}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/marketplace-location-search":{"get":{"operationId":"facebook_marketplace_location_search","tags":["Facebook Marketplace"],"summary":"Facebook Marketplace Location Search API","description":"Disambiguate city names into Marketplace hubs — id + lat/lng.\n\nResolve a city/place query into Facebook Marketplace location hubs with id (Facebook city_page.id — same value marketplace-search listings expose as cityPageId), slug, city/state, and coordinates when available. marketplace-search already accepts a city string with no lat/lng required — use this endpoint when the name is ambiguous (Austin TX vs Austin MN vs Austin IN) or you need id/coordinates before searching. Bare ambiguous cities (Austin, Portland, Springfield) resolve from a local table in typically under 1s; every other query geocodes globally (typically under 2s) instead of a ~28s Facebook hub scrape. id resolves instantly for ~60 major US metros from a baked directory verified against live listing cityPageId values; smaller cities and non-US places return idResolved:false. marketplace-search still accepts those names — it geocodes a US town and snaps to the nearest baked metro rather than guessing a vanity slug. Envelope timings{path,hubMs,hubCount,geocodeMs,totalMs} including on 504/404. Flat 2 credits.\n\nDocs: https://captapi.com/apis/facebook-marketplace-location-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"City/place query. Bare names like 'Austin' may return multiple candidates (TX/MN/IN); include a state for a single hit (e.g. 'Austin, TX').","schema":{"type":"string","minLength":2}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 10, max 50). Flat 2 credits per call.","schema":{"type":"integer","maximum":50,"minimum":1,"default":10}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Disambiguate city names into Marketplace hubs — id + lat/lng.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"Echo of the q parameter you sent."},"totalReturned":{"type":"integer","description":"Number of location candidates in this response."},"locations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this locations item."},"cityPageId":{"type":"string","description":"City page id. Example: \"109791499039942\"."},"slug":{"type":"string","description":"Marketplace hub path slug (e.g. austin, austin-minnesota, izmir)."},"name":{"type":"string","description":"Name of this locations item."},"city":{"type":"string","description":"City name from the query / hub / geocode."},"state":{"type":"string","description":"US state abbreviation when known."},"latitude":{"type":"number","description":"Hub latitude when known (included by default — no details flag)."},"longitude":{"type":"number","description":"Hub longitude when known."}}}}}}}},"example":{"success":true,"data":{"query":"Austin","totalReturned":2,"locations":[{"id":"109791499039942","cityPageId":"109791499039942","slug":"austin","name":"Austin, TX","city":"Austin","state":"TX","latitude":30.2677,"longitude":-97.7475},{"slug":"austin-minnesota","name":"Austin, MN","city":"Austin","state":"MN","latitude":43.6666,"longitude":-92.9746}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/marketplace-item":{"get":{"operationId":"facebook_marketplace_item","tags":["Facebook Marketplace"],"summary":"Facebook Marketplace Item API","description":"Marketplace listing — title, priceAmount, status, seller{}, condition, coords (2 credits).\n\nPaste a Facebook Marketplace item URL and get the listing as clean JSON aligned with search rows: title, price + priceAmount (minor units), currency, categoryId, location{name,city,state,countryCode,latitude,longitude} (same object shape as Event endpoints — no flat city/state twins), cityPageId, status (available|pending|sold) with isSold/isPending/isHidden, deliveryTypes, image + photos[], createdAt, mediaUrlsExpireAt from Meta CDN oe=, plus detail-only description, condition, and seller{id,name,url,joinedAt,rating} when Facebook's public page exposes marketplace_listing_seller. Fetches are hedged: a page render that hasn't answered in ~30s gets a second render on a fresh session in parallel and the first full page wins, so one hung render no longer burns the whole call — 504 UPSTREAM_TIMEOUT (with timings) now means both attempts failed, not that one connection stalled. Flat 2 credits. Session-only isViewerSeller is never returned.\n\nDocs: https://captapi.com/apis/facebook-marketplace-item","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook Marketplace item URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Marketplace listing — title, priceAmount, status, seller{}, condition, coords (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of the item."},"description":{"type":"string","description":"Description text."},"price":{"type":"integer","description":"Price of the item."},"priceFormatted":{"type":"string","description":"Formatted price string."},"currency":{"type":"string","description":"Currency code."},"condition":{"type":"string","description":"Condition. Example: \"Used - like new\"."},"location":{"type":"string","description":"Venue block {name, city, state, countryCode, latitude, longitude} — same keys as Event endpoints. No flat city/state/lat/lng twins."},"latitude":{"type":"number","description":"Latitude. Example: 38.888854980469."},"longitude":{"type":"number","description":"Longitude. Example: -77.085571289062."},"isSold":{"type":"boolean","description":"Convenience bool for status === sold."},"deliveryTypes":{"type":"array","items":{"type":"string"},"description":"Delivery types (array)."},"image":{"type":"string","description":"Cover photo URL. Signed Meta CDN — check mediaUrlsExpireAt."},"photos":{"type":"array","items":{"type":"string"},"description":"Full photo gallery when the item page exposes it."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"status":{"type":"string","description":"Listing availability: \"available\" | \"pending\" | \"sold\". Sold listings can still be published."},"priceAmount":{"type":"integer","description":"Price in minor units (cents) for exact arithmetic."},"city":{"type":"string","description":"City. Example: \"Arlington\"."},"state":{"type":"string","description":"State. Example: \"VA\"."}}}}},"example":{"success":true,"data":{"platform":"facebook","id":"2228870800986975","url":"https://www.facebook.com/marketplace/item/2228870800986975/","title":"Elabest Mesh Office Chair, Ergonomic Computer Desk Chair, Sturdy Task Chair - Adjustable Lumbar Support","description":"Breathable mesh office chair has an ergonomic design with a high back and adjustable headrest. This light gray task chair is manufactured by Elabest and features adjustable armrests, a five-point rolling base, and integrated lumbar support.\n\nEstimated (WxDxH): 26 x 24 x 45 in","price":125,"priceFormatted":"$125","currency":"USD","condition":"Used - like new","location":"Arlington, VA","latitude":38.888854980469,"longitude":-77.085571289062,"isSold":true,"deliveryTypes":["IN_PERSON","DOOR_PICKUP"],"image":"https://scontent-mad1-1.xx.fbcdn.net/v/t39.84726-6/749377945_1746854896315726_817991790771142418_n.jpg?stp=dst-jpg_p720x720_tt6&_nc_cat=100&ccb=1-7&_nc_sid=92e707&_nc_ohc=Td50J02FhxwQ7kNvwEMS5Gk&_nc_oc=Adq3GF3R5f05eu3AlZfXV5BYX7n-dl-fGhjd7L4VfCb2IZztMYgOGJOLqDwEA8uVUvU&_nc_zt=14&_nc_ht=scontent-mad1-1.xx&_nc_gid=Srmkvq9GlIeOtnd0GDpLVA&_nc_ss=7b289&oh=00_AQC6x7FebWsdvTVd2WTXik82gabWPwTIgqcmEHjtOn9PRA&oe=6A6D9DBB","photos":["https://scontent-mad1-1.xx.fbcdn.net/v/t39.84726-6/749377945_1746854896315726_817991790771142418_n.jpg?stp=dst-jpg_p720x720_tt6&_nc_cat=100&ccb=1-7&_nc_sid=92e707&_nc_ohc=Td50J02FhxwQ7kNvwEMS5Gk&_nc_oc=Adq3GF3R5f05eu3AlZfXV5BYX7n-dl-fGhjd7L4VfCb2IZztMYgOGJOLqDwEA8uVUvU&_nc_zt=14&_nc_ht=scontent-mad1-1.xx&_nc_gid=Srmkvq9GlIeOtnd0GDpLVA&_nc_ss=7b289&oh=00_AQC6x7FebWsdvTVd2WTXik82gabWPwTIgqcmEHjtOn9PRA&oe=6A6D9DBB","https://scontent-mad2-1.xx.fbcdn.net/v/t45.5328-4/750643688_1384573667068640_514500939676617077_n.jpg?stp=dst-jpg_p720x720_tt6&_nc_cat=111&ccb=1-7&_nc_sid=247b10&_nc_ohc=Aa-65J_vFfcQ7kNvwF56W3U&_nc_oc=AdqZo7FznGIikAd34m8FI2BzTOz3YUC3qQQ7lZPPYOm6lxpve9wXM1XMfZkSG1T1N-k&_nc_zt=23&_nc_ht=scontent-mad2-1.xx&_nc_gid=Srmkvq9GlIeOtnd0GDpLVA&_nc_ss=7b289&oh=00_AQADpKLF9okchpYthAq_g22eIr1EZlOHwgG-Ih5jzyIFyQ&oe=6A6D812F"],"createdAt":"2026-07-17T18:23:51+00:00","status":"sold","priceAmount":12500,"city":"Arlington","state":"VA"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/event-search":{"get":{"operationId":"facebook_event_search","tags":["Facebook Events"],"summary":"Facebook Event Search API","description":"Search Facebook events by topic and city — local startDate/timezone, venue.\n\nSearch public Facebook events with a topic query (e.g. comedy) and optional location / from / to / upcoming filters. Each result uses the same Event shape as Event Details and Profile Events — every field present, null when Facebook omits it: startDate/endDate as ISO with the host timezone offset (calendar day matches startTime — evening CDT events do not roll to the next UTC day), IANA timezone (from venue lat/lng when present — never Etc/*), startTime (always includes the year), isPast, eventType (discovery category, e.g. Comedy), visibility (public|private|friends|… from Facebook's *_TYPE), location{name,city,latitude,longitude,countryCode} (all five keys always — null when unknown), description, image, organizers, ticketsUrl, categories, and usersGoing/usersInterested when exposed. Relative labels like \"Happening now\" are never returned as startTime. Billing: flat 2 credits on every successful call — check source / x-captapi-source (native|extended). Envelope timings{serpMs,hydrateMs,hydrateAttempts,discoveryMs,totalMs,path} exposes per-stage latency. Set client timeouts ≥130s until typical searches stay under 60s.\n\nDocs: https://captapi.com/apis/facebook-event-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Topic keyword, e.g. 'comedy'. Pair with location for city-scoped results.","schema":{"type":"string","minLength":2}},{"name":"location","in":"query","required":false,"description":"City/place geo filter (e.g. London). Matches timezone, location.city, or coords near the city — not a title substring.","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Inclusive local start date filter YYYY-MM-DD. Use for upcoming-only windows — Facebook/SERP may return past events.","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"Inclusive local start date filter YYYY-MM-DD.","schema":{"type":"string"}},{"name":"upcoming","in":"query","required":false,"description":"When true and from is omitted, sets from to today's UTC date so past events are dropped.","schema":{"type":"boolean","default":false}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call. Response `source` is native or extended (fetch path — not a price change).","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Search Facebook events by topic and city — local startDate/timezone, venue.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"location":{"type":"string","description":"Venue block {name, city, latitude, longitude, countryCode} — all five keys always."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"events":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this events item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Name of this events item."},"description":{"type":"string","description":"Description of this events item."},"startDate":{"type":"string","description":"Event start as ISO-8601 with the host timezone offset (e.g. 2026-07-27T19:45:00-05:00). Calendar day matches startTime — not UTC midnight."},"endDate":{"type":"string","description":"Event end as ISO-8601 with the same host timezone offset when available (null when unknown)."},"timezone":{"type":"string","description":"IANA timezone from venue coords or the startTime abbreviation (e.g. America/Chicago for CDT)."},"startTime":{"type":"string","description":"Absolute local schedule sentence that always includes the year — never relative labels like Happening now."},"duration":{"type":"string","description":"Human duration when start/end are known; null otherwise."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"eventType":{"type":"string","description":"Discovery category (e.g. Comedy). Null when unknown — never PUBLIC_TYPE."},"isOnline":{"type":"boolean","description":"Is online. Example: false."},"isPast":{"type":"boolean","description":"Whether the event start is in the past."},"isCanceled":{"type":"boolean","description":"Is canceled. Example: false."},"address":{"type":"string","description":"Address."},"image":{"type":"string","description":"Image URL."},"location":{"type":"object","properties":{"name":{"type":"string","description":"Name of this events item."},"city":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"countryCode":{"type":"string"}},"description":"Venue block {name, city, latitude, longitude, countryCode} — all five keys always."},"organizers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this events item."},"name":{"type":"string","description":"Name of this events item."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean"}}},"description":"Array of objects with id, name, url, verified."},"ticketsUrl":{"type":"string","description":"Tickets url URL."},"categories":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}}},"description":"Array of objects with label, url."}}}}}}}},"example":{"success":true,"data":{"query":"comedy Chicago","location":"Chicago","totalReturned":2,"events":[{"platform":"facebook","id":"1501904507609251","url":"https://www.facebook.com/events/1501904507609251/","name":"The Best of Chicago Comedy Showcase at Zanies Rosemont","description":"Get ready for an unforgettable evening of laughter as Chicago's comedy scene brings its A-game to the stage! \"The Best of Chicago Showcase\" features a dynamic lineup of the city's funniest stand-up comedians, delivering a blend of fresh, cutting-edge material and beloved, time-tested jokes.","startDate":"2026-08-19T19:00:00-05:00","endDate":"2026-08-19T20:30:00-05:00","timezone":"America/Chicago","startTime":"Wednesday 19 August 2026 from 19:00-20:30 CDT","duration":"1 hr 30 min","durationSeconds":5400,"eventType":"Comedy","isOnline":false,"isPast":false,"isCanceled":false,"address":"5437 Park Pl, Des Plaines, IL 60018-3732, United States","image":"https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=1501904507609251","location":{"name":"5437 Park Place, Rosemont, IL, United States, Illinois 60018","city":"Rosemont, IL","latitude":41.97826,"longitude":-87.86738,"countryCode":"US"},"organizers":[{"id":"100064546187809","name":"Zanies Rosemont Comedy Club","url":"https://www.facebook.com/RosemontZanies","verified":false}],"ticketsUrl":"https://www.etix.com/ticket/p/74170542/the-best-of-chicago-showcase-rosemont-zanies-rosemont","categories":[{"label":"Comedy","url":"https://www.facebook.com/events/search/?filters=eyJmaWx0ZXJfZXZlbnRzX2NhdGVnb3J5OjAiOiJ7XCJuYW1lXCI6XCJmaWx0ZXJfZXZlbnRzX2NhdGVnb3J5XCIsXCJhcmdzXCI6XCI2NjAwMzI2MTc1MzYzNzNcIn0ifQ%3D%3D&q=Comedy"}]},{"platform":"facebook","id":"1345542687414105","url":"https://www.facebook.com/events/1345542687414105/","name":"Anthony Mrocka at Zanies Rosemont","startDate":"2026-08-05T19:00:00-05:00","timezone":"America/Chicago","startTime":"Wed, Aug 5 at 7:00 PM CDT","eventType":"PUBLIC_TYPE","isPast":false,"isCanceled":false,"location":{"name":"5437 Park Place, Rosemont, IL, United States, Illinois 60018","city":"Rosemont, IL","countryCode":"US"},"organizers":[{"id":"100064546187809","name":"Zanies Rosemont Comedy Club","url":"https://www.facebook.com/RosemontZanies","verified":false}]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/event-details":{"get":{"operationId":"facebook_event_details","tags":["Facebook Events"],"summary":"Facebook Event Details API","description":"Get a Facebook event — title, local start/end, timezone, place, host id, and attendance when exposed.\n\nPaste a Facebook event URL and get clean JSON using the shared Event shape: title, description, startDate/endDate as ISO with the host timezone offset (calendar day matches startTime), IANA timezone resolved from venue coordinates when present (else the display-sentence abbreviation — GMT→Europe/London; never Etc/*; null when unknown), duration, eventType (discovery category) + visibility (public|private|…), location{name,city,latitude,longitude,countryCode} (fixed key set — null when unknown), organizers[{id,name,url,verified}], categories, ticketsUrl, and going/interested counts when Facebook exposes them on the logged-out hydrate. Flat 2 credits per call.\n\nDocs: https://captapi.com/apis/facebook-event-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook event URL, e.g. https://facebook.com/events/ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Get a Facebook event — title, local start/end, timezone, place, host id, and attendance when exposed.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"description":{"type":"string","description":"Description text."},"startDate":{"type":"string","description":"Event start as ISO-8601 with the host timezone offset (e.g. 2026-08-19T19:00:00-05:00). Calendar day matches startTime — not UTC midnight."},"endDate":{"type":"string","description":"Event end as ISO-8601 with the same host timezone offset when Facebook exposes end_timestamp."},"timezone":{"type":"string","description":"IANA timezone inferred from the startTime abbreviation (e.g. America/Chicago for CDT)."},"startTime":{"type":"string","description":"Facebook's human-readable local schedule sentence (includes TZ abbrev)."},"duration":{"type":"string","description":"Human duration from Facebook (e.g. 1 hr 30 min) or derived from start/end."},"durationSeconds":{"type":"integer","description":"Duration in seconds when start and end timestamps are known."},"eventType":{"type":"string","description":"Discovery category label when present (e.g. Comedy). Never a Facebook visibility constant — see visibility."},"isOnline":{"type":"boolean","description":"Is online. Example: false."},"isPast":{"type":"boolean","description":"Whether the event start is in the past (Relay is_past, else derived from startDate vs now)."},"isCanceled":{"type":"boolean","description":"Is canceled. Example: false."},"address":{"type":"string","description":"Street / one-line address when distinct from location.name. Null when it would only echo city."},"image":{"type":"string","description":"Image URL."},"location":{"type":"object","properties":{"name":{"type":"string","description":"Name of this location item."},"city":{"type":"string","description":"City. Example: \"Rosemont, IL\"."},"latitude":{"type":"number","description":"Latitude. Example: 41.97826."},"longitude":{"type":"number","description":"Longitude. Example: -87.86738."},"countryCode":{"type":"string","description":"ISO-3166 alpha-2 country code (e.g. US, MX)."}}},"organizers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this organizers item."},"name":{"type":"string","description":"Name of this organizers item."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":"boolean","description":"Whether the host Page/profile shows a verified badge (on organizers[].verified)."}}}},"ticketsUrl":{"type":"string","description":"Tickets url URL."},"categories":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"Label. Example: \"Comedy\"."},"url":{"type":"string","description":"Canonical URL of the item."}}}}}}}},"example":{"success":true,"data":{"platform":"facebook","id":"1501904507609251","url":"https://www.facebook.com/events/1501904507609251/","name":"The Best of Chicago Comedy Showcase at Zanies Rosemont","description":"Get ready for an unforgettable evening of laughter as Chicago's comedy scene brings its A-game to the stage! \"The Best of Chicago Showcase\" features a dynamic lineup of the city's funniest stand-up comedians, delivering a blend of fresh, cutting-edge material and beloved, time-tested jokes.","startDate":"2026-08-19T19:00:00-05:00","endDate":"2026-08-19T20:30:00-05:00","timezone":"America/Chicago","startTime":"Wednesday 19 August 2026 from 19:00-20:30 CDT","duration":"1 hr 30 min","durationSeconds":5400,"eventType":"Comedy","isOnline":false,"isPast":false,"isCanceled":false,"address":"5437 Park Pl, Des Plaines, IL 60018-3732, United States","image":"https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=1501904507609251","location":{"name":"5437 Park Place, Rosemont, IL, United States, Illinois 60018","city":"Rosemont, IL","latitude":41.97826,"longitude":-87.86738,"countryCode":"US"},"organizers":[{"id":"100064546187809","name":"Zanies Rosemont Comedy Club","url":"https://www.facebook.com/RosemontZanies","verified":false}],"ticketsUrl":"https://www.etix.com/ticket/p/74170542/the-best-of-chicago-showcase-rosemont-zanies-rosemont","categories":[{"label":"Comedy","url":"https://www.facebook.com/events/search/?filters=eyJmaWx0ZXJfZXZlbnRzX2NhdGVnb3J5OjAiOiJ7XCJuYW1lXCI6XCJmaWx0ZXJfZXZlbnRzX2NhdGVnb3J5XCIsXCJhcmdzXCI6XCI2NjAwMzI2MTc1MzYzNzNcIn0ifQ%3D%3D&q=Comedy"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/facebook/profile-events":{"get":{"operationId":"facebook_profile_events","tags":["Facebook Events"],"summary":"Facebook Profile Events API","description":"List a Facebook Page's events — local startDate, timezone, venue.\n\nPass a Facebook Page URL and get that page's /events list as clean JSON using the same Event shape as Event Search / Event Details — every field present, null when the profile card omits it (description, endDate, duration, image, organizers, ticketsUrl, categories, …). A profile listing exposes only the event header. Call event-details with the event url to hydrate description, endDate, durationSeconds, image, attendee counts and ticketsUrl. startDate is ISO with host offset (year resolved from yearless cards like \"Tue, Aug 4 at 8:00 PM EDT\"); startTime always includes the year; eventType is the discovery category when known; visibility is public|private|… (not PUBLIC_TYPE). Envelope includes source (native|extended) for the fetch path. Billing: flat 2 credits on every successful call.\n\nDocs: https://captapi.com/apis/facebook-profile-events","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Facebook profile/page URL, @handle, or page name. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call. Response `source` is native or extended (fetch path — not a price change).","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"List a Facebook Page's events — local startDate, timezone, venue.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"events":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this events item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Name of this events item."},"startDate":{"type":"string","description":"Event start as ISO-8601 with host timezone offset. Year is resolved for yearless cards (Tue, Aug 4 at 8:00 PM EDT → 2026-08-04T20:00:00-04:00)."},"timezone":{"type":"string","description":"IANA timezone from the startTime abbreviation (e.g. America/New_York for EDT)."},"startTime":{"type":"string","description":"Local schedule sentence that always includes the year (built from startDate when the card omits it)."},"eventType":{"type":"string","description":"Discovery category when known; null on thin cards — never PUBLIC_TYPE."},"isPast":{"type":"boolean","description":"Whether the event start is in the past (derived from startDate)."},"isCanceled":{"type":"boolean","description":"Is canceled. Example: false."},"location":{"type":"object","properties":{"name":{"type":"string","description":"Name of this events item."}},"description":"Location shown on the profile or item."}}}}}}}},"example":{"success":true,"data":{"platform":"facebook","url":"https://www.facebook.com/MadisonSquareGarden","totalReturned":2,"events":[{"platform":"facebook","id":"1595969051643502","url":"https://www.facebook.com/events/1595969051643502/","name":"J. Cole: The Fall-Off Tour","startDate":"2026-08-04T20:00:00-04:00","timezone":"America/New_York","startTime":"Tue, Aug 4 at 8:00 PM EDT","eventType":"PUBLIC_TYPE","isPast":false,"isCanceled":false,"location":{"name":"Madison Square Garden"}},{"platform":"facebook","id":"1379008927241796","url":"https://www.facebook.com/events/1379008927241796/","name":"Hilary Duff: the lucky me tour","startDate":"2026-08-05T19:00:00-04:00","timezone":"America/New_York","startTime":"Wed, Aug 5 at 7:00 PM EDT","eventType":"PUBLIC_TYPE","isPast":false,"isCanceled":false,"location":{"name":"Madison Square Garden"}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/facebook/search":{"get":{"operationId":"facebook_ad_library_search","tags":["Facebook Ad Library"],"summary":"Facebook Ad Library Search API","description":"Search Meta Ad Library by keyword — active/inactive, media type, date range, platforms, cursor, and spend/impressions when Meta publishes them.\n\nSearch Meta's Ad Library and get competitor creatives as clean JSON — filters: status (default ACTIVE), media_type, platforms, ad_type, search_type (exact phrase), sort_by (total_impressions|relevancy_monthly_grouped), start_date/end_date, cursor, trim. Cursor pages the current HTML result batch via nextCursor (not Meta's multi-thousand POST cursor). hasMore is true only when nextCursor is present. searchResultsCount is Meta's upstream match count (can be thousands); retrievableCount is how many ads this cursor walk can actually return (the fetched HTML batch, typically ~30–50) — publish both; the big number is not walkable. Same advertiser id collapses to one name within a response (name normalisation, not dedup). Collation siblings share collationId and each consume a limit slot — group on that key if you want one row per creative; collationId is always keyed (null when Meta omits it) and siblings in one collated_results group inherit a missing id. Each ad: text/headline/cta/ctaType/landingUrl, media[] (canonical URL list) plus typed images/videos + cards[], isActive, publisherPlatforms (not a platforms twin), pageLikeCount/pageCategories/pageEntityType, politicalCountries, reachEstimate, spend/impressions when Meta publishes them. Meta publishes spend, impressions, reach, and the paid-for-by extras (byline, disclaimerLabel, brandedContent, pageEntityType, totalActiveTime) only for political and issue ads in regions that require disclosure; commercial advertisers omit them — politicalCountries: [] is the signal, not a scrape miss. DCO creatives substitute cards[0] when text/headline/linkDescription are {{product.*}} tokens and set textIsFromCard (leftover tokens keep isTemplated). images[]/videos[] are filled from cards when Meta leaves the typed arrays empty. mediaUrlsExpireAt is the earliest Meta CDN oe= stamp (~5 days). variantCount is always keyed (null when Meta omits it). advertiser is {id,name,url,logo,profileId?} — id is the Ad Library page id; profileId is the facebook.com/{digits} namespace when it differs; identical pageId/advertiserId aliases are not emitted. firstShown/lastShown are calendar days (YYYY-MM-DD) in Pacific — Meta's date, not an 8 a.m. UTC instant. Row-level country is omitted when Meta does not publish a per-ad market (the envelope country is the query). Envelope fetchMs / parseMs / totalMs survive the customer-trace strip so a ~13s call is attributable. Native fetch is capped at 110s. Flat 2 credits on the native path.\n\nDocs: https://captapi.com/apis/facebook-ad-library-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keyword, brand, or advertiser to search Meta Ad Library (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code (e.g. US, GB, DE). Default US. Non-ISO codes are a definitive 400 INVALID_COUNTRY — Meta would otherwise ignore the code and search globally while echoing it back as if the filter worked.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"status","in":"query","required":false,"description":"Ad delivery status: ACTIVE (default), INACTIVE, or ALL. Use ACTIVE for \"what are they running now?\".","schema":{"enum":["ALL","ACTIVE","INACTIVE"],"type":"string","default":"ACTIVE"}},{"name":"media_type","in":"query","required":false,"description":"Creative filter: ALL (default), IMAGE, VIDEO, MEME, IMAGE_AND_MEME, or NONE.","schema":{"enum":["ALL","IMAGE","VIDEO","MEME","IMAGE_AND_MEME","NONE"],"type":"string","default":"ALL"}},{"name":"platforms","in":"query","required":false,"description":"Comma-separated publisher platforms to keep: FACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, THREADS.","schema":{"type":"string"}},{"name":"ad_type","in":"query","required":false,"description":"all (default) or political_and_issue_ads. Spend/impressions are typically only filled for political/issue ads.","schema":{"enum":["all","political_and_issue_ads"],"type":"string","default":"all"}},{"name":"search_type","in":"query","required":false,"description":"keyword_unordered (default) or keyword_exact_phrase.","schema":{"enum":["keyword_unordered","keyword_exact_phrase"],"type":"string","default":"keyword_unordered"}},{"name":"sort_by","in":"query","required":false,"description":"Meta sort mode: total_impressions or relevancy_monthly_grouped.","schema":{"enum":["total_impressions","relevancy_monthly_grouped"],"type":"string"}},{"name":"start_date","in":"query","required":false,"description":"Only ads with delivery start on/after this date (YYYY-MM-DD).","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"end_date","in":"query","required":false,"description":"Only ads with delivery start on/before this date (YYYY-MM-DD).","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from a previous nextCursor. Pages through the current Meta HTML result batch.","schema":{"type":"string"}},{"name":"trim","in":"query","required":false,"description":"When true, omit cards/images/videos typed arrays (media[] stays). Captapi payloads are already lean vs Meta nested snapshots.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Search Meta Ad Library by keyword — active/inactive, media type, date range, platforms, cursor, and spend/impressions when Meta publishes them.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"Keyword you searched."},"country":{"type":"string","description":"ISO market you queried (e.g. US, BD). Envelope only — not each ad's delivery country, and not a popular-creators feed market."},"totalReturned":{"type":"integer","description":"Ads on this page (length of ads[])."},"ads":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Body copy of the creative. DCO {{product.*}} tokens fall back to cards[0].text when that card has real copy."},"headline":{"type":"string","description":"Ad headline / title when Meta exposes it. Not a profile headline. DCO tokens fall back to cards[0] (see textIsFromCard)."},"cta":{"type":"string","description":"Call-to-action label (e.g. Learn more)."},"landingUrl":{"type":"string","description":"Click-through URL from the creative."},"adFormat":{"type":"string","description":"Creative format Meta labelled (IMAGE, VIDEO, …)."},"firstShown":{"type":"string","description":"Meta delivery-start date as YYYY-MM-DD (Pacific calendar day) — not an 8 a.m. UTC instant."},"lastShown":{"type":"string","description":"Meta delivery-end date as YYYY-MM-DD (Pacific calendar day) — not an 8 a.m. UTC instant."},"impressions":{"type":"string","description":"Impression band when Meta publishes it. Commercial usually null — see platformNote."},"spend":{"type":"string","description":"Spend band when Meta publishes it (political/issue ads). Commercial usually null — see platformNote."},"country":{"type":"string","description":"ISO market you queried (e.g. US, BD). Envelope only — not each ad's delivery country, and not a popular-creators feed market."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ads item."},"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string"}},"description":"Advertiser running the ad."},"media":{"type":"array","items":{"type":"string"},"description":"Canonical URL list — one primary asset per creative, including DCO cards. resizedUrl / posters live on images[] / videos[]."}}}}}}}},"example":{"success":true,"data":{"query":"election","country":"US","totalReturned":2,"ads":[{"platform":"facebook_ad_library","id":"317161109571794","url":"https://www.facebook.com/ads/library/?id=317161109571794","text":"The Voting Information Center—one-tap voting registration information from election experts and authorities in one place.","headline":"Voting Information Center","cta":"Learn more","landingUrl":"http://facebook.com/votinginformationcenter","adFormat":"VIDEO","firstShown":"2020-09-22T07:00:00.000Z","lastShown":"2020-10-05T07:00:00.000Z","impressions":">1M","spend":">$1M","country":"US","advertiser":{"id":"108824017345866","name":"Meta","url":"https://www.facebook.com/Meta/","logo":"https://scontent-atl3-1.xx.fbcdn.net/v/t1.6435-9/119568341_200337161527884_7846459746434232698_n.png?stp=dst-png_s60x60&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=qaRlosGC9wUQ7kNvwHuGOSN&_nc_oc=AdpUTiQHP0F2DQWlJJsFhLjPwiKgiTaMBS9Gf3J_Ogy1Z6nYv2kt_BhKXvw8jPupOMg&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_gid=kjSzmNhJvOQPmxnVKKr0xg&_nc_ss=72289&oh=00_AQCbS0Qc_-2kHNJh8Yysq78dbBXaaJS4Osw3-xA3_SHVlw&oe=6A89438E"},"media":["https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQNN757NtitUcJnpv0ODeMH6fXo-yFM-X90P2W82Zsrc70oOzST9lrKgscKf21SHBUtZ9pdKMclY8s32B0eRJ7o.mp4?_nc_cat=106&_nc_sid=ef5aa3&_nc_ht=video-atl3-1.xx.fbcdn.net&_nc_ohc=VIhm6QH6QpYQ7kNvwEGz32Z&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5WSV9VU0VDQVNFX1BST0RVQ1RfVFlQRS4uQzMuMzQwLmFzaWNfaHExX3NkX3Byb2dyZXNzaXZlIiwieHB2X2Fzc2V0X2lkIjo4MzE0MTAwMzMxNDk2MzYsImFzc2V0X2FnZV9kYXlzIjoyMzcsInZpX3VzZWNhc2VfaWQiOjEwNjgwLCJkdXJhdGlvbl9zIjoxNSwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=kjSzmNhJvOQPmxnVKKr0xg&_nc_ss=72289&_nc_zt=28&oh=00_AQBmg1RWfbVvJ3MUBSfprUeNw4A1j1otLN5iP3DoZ8RxIw&oe=6A677448","https://scontent-atl3-2.xx.fbcdn.net/v/t39.35426-6/120065387_2711663819108220_8472417301728012411_n.jpg?_nc_cat=105&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=XJsOGtccv7UQ7kNvwFOmuvH&_nc_oc=AdqJh0Avn_pYIk_hzhEW3QS1dyOrrTJn4nBpQ38NLoUvb1OE8Kwj7qy75S7f1QbV1cs&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=kjSzmNhJvOQPmxnVKKr0xg&_nc_ss=72289&oh=00_AQBESYOW184a4FJWDENcSYwQSBzwkH5yonZh3U5v6ZZEgA&oe=6A67964A"]},{"platform":"facebook_ad_library","id":"372804137235499","url":"https://www.facebook.com/ads/library/?id=372804137235499","text":"The Voting Information Center on Facebook—one-tap voting info from election experts and authorities in one place.","headline":"Voting Information Center","cta":"Learn more","landingUrl":"http://facebook.com/votinginformationcenter","adFormat":"VIDEO","firstShown":"2020-10-05T07:00:00.000Z","lastShown":"2020-10-13T07:00:00.000Z","impressions":">1M","spend":">$1M","country":"US","advertiser":{"id":"108824017345866","name":"Meta","url":"https://www.facebook.com/Meta/","logo":"https://scontent-atl3-1.xx.fbcdn.net/v/t1.6435-9/119568341_200337161527884_7846459746434232698_n.png?stp=dst-png_s60x60&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=qaRlosGC9wUQ7kNvwHuGOSN&_nc_oc=AdpUTiQHP0F2DQWlJJsFhLjPwiKgiTaMBS9Gf3J_Ogy1Z6nYv2kt_BhKXvw8jPupOMg&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_gid=kjSzmNhJvOQPmxnVKKr0xg&_nc_ss=72289&oh=00_AQCbS0Qc_-2kHNJh8Yysq78dbBXaaJS4Osw3-xA3_SHVlw&oe=6A89438E"},"media":["https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQPYrtdWcXYzwK9kZxgDiAgoU_IImyeS9Q8adbGcircR7RR1dDdUBrAQ0LiHO2OJoauE5pf8F4GyEcPVDLQ94uo.mp4?_nc_cat=100&_nc_sid=ef5aa3&_nc_ht=video-atl3-1.xx.fbcdn.net&_nc_ohc=TJVBi21FSYoQ7kNvwGc3J8g&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5WSV9VU0VDQVNFX1BST0RVQ1RfVFlQRS4uQzMuMzQwLmFzaWNfaHExX3NkX3Byb2dyZXNzaXZlIiwieHB2X2Fzc2V0X2lkIjo4OTE2MjkwMDA0NTQwNDEsImFzc2V0X2FnZV9kYXlzIjoxNTcsInZpX3VzZWNhc2VfaWQiOjEwNjgwLCJkdXJhdGlvbl9zIjoxNCwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=kjSzmNhJvOQPmxnVKKr0xg&_nc_ss=72289&_nc_zt=28&oh=00_AQCMG2KnWhkyJxkleqImsnYBBqDKo2-gU04sjFZY6UOemA&oe=6A678682","https://scontent-atl3-1.xx.fbcdn.net/v/t39.35426-6/120439450_1980569842077757_2547343747583380554_n.jpg?_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=ghBwQrPN7IYQ7kNvwEK1Ioe&_nc_oc=Adq-eL0xdnXQzWG8i4nmzYYnwcV_Aa55yUcMBwzE5_rk0sejWdtPX_5QJKW6xounlWk&_nc_zt=14&_nc_ht=scontent-atl3-1.xx&_nc_gid=kjSzmNhJvOQPmxnVKKr0xg&_nc_ss=72289&oh=00_AQB1w19aEluVfs5pAiHsky2u5dZ4bgAW_AohS8QzRc8Wkg&oe=6A678BF4"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/facebook/company-ads":{"get":{"operationId":"facebook_ad_library_company_ads","tags":["Facebook Ad Library"],"summary":"Facebook Company Ads API","description":"Ads for one Meta page — active by default, cursor through the HTML batch, same envelope as /facebook/search.\n\nList ads for one Meta page/advertiser. Prefer pageId (or libraryUrl) from /facebook/search-companies. status defaults to ACTIVE so the first page is what the page is running now — use ALL for historical/inactive variants (collation siblings share copy and consume a limit slot). nextCursor pages the current HTML result batch; hasMore is true only when nextCursor is present. searchResultsCount is Meta's upstream match count; retrievableCount is how many ads this cursor walk can actually return. A search-companies libraryUrl with active_status=all is rewritten to the requested filter. Flat 2 credits native.\n\nDocs: https://captapi.com/apis/facebook-ad-library-company-ads","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"pageId from /search-companies (preferred), libraryUrl, vanity page URL (facebook.com/nike/), or Ad Library URL with view_all_page_id. Do not pass profileId from facebook.com/{digits}/ when it differs from pageId. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code. Default US. Non-ISO codes are a definitive 400 INVALID_COUNTRY.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call on the native path; the extended fallback bills per returned ad.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"status","in":"query","required":false,"description":"Ad delivery status: ACTIVE (default), INACTIVE, or ALL. Use ACTIVE for \"what are they running now?\".","schema":{"enum":["ALL","ACTIVE","INACTIVE"],"type":"string","default":"ACTIVE"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from a previous nextCursor. Pages through the current Meta HTML result batch.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Ads for one Meta page — active by default, cursor through the HTML batch, same envelope as /facebook/search.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"country":{"type":"string","description":"ISO market you queried (e.g. US). Envelope only — not a popular-creators feed market."},"totalReturned":{"type":"integer","description":"Ads on this page (length of ads[])."},"ads":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"headline":{"type":"string","description":"Ad headline / title when Meta exposes it. Not a profile headline."},"cta":{"type":"string","description":"Call-to-action text."},"landingUrl":{"type":"string","description":"Landing page the ad links to."},"adFormat":{"type":"string","description":"Format of the ad creative."},"firstShown":{"type":"string","description":"Meta delivery-start date as YYYY-MM-DD (Pacific calendar day)."},"lastShown":{"type":"string","description":"Meta delivery-end date as YYYY-MM-DD (Pacific calendar day)."},"impressions":{"type":"string","description":"Estimated ad impressions."},"spend":{"type":"string","description":"Estimated ad spend."},"country":{"type":"string","description":"ISO market you queried (e.g. US). Envelope only — not a popular-creators feed market."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ads item."},"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string"}},"description":"Advertiser running the ad."},"media":{"type":"array","items":{"type":"string"},"description":"Media attached to the item."}}}}}}}},"example":{"success":true,"data":{"url":"https://www.facebook.com/Meta","country":"US","totalReturned":2,"ads":[{"platform":"facebook_ad_library","id":"273872017027242","url":"https://www.facebook.com/ads/library/?id=273872017027242","text":"The Voting Information Center on Facebook - one-tap voting info from election experts and authorities in one place.","headline":"Voting Information Center","cta":"Learn more","landingUrl":"http://facebook.com/votinginformationcenter","adFormat":"VIDEO","firstShown":"2020-10-05T07:00:00.000Z","lastShown":"2020-10-13T07:00:00.000Z","impressions":">1M","spend":">$1M","country":"US","advertiser":{"id":"108824017345866","name":"Meta","url":"https://www.facebook.com/Meta/","logo":"https://scontent-atl3-1.xx.fbcdn.net/v/t1.6435-9/119568341_200337161527884_7846459746434232698_n.png?stp=dst-png_s60x60&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=qaRlosGC9wUQ7kNvwH_c6S1&_nc_oc=Adq6Kf5L_Tkx2E3_ZTPgkkJBqBFrUF2yFzbizYtSLVcyom-ZAmB0zM6FgNhqa6CE4bQ&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_gid=SxD9styajND2_8-5Hiv5XQ&_nc_ss=72289&oh=00_AQB38PZJl2olGB2U4-yzTIbucPjM7a_5C-sAcPDMbf_TKA&oe=6A89438E"},"media":["https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQOW2b9UEJoszgGizc9hrdAjx8h2PNmX5EFioCovqhnhZrPmWYYs2jrz2_k4rgn72viqiAXdYrPWHCU-Gie0kjeq.mp4?_nc_cat=103&_nc_sid=ef5aa3&_nc_ht=video-atl3-1.xx.fbcdn.net&_nc_ohc=nys365hpMxcQ7kNvwHgMgqj&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5WSV9VU0VDQVNFX1BST0RVQ1RfVFlQRS4uQzMuMzIwLmFzaWNfaHExX3NkX3Byb2dyZXNzaXZlIiwieHB2X2Fzc2V0X2lkIjo2NjAxMjk2OTAzNjcwMTMsImFzc2V0X2FnZV9kYXlzIjoyNDksInZpX3VzZWNhc2VfaWQiOjEwNjgwLCJkdXJhdGlvbl9zIjozMCwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=SxD9styajND2_8-5Hiv5XQ&_nc_ss=72289&_nc_zt=28&oh=00_AQBnmCAlNRahN4AsgdZ38Ac5EdAxMjL50nCNBkLLyltBwA&oe=6A678B84","https://scontent-atl3-2.xx.fbcdn.net/v/t39.35426-6/120102604_752266025568907_2538374744503325031_n.jpg?_nc_cat=105&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=zOy1dkRrjNwQ7kNvwE6UWb4&_nc_oc=AdoeR4HjsR3dT59BfJw-cJn13C_EDqxVPAUcXGvB7N-aH8ENNZZDwhMcyf83dUgpiPo&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SxD9styajND2_8-5Hiv5XQ&_nc_ss=72289&oh=00_AQAeRefR3xV4gR8tcoNYd2lM6c7GaZUDOV0GYx4rVDnAiA&oe=6A677DC7"]},{"platform":"facebook_ad_library","id":"3335260483258933","url":"https://www.facebook.com/ads/library/?id=3335260483258933","text":"The Voting Information Center on Facebook - one-tap voting info from election experts and authorities in one place.","headline":"Voting Information Center","cta":"Learn more","landingUrl":"http://facebook.com/votinginformationcenter","adFormat":"VIDEO","firstShown":"2020-09-23T07:00:00.000Z","lastShown":"2020-10-05T07:00:00.000Z","impressions":">1M","spend":">$1M","country":"US","advertiser":{"id":"108824017345866","name":"Facebook","url":"https://www.facebook.com/Meta/","logo":"https://scontent-atl3-1.xx.fbcdn.net/v/t1.6435-9/119568341_200337161527884_7846459746434232698_n.png?stp=dst-png_s60x60&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=qaRlosGC9wUQ7kNvwH_c6S1&_nc_oc=Adq6Kf5L_Tkx2E3_ZTPgkkJBqBFrUF2yFzbizYtSLVcyom-ZAmB0zM6FgNhqa6CE4bQ&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_gid=SxD9styajND2_8-5Hiv5XQ&_nc_ss=72289&oh=00_AQB38PZJl2olGB2U4-yzTIbucPjM7a_5C-sAcPDMbf_TKA&oe=6A89438E"},"media":["https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQOW2b9UEJoszgGizc9hrdAjx8h2PNmX5EFioCovqhnhZrPmWYYs2jrz2_k4rgn72viqiAXdYrPWHCU-Gie0kjeq.mp4?_nc_cat=103&_nc_sid=ef5aa3&_nc_ht=video-atl3-1.xx.fbcdn.net&_nc_ohc=nys365hpMxcQ7kNvwHgMgqj&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5WSV9VU0VDQVNFX1BST0RVQ1RfVFlQRS4uQzMuMzIwLmFzaWNfaHExX3NkX3Byb2dyZXNzaXZlIiwieHB2X2Fzc2V0X2lkIjo2NjAxMjk2OTAzNjcwMTMsImFzc2V0X2FnZV9kYXlzIjoyNDksInZpX3VzZWNhc2VfaWQiOjEwNjgwLCJkdXJhdGlvbl9zIjozMCwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=SxD9styajND2_8-5Hiv5XQ&_nc_ss=72289&_nc_zt=28&oh=00_AQBnmCAlNRahN4AsgdZ38Ac5EdAxMjL50nCNBkLLyltBwA&oe=6A678B84","https://scontent-atl3-2.xx.fbcdn.net/v/t39.35426-6/120102604_752266025568907_2538374744503325031_n.jpg?_nc_cat=105&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=zOy1dkRrjNwQ7kNvwE6UWb4&_nc_oc=AdoeR4HjsR3dT59BfJw-cJn13C_EDqxVPAUcXGvB7N-aH8ENNZZDwhMcyf83dUgpiPo&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SxD9styajND2_8-5Hiv5XQ&_nc_ss=72289&oh=00_AQAeRefR3xV4gR8tcoNYd2lM6c7GaZUDOV0GYx4rVDnAiA&oe=6A677DC7"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/facebook/search-companies":{"get":{"operationId":"facebook_ad_library_search_companies","tags":["Facebook Ad Library"],"summary":"Facebook Ad Library Search Companies API","description":"Find Meta Ad Library pages by brand — name-matched, pageId for company-ads (not profileId).\n\nSearch Meta Ad Library advertisers/pages by brand name. Results are relevance-filtered so query tokens must appear in the page name — off-brand pages that merely appeared near the keyword (e.g. Sukeban for q=nike) are dropped; empty beats spam. Each company returns id = pageId = advertiserId (pass to /facebook/company-ads), profileId when the facebook.com/{digits}/ URL uses a different numeric identity, vanity or numeric url, logo, and libraryUrl (ready view_all_page_id link). Chain: search-companies → companies[0].pageId → company-ads?url=. Flat 2 credits.\n\nDocs: https://captapi.com/apis/facebook-ad-library-search-companies","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Company or brand name to search for (min 2 characters). Name-matched — off-brand pages are dropped.","schema":{"type":"string","minLength":2}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code. Default US. Non-ISO codes are a definitive 400 INVALID_COUNTRY.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Find Meta Ad Library pages by brand — name-matched, pageId for company-ads (not profileId).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"country":{"type":"string","description":"ISO market you queried (e.g. US). Not a popular-creators feed market."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"companies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this companies item."},"name":{"type":"string","description":"Name of this companies item."},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string","description":"Logo image URL."}}}}}}}},"example":{"success":true,"data":{"query":"nike","country":"US","totalReturned":2,"companies":[{"id":"146705838515566","name":"Sukeban World","url":"https://www.facebook.com/61551864263186/","logo":"https://scontent-iad6-1.xx.fbcdn.net/v/t39.35426-6/517640014_2104272360362331_1464623957160374455_n.jpg?stp=dst-jpg_s60x60_tt6&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=zj4Fm9x6lhEQ7kNvwGyzer2&_nc_oc=Adpw1Rqb_eBzffqqgyQt5_CPB2Dct1h7kaRFJQZmeucV_ui5BXf-Q6skKKVFDUKvDH4&_nc_zt=14&_nc_ht=scontent-iad6-1.xx&_nc_gid=WFVhUXC3vFhp5HqXMO2_vg&_nc_ss=72289&oh=00_AQCbgqCqvp545MCPZrHlySJ8QWqgsWnjuxmEGnyIw8Gw3A&oe=6A611F63"},{"id":"15087023444","name":"Nike","url":"https://www.facebook.com/nike/","logo":"https://scontent-iad6-1.xx.fbcdn.net/v/t39.35426-6/366635364_819887626183060_5665913834577832309_n.jpg?stp=dst-jpg_s60x60_tt6&_nc_cat=106&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=cpw1LHoxRRMQ7kNvwF0VELk&_nc_oc=Adp4gYKupQoA3SFulWbqwUFHqP4Hb9COtOidu_sWgA0fqGKhHNgkorx0YOcUbNCeAek&_nc_zt=14&_nc_ht=scontent-iad6-1.xx&_nc_gid=WFVhUXC3vFhp5HqXMO2_vg&_nc_ss=72289&oh=00_AQCzxYXtTr8L2PBX03C3WTbVmtXlrB0ZHR45OVmp6Pv9mA&oe=6A612326"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/facebook/ad-details":{"get":{"operationId":"facebook_ad_library_ad_details","tags":["Facebook Ad Library"],"summary":"Facebook Ad Details API","description":"One Meta ad by ID — same creative as search, plus delivery breakdowns when Meta publishes them.\n\nPaste a Meta Ad Library ad URL or archive ID and get that creative as clean JSON. Creative fields (text, headline, cta, landingUrl, images[], videos[], advertiser) match a search hit for the same id — use this for ID lookup without paging search. media[] is the canonical URL list (one primary asset per creative, including DCO cards) — resizedUrl and video posters live on images[] / videos[], which fill from cards when Meta leaves the typed arrays empty. DCO {{product.*}} tokens fall back to cards[0] and set textIsFromCard. mediaUrlsExpireAt is the earliest Meta CDN oe= stamp (~5 days). caption is Meta's display domain line under the creative (e.g. blogs.groovewriters.com), not ad copy — text / headline / linkDescription hold the copy. advertiser.id is the Ad Library page id; advertiser.profileId is the facebook.com/{digits} namespace when it differs (url is built from profileId); advertiser.location is keyed null when Meta withholds it. Delivery extras when Meta publishes them (mostly political/issue and EU AAA ads): publisherPlatforms, demographicDistribution[], regionDistribution[], ageCountryGenderReachBreakdown / euTransparency, variantCount (collation), isAaaEligible, spendRange {raw, currency, min, max} (max null on open-ended bands like >$1M). Meta publishes spend and impression ranges only for political and issue ads in regions that require disclosure; commercial advertisers omit both. There is no platforms twin. On commercial ads Meta often withholds those breakdowns — keys stay present as null so the schema is stable. Always 2 credits — native and fallback share one price. fetchPath is native | fallback.\n\nDocs: https://captapi.com/apis/facebook-ad-library-ad-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Meta Ad Library ad URL or ad ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"One Meta ad by ID — same creative as search, plus delivery breakdowns when Meta publishes them.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Body copy of the creative. DCO {{product.*}} tokens fall back to cards[0] (textIsFromCard)."},"headline":{"type":"string","description":"Ad headline / title when Meta exposes it. Not a profile headline. DCO tokens fall back to cards[0]."},"cta":{"type":"string","description":"Call-to-action label (e.g. Learn more)."},"landingUrl":{"type":"string","description":"Click-through URL from the creative."},"adFormat":{"type":"string","description":"Creative format Meta labelled (IMAGE, VIDEO, …)."},"firstShown":{"type":"string","description":"Meta delivery-start date as YYYY-MM-DD (Pacific calendar day)."},"lastShown":{"type":"string","description":"Meta delivery-end date as YYYY-MM-DD (Pacific calendar day)."},"impressions":{"type":"string","description":"Impression band when Meta publishes it. Commercial usually null."},"spend":{"type":"string","description":"Spend band when Meta publishes it (political/issue ads). Commercial usually null."},"country":{"type":"string","description":"ISO market when Meta publishes one on the detail page. Not a popular-creators feed market."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Ad Library page id (view_all_page_id). The one identity to join on."},"name":{"type":"string","description":"Page display name."},"url":{"type":"string","description":"Page URL — built from profileId when Meta exposes that namespace."},"logo":{"type":"string","description":"Page profile picture URL."}}},"media":{"type":"array","items":{"type":"string"},"description":"Canonical URL list — one primary asset per creative, including DCO cards. Use images[] / videos[] for resizedUrl and posters."}}}}},"example":{"success":true,"data":{"platform":"facebook_ad_library","id":"317161109571794","url":"https://www.facebook.com/ads/library/?id=317161109571794","text":"The Voting Information Center—one-tap voting registration information from election experts and authorities in one place.","headline":"Voting Information Center","cta":"Learn more","landingUrl":"http://facebook.com/votinginformationcenter","adFormat":"VIDEO","firstShown":"2020-09-22T07:00:00.000Z","lastShown":"2020-10-05T07:00:00.000Z","impressions":">1M","spend":">$1M","country":"US","advertiser":{"id":"108824017345866","name":"Meta","url":"https://www.facebook.com/Meta/","logo":"https://scontent-dfw5-2.xx.fbcdn.net/v/t1.6435-9/119568341_200337161527884_7846459746434232698_n.png?stp=dst-png_s60x60&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=ZqrAiU5uA1sQ7kNvwHsXpf9&_nc_oc=AdqVVq_tCCm9QfdHEQa5d82UKJTt9DT4LxrW9m95vTx7VJLcyuQH74gIZv0WeiJgIfo&_nc_zt=23&_nc_ht=scontent-dfw5-2.xx&_nc_gid=oKi5rqU7-78Y6XFLpAVqvA&_nc_ss=79289&oh=00_AQDIgONmGu5lj1i0jpr_nH9fjb7afatDtlB-wsXtBQNtZQ&oe=6A8F324E"},"media":["https://video-dfw5-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQNN757NtitUcJnpv0ODeMH6fXo-yFM-X90P2W82Zsrc70oOzST9lrKgscKf21SHBUtZ9pdKMclY8s32B0eRJ7o.mp4?_nc_cat=106&_nc_sid=ef5aa3&_nc_ht=video-dfw5-1.xx.fbcdn.net&_nc_ohc=DeBVZh2ChkAQ7kNvwELM_GV&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5WSV9VU0VDQVNFX1BST0RVQ1RfVFlQRS4uQzMuMzQwLmFzaWNfaHExX3NkX3Byb2dyZXNzaXZlIiwieHB2X2Fzc2V0X2lkIjo4MzE0MTAwMzMxNDk2MzYsImFzc2V0X2FnZV9kYXlzIjoyNDEsInZpX3VzZWNhc2VfaWQiOjEwNjgwLCJkdXJhdGlvbl9zIjoxNSwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=oKi5rqU7-78Y6XFLpAVqvA&_nc_ss=79289&_nc_zt=28&oh=00_AQB-CUR53tb21BEWdlRLg5BhAauE3-hDDO9zmz06SvSAdg&oe=6A6D9B48","https://scontent-dfw5-1.xx.fbcdn.net/v/t39.35426-6/120065387_2711663819108220_8472417301728012411_n.jpg?_nc_cat=105&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=JCEJHIw0engQ7kNvwEcgh1o&_nc_oc=Ado6Dn6wrEd2aZKTiM6OLVJyx_BYbHRC0Bmv70xAZp21Pm2Enab2l80KoUSxQZAs1Ow&_nc_zt=14&_nc_ht=scontent-dfw5-1.xx&_nc_gid=oKi5rqU7-78Y6XFLpAVqvA&_nc_ss=79289&oh=00_AQAw5ZEVUbeJYpBcx6Qa4wV6V-hZRjNvtI487nUdgq8UZA&oe=6A6D850A"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/facebook/ad-transcript":{"get":{"operationId":"facebook_ad_library_ad_transcript","tags":["Facebook Ad Library"],"summary":"Facebook Ad Copy API","description":"Written creative copy from a Meta ad — headline, body, CTA, landing URL.\n\nReturns the ad's written copy — headline, body text, CTA and landing URL. Meta does not expose ad audio, so this is not a speech transcript. Paste a Meta Ad Library ad URL or ad ID. There is no speaker, start, duration, timestamp, or segments array (those belong on instagram/transcript and tiktok/transcript). The path /ad-transcript is kept for compatibility. Always 2 credits.\n\nDocs: https://captapi.com/apis/facebook-ad-library-ad-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Meta Ad Library ad URL or ad ID. Returns the ad's written copy — headline, body text, CTA and landing URL. Meta does not expose ad audio, so this is not a speech transcript. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Written creative copy from a Meta ad — headline, body, CTA, landing URL.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"adId":{"type":"string","description":"Ad id. Example: \"317161109571794\"."},"transcript":{"type":"string","description":"Complete text transcript (file-upload endpoints). Timed caption/ASR endpoints use text instead."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"string","description":"Speaker label for the segment."},"text":{"type":"string","description":"Body copy of the creative. Not spoken audio."},"start":{"type":"integer","description":"Start time in seconds."},"duration":{"type":"integer","description":"Duration when present — prefer durationSeconds (number) and durationText on endpoints that expose both."},"timestamp":{"type":"string","description":"Human-readable timestamp (MM:SS format)."}}}},"wordCount":{"type":"integer","description":"Total number of words in the transcript (file-upload endpoints)."},"segments":{"type":"integer","description":"Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this advertiser item."},"name":{"type":"string","description":"Name of this advertiser item."},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string","description":"Logo image URL."}}}}}}},"example":{"success":true,"data":{"platform":"facebook_ad_library","url":"https://www.facebook.com/ads/library/?id=317161109571794","adId":"317161109571794","transcript":"headline: Voting Information Center\nbody: The Voting Information Center—one-tap voting registration information from election experts and authorities in one place.\ncta: Learn more\nlandingUrl: http://facebook.com/votinginformationcenter","transcriptSegments":[{"speaker":"headline","text":"Voting Information Center","start":0,"duration":0,"timestamp":"00:00"},{"speaker":"body","text":"The Voting Information Center—one-tap voting registration information from election experts and authorities in one place.","start":0,"duration":0,"timestamp":"00:00"},{"speaker":"cta","text":"Learn more","start":0,"duration":0,"timestamp":"00:00"},{"speaker":"landingUrl","text":"http://facebook.com/votinginformationcenter","start":0,"duration":0,"timestamp":"00:00"}],"wordCount":25,"segments":4,"advertiser":{"id":"108824017345866","name":"Meta","url":"https://www.facebook.com/Meta/","logo":"https://scontent-dfw5-2.xx.fbcdn.net/v/t1.6435-9/119568341_200337161527884_7846459746434232698_n.png?stp=dst-png_s60x60&_nc_cat=100&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=ZqrAiU5uA1sQ7kNvwHsXpf9&_nc_oc=AdqVVq_tCCm9QfdHEQa5d82UKJTt9DT4LxrW9m95vTx7VJLcyuQH74gIZv0WeiJgIfo&_nc_zt=23&_nc_ht=scontent-dfw5-2.xx&_nc_gid=oKi5rqU7-78Y6XFLpAVqvA&_nc_ss=79289&oh=00_AQDIgONmGu5lj1i0jpr_nH9fjb7afatDtlB-wsXtBQNtZQ&oe=6A8F324E"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/tiktok/search":{"get":{"operationId":"tiktok_ad_library_search","tags":["TikTok Ad Library"],"summary":"TikTok Ad Library Search API","description":"Search TikTok Commercial Content Library — relevance-filtered, uniform null schema (2 credits).\n\nSearch TikTok's Commercial Content Library (library.tiktok.com / EU DSA) by keyword. Local keyword matching is case-insensitive whole-word match=any|all (hair ≠ wheelchair). Envelope uses candidatesScanned / truncated (true when literalMatches > totalReturned); each hit has matchedFrom as a string array of matched fields. platform is tiktok (library=dsa). media[] are objects with url/type/expiresAt when signed. Ads share a uniform key set — withheld fields are null, not missing. firstShown/lastShown are omitted (DSA list XHR stamps scrape/serve times, not run dates) — use /tiktok/ad-details for calendar-day ISO dates. advertiser is always {id,name,url,logo,location}. Flat 2 credits when results are returned (empty is free); the fallback path is capped at 5. Native-only by default (the paid fallback is parked). A miss is a retryable 503 at 0 credits. When the fallback is enabled and the native fetch is slow, it starts beside it (15s for one-page fetches, later for larger limits) and the first useful answer wins. country default GB (US often empty). For brand performance use /v1/ad-library/tiktok/top-ads.\n\nDocs: https://captapi.com/apis/tiktok-ad-library-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keyword or advertiser to search TikTok Commercial Content Library (min 2 characters).","schema":{"type":"string","minLength":2}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code (e.g. GB, DE, FR). Default GB. TikTok's Commercial Content Library only covers the EU/EEA, the UK and Switzerland (32 countries) — other codes (US, SA, …) return 400 UNSUPPORTED_REGION with the supported list; TikTok has no ad-library data for them.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"GB"}},{"name":"match","in":"query","required":false,"description":"Keyword token mode: \"any\" (default, OR whole-word) or \"all\" (AND). hair ≠ wheelchair. Literal hits lead; already-fetched SERP ads fill behind them up to limit (matchedFrom [] = ranked fill). Empty results are free.","schema":{"type":"string","default":"any"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits per call.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Search TikTok Commercial Content Library — relevance-filtered, uniform null schema (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"ads":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"adFormat":{"type":"string","description":"Format of the ad creative."},"firstShown":{"type":"string","description":"When the ad was first shown."},"lastShown":{"type":"string","description":"When the ad was last shown."},"impressions":{"type":"string","description":"Estimated ad impressions."},"advertiser":{"type":"object","properties":{"name":{"type":"string"},"location":{"type":"string"}},"description":"Advertiser running the ad."},"media":{"type":"array","items":{"type":"string"},"description":"Array of {url, type, expiresAt}. expiresAt is second-precision from x-expires / VExpiration / expire=; null when the URL is unsigned (library.tiktok.com often has no expiry param). width/height/durationSeconds are not on this surface."},"impressionsRange":{"type":"object","properties":{"min":{"type":"integer"},"max":{"type":"integer"},"raw":{"type":"string"}},"description":"Parsed impressions as {min, max, raw}. Prefer this for sorting; impressions stays the Meta display string. Usually null for commercial ads."}}}}}}}},"example":{"success":true,"data":{"query":"nike","country":"GB","totalReturned":2,"ads":[{"platform":"tiktok_ad_library","id":"1872402620173314","url":"https://library.tiktok.com/ads/detail/?ad_id=1872402620173314","text":"Professional Massage Therapy for Relaxation, Recovery, and Wellness.","adFormat":"video","firstShown":"2026-08-02T00:00:00.000Z","lastShown":"2026-08-02T00:00:00.000Z","impressions":"0-1K","advertiser":{"name":"HongKong AdTiger Media Co., Limited","location":"Hong Kong"},"media":["https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0051c001-sg/3dff80d5a4f73a22d6682afa5f45d78d~tplv-tiktokx-origin.jpeg?dr=14582&refresh_token=cd5ba53f&x-expires=1785686400&x-signature=m6GakMpuep1d%2BRNlCGpC0K9CiWE%3D&t=4d5b0474&ps=13740610&a","https://library.tiktok.com/api/v1/cdn/1785667308/video/aHR0cHM6Ly92NzcudGlrdG9rY2RuLmNvbS9mMTgyNTU3Yzg1OGVjOGEwM2RkMGQ1MjRjZTRlOWM4Ny82YTZmNzM3ZS92aWRlby90b3MvYWxpc2cvdG9zLWFsaXNnLXZlLTAwNTFjMDAxLXNnL29zOU5VSkFzZ0lMUGVtT0RoRlVHZUdSQzNSb1JnbW5lQUFKTEdiLw==/fee44425-7600-4c48-8df9-ce242eb52069?a=475769&bt=593&btag=e00088000&bti=PDU2NmYwMy86&ft=.NpOcInz7Thz~INGXq8Zmo&l=2026080218414895FDAC2A6CF961573BDF&mime_type=video_mp4&rc=N2hoOzVpZzM1OTs0aDM5aUBpajVpOGw5cjRqPDMzODYzNEBjMmFeYy9fXzMxMS0zLTJjYSNxZy82MmRraWthLS1kMC1zcw%3D%3D&signature=v7cmUB0AYCwTjyukuWGzRGtiRJKMRb6UOyUo2szN2pY%3D&vvpl=1"],"impressionsRange":{"min":0,"max":1000,"raw":"0-1K"}},{"platform":"tiktok_ad_library","id":"1872069030885697","url":"https://library.tiktok.com/ads/detail/?ad_id=1872069030885697","text":"Visit the website and learn more.","adFormat":"video","firstShown":"2026-08-02T00:00:00.000Z","lastShown":"2026-08-02T00:00:00.000Z","impressions":"0-1K","advertiser":{"name":"VV7 HOLDING LLC","location":"United States"},"media":["https://p16-common-sign.tiktokcdn.com/ad-site-i18n-sg/20260729c7c7767b1bd4c6634305aba2~tplv-tiktokx-origin.jpeg?dr=14582&refresh_token=a7fcf310&x-expires=1785686400&x-signature=H8hajcaAaLOzUe4Qcbse8V10R%2Bs%3D&t=4d5b0474&ps=13740610&shp=0c75dd76&s","https://library.tiktok.com/api/v1/cdn/1785667310/video/aHR0cHM6Ly92NzcudGlrdG9rY2RuLmNvbS9kOTEzMzQzYmVlZTBlODkyNDRhOTZjYmE0ZTdjYzk1OS82YTZmNzM2MC92aWRlby90b3MvYWxpc2cvdG9zLWFsaXNnLXZlLTAwNTFjMDAxLXNnL28wM3VvbDdZak5BRUFpSHcybXk5enB2aVVNY0JCWGFRQ3FOSUEv/a83a6b69-bc09-432a-a704-4cb96c22fbb2?a=475769&bt=997&btag=e000b8000&bti=PDU2NmYwMy86&ft=.NpOcInz7Thn~INGXq8Zmo&l=202608021841508CA9C9F51CA00456AC9F&mime_type=video_mp4&rc=Z2dpNWY5ZTdmM2k8ZzU2OEBpM3FvcnU5cmw2PDMzODYzNEBhMDUyLjFhXjQxMF5jXy1eYSNiY3MwMmRrLmlhLS1kMC1zcw%3D%3D&signature=c1LXfiH6SOrrYOTEWg4TRCzE%2BNR%2BSu0k%2Fuj%2FDEUJ3vk%3D&vvpl=1"],"impressionsRange":{"min":0,"max":1000,"raw":"0-1K"}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/tiktok/top-ads":{"get":{"operationId":"tiktok_ad_library_top_ads","tags":["TikTok Ad Library"],"summary":"TikTok Creative Center Top Ads API","description":"TikTok Creative Center Top Ads — one ~20-row leaderboard page, not a library search (flat 2; ~1/ad on the fallback path).\n\nq filters the top-N Creative Center leaderboard; it is not a library search. To find a known advertiser's ads, use /v1/ad-library/tiktok/ad-details by ad id. Pull high-performing auction ads from one signed top_ads/v2/list page (~20 rows) as clean JSON: id, url (per-ad detail page), title, brandName (= advertiser.name when present), advertiser{id,name}, likes + likesIsApproximate, ctr, costTier when present, resolved industry/industryKey, objective, and video{} (urlHd only when a distinct HD rendition exists). limit (default 20, max 20) only trims that page — it cannot grow the pool. Creative Center does not expose ad run dates on the list surface — use /tiktok/ad-details (DSA) for firstShown/lastShown (search omits them). Optional ctrTier/isSparkAd appear only when upstream ships them (never null-padded). Keyword q is case-insensitive whole-word match=any|all on title/brandName/industry/objective (hair ≠ wheelchair). There is no tags field. advertiser.name is often null in the default US market, so brand search cannot match there. Each literal hit includes matchedFrom (field names that matched) and the envelope reports candidatesScanned/filteredOut/literalMatches (null when q is omitted)/matchBasis/truncatedReason. When no title/brand whole-word hits, ads[] is still TikTok's keyword-ranked page (matchBasis=ranked, literalMatches=0) — the same list Creative Center shows — not an empty miss. Empty results and upstream timeouts are never charged. A real browser is required — Creative Center HTML is an empty shell and the list API needs page-signed requests. We intercept the signed list XHR and exit when that JSON arrives (typically 30-60 seconds; not networkidle). Flat 2 credits on the native path; the fallback path bills ~1 credit per returned ad (min 2; ~20 at default limit). truncatedReason is limit (your cap trimmed the page) or leaderboard-page (the page was short and Creative Center still had more); null when truncated is false. Pass cache=true for a 24h hit (0 credits).\n\nDocs: https://captapi.com/apis/tiktok-ad-library-top-ads","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Optional keyword that ranks the one ~20-row leaderboard page — not a library search. Case-insensitive whole-word hits on title/brandName/industry/objective (hair ≠ wheelchair) come first; the rest of TikTok's keyword-ranked page follows as fill (matchedFrom [] on those ads, rankedFill in the envelope). There is no tags field. advertiser.name is often null in the default US market. Envelope candidatesScanned is the pre-filter pool size. For a known advertiser, use /tiktok/ad-details by ad id.","schema":{"type":"string"}},{"name":"match","in":"query","required":false,"description":"Keyword token mode: \"any\" (default, OR) or \"all\" (AND). Zero whole-word hits still return TikTok's keyword-ranked page as matchBasis=ranked (literalMatches=0).","schema":{"type":"string","default":"any"}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code. Default US. Non-ISO codes are a definitive 400 INVALID_COUNTRY (Creative Center used to quietly return an empty leaderboard for them).","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"period","in":"query","required":false,"description":"Lookback window in days: 7, 30, or 180. Default 30.","schema":{"type":"integer","default":30}},{"name":"orderBy","in":"query","required":false,"description":"Sort: for_you, likes, ctr, impressions, or cost. Default for_you.","schema":{"type":"string","default":"for_you"}},{"name":"industry","in":"query","required":false,"description":"Optional industry key or label from Creative Center.","schema":{"type":"string"}},{"name":"objective","in":"query","required":false,"description":"Optional campaign objective (e.g. Traffic, Conversion, Reach).","schema":{"type":"string"}},{"name":"adFormat","in":"query","required":false,"description":"Optional format filter: spark or non_spark. Served only by the extended fetcher — while it is disabled, adFormat returns 503 filter_unavailable (retryable false, not billed). Omit adFormat for the native leaderboard.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 20). One Creative Center leaderboard page is ~20 rows; limit only trims that pool — it cannot scan more candidates. Flat 2 credits on the native path; the fallback path ~1 credit per returned ad (min 2).","schema":{"type":"integer","maximum":20,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"TikTok Creative Center Top Ads — one ~20-row leaderboard page, not a library search (flat 2; ~1/ad on the fallback path).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"description":"The search query you sent."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"period":{"type":"integer","description":"Lookback window in days used for the ranking: 7, 30, or 180."},"orderBy":{"type":"string","description":"Sort you asked for: for_you, likes, ctr, impressions, or cost."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"datesPresent":{"type":"integer","description":"Dates present. Example: 1."},"match":{"type":"string","description":"Echo of the match query param (\"any\" or \"all\") — the mode you asked for."},"matchedFrom":{"type":"integer","description":"Per-ad only, and only when q is set: string[] of fields that matched (title, brandName, industry, objective). There is no tags field. Never the envelope scan count."},"filteredOut":{"type":"integer","description":"Rows dropped by the local whole-word keyword filter (0 when matchBasis is ranked)."},"literalMatches":{"type":"integer","description":"Always keyed. Count of rows that passed local whole-word matching when q is set; null when q is omitted (no filter ran). 0 with ads present means matchBasis=ranked."},"matchBasis":{"type":"string","description":"Mode actually applied: any|all when whole-word hits exist; ranked when q was set and TikTok's keyword page is returned without a whole-word hit; none when q is omitted."},"ads":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this ads item."},"brandName":{"type":"string","description":"Same as advertiser.name when present. Spark Ads with \"Not Mention\" fall back to the organic creator. Omitted when no name exists."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ads item."},"name":{"type":"string"}},"description":"Grouping axis {id,name}. id may be brand_id or Spark author uid; null when Creative Center withholds it. name mirrors brandName when present — often null on every US row (the default market), so brand matching cannot fire there. Spark falls back to the creator nickname."},"firstSeen":{"type":["string","null"],"description":"First seen. Example: \"2026-01-10T00:00:00.000Z\"."},"lastSeen":{"description":"Last seen."},"likes":{"type":"integer","description":"Like count (number)."},"likesIsApproximate":{"type":"boolean","description":"true when likes looks like a rounded Creative Center bucket (e.g. multiples of 1k/100k); false when the integer looks exact."},"ctr":{"type":"number","description":"Click-through rate signal from Creative Center (typically 0–1)."},"ctrTier":{"type":"string","description":"Present only when Creative Center ships a CTR bucket. Omitted (not null) when withheld."},"costTier":{"type":"integer","description":"Creative Center cost bucket when present."},"isSparkAd":{"type":"boolean","description":"Present only when upstream sets Spark/non-Spark. Omitted when withheld. adFormat is omitted when it would only repeat Spark/Non-Spark."},"industry":{"type":"string","description":"Industry. Example: \"Charity & Public Welfare\"."},"industryKey":{"type":"string","description":"Creative Center industry key / label id."},"objective":{"type":"string","description":"Objective. Example: \"Reach\"."},"video":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"urlHd":{"type":"string"},"cover":{"type":"string"},"durationSeconds":{"type":"integer"},"width":{"type":"integer"},"height":{"type":"integer"}},"description":"Object with id, url, urlHd, cover, durationSeconds, width."}}}}}}}},"example":{"success":true,"data":{"query":null,"country":"US","period":30,"orderBy":"ctr","totalReturned":2,"datesPresent":1,"match":"any","matchedFrom":2,"filteredOut":0,"literalMatches":2,"matchBasis":"none","ads":[{"platform":"tiktok_creative_center","id":"7662489073849090066","url":"https://ads.tiktok.com/business/creativecenter/topads/7662489073849090066/pc/en","title":"Nuuly loves a woman in a suit ! #ad #nuulypartner #nuuly #frthoidolovenuuly","brandName":"nuuly","advertiser":{"id":"brand_nuuly","name":"nuuly"},"firstSeen":"2026-01-10T00:00:00.000Z","lastSeen":null,"likes":620,"likesIsApproximate":false,"ctr":0.17,"ctrTier":"below_50%","costTier":1,"isSparkAd":false,"industry":"Charity & Public Welfare","industryKey":"label_23105000000","objective":"Reach","video":{"id":"v10033g50000example","url":"https://v16m-default.tiktokcdn.com/example.mp4","urlHd":"https://v16m-default.tiktokcdn.com/example-hd.mp4","cover":"https://p16-common-sign.tiktokcdn.com/example~tplv-noop.image","durationSeconds":15,"width":720,"height":1280}},{"platform":"tiktok_creative_center","id":"7662938725836324871","url":"https://ads.tiktok.com/business/creativecenter/topads/7662938725836324871/pc/en","title":"How I fix my hair EASILY on the go #hair #hairhack","brandName":"Creator X","advertiser":{"id":"uid42","name":"Creator X"},"firstSeen":null,"lastSeen":null,"likes":5,"likesIsApproximate":false,"ctr":0.62,"ctrTier":"top_25%","costTier":0,"isSparkAd":true,"industry":"Charity & Public Welfare","industryKey":"label_23105000000","objective":"Product Sales","video":{"id":"v10033g50000example","url":"https://v16m-default.tiktokcdn.com/example.mp4","cover":"https://p16-common-sign.tiktokcdn.com/example~tplv-noop.image","durationSeconds":15,"width":720,"height":1280}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/tiktok/ad-details":{"get":{"operationId":"tiktok_ad_library_ad_details","tags":["TikTok Ad Library"],"summary":"TikTok Ad Details API","description":"One TikTok Commercial Content Library ad by ID — calendar-day dates, always 2 credits.\n\nPaste a TikTok Ad Library URL or ad ID and get that creative as clean JSON with the same uniform key set as /tiktok/search (null when withheld) plus calendar-day YYYY-MM-DD firstShown/lastShown (search omits those). platform=tiktok, library=dsa, media[] objects {url,type,expiresAt} — expiresAt is x-expires / VExpiration / expire= to the second, or null when the URL is unsigned (never midnight-of-fetch). impressions from Unique users seen when disclosed, spend only when shipped. advertiser is always {id,name,url,logo,location} — name is a human label, never a bare numeric id. Always 2 credits on success — native and fallback paths share one price (no 2-vs-5 surprise). Response includes fetchPath: \"native\" | \"fallback\" so you can see which path ran. Default country GB (EU-led library).\n\nDocs: https://captapi.com/apis/tiktok-ad-library-ad-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"TikTok Ad Library URL or numeric ad ID. Inputs with no extractable numeric ID are a definitive 400. An ID TikTok's library positively reports as nonexistent is a definitive 404 AD_NOT_FOUND (ads outside the EU/EEA+UK+CH never enter the library, and entries expire one year after last impression). The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code. Default GB. Only EU/EEA + UK + CH are covered by TikTok's library; other codes return 400 UNSUPPORTED_REGION.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"GB"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"One TikTok Commercial Content Library ad by ID — calendar-day dates, always 2 credits.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"adFormat":{"type":"string","description":"Format of the ad creative."},"firstShown":{"type":"string","description":"Calendar day the ad was first shown (YYYY-MM-DD). TikTok publishes day granularity — not a UTC midnight instant and not MM/DD/YYYY."},"lastShown":{"type":"string","description":"Calendar day the ad was last shown (YYYY-MM-DD). Same day-granularity rule as firstShown."},"advertiser":{"type":"object","properties":{"name":{"type":"string","description":"Name of this advertiser item."}}},"media":{"type":"array","items":{"type":"string"},"description":"Array of {url, type, expiresAt}. expiresAt is a signed-CDN parse (x-expires / VExpiration / expire=) to the second, or null when the URL has no expiry param. The /api/v1/cdn/{unix}/ path segment is not an expiry. width/height/durationSeconds are omitted — TikTok DSA has not been observed to publish them."}}}}},"example":{"success":true,"data":{"platform":"tiktok_ad_library","id":"1872034324356433","url":"https://library.tiktok.com/ads/detail/?ad_id=1872034324356433","text":"#gandurilemele #foryoupage❤️❤️ Buna dimineața tuturor!Zi binecuvântata tuturor!🙏🙏🙏","adFormat":"video","firstShown":"07/29/2026","lastShown":"07/29/2026","advertiser":{"name":"alyalina535"},"media":["https://library.tiktok.com/api/v1/cdn/1785356384/video/aHR0cHM6Ly92NzcudGlrdG9rY2RuLmNvbS8zYTU3ZmRiZjYzZGIzYjY5Nzc1NzA5ZjQ0ZTMwOGZkNC82YTZhYjUwZS92aWRlby90b3MvdXNlYXN0MmEvdG9zLXVzZWFzdDJhLXZlLTAwNjgtZXV0dHAvbzRJMXRCVHdBNUVFNlEzMW01emlpY1NNSUE0ZjlLQW53b0JMQ2sv/7467d396-0387-4b9f-90c7-2d2cd26db171?a=475769&bt=1049&btag=e00090000&bti=PDU2NmYwMy86&ft=.NpOcInz7ThRcbuGXq8Zmo&l=20260730041944142876664F10EA1EB193&mime_type=video_mp4&rc=NWZoZWU8ZDM6NDU3OGk6ZEBpM3Q0aHM5cjxsPDMzZjczNUA2YWM2MF9eXmExMWBeYDFgYSNnMjNmMmRzcGdhLS1kMTNzcw%3D%3D&signature=Qzo7c7UEa5N40yYL1KKsuy%2BR%2BCnqSwFptCMo9QOZPtQ%3D&vvpl=1"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/google/company-ads":{"get":{"operationId":"google_ad_library_company_ads","tags":["Google Ad Library"],"summary":"Google Company Ads API","description":"Google publishes spend and impression ranges only for election ads; commercial advertisers omit both.\n\nGoogle publishes spend and impression ranges only for election ads in regions that require disclosure; commercial advertisers omit both. isActive is derived from lastShown — true when the creative was seen within 7 UTC days. Pass an advertiser name, domain (nike.com), or AR… id from advertiser-search and get public commercial creatives as clean JSON: id, url, adFormat, firstShown/lastShown, advertiser, media[], isActive. A name/domain can match more than one Google AR… entity — ads[] and adsCountEstimate are always the single resolvedAdvertiser; siblings are otherMatches[{id, name}], not mixed into the list. ATC does not publish structured copy: adFormat=text is inferred from the absence of an image/video asset — those rows keep text/headline/cta/landingUrl as null (the parser still runs; inactive creatives are not skipped). Image/video rows omit those keys (copy lives in the asset). The same omit convention applies to spend/impressions (election-only) and empty country/countries. Supports country/region, start_date/end_date, sort=last_shown|first_shown, cursor pagination, adsCountEstimate. resolution is always keyed: not-in-library | resolved-no-ads | resolved-filtered-out when ads is empty; null when ads exist (null means the list is populated — it is not a leftover). Flat 2 credits when ads are returned; totalReturned=0 is 0 credits (max 200 per page).\n\nDocs: https://captapi.com/apis/google-ad-library-company-ads","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"advertiser","in":"query","required":true,"description":"Advertiser name, domain (e.g. nike.com), or Google advertiser ID (AR…). Prefer AR… from advertiser-search.","schema":{"type":"string","minLength":2}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country / region code (soft filter). Default US. Alias: region. Non-ISO codes are a definitive 400 INVALID_COUNTRY.","schema":{"type":"string","minLength":2,"maxLength":8,"default":"US"}},{"name":"region","in":"query","required":false,"description":"Alias for country.","schema":{"type":"string","minLength":2,"maxLength":8}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). Flat 2 credits when results are returned; 0 credits when totalReturned is 0.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from nextCursor.","schema":{"type":"string"}},{"name":"start_date","in":"query","required":false,"description":"YYYY-MM-DD — keep creatives whose shown window overlaps this start.","schema":{"type":"string"}},{"name":"end_date","in":"query","required":false,"description":"YYYY-MM-DD — keep creatives whose shown window overlaps this end.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Client-side sort: last_shown (recent activity first) or first_shown. Default is ATC order.","schema":{"enum":["last_shown","first_shown"],"type":"string"}},{"name":"topic","in":"query","required":false,"description":"Only \"all\" is supported (commercial ATC). Google publishes spend and impression ranges only for election ads; commercial advertisers omit both. isActive is true when lastShown is within 7 UTC days.","schema":{"type":"string","default":"all"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Google publishes spend and impression ranges only for election ads; commercial advertisers omit both.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"advertiser":{"type":"string","description":"Advertiser running the ad."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"platformNote":{"type":"string","description":"Platform note."},"ads":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"adFormat":{"type":"string","description":"Inferred from assets — text means no image/video URL, not a labelled text field. ATC does not ship the copy next to that label. text rows always include text/headline/cta/landingUrl (null when SearchCreatives has no copy). image/video rows omit those keys — copy lives in the asset."},"firstShown":{"type":"string","description":"When the ad was first shown."},"lastShown":{"type":"string","description":"When the ad was last shown."},"isActive":{"type":"boolean","description":"Derived: true when lastShown is within 7 UTC days. Google does not publish an activity flag."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ads item."},"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Advertiser running the ad."},"media":{"type":"array","items":{"type":"string"},"description":"Media attached to the item."}}}}}}}},"example":{"success":true,"data":{"advertiser":"nike.com","country":"US","totalReturned":2,"platformNote":"Google publishes spend and impression ranges only for election ads in regions that require disclosure; commercial advertisers omit both. isActive is derived from lastShown — true when the creative was seen within 7 UTC days.","ads":[{"platform":"google","id":"CR13596485266373083137","url":"https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR13596485266373083137","adFormat":"image","firstShown":"2022-11-30T14:47:01.000Z","lastShown":"2026-07-26T13:01:42.000Z","isActive":true,"advertiser":{"id":"AR16735076323512287233","name":"Nike, Inc.","url":"https://adstransparency.google.com/advertiser/AR16735076323512287233"},"media":["https://tpc.googlesyndication.com/archive/simgad/1889619096914274581"]},{"platform":"google","id":"CR00101170943954518017","url":"https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR00101170943954518017","adFormat":"image","firstShown":"2022-11-30T18:54:18.000Z","lastShown":"2026-07-26T12:53:39.000Z","advertiser":{"id":"AR16735076323512287233","name":"Nike, Inc.","url":"https://adstransparency.google.com/advertiser/AR16735076323512287233"},"media":["https://tpc.googlesyndication.com/archive/simgad/3850814477191431652"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/google/ad-details":{"get":{"operationId":"google_ad_library_ad_details","tags":["Google Ad Library"],"summary":"Google Ad Details API","description":"Google publishes spend and impression ranges only for election ads; commercial advertisers omit both.\n\nGoogle publishes spend and impression ranges only for election ads in regions that require disclosure; commercial advertisers omit both. isActive is derived from lastShown — true when the creative was seen within 7 UTC days. Paste a Google Ads Transparency URL with both AR… advertiser and CR… creative IDs. This is ID lookup, not a richer scrape: same commercial SearchCreatives payload as a company-ads row. Response id and advertiser.id always match the request. Flat 2 credits native; the fallback path is capped at 5.\n\nDocs: https://captapi.com/apis/google-ad-library-ad-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"creative_id","in":"query","required":true,"description":"Google Ads Transparency URL containing AR... advertiser and CR... creative IDs. A creative that does not exist under the advertiser is a definitive 404 AD_NOT_FOUND (upstream answered) — 503 is reserved for actual transport failures.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code. Default US. Non-ISO codes are a definitive 400 INVALID_COUNTRY.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Google publishes spend and impression ranges only for election ads; commercial advertisers omit both.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"headline":{"type":"string","description":"Profile headline."},"landingUrl":{"type":"string","description":"Landing page the ad links to."},"adFormat":{"type":"string","description":"Format of the ad creative."},"firstShown":{"type":"string","description":"When the ad was first shown."},"lastShown":{"type":"string","description":"When the ad was last shown."},"impressions":{"type":"string","description":"Estimated ad impressions."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this advertiser item."},"name":{"type":"string","description":"Name of this advertiser item."},"url":{"type":"string","description":"Canonical URL of the item."}}},"media":{"type":"array","items":{},"description":"Media attached to the item."}}}}},"example":{"success":true,"data":{"platform":"google_ad_library","id":"CR08395356613392728065","url":"https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR08395356613392728065","text":"Discover {KeyWord:Nike Shoes} Online At Nike.com. Shop The Official Nike Site.","headline":"{KeyWord:Nike Vomero}","landingUrl":"nike.com","adFormat":"text","firstShown":"2025-09-19T13:04:37.000Z","lastShown":"2026-07-23T06:18:08.000Z","impressions":"7000-8000","country":"Malta, United Arab Emirates, Cyprus, Belgium, United Kingdom, Czechia, Hungary, United States, Iceland, Ireland, Italy, Sweden, India, Spain, Greece, Croatia, Bulgaria, Portugal, Denmark, Lithuania, Poland, Netherlands, Germany, Australia, Norway, France, Romania","advertiser":{"id":"AR18378488041124659201","name":"Nike Retail BV","url":"https://adstransparency.google.com/advertiser/AR18378488041124659201"},"media":[]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/google/advertiser-search":{"get":{"operationId":"google_ad_library_advertiser_search","tags":["Google Ad Library"],"summary":"Google Advertiser Search API","description":"Find Google Ads Transparency AR… entities — ranked multi-result (1 credit when found; empty is free).\n\nSearch advertisers on Google Ads Transparency and get ranked AR… entities with name, url, optional country/adsCount. Brand queries are expanded (nike → Nike, Inc. + regional entities) so country=US prefers the parent company over NIKE SRL. adsCount of 20000 is Google's own display ceiling, not a precise inventory count. Pass advertisers[0].id into /google/company-ads?advertiser=AR… to complete the chain. resolution is not-in-library when advertisers is empty, null when rows exist. Flat 1 credit when advertisers are returned; totalReturned=0 is 0 credits.\n\nDocs: https://captapi.com/apis/google-ad-library-advertiser-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Brand, domain, or advertiser name (min 2 characters). Expanded + ranked so US prefers Inc. over SRL.","schema":{"type":"string","minLength":2}},{"name":"country","in":"query","required":false,"description":"Two-letter ISO country code used for ranking (e.g. US). Default US. Non-ISO codes are a definitive 400 INVALID_COUNTRY.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 10, max 50). Flat 1 credit when results are returned; 0 credits when totalReturned is 0.","schema":{"type":"integer","maximum":50,"minimum":1,"default":10}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Find Google Ads Transparency AR… entities — ranked multi-result (1 credit when found; empty is free).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"advertisers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this advertisers item."},"name":{"type":"string","description":"Name of this advertisers item."},"url":{"type":"string","description":"Canonical URL of the item."}}}}}}}},"example":{"success":true,"data":{"query":"nike","country":"US","totalReturned":1,"advertisers":[{"id":"AR17365672681860497409","name":"NIKE SRL","url":"https://adstransparency.google.com/advertiser/AR17365672681860497409"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/linkedin/search-ads":{"get":{"operationId":"linkedin_ad_library_search_ads","tags":["LinkedIn Ad Library"],"summary":"LinkedIn Ad Library Search API","description":"LinkedIn publishes run dates, impressions and targeting only on a subset of creatives.\n\nLinkedIn publishes run dates, impressions and targeting only on a subset of Ad Library creatives — missing firstShown/impressions/targeting means the detail page has no Ran-from line, not a scrape miss. Search returns SERP cards (id, advertiser, copy, optional media). It does not hydrate 20 detail pages (that path was ~120s, at the request time limit). Use /linkedin/ad-details to hydrate About-the-ad fields when LinkedIn shows them; unpublished keys are omitted. Dates are YYYY-MM-DD; startDate/endDate alias firstShown/lastShown (one Ran-from range). Envelope source is native|extended — flat 2 credits native; extended bills ~3.5 credits per returned ad. Filter with q (advertiser), keyword, companyId, country or countries, startDate/endDate. Page with cursor / paginationToken.\n\nDocs: https://captapi.com/apis/linkedin-ad-library-search-ads","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Advertiser / account owner name (min 2 when used). Provide q/company, keyword, or companyId.","schema":{"type":"string"}},{"name":"company","in":"query","required":false,"description":"Alias of q — advertiser / account owner name.","schema":{"type":"string"}},{"name":"keyword","in":"query","required":false,"description":"Optional keyword filter on ad creative copy. Whole-word hits are ordered first; already-fetched SERP cards without a literal hit fill behind them up to limit (matchedFrom [] = ranked fill).","schema":{"type":"string"}},{"name":"companyId","in":"query","required":false,"description":"LinkedIn numeric company id for exact advertiser match.","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Single ISO country code. Default US. Ignored when countries is set. Non-ISO codes are a definitive 400 INVALID_COUNTRY — LinkedIn would otherwise answer an empty result set as if the filter worked.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"US"}},{"name":"countries","in":"query","required":false,"description":"Comma-separated ISO country codes (e.g. US,CA,MX). Each code is validated — non-ISO codes are a 400 INVALID_COUNTRY.","schema":{"type":"string"}},{"name":"startDate","in":"query","required":false,"description":"Custom range start YYYY-MM-DD (use with endDate).","schema":{"type":"string"}},{"name":"endDate","in":"query","required":false,"description":"Custom range end YYYY-MM-DD (use with startDate).","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Pagination token from paginationToken / nextCursor.","schema":{"type":"string"}},{"name":"paginationToken","in":"query","required":false,"description":"Alias of cursor.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 200). One LinkedIn SERP page is ~25 cards — when limit is higher, further pages are pulled automatically within the request's time budget, so limit=50 fills to 50 when LinkedIn has the ads (hasMore + nextCursor cover the rest). Flat 2 credits per call on the native path; the extended fallback bills ~3.5 credits per returned ad. Response `source` is native or extended so you can see which price applied.","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"LinkedIn publishes run dates, impressions and targeting only on a subset of creatives.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The search query you sent."},"keyword":{"description":"Keyword."},"companyId":{"description":"Company id."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"countries":{"type":"array","items":{"type":"string"},"description":"Countries (array)."},"startDate":{"description":"Alias of firstShown — LinkedIn publishes one Ran-from range."},"endDate":{"description":"Alias of lastShown — LinkedIn publishes one Ran-from range."},"totalAds":{"type":"integer","description":"Total ads matching the LinkedIn Ad Library search criteria."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"paginationToken":{"type":"string","description":"Opaque LinkedIn Ad Library pagination token for the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"isLastPage":{"type":"boolean","description":"Whether LinkedIn reports this search page as the last page."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"platformNote":{"type":"string","description":"LinkedIn publishes run dates, impressions and targeting only on a subset of Ad Library creatives. Search returns the SERP card. Use /linkedin/ad-details to hydrate About-the-ad fields when LinkedIn shows them."},"ads":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this ads item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"cta":{"type":"string","description":"Call-to-action text."},"landingUrl":{"type":"string","description":"Landing page the ad links to."},"adFormat":{"description":"Format of the ad creative."},"firstShown":{"type":"string","description":"Ran-from start as YYYY-MM-DD when LinkedIn publishes it. Alias of startDate."},"lastShown":{"type":"string","description":"Ran-from end as YYYY-MM-DD when LinkedIn publishes it. Alias of endDate."},"impressions":{"type":"string","description":"Estimated ad impressions."},"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this ads item."},"name":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string"}},"description":"Advertiser running the ad."},"media":{"type":"array","items":{},"description":"Media attached to the item."},"description":{"type":["string","null"],"description":"Description of this ads item."},"destinationUrl":{"type":["string","null"],"description":"Click-through / landing URL from the ad creative when LinkedIn publishes one."},"adDuration":{"type":["string","null"],"description":"LinkedIn 'Ran from … to …' availability string."},"startDate":{"type":["string","null"],"description":"Alias of firstShown — LinkedIn publishes one Ran-from range."},"endDate":{"type":["string","null"],"description":"Alias of lastShown — LinkedIn publishes one Ran-from range."},"totalImpressions":{"type":["string","null"],"description":"Estimated total impressions band from LinkedIn Ad Library (e.g. 1k-5k)."},"impressionsByCountry":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"impressions":{"type":"string","description":"Estimated ad impressions."}}},"description":"Per-country impression share rows ({country, impressions})."},"targeting":{"type":["object","null"],"properties":{"language":{"type":"string"},"location":{"type":"string"}},"description":"LinkedIn Ad Library targeting segments (language, location, company, and related keys)."},"carouselImages":{"type":"array","items":{},"description":"Ordered carousel creative image URLs when the ad is a carousel."},"paidForBy":{"type":["string","null"],"description":"Payer entity string from LinkedIn's 'Paid for by' line."},"countries":{"type":"array","items":{"type":"string"},"description":"Countries (array)."},"headline":{"type":"string"}}}},"source":{"description":"native (flat 2 credits) or extended (~3.5 credits per returned ad). Also mirrored in X-Captapi-Source."}}}}},"example":{"success":true,"data":{"query":"microsoft","keyword":null,"companyId":null,"country":"US","countries":["US"],"startDate":null,"endDate":null,"totalAds":7523,"totalReturned":2,"paginationToken":"1456462353-1785251292711","nextCursor":"1456462353-1785251292711","isLastPage":false,"hasMore":true,"platformNote":"LinkedIn publishes run dates, impressions and targeting only on a subset of Ad Library creatives. Search returns the SERP card. Use /linkedin/ad-details to hydrate About-the-ad fields when LinkedIn shows them; ads without a Ran-from line omit those keys.","ads":[{"platform":"linkedin_ad_library","id":"1456323573","url":"https://www.linkedin.com/ad-library/detail/1456323573","text":"Drowning in one off scripts and manual steps? In a free 15 minute consult, our experts help streamline IT Infrastructure Operations with PowerShell.","cta":"Learn more","landingUrl":"https://calendly.com/d/cvqn-kt5-t72/free-consultation?utm_campaign=32735245-PowerHouse&utm_source=linkedin&utm_medium=paidsocial&utm_term=free%20consultation&utm_content=calendly%20link&trk=ad_library_ad_preview_content_image","adFormat":null,"firstShown":"2026-07-28","lastShown":"2026-08-02","impressions":"1k-5k","country":"US","advertiser":{"id":"16217038","name":"ScriptRunner Software GmbH","url":"https://www.linkedin.com/company/16217038","logo":"https://media.licdn.com/dms/image/v2/C4D0BAQFYeG3JIAlUQg/company-logo_100_100/company-logo_100_100/0/1630544718632/scriptrunner_logo?e=1787184000&v=beta&t=CeO2dmEiPsb-6gTcpJtkBMm0c4JSLZ6b6zfm44wc_7s"},"media":[],"description":"Drowning in one off scripts and manual steps? In a free 15 minute consult, our experts help streamline IT Infrastructure Operations with PowerShell.","destinationUrl":"https://calendly.com/d/cvqn-kt5-t72/free-consultation?utm_campaign=32735245-PowerHouse&utm_source=linkedin&utm_medium=paidsocial&utm_term=free%20consultation&utm_content=calendly%20link&trk=ad_library_ad_preview_content_image","adDuration":"Ran from Jul 28, 2026 to Aug 2, 2026","startDate":"2026-07-28","endDate":"2026-08-02","totalImpressions":"1k-5k","impressionsByCountry":[{"country":"United States","impressions":"97%"},{"country":"Canada","impressions":"3%"}],"targeting":{"language":"Targeting includes English","location":"Targeting includes Germany, Switzerland and Netherlands, Benelux, DACH, United States, Canada, Austria, Belgium, United Kingdom"},"carouselImages":[],"paidForBy":"ScriptRunner Software GmbH","countries":["US"]},{"platform":"linkedin_ad_library","id":"1526380116","url":"https://www.linkedin.com/ad-library/detail/1526380116","text":"Built to grow together: The FY27 Microsoft Marketplace opportunity","headline":"Built to grow together: The FY27 Microsoft Marketplace opportunity","adFormat":null,"country":"US","advertiser":{"name":"Built to grow together: The FY27 Microsoft Marketplace opportunity"},"media":[],"description":null,"destinationUrl":null,"adDuration":null,"startDate":null,"endDate":null,"totalImpressions":null,"impressionsByCountry":[],"targeting":null,"carouselImages":[],"paidForBy":null,"countries":["US"]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/ad-library/linkedin/ad-details":{"get":{"operationId":"linkedin_ad_library_ad_details","tags":["LinkedIn Ad Library"],"summary":"LinkedIn Ad Details API","description":"One LinkedIn Ad Library ad by ID.\n\nPaste a LinkedIn Ad Library URL or ad ID. A real ad without a Ran-from line is 200 with those keys omitted — 404 only when the page is not an ad. LinkedIn publishes run dates, impressions and targeting only on a subset of creatives; ad-details cannot invent them. Dates are YYYY-MM-DD; startDate/endDate alias firstShown/lastShown. advertiser.id is extracted from linkedin.com/company/{id}. Envelope source is native|extended. Flat 2 credits native; extended fallback capped at 5.\n\nDocs: https://captapi.com/apis/linkedin-ad-library-ad-details","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"LinkedIn Ad Library URL or numeric ad ID (also accepts urn:li:sponsoredCreative:ID). Inputs that are neither numeric nor an ad-library detail URL are a definitive 400. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"One LinkedIn Ad Library ad by ID.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Text content."},"cta":{"type":"string","description":"Call-to-action text."},"landingUrl":{"type":"string","description":"Landing page the ad links to."},"adFormat":{"description":"Format of the ad creative."},"firstShown":{"type":"string","description":"Ran-from start as YYYY-MM-DD when LinkedIn publishes it. Alias of startDate."},"lastShown":{"type":"string","description":"Ran-from end as YYYY-MM-DD when LinkedIn publishes it. Alias of endDate."},"impressions":{"type":"string","description":"Estimated ad impressions."},"advertiser":{"type":"object","properties":{"id":{"type":"string","description":"Id of this advertiser item."},"name":{"type":"string","description":"Name of this advertiser item."},"url":{"type":"string","description":"Canonical URL of the item."},"logo":{"type":"string","description":"Logo image URL."}}},"media":{"type":"array","items":{},"description":"Media attached to the item."},"description":{"type":"string","description":"Description text."},"destinationUrl":{"type":"string","description":"Outbound click-through / landing URL when the platform exposes one."},"adDuration":{"type":"string","description":"LinkedIn 'Ran from … to …' availability string."},"startDate":{"type":"string","description":"Alias of firstShown — LinkedIn publishes one Ran-from range."},"endDate":{"type":"string","description":"Alias of lastShown — LinkedIn publishes one Ran-from range."},"totalImpressions":{"type":"string","description":"Estimated total impressions band from LinkedIn Ad Library (e.g. 1k-5k)."},"impressionsByCountry":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","description":"Country for the request context. On popular-creators top-level: ISO feed market you queried (e.g. US) — not each creator's home country (see region)."},"impressions":{"type":"string","description":"Estimated ad impressions."}}}},"targeting":{"type":"object","properties":{"language":{"type":"string","description":"Detected or requested language code."},"location":{"type":"string","description":"Location shown on the profile or item."}}},"carouselImages":{"type":"array","items":{},"description":"Ordered carousel creative image URLs when the ad is a carousel."},"paidForBy":{"type":"string","description":"Payer entity string from LinkedIn's 'Paid for by' line."},"countries":{"type":"array","items":{},"description":"Countries (array)."},"platformNote":{"type":"string","description":"LinkedIn publishes run dates, impressions and targeting only on a subset of Ad Library creatives. Missing firstShown/impressions/targeting means the detail page has no Ran-from line — not a scrape miss."},"source":{"description":"native (flat 2 credits) or extended (capped at 5). Also mirrored in X-Captapi-Source."}}}}},"example":{"success":true,"data":{"platform":"linkedin_ad_library","id":"1456323573","url":"https://www.linkedin.com/ad-library/detail/1456323573","text":"Drowning in one off scripts and manual steps? In a free 15 minute consult, our experts help streamline IT Infrastructure Operations with PowerShell.","cta":"Learn more","landingUrl":"https://calendly.com/d/cvqn-kt5-t72/free-consultation?utm_campaign=32735245-PowerHouse&utm_source=linkedin&utm_medium=paidsocial&utm_term=free%20consultation&utm_content=calendly%20link&trk=ad_library_ad_preview_content_image","adFormat":null,"firstShown":"2026-07-28","lastShown":"2026-08-02","impressions":"1k-5k","advertiser":{"id":"16217038","name":"ScriptRunner Software GmbH","url":"https://www.linkedin.com/company/16217038","logo":"https://media.licdn.com/dms/image/v2/C4D0BAQFYeG3JIAlUQg/company-logo_100_100/company-logo_100_100/0/1630544718632/scriptrunner_logo?e=1787184000&v=beta&t=CeO2dmEiPsb-6gTcpJtkBMm0c4JSLZ6b6zfm44wc_7s"},"media":[],"description":"Drowning in one off scripts and manual steps? In a free 15 minute consult, our experts help streamline IT Infrastructure Operations with PowerShell.","destinationUrl":"https://calendly.com/d/cvqn-kt5-t72/free-consultation?utm_campaign=32735245-PowerHouse&utm_source=linkedin&utm_medium=paidsocial&utm_term=free%20consultation&utm_content=calendly%20link&trk=ad_library_ad_preview_content_image","adDuration":"Ran from Jul 28, 2026 to Aug 2, 2026","startDate":"2026-07-28","endDate":"2026-08-02","totalImpressions":"1k-5k","impressionsByCountry":[{"country":"United States","impressions":"97%"},{"country":"Canada","impressions":"3%"}],"targeting":{"language":"Targeting includes English","location":"Targeting includes Germany, Switzerland and Netherlands, Benelux, DACH, United States, Canada, Austria, Belgium, United Kingdom"},"carouselImages":[],"paidForBy":"ScriptRunner Software GmbH","countries":[],"platformNote":"LinkedIn publishes run dates, impressions and targeting only on a subset of Ad Library creatives. Missing firstShown/impressions/targeting means the detail page has no Ran-from line — not a scrape miss."}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/amazon-shop/page":{"get":{"operationId":"amazon_shop_page","tags":["Amazon Shop"],"summary":"Amazon Seller Storefront API","description":"Third-party seller storefronts (/sp?seller= / /s?me=) — ASIN + canonical /dp URLs, price, badges.\n\nPass an Amazon seller storefront URL (/sp?seller=… or /s?me=…) or raw seller ID (e.g. A294P4X9EWVXLJ) and get that merchant's product listings as clean JSON. Each product includes an extracted ASIN and a canonical https://www.amazon.com/dp/{ASIN} URL (joinable to Amazon's catalog — not shop/{handle}/getProductDetails/… affiliate paths), plus title, image, price/currency/priceFormatted (omitted when Amazon shows no price), rating/reviews, and isPrime/isBestSeller/isSponsored. Also seller{id,name,url} and cursor pagination (nextCursor/hasMore). platform is amazon. Freshness is envelope fetchedAt. Billing is 1 credit per ~16-product storefront page. This is not the influencer Amazon Shop surface (amazon.com/shop/{handle}) that returns avatar/socials/lists/curations — those creator vitrines are a different product and return HTTP 400 here.\n\nDocs: https://captapi.com/apis/amazon-shop-page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Amazon seller storefront URL (/sp?seller=… or /s?me=…) or raw seller ID. Not influencer /shop/<handle> pages. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"marketplace","in":"query","required":false,"description":"Amazon marketplace code. Default US.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"US"}},{"name":"limit","in":"query","required":false,"description":"Max products to include (default 20, max 200; 0 = seller metadata only). Billed per storefront page — 1 credit per ~16 products.","schema":{"type":"integer","maximum":200,"minimum":0,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from nextCursor (page or page:offset). Leave empty for the first page.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Third-party seller storefronts (/sp?seller= / /s?me=) — ASIN + canonical /dp URLs, price, badges.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"amazon\" on this endpoint."},"url":{"type":"string","description":"Canonical product page https://www.amazon.com/dp/{ASIN} (not a shop/{handle}/getProductDetails/… affiliate path)."},"marketplace":{"type":"string","description":"Amazon marketplace code echoed from the request (default US)."},"seller":{"type":"object","properties":{"id":{"type":"string","description":"Id of this seller item."},"name":{"type":"string","description":"Name of this seller item."},"url":{"type":"string","description":"Canonical product page https://www.amazon.com/dp/{ASIN} (not a shop/{handle}/getProductDetails/… affiliate path)."}}},"scrapedAt":{"type":"string","description":"When this response was collected (ISO 8601). Envelope-level freshness on listings that expose it (e.g. Facebook profile-reels) — not a per-row stamp on Spotify search. facebook/profile-posts uses fetchedAt; there is no scrapedAt twin."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"products":{"type":"array","items":{"type":"object","properties":{"asin":{"type":"string","description":"Amazon Standard Identification Number — catalog identity for joins across sellers and marketplaces."},"title":{"type":"string","description":"Title of this products item."},"url":{"type":"string","description":"Canonical product page https://www.amazon.com/dp/{ASIN} (not a shop/{handle}/getProductDetails/… affiliate path)."},"image":{"type":"string","description":"Image URL."},"price":{"type":"number","description":"Numeric price when Amazon shows one on the card. Omitted with currency/priceFormatted when all three are unavailable."},"currency":{"type":"string","description":"ISO currency for price (e.g. USD). Omitted when there is no price."},"priceFormatted":{"type":"string","description":"Display price as Amazon printed it (e.g. $49.99). Omitted when there is no price."},"rating":{"type":"number","description":"Star rating (out of 5) when the card shows one."},"reviews":{"description":"Review count printed beside the stars on the storefront card. Omitted when Amazon does not expose a count on that row."},"isPrime":{"type":"boolean","description":"Is prime. Example: false."},"isBestSeller":{"type":"boolean","description":"Is best seller. Example: false."},"isSponsored":{"type":"boolean","description":"Is sponsored. Example: false."}}}}}}}},"example":{"success":true,"data":{"platform":"amazon_shop","url":"https://www.amazon.com/sp?seller=A294P4X9EWVXLJ","marketplace":"US","seller":{"id":"A294P4X9EWVXLJ","name":"AnkerDirect","url":"https://www.amazon.com/sp?seller=A294P4X9EWVXLJ"},"scrapedAt":"2026-08-02T16:59:58.250Z","totalReturned":2,"hasMore":true,"nextCursor":"1:5","products":[{"asin":"B08NDYQSXZ","title":"Anker Charging Dock for Oculus Quest 2, Oculus Certified Charging Station Stand Set, Headset Display Holder and Controller Mount Station with 2 Rechargeable Batteries, USB-C Charger and Cable","url":"https://www.amazon.com/dp/B08NDYQSXZ","image":"https://m.media-amazon.com/images/I/61EK9jpDapL._AC_UY218_.jpg","price":49.99,"currency":"USD","priceFormatted":"$49.99","rating":4.4,"reviews":null,"isPrime":false,"isBestSeller":false,"isSponsored":false},{"asin":"B08HKPDZSD","title":"Anker Ergonomic Optical USB Wired Vertical Mouse 1000/1600 DPI, 5 Buttons CE100 (Renewed)","url":"https://www.amazon.com/dp/B08HKPDZSD","image":"https://m.media-amazon.com/images/I/61Zu2ANcJbL._AC_UY218_.jpg","price":16.89,"currency":"USD","priceFormatted":"$16.89","rating":4.5,"reviews":null,"isPrime":false,"isBestSeller":false,"isSponsored":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/user":{"get":{"operationId":"github_user","tags":["GitHub"],"summary":"GitHub User API","description":"GitHub public profile — login, type User|Organization, email when public, followers (1 credit).\n\nPass a GitHub username or profile URL and get the public /users/{username} profile as camelCase JSON: login, name, company, blog, location, email (only when the account made it public — omitted when null), bio, avatar, publicRepos/publicGists, followers/following, twitterUsername, hireable, nodeId, siteAdmin, and createdAt/updatedAt. type is User or Organization (GitHub's casing) so orgs are distinguishable from people. Flat 1 credit. Honesty note: this is a thin wrap of GitHub's free public REST API (60 req/hour unauthenticated; 5,000/hour with a personal access token). Captapi's value here is one key across ~32 platforms, no per-platform rate-limit handling, and the same response envelope/field names as other profile endpoints — not removing a GitHub OAuth barrier (there isn't one for public profiles). Call api.github.com directly for GitHub-only jobs.\n\nDocs: https://captapi.com/apis/github-user","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"GitHub username or profile URL, e.g. getify or https://github.com/getify.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"GitHub public profile — login, type User|Organization, email when public, followers (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"github\" on this endpoint."},"type":{"type":"string","description":"GitHub account kind: \"User\" or \"Organization\" (upstream casing preserved)."},"login":{"type":"string","description":"Account login name."},"id":{"type":"integer","description":"Stable platform ID for the item."},"nodeId":{"type":"string","description":"GitHub GraphQL node_id for the account."},"url":{"type":"string","description":"Canonical URL of the item."},"apiUrl":{"type":"string","description":"Api url URL."},"name":{"type":"string","description":"GitHub profile display name (not a deprecated alias — GitHub has no displayName field here)."},"company":{"type":"string","description":"Company. Example: \"Getify Solutions\"."},"blog":{"type":"string","description":"Blog URL."},"location":{"type":"string","description":"Location shown on the profile or item."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"publicRepos":{"type":"integer","description":"Count of public repositories."},"publicGists":{"type":"integer","description":"Count of public gists."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"hireable":{"type":"boolean","description":"true when the user marked themselves hireable on GitHub; omitted/null when unset."},"siteAdmin":{"type":"boolean","description":"true when the account is a GitHub site admin (rare)."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"updatedAt":{"type":"string","description":"Last update date (ISO 8601)."}}}}},"example":{"success":true,"data":{"platform":"github","type":"User","login":"getify","id":150330,"nodeId":"MDQ6VXNlcjE1MDMzMA==","url":"https://github.com/getify","apiUrl":"https://api.github.com/users/getify","name":"Kyle Simpson","company":"Getify Solutions","blog":"http://getify.me","location":"Austin, TX","bio":"Kyle Simpson is a Human-Centric Technologist. He's fighting for the people behind the pixels.","avatar":"https://avatars.githubusercontent.com/u/150330?v=4","publicRepos":74,"publicGists":411,"followers":45221,"following":3,"hireable":true,"siteAdmin":false,"createdAt":"2009-11-08T06:56:21Z","updatedAt":"2026-04-28T20:14:44Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/repositories":{"get":{"operationId":"github_repositories","tags":["GitHub"],"summary":"GitHub Repositories API","description":"List a user's repos with sort/direction/type — opaque Link cursor (~0.4/repo).\n\nList repositories from GitHub REST /users/{login}/repos. Pass sort=created|updated|pushed|full_name (default updated), direction=asc|desc, and type=owner|member|all — all echoed at the top level. Each row is the same camelCase repo card as github/repository: homepage, license, and licenseName are always present (null when unset / NOASSERTION). watchers and parent are detail-only — list payloads omit subscribers_count and parent; call github/repository for those. Opaque nextCursor from GitHub's Link header. ~0.4 credits/repo (default limit 30 → ~12). Pricing vs detail: single-repo lookup is flat 1 credit; this list is per-result for bulk. Trending is a separate HTML scrape at flat 2.\n\nDocs: https://captapi.com/apis/github-repositories","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"GitHub username or profile URL, e.g. torvalds.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"created | updated | pushed | full_name (default updated). Not stars — GitHub's user-repos API has no stars sort. Echoed as data.sort.","schema":{"type":"string","pattern":"^(created|updated|pushed|full_name)$","default":"updated"}},{"name":"direction","in":"query","required":false,"description":"asc or desc (default desc). Echoed as data.direction.","schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc"}},{"name":"type","in":"query","required":false,"description":"owner (default) | member | all — affiliation filter. Echoed as data.type.","schema":{"type":"string","pattern":"^(all|owner|member)$","default":"owner"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 30, max 100). Billed per result.","schema":{"type":"integer","maximum":100,"minimum":1,"default":30}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from a previous nextCursor (GitHub Link page=). Not a bare page number.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":12,"perResult":0.4,"label":"~12 credits (0.4/result)","billedOnCacheHit":false},"x-one-liner":"List a user's repos with sort/direction/type — opaque Link cursor (~0.4/repo).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"sort":{"type":"string","description":"Echo of sort=created|updated|pushed|full_name (default updated)."},"direction":{"type":"string","description":"Echo of direction=asc|desc (default desc)."},"type":{"type":"string","description":"Top-level: affiliation filter owner|member|all. On each repo row: always \"repository\"."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Opaque Link-header cursor (not a bare page number)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"repositories":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Top-level: affiliation filter owner|member|all. On each repo row: always \"repository\"."},"name":{"type":"string","description":"Name of this repositories item."},"fullName":{"type":"string","description":"Full display name."},"url":{"type":"string","description":"Canonical URL of the item."},"description":{"type":"string","description":"Description of this repositories item."},"owner":{"type":"string","description":"Owner of the repository."},"ownerUrl":{"type":"string","description":"Owner url URL."},"ownerType":{"type":"string","description":"Owner type. Example: \"User\"."},"ownerAvatar":{"type":"string","description":"Owner avatar URL."},"language":{"type":"string","description":"Primary programming language (e.g. \"C\", \"Python\") — not a spoken-language code."},"stars":{"type":"integer","description":"Star count."},"forks":{"type":"integer","description":"Fork count."},"openIssuesAndPrs":{"type":"integer","description":"GitHub open_issues_count — open issues plus open pull requests."},"defaultBranch":{"type":"string","description":"Default branch name."},"licenseName":{"type":"string","description":"Human-readable license label from GitHub. Always present — null when GitHub sent no license object."},"isFork":{"type":"boolean","description":"Whether the repository is a fork."},"isArchived":{"type":"boolean","description":"Whether the repository is archived."},"pushedAt":{"type":"string","description":"Last push date (ISO 8601)."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"updatedAt":{"type":"string","description":"Last update date (ISO 8601)."},"homepage":{"type":"string"}}}}}}}},"example":{"success":true,"data":{"username":"torvalds","sort":"pushed","direction":"desc","type":"owner","totalReturned":2,"nextCursor":"eyJ2IjoxLCJrIjoicmVwb3MiLCJwIjoyfQ","hasMore":true,"repositories":[{"platform":"github","type":"repository","name":"linux","fullName":"torvalds/linux","url":"https://github.com/torvalds/linux","description":"Linux kernel source tree","owner":"torvalds","ownerUrl":"https://github.com/torvalds","ownerType":"User","ownerAvatar":"https://avatars.githubusercontent.com/u/1024025?v=4","language":"C","stars":239734,"forks":63487,"openIssuesAndPrs":3,"defaultBranch":"master","licenseName":"Other","isFork":false,"isArchived":false,"pushedAt":"2026-07-18T04:53:39Z","createdAt":"2011-09-04T22:48:12Z","updatedAt":"2026-07-18T18:40:38Z"},{"platform":"github","type":"repository","name":"libgit2","fullName":"torvalds/libgit2","url":"https://github.com/torvalds/libgit2","description":"A cross-platform, linkable library implementation of Git.","owner":"torvalds","ownerUrl":"https://github.com/torvalds","ownerType":"User","ownerAvatar":"https://avatars.githubusercontent.com/u/1024025?v=4","language":"C","stars":370,"forks":28,"openIssuesAndPrs":1,"defaultBranch":"main","homepage":"https://libgit2.org/","licenseName":"Other","isFork":true,"isArchived":false,"pushedAt":"2023-12-19T11:45:42Z","createdAt":"2022-07-30T03:30:56Z","updatedAt":"2026-07-18T17:03:41Z"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/pull-requests":{"get":{"operationId":"github_pull_requests","tags":["GitHub"],"summary":"GitHub Pull Requests API","description":"List repo PRs — draft, labels, author{}, head/base, opaque Link cursor (state echoed).\n\nList pull requests for a repository via GitHub REST /pulls. Default state=open (pass closed|all — the applied filter is echoed as data.state). Each row: number, title, state, draft, labels[], author{id,login,avatar,url}, head/base refs, assignees[], requestedReviewers[], closedAt/mergedAt. Empty labels / assignees / requestedReviewers are [] — GitHub told us the collection is empty, not that we failed to read it. Opaque nextCursor from GitHub's Link header (not a bare page number). Billing scales with results (~0.4/PR, min ~12 at default limit).\n\nDocs: https://captapi.com/apis/github-pull-requests","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"repo","in":"query","required":true,"description":"Repository URL or owner/name, e.g. vercel/next.js.","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"open (API default), closed, or all. Echoed as data.state. Docs example uses closed so mergedAt is visible.","schema":{"type":"string","pattern":"^(open|closed|all)$","default":"open"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 30, max 100). Billed per result.","schema":{"type":"integer","maximum":100,"minimum":1,"default":30}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from a previous nextCursor (GitHub Link page=). Not a bare page number.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":12,"perResult":0.4,"label":"~12 credits (0.4/result)","billedOnCacheHit":false},"x-one-liner":"List repo PRs — draft, labels, author{}, head/base, opaque Link cursor (state echoed).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"repository":{"type":"string","description":"Repository. Example: \"vercel/next.js\"."},"state":{"type":"string","description":"Top-level: filter echoed from the request (open|closed|all). On each PR: GitHub's PR state."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Opaque Link-header cursor (not a bare page number)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"pullRequests":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Id of this pull requests item."},"number":{"type":"integer","description":"Number. Example: 100."},"title":{"type":"string","description":"Title of this pull requests item."},"state":{"type":"string","description":"Top-level: filter echoed from the request (open|closed|all). On each PR: GitHub's PR state."},"draft":{"type":"boolean","description":"true when the PR is a draft — exclude from review-throughput metrics."},"url":{"type":"string","description":"Canonical URL of the item."},"author":{"type":"object","properties":{"id":{"type":"integer","description":"Id of this pull requests item."},"login":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string"}},"description":"PR author card {id, login, avatar, url} — not a bare login string."},"labels":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"}}},"description":"Label objects [{name, color, description}]. Always an array — [] when the PR has none."},"head":{"type":"object","properties":{"ref":{"type":"string"},"sha":{"type":"string"},"label":{"type":"string"}},"description":"Source branch {ref, sha, label}."},"base":{"type":"object","properties":{"ref":{"type":"string"},"sha":{"type":"string"},"label":{"type":"string"}},"description":"Target branch {ref, sha, label}."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"updatedAt":{"type":"string","description":"Last update date (ISO 8601)."},"closedAt":{"type":"string","description":"When the PR was closed (ISO). Distinct from mergedAt."},"mergedAt":{"type":"string","description":"When the PR was merged (ISO). Null/omitted if not merged."}}}}}}}},"example":{"success":true,"data":{"repository":"vercel/next.js","state":"closed","totalReturned":2,"nextCursor":"eyJ2IjoxLCJrIjoicHVsbHMiLCJwIjoyfQ","hasMore":true,"pullRequests":[{"id":11,"number":100,"title":"docs: clarify cursor","state":"closed","draft":false,"url":"https://github.com/vercel/next.js/pull/100","author":{"id":1,"login":"example","url":"https://github.com/example","avatar":"https://avatars.githubusercontent.com/u/1?v=4"},"labels":[{"name":"documentation","color":"0075ca"}],"head":{"ref":"docs-cursor","sha":"aaa111","label":"example:docs-cursor"},"base":{"ref":"canary","sha":"bbb222","label":"vercel:canary"},"createdAt":"2026-06-01T00:00:00Z","updatedAt":"2026-06-02T00:00:00Z","closedAt":"2026-06-02T12:00:00Z","mergedAt":"2026-06-02T12:00:00Z"},{"id":12,"number":101,"title":"WIP: experimental","state":"closed","draft":true,"url":"https://github.com/vercel/next.js/pull/101","author":{"id":2,"login":"dev","url":"https://github.com/dev","avatar":"https://avatars.githubusercontent.com/u/2?v=4"},"head":{"ref":"wip","sha":"ccc","label":"dev:wip"},"base":{"ref":"canary","sha":"ddd","label":"vercel:canary"},"createdAt":"2026-05-01T00:00:00Z","updatedAt":"2026-05-03T00:00:00Z","closedAt":"2026-05-03T00:00:00Z"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/activity":{"get":{"operationId":"github_activity","tags":["GitHub"],"summary":"GitHub Activity API","description":"Public events with typed payload (Push commits/ref, PR/issue action) — 90-event ceiling.\n\nRecent public events from /users/{login}/events/public with a normalized payload per type: PushEvent → ref, size, commits[{sha,message}]; PullRequestEvent → action + PR fields; IssuesEvent → action + issue fields. actor is omitted (same as username). GitHub caps this feed at 90 events (~90 days) — eventCeiling is echoed and pagination stops there (limit max 90). Opaque nextCursor from the Link header. Not a contribution graph — use github/contributions for the heatmap.\n\nDocs: https://captapi.com/apis/github-activity","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"GitHub username or profile URL, e.g. getify.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 30, max 90). Billed per result.","schema":{"type":"integer","maximum":90,"minimum":1,"default":30}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from a previous nextCursor. Pagination stops after GitHub's 90-event public activity ceiling.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":12,"perResult":0.4,"label":"~12 credits (0.4/result)","billedOnCacheHit":false},"x-one-liner":"Public events with typed payload (Push commits/ref, PR/issue action) — 90-event ceiling.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"eventCeiling":{"type":"integer","description":"Hard cap of 90 — GitHub's /users/{u}/events/public limit. hasMore is false once reached."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Opaque Link-header cursor. Pagination stops at eventCeiling."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this events item."},"type":{"type":"string","description":"GitHub event enum: PushEvent, PullRequestEvent, IssuesEvent, CreateEvent, WatchEvent, ForkEvent, …"},"repo":{"type":"string","description":"owner/name of the repository the event targets."},"repoUrl":{"type":"string","description":"Repo url URL."},"payload":{"type":"object","properties":{"ref":{"type":"string"},"head":{"type":"string"},"before":{"type":"string"},"size":{"type":"integer"},"distinctSize":{"type":"integer"},"commits":{"type":"array","items":{"type":"object","properties":{"sha":{"type":"string"},"message":{"type":"string"},"authorName":{"type":"string"},"authorEmail":{"type":"string"},"distinct":{"type":"boolean"}}}},"action":{"type":"string"},"number":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string"},"state":{"type":"string"}},"description":"Type-specific details — PushEvent: ref/size/commits[]; PullRequestEvent/IssuesEvent: action + entity fields."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"public":{"type":"boolean","description":"Public. Example: true."}}}}}}}},"example":{"success":true,"data":{"username":"getify","eventCeiling":90,"totalReturned":2,"nextCursor":"eyJ2IjoxLCJrIjoiYWN0aXZpdHkiLCJwIjoyfQ","hasMore":true,"events":[{"id":"9001","type":"PushEvent","repo":"getify/You-Dont-Know-JS","repoUrl":"https://github.com/getify/You-Dont-Know-JS","payload":{"ref":"refs/heads/2nd-ed","head":"deadbeef","before":"cafebabe","size":1,"distinctSize":1,"commits":[{"sha":"deadbeef","message":"typo fix","authorName":"Kyle Simpson","authorEmail":"getify@gmail.com","distinct":true}]},"createdAt":"2026-07-01T10:00:00Z","public":true},{"id":"9002","type":"IssuesEvent","repo":"getify/You-Dont-Know-JS","repoUrl":"https://github.com/getify/You-Dont-Know-JS","payload":{"action":"opened","number":7,"title":"Clarify chapter 3","url":"https://github.com/getify/You-Dont-Know-JS/issues/7","state":"open"},"createdAt":"2026-06-28T10:00:00Z","public":true}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/followers":{"get":{"operationId":"github_followers","tags":["GitHub"],"summary":"GitHub Followers API","description":"Follower cards {id, login, type, url, avatar} — ~0.1/row; large accounts are expensive to page fully.\n\nList followers from /users/{login}/followers as {id, login, type (User|Organization), url, avatar}. Opaque nextCursor from GitHub's Link header. Billed ~0.1 credits/row (min 3; default limit 30 → ~3). There is no sampling/since parameter — paging a mega-account (~250k followers) costs ~25k credits at this rate; for full archives prefer api.github.com. Structurally identical to github/following.\n\nDocs: https://captapi.com/apis/github-followers","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"GitHub username or profile URL, e.g. getify.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 30, max 100). Billed per result.","schema":{"type":"integer","maximum":100,"minimum":1,"default":30}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from a previous nextCursor (GitHub Link page=). Not a bare page number.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":3,"perResult":0.1,"label":"~3 credits (0.1/result)","billedOnCacheHit":false},"x-one-liner":"Follower cards {id, login, type, url, avatar} — ~0.1/row; large accounts are expensive to page fully.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Opaque Link-header cursor (not a bare page number)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"followers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Id of this followers item."},"login":{"type":"string","description":"GitHub username."},"type":{"type":"string","description":"Account kind: \"User\" or \"Organization\"."},"url":{"type":"string","description":"Profile URL (https://github.com/{login})."},"avatar":{"type":"string","description":"Avatar image URL."}}}}}}}},"example":{"success":true,"data":{"username":"getify","totalReturned":2,"nextCursor":"eyJ2IjoxLCJrIjoiZm9sbG93ZXJzIiwicCI6Mn0","hasMore":true,"followers":[{"id":206,"login":"sprsquish","type":"User","url":"https://github.com/sprsquish","avatar":"https://avatars.githubusercontent.com/u/206?v=4"},{"id":365,"login":"pius","type":"User","url":"https://github.com/pius","avatar":"https://avatars.githubusercontent.com/u/365?v=4"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/following":{"get":{"operationId":"github_following","tags":["GitHub"],"summary":"GitHub Following API","description":"Accounts a user follows — same card and ~0.1/row pricing as followers.\n\nList accounts from /users/{login}/following as {id, login, type, url, avatar}. Same shape, opaque Link cursor, and ~0.1 credits/row (min 3) as github/followers. No sampling parameter — large following lists are expensive to exhaust via Captapi.\n\nDocs: https://captapi.com/apis/github-following","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"GitHub username or profile URL, e.g. getify.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 30, max 100). Billed per result.","schema":{"type":"integer","maximum":100,"minimum":1,"default":30}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from a previous nextCursor (GitHub Link page=). Not a bare page number.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":3,"perResult":0.1,"label":"~3 credits (0.1/result)","billedOnCacheHit":false},"x-one-liner":"Accounts a user follows — same card and ~0.1/row pricing as followers.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Opaque Link-header cursor (not a bare page number)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"following":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Id of this following item."},"login":{"type":"string","description":"GitHub username."},"type":{"type":"string","description":"Account kind: \"User\" or \"Organization\"."},"url":{"type":"string","description":"Profile URL (https://github.com/{login})."},"avatar":{"type":"string","description":"Avatar image URL."}}}}}}}},"example":{"success":true,"data":{"username":"getify","totalReturned":2,"nextCursor":"eyJ2IjoxLCJrIjoiZm9sbG93aW5nIiwicCI6Mn0","hasMore":true,"following":[{"id":579,"login":"mikeal","type":"User","url":"https://github.com/mikeal","avatar":"https://avatars.githubusercontent.com/u/579?v=4"},{"id":9950313,"login":"nodejs","type":"Organization","url":"https://github.com/nodejs","avatar":"https://avatars.githubusercontent.com/u/9950313?v=4"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/contributions":{"get":{"operationId":"github_contributions","tags":["GitHub"],"summary":"GitHub Contributions API","description":"GitHub contribution graph — sorted days[], currentStreak (today grace), longestStreak (2 credits).\n\nPass a GitHub username or profile URL and get the real last-year contribution calendar from github.com/users/{login}/contributions: totalContributions, from/to (min/max date), currentStreak, longestStreak, and days[{date, count, level}] sorted ascending by date (not GitHub's weekday-major DOM order). currentStreak uses GitHub's today-grace rule: a zero on today does not break the streak; a zero on any earlier day does. source discloses that HTML calendar. This is not /users/{u}/events/public (max 90 events / 90 days) and not a sampled stars sum. Flat 2 credits.\n\nDocs: https://captapi.com/apis/github-contributions","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"username","in":"query","required":true,"description":"GitHub username or profile URL, e.g. getify or https://github.com/getify.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"GitHub contribution graph — sorted days[], currentStreak (today grace), longestStreak (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"url":{"type":"string","description":"Canonical URL of the item."},"totalContributions":{"type":"integer","description":"Contributions in the last year — the number on the profile graph heading. Equals sum(days[].count)."},"from":{"type":"string","description":"Earliest date in days[] (YYYY-MM-DD). Always min(days[].date)."},"to":{"type":"string","description":"Latest date in days[] (YYYY-MM-DD). Always max(days[].date) — the calendar window ends on today."},"currentStreak":{"type":"integer","description":"Consecutive days with count>0 ending at the latest calendar day. Today-grace: if the last day is today and count is 0, that day is skipped (the day is not over); a zero on any earlier day breaks the streak. Computed after sorting days ascending."},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date. Example: \"2025-08-03\"."},"count":{"type":"integer","description":"Contributions on that date (from the calendar tool-tip)."},"level":{"type":"integer","description":"GitHub intensity 0–4 for the heatmap cell."}}}},"source":{"description":"Public contribution calendar HTML path (github.com/users/{login}/contributions)."}}}}},"example":{"success":true,"data":{"username":"getify","url":"https://github.com/getify","totalContributions":164,"from":"2025-08-03","to":"2025-08-05","currentStreak":2,"days":[{"date":"2025-08-03","count":0,"level":0},{"date":"2025-08-04","count":5,"level":2}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/repository":{"get":{"operationId":"github_repository","tags":["GitHub"],"summary":"GitHub Repository API","description":"GitHub repo — stars, real watchers (subscribers), openIssuesAndPrs, license, parent when fork (1 credit).\n\nPass a repository URL or owner/name and get GitHub REST /repos/{owner}/{repo} as camelCase JSON: description, stars, forks, watchers (subscribers_count — people notified of activity; not the legacy watchers_count star alias), openIssuesAndPrs (GitHub's open_issues_count = open issues + open PRs), primary programming language, homepage / license / licenseName (always present; SPDX NOASSERTION → license null with licenseName kept), topics, parent when isFork, size, visibility, hasIssues/hasDiscussions, ownerType (User|Organization), and timestamps. This card is a superset of each github/repositories row (list omits watchers and parent). Flat 1 credit. For the curated trending page (stars gained today/this week/month), use github/trending-repositories.\n\nDocs: https://captapi.com/apis/github-repository","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"repo","in":"query","required":true,"description":"Repository URL or owner/name, e.g. torvalds/linux or https://github.com/torvalds/linux.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"GitHub repo — stars, real watchers (subscribers), openIssuesAndPrs, license, parent when fork (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"github\" on this endpoint."},"type":{"type":"string","description":"Always \"repository\" on each repo object."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"fullName":{"type":"string","description":"Full display name."},"url":{"type":"string","description":"Canonical URL of the item."},"description":{"type":"string","description":"Description text."},"owner":{"type":"string","description":"Owner of the repository."},"ownerUrl":{"type":"string","description":"Owner url URL."},"ownerType":{"type":"string","description":"Owner account kind: \"User\" or \"Organization\"."},"ownerAvatar":{"type":"string","description":"Owner avatar URL."},"language":{"type":"string","description":"Primary programming language (e.g. \"C\", \"Python\") — not a spoken-language code."},"stars":{"type":"integer","description":"stargazers_count — total stars."},"forks":{"type":"integer","description":"Fork count."},"watchers":{"type":"integer","description":"subscribers_count — people watching for notifications. Omitted on list payloads that lack the field. Never GitHub's legacy watchers_count (that equals stars)."},"openIssuesAndPrs":{"type":"integer","description":"GitHub open_issues_count — open issues plus open pull requests. Use github/pull-requests for PRs alone."},"defaultBranch":{"type":"string","description":"Default branch name."},"licenseName":{"type":"string","description":"Human-readable license label from GitHub (e.g. Other, MIT License). Always present — null when GitHub sent no license object."},"isFork":{"type":"boolean","description":"Whether the repository is a fork."},"isArchived":{"type":"boolean","description":"Whether the repository is archived."},"size":{"type":"integer","description":"Repository size in kilobytes (GitHub's size field)."},"visibility":{"type":"string","description":"Repository visibility (usually \"public\" on this surface)."},"hasIssues":{"type":"boolean","description":"Whether the issues feature is enabled on the repo."},"hasDiscussions":{"type":"boolean","description":"Whether GitHub Discussions is enabled."},"pushedAt":{"type":"string","description":"Last push date (ISO 8601)."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"updatedAt":{"type":"string","description":"Last update date (ISO 8601)."}}}}},"example":{"success":true,"data":{"platform":"github","type":"repository","name":"linux","fullName":"torvalds/linux","url":"https://github.com/torvalds/linux","description":"Linux kernel source tree","owner":"torvalds","ownerUrl":"https://github.com/torvalds","ownerType":"User","ownerAvatar":"https://avatars.githubusercontent.com/u/1024025?v=4","language":"C","stars":241852,"forks":63487,"watchers":8345,"openIssuesAndPrs":3,"defaultBranch":"master","licenseName":"Other","isFork":false,"isArchived":false,"size":6228144,"visibility":"public","hasIssues":false,"hasDiscussions":false,"pushedAt":"2026-07-18T04:53:39Z","createdAt":"2011-09-04T22:48:12Z","updatedAt":"2026-07-18T18:40:38Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/trending-repositories":{"get":{"operationId":"github_trending_repositories","tags":["GitHub"],"summary":"GitHub Trending Repositories API","description":"github.com/trending — repos ranked by starsGained (daily|weekly|monthly), not all-time stars (2 credits).\n\nScrapes the public github.com/trending page (source: \"github.com/trending\") — repositories ranked by stars gained in a window, not REST /search/repositories sorted by all-time stars. Pass since=daily|weekly|monthly (default daily) and optional language slug (e.g. python → /trending/python). Each row: rank, fullName, url, description, language (programming language), stars, forks, starsGained, since. Flat 2 credits. The HTML page usually lists ~25 repos; there is no cursor (unlike Search API's 1000-result cap). This is not a substitute for github/repository detail fields (license, watchers/subscribers, parent, …).\n\nDocs: https://captapi.com/apis/github-trending-repositories","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"since","in":"query","required":false,"description":"Trending window: daily (default), weekly, or monthly — matches github.com/trending?since=.","schema":{"type":"string","pattern":"^(daily|weekly|monthly)$","default":"daily"}},{"name":"language","in":"query","required":false,"description":"Optional programming-language slug (e.g. python, typescript) → /trending/{language}.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 100). Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":25}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"github.com/trending — repos ranked by starsGained (daily|weekly|monthly), not all-time stars (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"since":{"type":"string","description":"Trending window echoed from the request: daily | weekly | monthly."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"repositories":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Content type of the item."},"rank":{"type":"integer","description":"1-based position on the trending page."},"name":{"type":"string","description":"Name of this repositories item."},"fullName":{"type":"string","description":"Full display name."},"url":{"type":"string","description":"Canonical URL of the item."},"description":{"type":"string","description":"Description of this repositories item."},"owner":{"type":"string","description":"Owner of the repository."},"ownerUrl":{"type":"string","description":"Owner url URL."},"language":{"type":"string","description":"Programming-language filter slug echoed from the request (null when browsing all languages)."},"stars":{"type":"integer","description":"Total star count shown on the trending card."},"forks":{"type":"integer","description":"Total fork count shown on the trending card."},"starsGained":{"type":"integer","description":"Stars gained in the since window — the metric that ranks github.com/trending."},"since":{"type":"string","description":"Trending window echoed from the request: daily | weekly | monthly."}}}},"source":{"description":"Always \"github.com/trending\" — HTML trending page, not REST star search."}}}}},"example":{"success":true,"data":{"since":"daily","totalReturned":2,"repositories":[{"platform":"github","type":"repository","rank":1,"name":"computer","fullName":"cloudflare/computer","url":"https://github.com/cloudflare/computer","description":"Remote browser infrastructure","owner":"cloudflare","ownerUrl":"https://github.com/cloudflare","language":"TypeScript","stars":2514,"forks":120,"starsGained":796,"since":"daily"},{"platform":"github","type":"repository","rank":2,"name":"hot-repo","fullName":"example/hot-repo","url":"https://github.com/example/hot-repo","description":"Trending sample","owner":"example","ownerUrl":"https://github.com/example","language":"Python","stars":1200,"forks":80,"starsGained":327,"since":"daily"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/github/trending-developers":{"get":{"operationId":"github_trending_developers","tags":["GitHub"],"summary":"GitHub Trending Developers API","description":"github.com/trending/developers — windowed ranks with popularRepo + followers (2 credits).\n\nScrapes github.com/trending/developers (source: \"github.com/trending/developers\") for developers ranked in a since=daily|weekly|monthly window — not REST /search/users with followers:>1000 (all-time most-followed). Each row: rank, login, name, url, avatar, popularRepo/popularRepoUrl/popularRepoDescription, plus followers, following, bio, company, location, publicRepos, ownerType hydrated from GET /users/{login}. No Search relevance score field. Flat 2 credits. Page usually ≤25 rows (no cursor).\n\nDocs: https://captapi.com/apis/github-trending-developers","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"since","in":"query","required":false,"description":"Trending window: daily (default), weekly, or monthly — matches github.com/trending/developers?since=.","schema":{"type":"string","pattern":"^(daily|weekly|monthly)$","default":"daily"}},{"name":"language","in":"query","required":false,"description":"Optional programming-language slug → /trending/developers/{language}.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 25, max 100). Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":25}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"github.com/trending/developers — windowed ranks with popularRepo + followers (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"since":{"type":"string","description":"Trending window echoed from the request: daily | weekly | monthly."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"developers":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"type":{"type":"string","description":"Content type of the item."},"rank":{"type":"integer","description":"1-based position on the trending developers page."},"login":{"type":"string","description":"Account login name."},"name":{"type":"string","description":"Name of this developers item."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"popularRepo":{"type":"string","description":"owner/name of the popular repo shown on the trending card."},"popularRepoUrl":{"type":"string","description":"Popular repo url URL."},"popularRepoDescription":{"type":"string","description":"Popular repo description. Example: \"A book series on JS\"."},"since":{"type":"string","description":"Trending window echoed from the request: daily | weekly | monthly."},"followers":{"type":"integer","description":"Follower count hydrated from GET /users/{login} (the ranking signal you can sort on)."},"publicRepos":{"type":"integer","description":"Public repository count from the hydrated profile."},"bio":{"type":"string","description":"Public profile bio when set."},"location":{"type":"string","description":"Location shown on the profile or item."},"ownerType":{"type":"string","description":"Owner type. Example: \"User\"."}}}},"source":{"description":"Always \"github.com/trending/developers\" — not REST /search/users."}}}}},"example":{"success":true,"data":{"since":"weekly","totalReturned":2,"developers":[{"platform":"github","type":"developer","rank":1,"login":"getify","name":"Kyle Simpson","url":"https://github.com/getify","avatar":"https://avatars.githubusercontent.com/u/150330?v=4","popularRepo":"getify/You-Dont-Know-JS","popularRepoUrl":"https://github.com/getify/You-Dont-Know-JS","popularRepoDescription":"A book series on JS","since":"weekly","followers":45221,"publicRepos":74,"bio":"Human-Centric Technologist","location":"Austin, TX","ownerType":"User"},{"platform":"github","type":"developer","rank":2,"login":"sindresorhus","name":"Sindre Sorhus","url":"https://github.com/sindresorhus","avatar":"https://avatars.githubusercontent.com/u/170270?v=4","popularRepo":"sindresorhus/awesome","popularRepoUrl":"https://github.com/sindresorhus/awesome","since":"weekly","followers":70000,"publicRepos":1200,"ownerType":"User"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitch/profile":{"get":{"operationId":"twitch_profile","tags":["Twitch"],"summary":"Twitch Profile API","description":"Twitch channel — handle + displayName, socials[], topClips, schedule preview, stream only when live (1 credit).\n\nPass a Twitch channel URL or username and get a clean profile (no GraphQL junk). Identity is handle + displayName only — login/username/name are not shipped (they collide with handle or displayName depending on the channel). bio / avatar / banner have no description/profileImage/bannerImage twins. Also: isPartner/isAffiliate, isLive, stream{title, game, gameBoxArtUrl, viewers, startedAt, thumbnail} when live (omitted when offline — isLive:false already said it), lastBroadcast{} when Twitch exposes one, socials[{platform,url,title}] from channel panels / socialMedias, recentVideos[] (same lean row as /twitch/user-videos: broadcastType, gameId/gameSlug, no per-row broadcaster*), topClips[], and schedule[] (lean preview, max 10). Canonical full schedule: GET /v1/twitch/user-schedule. Empty bio is omitted, not nulled. Accepts cache / cacheMaxAge=1d|3d|7d|14d|30d. Flat 1 credit.\n\nDocs: https://captapi.com/apis/twitch-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Twitch channel URL or username, e.g. https://www.twitch.tv/shroud. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Twitch channel — handle + displayName, socials[], topClips, schedule preview, stream only when live (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"displayName":{"type":"string","description":"Channel display name (e.g. Ninja, KaiCenat). Distinct from handle on most channels."},"url":{"type":"string","description":"Canonical URL of the item."},"followers":{"type":"integer","description":"Follower count."},"isPartner":{"type":"boolean","description":"Whether the channel is a platform Partner/partner."},"isAffiliate":{"type":"boolean","description":"Whether the channel is an affiliate."},"isLive":{"type":"boolean","description":"Whether the channel is currently live."},"recentVideos":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this recent videos item."},"url":{"type":"string","description":"Canonical URL of the item."},"embedUrl":{"type":"string","description":"Platform embed URL when a real embed id is known. Do not invent from a page/permalink id."},"title":{"type":"string","description":"Title of this recent videos item."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"views":{"type":"integer","description":"View count when the platform exposes one."},"thumbnail":{"type":"string","description":"VOD/clip thumbnail URL with Twitch's {width}x{height} placeholders substituted to 320x180 so the URL loads. See thumbnailTemplate for the raw template."},"thumbnailTemplate":{"type":"string","description":"Unsubstituted Twitch thumbnail template (…/{width}x{height}.jpg) when the source used placeholders — pick your own size."},"animatedPreviewUrl":{"type":"string","description":"VOD storyboard / animated preview strip when Twitch exposes it."},"broadcastType":{"type":"string","description":"Broadcast type. Example: \"ARCHIVE\"."},"game":{"type":"string","description":"Category / game name string (not a GraphQL Game object)."},"gameId":{"type":"string","description":"Twitch game/category id."},"gameSlug":{"type":"string","description":"Twitch game/category slug."},"gameBoxArtUrl":{"type":"string","description":"Category box art URL (additive media field)."},"language":{"type":"string","description":"Detected or requested language code."}}}},"topClips":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this top clips item."},"slug":{"type":"string","description":"URL slug of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"embedUrl":{"type":"string","description":"Platform embed URL when a real embed id is known. Do not invent from a page/permalink id."},"title":{"type":"string","description":"Title of this top clips item."},"views":{"type":"integer","description":"View count when the platform exposes one."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"thumbnail":{"type":"string","description":"VOD/clip thumbnail URL with Twitch's {width}x{height} placeholders substituted to 320x180 so the URL loads. See thumbnailTemplate for the raw template."},"game":{"type":"string","description":"Category / game name string (not a GraphQL Game object)."},"gameBoxArtUrl":{"type":"string","description":"Category box art URL (additive media field)."}}}},"schedule":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this schedule item."},"startAt":{"type":"string","description":"Start at. Example: \"2026-08-16T18:00:00Z\"."},"endAt":{"type":"string","description":"End at. Example: \"2026-08-17T02:00:00Z\"."},"isRecurring":{"type":"boolean","description":"Is recurring. Example: false."},"isCancelled":{"type":"boolean","description":"Is cancelled. Example: false."},"firstOccurrenceAt":{"type":"string"}}}},"socials":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."}}}},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"bio":{"type":"string","description":"Channel about text when the channel published one; omitted when empty."},"avatar":{"type":"string","description":"Profile image URL."},"banner":{"type":"string","description":"Channel banner URL."},"lastBroadcast":{"type":"object","properties":{"title":{"type":"string","description":"Title of this last broadcast item."},"game":{"type":"string","description":"Category / game name string (not a GraphQL Game object)."},"gameBoxArtUrl":{"type":"string","description":"Category box art URL (additive media field)."},"startedAt":{"type":"string","description":"When the stream, clip, or broadcast segment started (ISO 8601)."}}},"handle":{"type":"string","description":"Twitch login / URL slug (e.g. ninja). The join key — not a third username twin."}}}}},"example":{"success":true,"data":{"platform":"twitch","id":"37402112","displayName":"shroud","url":"https://www.twitch.tv/shroud","followers":11290546,"isPartner":true,"isAffiliate":false,"isLive":false,"recentVideos":[{"platform":"twitch","id":"2827992810","url":"https://www.twitch.tv/videos/2827992810","embedUrl":"https://player.twitch.tv/?video=2827992810&parent=captapi.com","title":"ME N THE GIRLS R GONNA POP OFF IN THIS 100K TWITCH RIVALS","createdAt":"2026-07-24T17:56:52Z","durationSeconds":20988,"views":246850,"thumbnail":"https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/c43d1ce993fae5a15f69_shroud_317074350583_1784915807//thumb/thumb0-320x180.jpg","thumbnailTemplate":"https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/c43d1ce993fae5a15f69_shroud_317074350583_1784915807//thumb/thumb0-{width}x{height}.jpg","animatedPreviewUrl":"https://d2nvs31859zcd8.cloudfront.net/c43d1ce993fae5a15f69_shroud_317074350583_1784915807/storyboards/2827992810-strip-0.jpg","broadcastType":"ARCHIVE","game":"VALORANT","gameId":"516575","gameSlug":"valorant","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/516575-144x192.jpg","language":"en"},{"platform":"twitch","id":"2827192082","url":"https://www.twitch.tv/videos/2827192082","embedUrl":"https://player.twitch.tv/?video=2827192082&parent=captapi.com","title":"HALO CE REMAKE! TIME TO CO-OP LEGENDARY AND GET OUR MEAT BEAT","createdAt":"2026-07-23T18:19:36Z","durationSeconds":20254,"views":176103,"thumbnail":"https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/43c3501090df2005acdf_shroud_319635395040_1784830770//thumb/thumb0-320x180.jpg","thumbnailTemplate":"https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/43c3501090df2005acdf_shroud_319635395040_1784830770//thumb/thumb0-{width}x{height}.jpg","animatedPreviewUrl":"https://d2vi6trrdongqn.cloudfront.net/43c3501090df2005acdf_shroud_319635395040_1784830770/storyboards/2827192082-strip-0.jpg","broadcastType":"ARCHIVE","game":"Halo: Campaign Evolved","gameId":"796500915","gameSlug":"halo-campaign-evolved","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/796500915_IGDB-144x192.jpg","language":"en"}],"topClips":[{"platform":"twitch","id":"2358589597","slug":"TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ","url":"https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ","embedUrl":"https://clips.twitch.tv/embed?clip=TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ","title":"F Shroud","views":562324,"createdAt":"2023-06-02T11:41:50Z","thumbnail":"https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/5696a6a8-e053-4c2e-a54c-5ca62c48102e/landscape/thumb/thumb-0000000000-1920x1080.jpg","game":"Diablo IV","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/515024-144x192.jpg"},{"platform":"twitch","id":"3663533447","slug":"SuccessfulEndearingPidgeonPunchTrees-46KXLAMeuS9kpp5Q","url":"https://www.twitch.tv/shroud/clip/SuccessfulEndearingPidgeonPunchTrees-46KXLAMeuS9kpp5Q","embedUrl":"https://clips.twitch.tv/embed?clip=SuccessfulEndearingPidgeonPunchTrees-46KXLAMeuS9kpp5Q","title":"it's gonna be over","views":561935,"createdAt":"2023-08-05T10:53:38Z","thumbnail":"https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/05f80190-90b4-4569-94ce-36a01d87b191/landscape/thumb/thumb-0000000000-1920x1080.jpg","game":"Baldur's Gate 3","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/512923_IGDB-144x192.jpg"}],"schedule":[{"id":"eyJzZWdtZW50SUQiOiI4OTdjMTZjNy1jYTYyLTQ4OGItODI4ZS0wY2Q1OTdjMzEyNzUiLCJpc29ZZWFyIjoyMDI2LCJpc29XZWVrIjozM30=","startAt":"2026-08-16T18:00:00Z","endAt":"2026-08-17T02:00:00Z","isRecurring":false,"isCancelled":false},{"id":"eyJzZWdtZW50SUQiOiJkNDYzZDJmNy1jNGQ3LTQ0ZTgtYWU0OS01OTlkNjI1Y2RkMTMiLCJpc29ZZWFyIjoyMDI2LCJpc29XZWVrIjozNH0=","startAt":"2026-08-17T18:00:00Z","endAt":"2026-08-18T02:00:00Z","isRecurring":true,"isCancelled":false,"firstOccurrenceAt":"2025-11-24T19:00:00Z"}],"socials":[{"platform":"link","url":"https://shroud.gg/"},{"platform":"link","url":"https://streamelements.com/shroud/tip"}],"createdAt":"2012-11-03T15:50:32.87847Z","bio":"I'm back baby","avatar":"https://static-cdn.jtvnw.net/jtv_user_pictures/c754eebf-745b-4e0a-814a-10bcaecaabbc-profile_image-300x300.png","banner":"https://static-cdn.jtvnw.net/jtv_user_pictures/dbee25e8-55b7-4565-87f0-e9d4661dcc66-profile_banner-480.jpeg","lastBroadcast":{"title":"ME N THE GIRLS MAY BE OUT! BUT WE HAD FUN!","game":"VALORANT","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/516575-144x192.jpg","startedAt":"2026-07-24T23:46:43.553428Z"},"handle":"shroud"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitch/user-videos":{"get":{"operationId":"twitch_user_videos","tags":["Twitch"],"summary":"Twitch User Videos API","description":"Twitch channel VODs — lean rows, video-id cursor, filter/sort, top-level broadcaster{} (flat 2).\n\nPass a Twitch channel URL or username and get a clean videos[] list (not a profile dump). Each row: id, url, embedUrl, title, createdAt, durationSeconds, views, thumbnail (320x180 — {width}x{height} substituted; thumbnailTemplate kept), animatedPreviewUrl, broadcastType, game (+ gameId/gameSlug/box art), lowercase language. Channel identity is once at the top as broadcaster{id,handle,displayName,url,avatar,followers,isPartner,isAffiliate} — videos[] do not repeat channel{}/broadcaster/broadcasterProfileImage. The same lean row shape is used on profile.recentVideos[]. filterBy=ARCHIVE|HIGHLIGHT|UPLOAD (omit for all types — no default filter; an unset filterBy is omitted, not null). sortBy=TIME|VIEWS. nextCursor is the last video id on the page (stable within the window — not a raw offset). Hard ceiling: first 100 matching videos (windowMax=100); Twitch anonymous GQL rejects after-cursors with IntegrityCheckFailed, so deeper history is not available. Flat 2 credits per call.\n\nDocs: https://captapi.com/apis/twitch-user-videos","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Twitch channel URL or username, e.g. https://www.twitch.tv/shroud. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 2 credits per call. Hard ceiling: first 100 matching videos only — deeper history is not available (windowMax=100).","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"filterBy","in":"query","required":false,"description":"ARCHIVE | HIGHLIGHT | UPLOAD. Omit for all types — there is no default filter (unset filterBy is omitted, not null).","schema":{"type":"string"}},{"name":"sortBy","in":"query","required":false,"description":"TIME (default, newest first) or VIEWS.","schema":{"type":"string","default":"TIME"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor = last video id from the previous nextCursor. Leave empty for the first page. Pages the first 100 matching videos only (not a raw offset).","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Twitch channel VODs — lean rows, video-id cursor, filter/sort, top-level broadcaster{} (flat 2).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"handle":{"type":"string","description":"Channel login for this list (same value as broadcaster.handle)."},"sortBy":{"type":"string","description":"Sort by. Example: \"TIME\"."},"broadcaster":{"type":"object","properties":{"id":{"type":"string","description":"Id of this broadcaster item."},"handle":{"type":"string","description":"Channel login for this list (same value as broadcaster.handle)."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"followers":{"type":"integer","description":"Follower count."},"isPartner":{"type":"boolean","description":"Whether the channel is a platform Partner/partner."},"isAffiliate":{"type":"boolean","description":"Whether the channel is an affiliate."}}},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Last video id on this page. Pass as cursor for the next page within the first 100 matching videos. Not a raw offset."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"windowMax":{"type":"integer","description":"Always 100 — Twitch anonymous GQL only exposes the first 100 matching videos; deeper history is not available."},"videos":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this videos item."},"url":{"type":"string","description":"Canonical URL of the item."},"embedUrl":{"type":"string","description":"Platform embed URL when a real embed id is known. Do not invent from a page/permalink id."},"title":{"type":"string","description":"Title of this videos item."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"views":{"type":"integer","description":"View count when the platform exposes one."},"thumbnail":{"type":"string","description":"VOD thumbnail with {width}x{height} substituted to 320x180. See thumbnailTemplate for the raw template."},"thumbnailTemplate":{"type":"string","description":"Thumbnail template URL."},"animatedPreviewUrl":{"type":"string","description":"Storyboard strip / animated preview image for a VOD."},"broadcastType":{"type":"string","description":"Broadcast type. Example: \"ARCHIVE\"."},"game":{"type":"string","description":"Game or category being streamed."},"gameId":{"type":"string","description":"Twitch game/category id."},"gameSlug":{"type":"string","description":"Twitch game/category slug."},"gameBoxArtUrl":{"type":"string","description":"Twitch category/game box art image URL (usually 144×192)."},"language":{"type":"string","description":"BCP-47 lowercase (same as twitch/clip and profile recentVideos)."}}}}}}}},"example":{"success":true,"data":{"platform":"twitch","handle":"shroud","sortBy":"TIME","broadcaster":{"id":"37402112","handle":"shroud","displayName":"shroud","url":"https://www.twitch.tv/shroud","avatar":"https://static-cdn.jtvnw.net/jtv_user_pictures/c754eebf-745b-4e0a-814a-10bcaecaabbc-profile_image-300x300.png","followers":11290546,"isPartner":true,"isAffiliate":false},"totalReturned":2,"nextCursor":"2827192082","hasMore":true,"windowMax":100,"videos":[{"platform":"twitch","id":"2827992810","url":"https://www.twitch.tv/videos/2827992810","embedUrl":"https://player.twitch.tv/?video=2827992810&parent=captapi.com","title":"ME N THE GIRLS R GONNA POP OFF IN THIS 100K TWITCH RIVALS","createdAt":"2026-07-24T17:56:52Z","durationSeconds":20988,"views":246850,"thumbnail":"https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/c43d1ce993fae5a15f69_shroud_317074350583_1784915807//thumb/thumb0-320x180.jpg","thumbnailTemplate":"https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/c43d1ce993fae5a15f69_shroud_317074350583_1784915807//thumb/thumb0-{width}x{height}.jpg","animatedPreviewUrl":"https://d2nvs31859zcd8.cloudfront.net/c43d1ce993fae5a15f69_shroud_317074350583_1784915807/storyboards/2827992810-strip-0.jpg","broadcastType":"ARCHIVE","game":"VALORANT","gameId":"516575","gameSlug":"valorant","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/516575-144x192.jpg","language":"en"},{"platform":"twitch","id":"2827192082","url":"https://www.twitch.tv/videos/2827192082","embedUrl":"https://player.twitch.tv/?video=2827192082&parent=captapi.com","title":"HALO CE REMAKE! TIME TO CO-OP LEGENDARY AND GET OUR MEAT BEAT","createdAt":"2026-07-23T18:19:36Z","durationSeconds":20254,"views":176103,"thumbnail":"https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/43c3501090df2005acdf_shroud_319635395040_1784830770//thumb/thumb0-320x180.jpg","thumbnailTemplate":"https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/43c3501090df2005acdf_shroud_319635395040_1784830770//thumb/thumb0-{width}x{height}.jpg","animatedPreviewUrl":"https://d2vi6trrdongqn.cloudfront.net/43c3501090df2005acdf_shroud_319635395040_1784830770/storyboards/2827192082-strip-0.jpg","broadcastType":"ARCHIVE","game":"Halo: Campaign Evolved","gameId":"796500915","gameSlug":"halo-campaign-evolved","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/796500915_IGDB-144x192.jpg","language":"en"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitch/user-schedule":{"get":{"operationId":"twitch_user_schedule","tags":["Twitch"],"summary":"Twitch User Schedule API","description":"Twitch channel schedule — startAt/endAt, title, game, isRecurring (0 credits when empty).\n\nPass a Twitch channel URL or username and get upcoming schedule segments as clean JSON. Each segment: id (stable segment key for dedup), title and game/gameId when Twitch exposes them, startAt/endAt (future-events tense — not startedAt/endedAt), isRecurring (false on one-offs, never null), isCancelled, canceledUntil (skip segments where this is set — a canceled broadcast still appears in Twitch's list), firstOccurrenceAt only when isRecurring is true. This is the canonical full schedule; twitch/profile.schedule[] is only a short preview (up to 10). Anonymous GQL does not expose timezone or vacation mode. Empty schedule (totalReturned=0) is 0 credits. Pass limit (default 50, max 100).\n\nDocs: https://captapi.com/apis/twitch-user-schedule","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Twitch channel URL or username, e.g. https://www.twitch.tv/shroud. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max schedule segments to return (default 50, max 100). Flat 1 credit per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":50}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Twitch channel schedule — startAt/endAt, title, game, isRecurring (0 credits when empty).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"handle":{"type":"string","description":"Channel login this schedule belongs to."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"schedule":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this schedule item."},"startAt":{"type":"string","description":"Segment start (ISO-8601 UTC). Future-events tense — this endpoint lists upcoming slots, not a stream that already started."},"endAt":{"type":"string","description":"Segment end (ISO-8601 UTC)."},"isRecurring":{"type":"boolean","description":"Whether the segment is a recurring series. false on one-offs — never null."},"isCancelled":{"type":"boolean","description":"Whether this occurrence is cancelled."},"firstOccurrenceAt":{"type":"string"}}}}}}}},"example":{"success":true,"data":{"platform":"twitch","handle":"shroud","totalReturned":2,"schedule":[{"id":"eyJzZWdtZW50SUQiOiI4OTdjMTZjNy1jYTYyLTQ4OGItODI4ZS0wY2Q1OTdjMzEyNzUiLCJpc29ZZWFyIjoyMDI2LCJpc29XZWVrIjozM30=","startAt":"2026-08-16T18:00:00Z","endAt":"2026-08-17T02:00:00Z","isRecurring":false,"isCancelled":false},{"id":"eyJzZWdtZW50SUQiOiJkNDYzZDJmNy1jNGQ3LTQ0ZTgtYWU0OS01OTlkNjI1Y2RkMTMiLCJpc29ZZWFyIjoyMDI2LCJpc29XZWVrIjozNH0=","startAt":"2026-08-17T18:00:00Z","endAt":"2026-08-18T02:00:00Z","isRecurring":true,"isCancelled":false,"firstOccurrenceAt":"2025-11-24T19:00:00Z"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/twitch/clip":{"get":{"operationId":"twitch_clip","tags":["Twitch"],"summary":"Twitch Clip API","description":"Twitch clip — curator vs channel, signedVideoUrl, unwrapped token, relatedClips (1 credit).\n\nPass a Twitch clip URL (clips.twitch.tv/&lt;slug&gt; or twitch.tv/&lt;channel&gt;/clip/&lt;slug&gt;) and get a clean structured object — not Twitch's raw GraphQL envelope. Channel URLs and usernames are 400 (they belong on /twitch/profile) — rejected immediately instead of a slow miss. Includes curator (who cut the clip) separate from channel{id,handle,displayName,url,avatar,followers,isPartner,lastBroadcast}, BCP-47 lowercase language (same as twitch/profile recentVideos), isFeatured/isPublished, videoOffsetSeconds, gameId/gameSlug/gameBoxArtUrl, videoQualities[{quality,frameRate,url,signedUrl}] with frameRate rounded to 2dp, videoUrl (unsigned source) plus signedVideoUrl (?sig=&token= — required for /nauth/ MP4s; unsigned returns 401), playbackAccessToken as parsed fields (signature, expires, expiresAt, clipUri, clipSlug, deviceId, version, authorization — no escaped JSON value string), and relatedClips[] from the same channel. No flat broadcaster / broadcasterProfileImage twins. Accepts cache / cacheMaxAge=1d|3d|7d|14d|30d. Flat 1 credit.\n\nDocs: https://captapi.com/apis/twitch-clip","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Twitch clip URL (clips.twitch.tv/<slug> or twitch.tv/<channel>/clip/<slug>). The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Twitch clip — curator vs channel, signedVideoUrl, unwrapped token, relatedClips (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Stable platform ID for the item."},"slug":{"type":"string","description":"URL slug of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"embedUrl":{"type":"string","description":"Platform embed URL when a real embed id is known. Do not invent from a page/permalink id."},"title":{"type":"string","description":"Title of the item."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"views":{"type":"integer","description":"View count when the platform exposes one."},"thumbnail":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Unsigned highest-quality source MP4 path (often /nauth/). Does not play by itself — Twitch returns 401 without a signature. Use signedVideoUrl for ready-to-play playback."},"signedVideoUrl":{"type":"string","description":"Ready-to-play highest-quality URL with ?sig=&token= appended. Required for current /nauth/ clip CDN paths. Expires with playbackAccessToken.expiresAt."},"videoQualities":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string","description":"Quality tier of the format."},"frameRate":{"type":"number","description":"Frames per second for a videoQualities row, rounded to 2 decimal places (Twitch returns raw floats like 60.023…). Example: 60."},"url":{"type":"string","description":"Canonical URL of the item."},"signedUrl":{"type":"string","description":"Signed url URL."}}}},"language":{"type":"string","description":"BCP-47 language, lowercase (e.g. en, es). Normalized the same way as twitch/profile recentVideos[].language — Twitch's raw clip field is often uppercase."},"isFeatured":{"type":"boolean","description":"Whether Twitch marks the clip as featured on the channel."},"isPublished":{"type":"boolean","description":"Whether the clip is published."},"videoOffsetSeconds":{"type":"integer","description":"Seconds into the source VOD where the clip starts."},"game":{"type":"string","description":"Game or category being streamed."},"gameId":{"type":"string","description":"Twitch game/category id."},"gameSlug":{"type":"string","description":"Twitch game/category slug."},"gameBoxArtUrl":{"type":"string","description":"Twitch category/game box art image URL (usually 144×192)."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Id of this channel item."},"handle":{"type":"string","description":"Account handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"followers":{"type":"integer","description":"Follower count."},"isPartner":{"type":"boolean","description":"Whether the channel is a platform Partner/partner."},"lastBroadcast":{"type":"object","properties":{"startedAt":{"type":"string"},"title":{"type":"string","description":"Title of the item."}},"description":"Most recent broadcast metadata ({startedAt, title})."}}},"curator":{"type":"object","properties":{"id":{"type":"string","description":"Id of this curator item."},"handle":{"type":"string","description":"Account handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."}}},"playbackAccessToken":{"type":"object","properties":{"signature":{"type":"string","description":"Signature. Example: \"9902191e0b3125657995296cbba4f83b41dd920e\"."},"expires":{"type":"integer","description":"Expires. Example: 1786947372."},"expiresAt":{"type":"string","description":"When signed URLs expire (ISO 8601)."},"clipUri":{"type":"string","description":"Clip uri URL."},"clipSlug":{"type":"string","description":"Clip slug."},"deviceId":{"type":"string","description":"Device id. Example: \"2de496b19fa54321aae2acec1f64aeb6\"."},"version":{"type":"integer","description":"Version. Example: 3."},"authorization":{"type":"object","properties":{"forbidden":{"type":"boolean"}},"description":"Object with forbidden."}}},"relatedClips":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this related clips item."},"slug":{"type":"string","description":"URL slug of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this related clips item."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"views":{"type":"integer","description":"View count when the platform exposes one."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"language":{"type":"string","description":"BCP-47 language, lowercase (e.g. en, es). Normalized the same way as twitch/profile recentVideos[].language — Twitch's raw clip field is often uppercase."},"thumbnail":{"type":"string","description":"Thumbnail image URL."}}}}}}}},"example":{"success":true,"data":{"platform":"twitch","id":"3052590127","slug":"EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4","url":"https://www.twitch.tv/xqc/clip/EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4","embedUrl":"https://clips.twitch.tv/embed?clip=EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4","title":"the word","createdAt":"2026-07-12T23:00:58Z","durationSeconds":44,"views":31747,"thumbnail":"https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/thumb/thumb-0000000000-1920x1080.jpg","videoUrl":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/1080/index.mp4","signedVideoUrl":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/1080/index.mp4?sig=9902191e0b3125657995296cbba4f83b41dd920e&token=%7B%22authorization%22%3A%7B%22forbidden%22%3Afalse%2C%22reason%22%3A%22%22%7D%2C%22clip_uri%22%3A%22https%3A%2F%2Fd1ndex63qxojbr.cloudfront.net%2Fnauth%2Fa952a6bb-ad94-4889-8ac1-6afadf21d338%2Flandscape%2Fh264%2F720%2Findex.mp4%22%2C%22clip_slug%22%3A%22EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4%22%2C%22device_id%22%3A%222de496b19fa54321aae2acec1f64aeb6%22%2C%22expires%22%3A1786947372%2C%22user_id%22%3A%22%22%2C%22version%22%3A3%7D","videoQualities":[{"quality":"1080","frameRate":60,"url":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/1080/index.mp4","signedUrl":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/1080/index.mp4?sig=9902191e0b3125657995296cbba4f83b41dd920e&token=%7B%22authorization%22%3A%7B%22forbidden%22%3Afalse%2C%22reason%22%3A%22%22%7D%2C%22clip_uri%22%3A%22https%3A%2F%2Fd1ndex63qxojbr.cloudfront.net%2Fnauth%2Fa952a6bb-ad94-4889-8ac1-6afadf21d338%2Flandscape%2Fh264%2F720%2Findex.mp4%22%2C%22clip_slug%22%3A%22EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4%22%2C%22device_id%22%3A%222de496b19fa54321aae2acec1f64aeb6%22%2C%22expires%22%3A1786947372%2C%22user_id%22%3A%22%22%2C%22version%22%3A3%7D"},{"quality":"720","frameRate":60.02,"url":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/720/index.mp4","signedUrl":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/720/index.mp4?sig=9902191e0b3125657995296cbba4f83b41dd920e&token=%7B%22authorization%22%3A%7B%22forbidden%22%3Afalse%2C%22reason%22%3A%22%22%7D%2C%22clip_uri%22%3A%22https%3A%2F%2Fd1ndex63qxojbr.cloudfront.net%2Fnauth%2Fa952a6bb-ad94-4889-8ac1-6afadf21d338%2Flandscape%2Fh264%2F720%2Findex.mp4%22%2C%22clip_slug%22%3A%22EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4%22%2C%22device_id%22%3A%222de496b19fa54321aae2acec1f64aeb6%22%2C%22expires%22%3A1786947372%2C%22user_id%22%3A%22%22%2C%22version%22%3A3%7D"}],"language":"en","isFeatured":false,"isPublished":true,"videoOffsetSeconds":1677,"game":"Just Chatting","gameId":"509658","gameSlug":"just-chatting","gameBoxArtUrl":"https://static-cdn.jtvnw.net/ttv-boxart/509658-285x380.jpg","channel":{"id":"71092938","handle":"xqc","displayName":"xQc","url":"https://www.twitch.tv/xqc","avatar":"https://static-cdn.jtvnw.net/jtv_user_pictures/xqc-profile_image-9298dca608632101-150x150.jpeg","followers":12535517,"isPartner":true,"lastBroadcast":{"startedAt":"2026-08-15T08:25:40.687536Z","title":"🧀LIVE🧀HERE🧀LOCKIN🧀DRAMA🧀NEWS🧀VIDEOS🧀GAMES🧀REACTS🧀THINGS🧀"}},"curator":{"id":"768198835","handle":"puertoricanporo","displayName":"puertoricanporo","url":"https://www.twitch.tv/puertoricanporo","avatar":"https://static-cdn.jtvnw.net/jtv_user_pictures/15b6d728-aa8b-47be-a3a3-6474f3bea71e-profile_image-150x150.png"},"playbackAccessToken":{"signature":"9902191e0b3125657995296cbba4f83b41dd920e","expires":1786947372,"expiresAt":"2026-08-17T06:16:12Z","clipUri":"https://d1ndex63qxojbr.cloudfront.net/nauth/a952a6bb-ad94-4889-8ac1-6afadf21d338/landscape/h264/720/index.mp4","clipSlug":"EnergeticEmpathicElephantJKanStyle-0sOlvgAod9mDhCw4","deviceId":"2de496b19fa54321aae2acec1f64aeb6","version":3,"authorization":{"forbidden":false}},"relatedClips":[{"id":"3942697259","slug":"DeliciousDelightfulPicklesWOOP","url":"https://www.twitch.tv/xqc/clip/DeliciousDelightfulPicklesWOOP","title":"xqc makes the wrong choice","createdAt":"2020-12-09T19:18:10Z","views":949606,"durationSeconds":44,"language":"en","thumbnail":"https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/ce4b4ef1-4e8d-4391-bff6-2bc4c5506a4d/landscape/thumb/thumb-0000000000-1920x1080.jpg"},{"id":"379398706","slug":"NimbleProductiveAsparagusHeyGuys-s77ZvN10Yr-O2sfo","url":"https://www.twitch.tv/xqc/clip/NimbleProductiveAsparagusHeyGuys-s77ZvN10Yr-O2sfo","title":"wow","createdAt":"2021-04-04T21:34:33Z","views":776873,"durationSeconds":26,"language":"en","thumbnail":"https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/b0181c83-be87-4dab-ad46-15dde4d81647/landscape/thumb/thumb-0000000000-1920x1080.jpg"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/spotify/artist":{"get":{"operationId":"spotify_artist","tags":["Spotify"],"summary":"Spotify Artist API","description":"Spotify artist — followers, monthlyListeners, worldRank, topCities, topTracks with playCount, concerts, and related artists (1 credit).\n\nPass a Spotify artist URL, URI, or ID and get a clean profile: name (track/artist title — not a profile displayName alias), description, image, followers, monthlyListeners, worldRank, topCities[{city,country,region,listeners}], externalLinks[], verified, topTracks[] (with playCount), concerts[], relatedArtists[], and albums[]/singles[] samples plus albumsCount/singlesCount and albumsHasMore/singlesHasMore. Flat 1 credit. monthlyListeners, topCities, and worldRank are not on Spotify's public Web API. The overview GraphQL only embeds a short discography sample — when HasMore is true, chain release URIs into /spotify/album. Pass raw=true only if you need the full upstream GraphQL payload (omitted by default — it is ~80% of the old response).\n\nDocs: https://captapi.com/apis/spotify-artist","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Spotify URL, URI, or ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"raw","in":"query","required":false,"description":"Include the upstream GraphQL payload as data.raw. Default false — omit unless you need fields not in the normalized shape (~80% of the old response body).","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Spotify artist — followers, monthlyListeners, worldRank, topCities, topTracks with playCount, concerts, and related artists (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Artist display name on Spotify. Not a deprecated displayName alias."},"description":{"type":"string","description":"Description text."},"followers":{"type":"integer","description":"Follower count."},"monthlyListeners":{"type":"integer","description":"Monthly listener count."},"image":{"type":"string","description":"Image URL."},"worldRank":{"type":"integer","description":"Artist global rank by monthly listeners (web-player GraphQL; not on Spotify's public Web API)."},"topCities":{"type":"array","items":{"type":"object","properties":{"city":{"type":"string","description":"City. Example: \"London\"."},"country":{"type":"string","description":"ISO country for a topCities listener city (e.g. US). Not a popular-creators feed market."},"region":{"type":"string","description":"ISO region/country for a topCities row (listener geography), not a request market."},"listeners":{"type":"integer","description":"Listener count for a city in topCities."}}}},"externalLinks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Network label (FACEBOOK, INSTAGRAM, TWITTER, …) — not the artist display name."},"url":{"type":"string","description":"Canonical URL of the item."}}}},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"topTracks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Track title."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"playCount":{"type":"integer","description":"Lifetime stream count for a topTracks[] row."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"albumUri":{"type":"string","description":"Spotify album URI for a track."},"image":{"type":"string","description":"Image URL."},"explicit":{"type":"boolean","description":"Convenience boolean: true only when contentRating is EXPLICIT (or EXPLICIT is among contentRatingLabels)."}}}},"concerts":{"type":"array","items":{},"description":"Upcoming concerts with city, venue, and start time when Spotify exposes them."},"relatedArtists":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Related artist display name."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"image":{"type":"string","description":"Image URL."}}}},"albums":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Release title."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"image":{"type":"string","description":"Image URL."},"releaseYear":{"type":"integer","description":"Year of release."},"totalTracks":{"type":"integer","description":"Number of tracks."}}}},"singles":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Release title."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"image":{"type":"string","description":"Image URL."},"releaseYear":{"type":"integer","description":"Year of release."},"totalTracks":{"type":"integer","description":"Number of tracks."}}}},"albumsCount":{"type":"integer","description":"Total album count for the artist."},"singlesCount":{"type":"integer","description":"Total singles/EP count for the artist."},"albumsHasMore":{"type":"boolean","description":"True when albumsCount > len(albums[]) — overview sample is incomplete; chain into /spotify/album."},"singlesHasMore":{"type":"boolean","description":"True when singlesCount > len(singles[]) — overview sample is incomplete; chain into /spotify/album."},"id":{"type":"string","description":"Stable platform ID for the item."}}}}},"example":{"success":true,"data":{"platform":"spotify","type":"artist","uri":"spotify:artist:06HL4z0CvFAxyc27GXpf02","url":"https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02?si=ojAujUioTXmCOg3l0f4rNg","name":"Taylor Swift","description":"And, baby, that’s show business for you. New album The Life of a Showgirl. Available now ❤️‍🔥","followers":161871951,"monthlyListeners":100784802,"image":"https://i.scdn.co/image/ab6761610000e5ebe2e8e7ff002a4afda1c7147e","worldRank":6,"topCities":[{"city":"London","country":"GB","region":"ENG","listeners":1612075},{"city":"Quezon City","country":"PH","region":"00","listeners":1256007}],"externalLinks":[{"name":"FACEBOOK","url":"https://facebook.com/TaylorSwift"},{"name":"INSTAGRAM","url":"https://instagram.com/taylorswift"}],"verified":true,"topTracks":[{"name":"The Fate of Ophelia","uri":"spotify:track:53iuhJlwXhSER5J2IYYv1W","url":"https://open.spotify.com/track/53iuhJlwXhSER5J2IYYv1W","playCount":1571637645,"durationMs":226073,"albumUri":"spotify:album:4a6NzYL1YHRUgx9e3YZI6I","image":"https://i.scdn.co/image/ab67616d0000b273d7812467811a7da6e6a44902","explicit":false},{"name":"I Knew It, I Knew You - From \"Toy Story 5\"","uri":"spotify:track:5uPaqMMt59KGrdKIitDRqa","url":"https://open.spotify.com/track/5uPaqMMt59KGrdKIitDRqa","playCount":137089953,"durationMs":178186,"albumUri":"spotify:album:3ZLIShtR6Fjs4nTWFpBUB6","image":"https://i.scdn.co/image/ab67616d0000b273a35a1d4983e2b4fd0094f910","explicit":false}],"concerts":[],"relatedArtists":[{"name":"Sabrina Carpenter","uri":"spotify:artist:74KM79TiuVKeVCqs8QtB0B","url":"https://open.spotify.com/artist/74KM79TiuVKeVCqs8QtB0B","image":"https://i.scdn.co/image/ab6761610000e5eb78e45cfa4697ce3c437cb455"},{"name":"Ariana Grande","uri":"spotify:artist:66CXWjxzNUsdJxJ2JdwvnR","url":"https://open.spotify.com/artist/66CXWjxzNUsdJxJ2JdwvnR","image":"https://i.scdn.co/image/ab6761610000e5eb766397ec42a573a53eb5fb87"}],"albums":[{"name":"The Life of a Showgirl + Acoustic Collection","uri":"spotify:album:6QNMhoV8V0u7cFuhhUBOn7","url":"https://open.spotify.com/album/6QNMhoV8V0u7cFuhhUBOn7","image":"https://i.scdn.co/image/ab67616d0000b273f756bdc2c11a985dc0c06d94","releaseYear":2025,"totalTracks":19},{"name":"The Life of a Showgirl","uri":"spotify:album:4a6NzYL1YHRUgx9e3YZI6I","url":"https://open.spotify.com/album/4a6NzYL1YHRUgx9e3YZI6I","image":"https://i.scdn.co/image/ab67616d0000b273d7812467811a7da6e6a44902","releaseYear":2025,"totalTracks":12}],"singles":[{"name":"I Knew It, I Knew You (From \"Toy Story 5\")","uri":"spotify:album:4Ii9whWXI1O1H01ziECRaG","url":"https://open.spotify.com/album/4Ii9whWXI1O1H01ziECRaG","image":"https://i.scdn.co/image/ab67616d0000b273e8852f06eca817333d20e60b","releaseYear":2026,"totalTracks":3},{"name":"Elizabeth Taylor","uri":"spotify:album:71GTik4z9bbKKY2EmUvkDI","url":"https://open.spotify.com/album/71GTik4z9bbKKY2EmUvkDI","image":"https://i.scdn.co/image/ab67616d0000b273dc6e4c7774e0c77c210d3a31","releaseYear":2026,"totalTracks":3}],"albumsCount":33,"singlesCount":79,"albumsHasMore":true,"singlesHasMore":true,"id":"06HL4z0CvFAxyc27GXpf02"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/spotify/track":{"get":{"operationId":"spotify_track","tags":["Spotify"],"summary":"Spotify Track API","description":"Spotify track — playCount, joinable artists[]/album{}, explicit, releaseDate (1 credit).\n\nPass a Spotify track URL, URI, or ID and get clean JSON: id, name (song title), playCount (stream count from Spotify's web GraphQL — same metric as artist topTracks[].playCount), trackNumber, contentRating + explicit, durationMs, artists[{id,uri,name,url}] (chain into /spotify/artist), album{id,uri,name,url,releaseDate} (chain into /spotify/album), releaseDate, and previewUrl / isrc / popularity when this Pathfinder surface exposes them. Flat 1 credit (same as artist — not 2). Pass raw=true only for the full GraphQL payload (omitted by default). Note: Spotify's official 0–100 popularity and ISRC are often absent on getTrack; playCount is the listen metric here.\n\nDocs: https://captapi.com/apis/spotify-track","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Spotify URL, URI, or ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"raw","in":"query","required":false,"description":"Include the upstream GraphQL payload as data.raw. Default false — getTrack embeds bulky artist discography.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Spotify track — playCount, joinable artists[]/album{}, explicit, releaseDate (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Track title (song name). Not a profile displayName alias."},"artists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this artists item."},"uri":{"type":"string","description":"Platform URI for the item."},"name":{"type":"string","description":"Name of this artists item."},"url":{"type":"string","description":"Canonical URL of the item."}}}},"album":{"type":"object","properties":{"id":{"type":"string","description":"Id of this album item."},"uri":{"type":"string","description":"Platform URI for the item."},"name":{"type":"string","description":"Name of this album item."},"url":{"type":"string","description":"Canonical URL of the item."},"releaseDate":{"type":"string","description":"Album release date (ISO) when Spotify exposes it on the track payload."}}},"durationMs":{"type":"integer","description":"Length in milliseconds."},"durationFormatted":{"type":"string","description":"Human-readable duration."},"releaseYear":{"type":"integer","description":"Year of release."},"image":{"type":"string","description":"Image URL."},"id":{"type":"string","description":"Stable platform ID for the item."},"playCount":{"type":"integer","description":"Lifetime stream count from Spotify web GraphQL (same metric as artist topTracks[].playCount)."},"trackNumber":{"type":"integer","description":"Track position on the album."},"contentRating":{"type":"string","description":"Pathfinder contentRating.label: NONE | EXPLICIT | NINETEEN_PLUS | UNKNOWN. Not a 2-valued twin of explicit — age-gate labels stay here."},"explicit":{"type":"boolean","description":"Convenience boolean: true only when contentRating is EXPLICIT. NINETEEN_PLUS / UNKNOWN / NONE → false."},"mediaType":{"type":"string","description":"Spotify media type (e.g. AUDIO)."},"playable":{"type":"boolean","description":"Whether the track is playable in the web player."},"releaseDate":{"type":"string","description":"Album release date (ISO) when Spotify exposes it on the track payload."}}}}},"example":{"success":true,"data":{"platform":"spotify","type":"track","uri":"spotify:track:0V3wPSX9ygBnCm8psDIegu","url":"https://open.spotify.com/track/0V3wPSX9ygBnCm8psDIegu","name":"Anti-Hero","artists":[{"id":"06HL4z0CvFAxyc27GXpf02","uri":"spotify:artist:06HL4z0CvFAxyc27GXpf02","name":"Taylor Swift","url":"https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"}],"album":{"id":"151w1FgRZfnKZA9FEcg9Z3","uri":"spotify:album:151w1FgRZfnKZA9FEcg9Z3","name":"Midnights","url":"https://open.spotify.com/album/151w1FgRZfnKZA9FEcg9Z3","releaseDate":"2022-10-21T00:00:00Z"},"durationMs":200690,"durationFormatted":"3:20","releaseYear":2022,"image":"https://i.scdn.co/image/ab67616d0000b273bb54dde68cd23e2a268ae0f5","id":"0V3wPSX9ygBnCm8psDIegu","playCount":2037355549,"trackNumber":3,"contentRating":"NONE","explicit":false,"mediaType":"AUDIO","playable":true,"releaseDate":"2022-10-21T00:00:00Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/spotify/album":{"get":{"operationId":"spotify_album","tags":["Spotify"],"summary":"Spotify Album API","description":"Spotify album — tracks[] with playCount, joinable artists[], releaseDate, explicit (1 credit).\n\nPass a Spotify album URL, URI, or ID and get clean JSON: name, artists[{id,uri,name,url}] (chain into /spotify/artist), tracks[{id,trackNumber,discNumber,name,uri,url,durationMs,playCount,explicit,artists}] from tracksV2 (per-track stream counts; id matches the uri suffix for joins into /spotify/track), totalTracks, releaseDate (full ISO — not year-only), releaseYear, album-level explicit (true if any track label is EXPLICIT), and cover image. Flat 1 credit (same as artist/track — not 2). Pass raw=true only if you need the full GraphQL payload (omitted by default).\n\nDocs: https://captapi.com/apis/spotify-album","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Spotify URL, URI, or ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"raw","in":"query","required":false,"description":"Include the upstream GraphQL payload as data.raw. Default false — omit unless you need fields not in the normalized shape.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Spotify album — tracks[] with playCount, joinable artists[], releaseDate, explicit (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Album title. Not a profile displayName alias."},"artists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this artists item."},"uri":{"type":"string","description":"Platform URI for the item."},"name":{"type":"string","description":"Artist display name."},"url":{"type":"string","description":"Canonical URL of the item."}}},"description":"Album artists as [{id, uri, name, url}] — chain uri into /spotify/artist."},"releaseYear":{"type":"integer","description":"Convenience year derived from releaseDate / date.year."},"image":{"type":"string","description":"Image URL."},"totalTracks":{"type":"integer","description":"Album track count from Spotify (matches tracks[] length when the catalog page is complete)."},"tracks":{"type":"array","items":{"type":"object","properties":{"trackNumber":{"type":"integer","description":"Track position on the album."},"discNumber":{"type":"integer","description":"Disc number. Example: 1."},"name":{"type":"string","description":"Track title."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"playCount":{"type":"integer","description":"Lifetime stream count for a tracks[] row (same GraphQL metric as /spotify/track)."},"explicit":{"type":"boolean","description":"True if any track contentRating is EXPLICIT; false when no track is EXPLICIT."},"artists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this artists item."},"uri":{"type":"string","description":"Platform URI for the item."},"name":{"type":"string","description":"Artist display name."},"url":{"type":"string","description":"Canonical URL of the item."}}},"description":"Album artists as [{id, uri, name, url}] — chain uri into /spotify/artist."}}}},"tracksHasMore":{"type":"boolean","description":"True when totalTracks exceeds the tracks[] page returned (rare after full pagination)."},"releaseDate":{"type":"string","description":"Full album release timestamp (ISO) when Spotify precision is DAY — prefer over releaseYear alone."},"explicit":{"type":"boolean","description":"True if any track contentRating is EXPLICIT; false when no track is EXPLICIT."},"id":{"type":"string","description":"Stable platform ID for the item."}}}}},"example":{"success":true,"data":{"platform":"spotify","type":"album","uri":"spotify:album:151w1FgRZfnKZA9FEcg9Z3","url":"https://open.spotify.com/album/151w1FgRZfnKZA9FEcg9Z3?si=DKhdQPU7T8W1NtfM19TiiA","name":"Midnights","artists":[{"id":"06HL4z0CvFAxyc27GXpf02","uri":"spotify:artist:06HL4z0CvFAxyc27GXpf02","name":"Taylor Swift","url":"https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"}],"releaseYear":2022,"image":"https://i.scdn.co/image/ab67616d0000b273bb54dde68cd23e2a268ae0f5","totalTracks":13,"tracks":[{"trackNumber":1,"discNumber":1,"name":"Lavender Haze","uri":"spotify:track:5jQI2r1RdgtuT8S3iG8zFC","url":"https://open.spotify.com/track/5jQI2r1RdgtuT8S3iG8zFC","durationMs":202395,"playCount":902202241,"explicit":true,"artists":[{"id":"06HL4z0CvFAxyc27GXpf02","uri":"spotify:artist:06HL4z0CvFAxyc27GXpf02","name":"Taylor Swift","url":"https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"}]},{"trackNumber":2,"discNumber":1,"name":"Maroon","uri":"spotify:track:3eX0NZfLtGzoLUxPNvRfqm","url":"https://open.spotify.com/track/3eX0NZfLtGzoLUxPNvRfqm","durationMs":218270,"playCount":627635994,"explicit":true,"artists":[{"id":"06HL4z0CvFAxyc27GXpf02","uri":"spotify:artist:06HL4z0CvFAxyc27GXpf02","name":"Taylor Swift","url":"https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"}]}],"tracksHasMore":false,"releaseDate":"2022-10-21T00:00:00Z","explicit":true,"id":"151w1FgRZfnKZA9FEcg9Z3"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/spotify/search":{"get":{"operationId":"spotify_search","tags":["Spotify"],"summary":"Spotify Search API","description":"Search Spotify — canonical spotify: URIs, explicit, fetchedAt (flat 2 credits).\n\nPass q plus optional type=tracks|albums|artists|podcasts|episodes (default tracks) and limit (max 50, no cursor). Primary path is web-player Pathfinder GraphQL (same family as /spotify/artist|track|album); a fallback path serves only on a miss — do not assume one raw schema across both (GraphQL __typename vs flat albumName/isExplicit). Envelope: query, type, fetchedAt, source (pathfinder; omitted when the fallback path served), results[]. Each result ships a canonical Spotify URI (spotify:track:… not a bare id), url, name, artists (structured on Pathfinder track/album hits), durationMs/durationFormatted, explicit, contentRating, and image. Request freshness is envelope fetchedAt only — not copied onto every row. Pathfinder search (decorateContextTracks) does not expose playCount or playable (absence ≠ false/zero); chain uri into /spotify/track for those. Flat 2 credits on native Pathfinder; the fallback path scales per result (cost varies with results). Pass raw=true for per-result upstream payloads (omitted by default; searchTerm is not repeated inside raw).\n\nDocs: https://captapi.com/apis/spotify-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search term (min 2 chars).","schema":{"type":"string","minLength":2}},{"name":"type","in":"query","required":false,"description":"Result kind: tracks (default), albums, artists, podcasts, or episodes.","schema":{"type":"string","pattern":"^(tracks|albums|artists|podcasts|episodes)$","default":"tracks"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 50). Flat 2 credits per call.","schema":{"type":"integer","maximum":50,"minimum":1,"default":20}},{"name":"raw","in":"query","required":false,"description":"Include per-result upstream payload as results[].raw. Default false. Pathfinder GraphQL vs fallback-path shapes differ — see FAQ.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Search Spotify — canonical spotify: URIs, explicit, fetchedAt (flat 2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"query":{"type":"string","description":"Echo of the q parameter."},"type":{"type":"string","description":"Content type of the item."},"fetchedAt":{"type":"string","description":"When this search request completed (envelope only — not duplicated on results[])."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Canonical Spotify URI (spotify:track:… / album:… / artist:… / show:… / episode:…) — never a bare id."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Result title (track, album, artist, or show name). Not a profile displayName alias."},"artists":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this results item."},"uri":{"type":"string","description":"Canonical Spotify URI (spotify:track:… / album:… / artist:… / show:… / episode:…) — never a bare id."},"name":{"type":"string","description":"Result title (track, album, artist, or show name). Not a profile displayName alias."},"url":{"type":"string","description":"Canonical URL of the item."}}},"description":"On Pathfinder track/album hits: [{id, uri, name, url}]. The fallback path may still ship name strings."},"album":{"type":"object","properties":{"id":{"type":"string","description":"Id of this results item."},"uri":{"type":"string","description":"Canonical Spotify URI (spotify:track:… / album:… / artist:… / show:… / episode:…) — never a bare id."},"name":{"type":"string","description":"Result title (track, album, artist, or show name). Not a profile displayName alias."},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Album the track belongs to."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"durationFormatted":{"type":"string","description":"Human duration (m:ss) when known."},"image":{"type":"string","description":"Image URL."},"id":{"type":"string","description":"Id of this results item."},"contentRating":{"type":"string","description":"Pathfinder contentRating.label when present on the search hydrate (NONE | EXPLICIT | NINETEEN_PLUS | UNKNOWN)."},"explicit":{"type":"boolean","description":"Whether the item is marked explicit (from contentRating or the fallback path's isExplicit)."}}}},"source":{"description":"\"pathfinder\" when the primary GraphQL path served; omitted when the fallback path served."}}}}},"example":{"success":true,"data":{"platform":"spotify","query":"lofi beats","type":"tracks","fetchedAt":"2026-08-07T10:56:53.985Z","totalReturned":2,"results":[{"platform":"spotify","type":"track","uri":"spotify:track:1xqpCUhTXEG3Zj7E6VEyj4","url":"https://open.spotify.com/track/1xqpCUhTXEG3Zj7E6VEyj4","name":"Lodi Dodi","artists":[{"id":"7hJcb9fa4alzcOq3EaNPoG","uri":"spotify:artist:7hJcb9fa4alzcOq3EaNPoG","name":"Snoop Dogg","url":"https://open.spotify.com/artist/7hJcb9fa4alzcOq3EaNPoG"}],"album":{"id":"0iXJO2ZAfKzNDYa6E4EFfl","uri":"spotify:album:0iXJO2ZAfKzNDYa6E4EFfl","name":"Death Row Greatest Hits","url":"https://open.spotify.com/album/0iXJO2ZAfKzNDYa6E4EFfl"},"durationMs":264480,"durationFormatted":"4:24","image":"https://i.scdn.co/image/ab67616d0000b2739322ff440b23b5717ddd8c9b","id":"1xqpCUhTXEG3Zj7E6VEyj4","contentRating":"EXPLICIT","explicit":true},{"platform":"spotify","type":"track","uri":"spotify:track:5SFVfPQNHzrsVjO2YmOl7u","url":"https://open.spotify.com/track/5SFVfPQNHzrsVjO2YmOl7u","name":"Lofi Beats","artists":[{"id":"0uXJZ5oJisbrkihiMUDiya","uri":"spotify:artist:0uXJZ5oJisbrkihiMUDiya","name":"Productivity Booster Music","url":"https://open.spotify.com/artist/0uXJZ5oJisbrkihiMUDiya"}],"album":{"id":"7D6QtZp3B4UAjd9J8hzjS2","uri":"spotify:album:7D6QtZp3B4UAjd9J8hzjS2","name":"All-Day Flow: Lo-Fi Beats for Creative Work","url":"https://open.spotify.com/album/7D6QtZp3B4UAjd9J8hzjS2"},"durationMs":158000,"durationFormatted":"2:38","image":"https://i.scdn.co/image/ab67616d0000b27356f94cadfab4bf5902a8f30c","id":"5SFVfPQNHzrsVjO2YmOl7u","contentRating":"NONE","explicit":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/spotify/podcast":{"get":{"operationId":"spotify_podcast","tags":["Spotify"],"summary":"Spotify Podcast API","description":"Spotify podcast show — publisher, rating, topics, explicit flag, and totalEpisodes as clean JSON.\n\nPass a Spotify show/podcast URL, URI, or ID (not an artist URL) and get clean JSON: id, name, description, publisher{name}, rating{average, totalRatings}, topics[{title, uri}], contentRating / contentRatingLabels / explicit, mediaType, showTypes, totalEpisodes, and cover image. Publisher is the show's publisher (not host names stuffed into artists[]). rating.average is one decimal (Spotify UI). htmlDescription is omitted when it is just description wrapped in &lt;p&gt;. Flat 1 credit per call. Does not ship Spotify's UI color palette (visualIdentity) or a bulky raw dump. For the episode archive, use /spotify/podcast-episodes (cursor pagination).\n\nDocs: https://captapi.com/apis/spotify-podcast","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Spotify show/podcast URL, URI, or ID (e.g. https://open.spotify.com/show/…). Not an artist URL.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Spotify podcast show — publisher, rating, topics, explicit flag, and totalEpisodes as clean JSON.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Podcast show title. Not a profile displayName alias."},"description":{"type":"string","description":"Description text."},"image":{"type":"string","description":"Image URL."},"totalEpisodes":{"type":"integer","description":"Episode count for the show when Spotify exposes it."},"id":{"type":"string","description":"Stable platform ID for the item."},"publisher":{"type":"object","properties":{"name":{"type":"string","description":"Show publisher (e.g. Joe Rogan, Hubspot) — not the show title and not the hosts."}}},"rating":{"type":"object","properties":{"average":{"type":"number","description":"Average. Example: 4.7."},"totalRatings":{"type":"integer","description":"Total ratings. Example: 952065."}}},"topics":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Title of this topics item."},"uri":{"type":"string","description":"Platform URI for the item."}}}},"contentRating":{"type":"string","description":"Primary Pathfinder label (first of contentRatingLabels). Podcast enum includes EXPLICIT | NINETEEN_PLUS | NOT_FOR_CHILDREN | SPOTIFY_EIGHTEEN_PLUS | UNKNOWN (and NONE on some surfaces)."},"contentRatingLabels":{"type":"array","items":{"type":"string"},"description":"Full label list from contentRatingV2 when present."},"explicit":{"type":"boolean","description":"True only when EXPLICIT is among the rating labels. On a show that is contentRatingLabels; on an episode it is contentRating (the episode's single label — same as the first of contentRatingLabels on the show). NINETEEN_PLUS and other age-gate values stay on contentRating — they do not make this true."},"mediaType":{"type":"string","description":"Media type label for this item (platform-specific enum)."},"playable":{"type":"boolean","description":"Whether the show is playable in the current market when Spotify exposes it."},"consumptionOrder":{"type":"string","description":"Consumption order. Example: \"EPISODIC\"."},"showTypes":{"type":"array","items":{"type":"string"},"description":"Show type flags when Spotify exposes them (e.g. \"SHOW_TYPE_EXCLUSIVE\")."}}}}},"example":{"success":true,"data":{"platform":"spotify","type":"podcast","uri":"spotify:show:4rOoJ6Egrf8K2IrywzwOMk","url":"https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk","name":"The Joe Rogan Experience","description":"The official podcast of comedian Joe Rogan.","image":"https://i.scdn.co/image/ab6765630000ba8a913317cdfae64a2585aa0f36","totalEpisodes":2731,"id":"4rOoJ6Egrf8K2IrywzwOMk","publisher":{"name":"Joe Rogan"},"rating":{"average":4.7,"totalRatings":952065},"topics":[{"title":"Comedy","uri":"spotify:genre:0JQ5DAqbMKFNr6gDrHHVKL"}],"contentRating":"EXPLICIT","contentRatingLabels":["EXPLICIT"],"explicit":true,"mediaType":"MIXED","playable":true,"consumptionOrder":"EPISODIC","showTypes":["SHOW_TYPE_EXCLUSIVE"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/spotify/podcast-episodes":{"get":{"operationId":"spotify_podcast_episodes","tags":["Spotify"],"summary":"Spotify Podcast Episodes API","description":"Podcast episode archive — previewUrl, releaseDate, explicit, cursor pagination (flat 2 credits).\n\nPass a Spotify show/podcast URL, URI, or ID (not an artist URL). Returns the show card plus episodes[{id, name, description, releaseDate, durationMs, previewUrl, audioUrls[], mediaTypes, hasVideo, contentRating/explicit, hasTranscripts, paywallContent, showTypes}]. totalEpisodes comes from the same episodes query as the page (no drift vs a separate show fetch). Cursor pagination via nextCursor/hasMore (offset into the archive; limit max 50). Flat 2 credits per call on native Pathfinder. Same anti-bloat rule as /spotify/podcast: no visualIdentity color dumps, no playedState, no per-episode podcastV2 show copies — raw is opt-in (?raw=true) and still slimmed.\n\nDocs: https://captapi.com/apis/spotify-podcast-episodes","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Spotify show/podcast URL, URI, or ID (e.g. https://open.spotify.com/show/…). Not an artist URL.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 50). Flat 2 credits per call.","schema":{"type":"integer","maximum":50,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"raw","in":"query","required":false,"description":"Include slimmed per-episode upstream payload as episodes[].raw. Default false. visualIdentity / playedState / podcastV2 are never included.","schema":{"type":"boolean","default":false}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Podcast episode archive — previewUrl, releaseDate, explicit, cursor pagination (flat 2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"podcast":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Show title."},"description":{"type":"string","description":"Description of this podcast item."},"image":{"type":"string","description":"Image URL."},"totalEpisodes":{"type":"integer","description":"Archive size from this episodes query (same source as pagination — no intra-response drift)."},"id":{"type":"string","description":"Show id (same id as in spotify:show:{id})."},"publisher":{"type":"object","properties":{"name":{"type":"string","description":"Show title."}},"description":"Object with name."},"rating":{"type":"object","properties":{"average":{"type":"number"},"totalRatings":{"type":"integer"}},"description":"On the embedded podcast card: {average, totalRatings}."},"topics":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"uri":{"type":"string","description":"Platform URI for the item."}}},"description":"Detected topics and themes."},"contentRating":{"type":"string","description":"Pathfinder contentRating.label (NONE | EXPLICIT | NINETEEN_PLUS | UNKNOWN, plus podcast age-gate labels when present)."},"contentRatingLabels":{"type":"array","items":{"type":"string"},"description":"Content rating labels (array)."},"explicit":{"type":"boolean","description":"True only when EXPLICIT is among the rating labels. On a show that is contentRatingLabels; on an episode it is contentRating (the episode's single label — same as the first of contentRatingLabels on the show). NINETEEN_PLUS and other age-gate values stay on contentRating — they do not make this true."},"mediaType":{"type":"string","description":"Media type label for this item (platform-specific enum)."},"playable":{"type":"boolean","description":"Whether this episode is playable in the current market."},"consumptionOrder":{"type":"string","description":"Consumption order. Example: \"EPISODIC\"."},"showTypes":{"type":"array","items":{"type":"string"},"description":"Show-level type flags copied from the parent show (e.g. \"SHOW_TYPE_EXCLUSIVE\")."}}},"totalEpisodes":{"type":"integer","description":"Archive size from this episodes query (same source as pagination — no intra-response drift)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"episodes":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"spotify\" on this endpoint."},"type":{"type":"string","description":"Content type of the item."},"uri":{"type":"string","description":"Platform URI for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Episode title. Not a profile displayName alias."},"description":{"type":"string","description":"Description of this episodes item."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"durationFormatted":{"type":"string","description":"Human-readable duration."},"releaseYear":{"type":"integer","description":"Convenience year derived from releaseDate."},"image":{"type":"string","description":"Image URL."},"id":{"type":"string","description":"Episode id (same id as in spotify:episode:{id})."},"previewUrl":{"type":"string","description":"MP3 preview URL from previewPlayback.audioPreview.cdnUrl when Spotify exposes one."},"audioUrls":{"type":"array","items":{"type":"string"},"description":"Additional mp3 preview source URLs from audio.items[]."},"releaseDate":{"type":"string","description":"Full episode release timestamp (ISO, often minute precision) — prefer over releaseYear alone."},"mediaTypes":{"type":"array","items":{"type":"string"},"description":"Media kinds on the episode (e.g. [\"AUDIO\",\"VIDEO\"])."},"hasVideo":{"type":"boolean","description":"True when mediaTypes includes VIDEO."},"contentRating":{"type":"string","description":"Pathfinder contentRating.label (NONE | EXPLICIT | NINETEEN_PLUS | UNKNOWN, plus podcast age-gate labels when present)."},"explicit":{"type":"boolean","description":"True only when EXPLICIT is among the rating labels. On a show that is contentRatingLabels; on an episode it is contentRating (the episode's single label — same as the first of contentRatingLabels on the show). NINETEEN_PLUS and other age-gate values stay on contentRating — they do not make this true."},"hasTranscripts":{"type":"boolean","description":"True when Spotify exposes transcript items for the episode."},"paywallContent":{"type":"boolean","description":"True when restrictions.paywallContent is set (exclusive/paywalled)."},"showTypes":{"type":"array","items":{"type":"string"},"description":"Show-level type flags copied from the parent show (e.g. \"SHOW_TYPE_EXCLUSIVE\")."},"playable":{"type":"boolean","description":"Whether this episode is playable in the current market."},"htmlDescription":{"type":"string","description":"Html description."}}}},"nextCursor":{"type":"string","description":"Offset string for the next page; null when hasMore is false."},"hasMore":{"type":"boolean","description":"True when more episodes remain beyond this page."}}}}},"example":{"success":true,"data":{"platform":"spotify","podcast":{"platform":"spotify","type":"podcast","uri":"spotify:show:4rOoJ6Egrf8K2IrywzwOMk","url":"https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk","name":"The Joe Rogan Experience","description":"The official podcast of comedian Joe Rogan.","image":"https://i.scdn.co/image/ab6765630000ba8a913317cdfae64a2585aa0f36","totalEpisodes":2731,"id":"4rOoJ6Egrf8K2IrywzwOMk","publisher":{"name":"Joe Rogan"},"rating":{"average":4.7,"totalRatings":952065},"topics":[{"title":"Comedy","uri":"spotify:genre:0JQ5DAqbMKFNr6gDrHHVKL"}],"contentRating":"EXPLICIT","contentRatingLabels":["EXPLICIT"],"explicit":true,"mediaType":"MIXED","playable":true,"consumptionOrder":"EPISODIC","showTypes":["SHOW_TYPE_EXCLUSIVE"]},"totalEpisodes":2731,"totalReturned":2,"episodes":[{"platform":"spotify","type":"episode","uri":"spotify:episode:6sriD1voEkINLnr08M9nmw","url":"https://open.spotify.com/episode/6sriD1voEkINLnr08M9nmw","name":"#2535 - Andrew Wilson","description":"Andrew Wilson has participated in thousands of debates on political, cultural, and religious topics. He hosts \"The Crucible\" and owns its associated online training program, Debate University.www.youtube.com/@The_Crucible  www.rumble.com/c/TheCrucible  www.thecrucible.video  www.debateuniversity.com  Perplexity: Download the app or ask Perplexity anything at https://pplx.ai/rogan.  Use code ROGAN at https://BlueChew.com to get 10% OFF + Free Overnight Shipping on your first order. Learn more about your ad choices. Visit podcastchoices.com/adchoices","durationMs":10072297,"durationFormatted":"2:47:52","releaseYear":2026,"image":"https://i.scdn.co/image/ab6765630000ba8adfec1dc1162dd326137b168e","id":"6sriD1voEkINLnr08M9nmw","previewUrl":"https://p.scdn.co/mp3-preview/df88d8d9a774747ca6dd4eb64f71a0984cf8760a.mp3","audioUrls":["https://p.scdn.co/mp3-preview/04e810abec582425b173ac15187820cb5f534e0b","https://p.scdn.co/mp3-preview/582677c5c09f2020c744a5278f3748a069abbe1a"],"releaseDate":"2026-08-05T17:00:00Z","mediaTypes":["AUDIO","VIDEO"],"hasVideo":true,"contentRating":"EXPLICIT","explicit":true,"hasTranscripts":false,"paywallContent":false,"showTypes":["SHOW_TYPE_EXCLUSIVE"],"playable":true,"htmlDescription":"<p>Andrew Wilson has participated in thousands of debates on political, cultural, and religious topics. He hosts \"The Crucible\" and owns its associated online training program, Debate University.<br />www.youtube.com/@The_Crucible  <br />www.rumble.com/c/TheCrucible  <br /><a href=\"www.thecrucible.video\" rel=\"nofollow\">www.thecrucible.video</a>  <br />www.debateuniversity.com</p><br/><p><br /></p><br/><p>Perplexity: Download the app or ask Perplexity anything at <a href=\"https://pplx.ai/rogan\" rel=\"nofollow\">https://pplx.ai/rogan</a>.</p><br/><p><br /></p><br/><p>Use code ROGAN at <a href=\"https://BlueChew.com\" rel=\"nofollow\">https://BlueChew.com</a> to get 10% OFF + Free Overnight Shipping on your first order.</p><p> </p><p>Learn more about your ad choices. Visit <a href=\"https://podcastchoices.com/adchoices\" rel=\"nofollow\">podcastchoices.com/adchoices</a></p>"},{"platform":"spotify","type":"episode","uri":"spotify:episode:12sZKqXfCxdOci06HGV7vf","url":"https://open.spotify.com/episode/12sZKqXfCxdOci06HGV7vf","name":"JRE MMA Show #183 with Rico Verhoeven","description":"Joe sits down with professional boxer, kickboxer, and mixed martial artist Rico Verhoeven.www.youtube.com/@RicoVerhoeven  https://ricoverhoeven.com      Learn more about your ad choices. Visit podcastchoices.com/adchoices","durationMs":8232297,"durationFormatted":"2:17:12","releaseYear":2026,"image":"https://i.scdn.co/image/ab6765630000ba8a7cec0dc10cb879778e8a6246","id":"12sZKqXfCxdOci06HGV7vf","previewUrl":"https://p.scdn.co/mp3-preview/862ca22fba9863c7b3b9476ae3fa75efb7e54247.mp3","audioUrls":["https://p.scdn.co/mp3-preview/8ccd9b3ce42a7c28545b2566d145b0810f853ab5","https://p.scdn.co/mp3-preview/bd8fd704118106c2987f86498bf19a90f06afb94"],"releaseDate":"2026-08-04T17:00:00Z","mediaTypes":["AUDIO","VIDEO"],"hasVideo":true,"contentRating":"EXPLICIT","explicit":true,"hasTranscripts":false,"paywallContent":false,"showTypes":["SHOW_TYPE_EXCLUSIVE"],"playable":true,"htmlDescription":"<p>Joe sits down with professional boxer, kickboxer, and mixed martial artist Rico Verhoeven.<br />www.youtube.com/@RicoVerhoeven  <br /><a href=\"https://ricoverhoeven.com/\" rel=\"nofollow\">https://ricoverhoeven.com</a><br /></p><br/><p><br /><a href=\"https://pplx.ai/rogan\" rel=\"nofollow\"><br /></a><br /></p><br/><p><br /></p><br/><p><br /><a href=\"https://squarespace.com/ROGAN\" rel=\"nofollow\"><br /></a><br /></p><br/><p><br /></p><br/><p><br /><a href=\"https://BetterHelp.com/JRE\" rel=\"nofollow\"><br /></a></p><p> </p><p>Learn more about your ad choices. Visit <a href=\"https://podcastchoices.com/adchoices\" rel=\"nofollow\">podcastchoices.com/adchoices</a></p>"}],"nextCursor":"2","hasMore":true}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/soundcloud/artist":{"get":{"operationId":"soundcloud_artist","tags":["SoundCloud"],"summary":"SoundCloud Artist API","description":"SoundCloud artist — handle + name, subscriptionTier, externalLinks, verified (1 credit).\n\nPass a SoundCloud artist URL or username and get clean JSON: id, handle (permalink slug — the join key), name, description, avatar, city/countryCode, verified, subscriptionTier (pro-unlimited|pro|mid-tier|free — one field, not badges + creatorSubscription duplicates), followers/followings/trackCount/playlistCount/likesCount, externalLinks[{url,network,title,username}] from SoundCloud web-profiles when published, createdAt when SoundCloud exposes it (often redacted on the public api-v2), and lastModified. Identity is handle + name only. city/countryCode are omitted when unpublished (never nulled). Flat 1 credit. Accepts cache / cacheMaxAge.\n\nDocs: https://captapi.com/apis/soundcloud-artist","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"SoundCloud artist profile URL or username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"SoundCloud artist — handle + name, subscriptionTier, externalLinks, verified (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"soundcloud\" on this endpoint."},"id":{"type":"string","description":"Stable platform ID for the item."},"handle":{"type":"string","description":"Permalink slug in the profile URL (e.g. flume) — the join key."},"url":{"type":"string","description":"Canonical URL of the item."},"name":{"type":"string","description":"Display name: SoundCloud full_name when set, otherwise their display-username value."},"description":{"type":"string","description":"Description text."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"city":{"type":"string","description":"City. Example: \"Sydney\"."},"countryCode":{"type":"string","description":"ISO-3166 alpha-2 country code (e.g. US, MX)."},"verified":{"type":"boolean","description":"Whether the account is verified. Top-level only (not duplicated under badges)."},"subscriptionTier":{"type":"string","description":"Canonical plan: \"pro-unlimited\" | \"pro\" | \"mid-tier\" | \"free\" — replaces badges.proUnlimited + creatorSubscription.product.id."},"followers":{"type":"integer","description":"Follower count."},"followings":{"type":"integer","description":"Number of accounts this artist follows."},"trackCount":{"type":"integer","description":"Public track count."},"playlistCount":{"type":"integer","description":"Public playlist count."},"likesCount":{"type":"integer","description":"Likes count on the profile when SoundCloud exposes it."},"lastModified":{"type":"string","description":"When the SoundCloud profile was last modified (ISO 8601)."},"externalLinks":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"Canonical URL of the item."},"network":{"type":"string","description":"Network. Example: \"personal\"."},"title":{"type":"string","description":"Title of this external links item."},"username":{"type":"string"}}}}}}}},"example":{"success":true,"data":{"platform":"soundcloud","id":"2976616","handle":"flume","url":"https://soundcloud.com/flume","name":"Flume","description":"Management: flume@threesixzero.com","avatar":"https://i1.sndcdn.com/avatars-sAZPcKyZpXJ0J0u5-JHfNSg-large.jpg","city":"Sydney","countryCode":"AU","verified":true,"subscriptionTier":"pro-unlimited","followers":2227831,"followings":203,"trackCount":412,"playlistCount":46,"likesCount":149,"lastModified":"2026-02-13T20:55:02Z","externalLinks":[{"url":"https://dumb.store/","network":"personal","title":"DUMB Store"},{"url":"http://www.facebook.com/flumemusic","network":"facebook","title":"Facebook","username":"flumemusic"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/soundcloud/artist-tracks":{"get":{"operationId":"soundcloud_artist_tracks","tags":["SoundCloud"],"summary":"SoundCloud Artist Tracks API","description":"Artist track list — opaque cursor, native-window when the api-v2 page ends (2 credits; empty is 0).\n\nPass a SoundCloud artist URL or username and get that artist's tracks as clean JSON. Each track row matches /soundcloud/track (title, plays/likes/reposts/comments/downloads, license, genre/tags[], artwork, streamable/downloadable, isrc/releaseDate when exposed) — without repeating artist{} on every row. The envelope names the yield: requested, listingHits (rows SoundCloud sent this page), hydrateFailures (received rows that did not become a track), totalReturned, nextCursor, hasMore, and truncatedReason=platform-page | catalog-end | native-window | extended-window. SoundCloud linked_partitioning can return listingHits < requested with hasMore still true — that is a platform page, not a drop. nextCursor is emitted only when the next native page has rows — a token is never issued and then refused. The public api-v2 window usually ends before the artist's full catalogue: that stop is native-window (hasMore false), not a 400. catalog-end is only when SoundCloud itself omits next_href on a native page. extended-window is the first-page fallback path (no cursor). Empty pages (native-window or extended-window with 0 rows) bill 0 credits. Top-level artistId + artist{id,handle,name,url,avatar,followers,verified} join to /soundcloud/artist; artistUrl is the profile URL. nextCursor is an opaque token (not a SoundCloud api-v2 URL). Flat 2 credits when tracks return (limit default 20, max 100).\n\nDocs: https://captapi.com/apis/soundcloud-artist-tracks","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"SoundCloud artist profile URL or username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max items to return (default 20, max 100). Flat 2 credits per call.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor from the previous nextCursor. Leave empty for the first page. Do not edit or invent values.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Artist track list — opaque cursor, native-window when the api-v2 page ends (2 credits; empty is 0).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"soundcloud\" on this endpoint."},"artistId":{"type":"string","description":"SoundCloud numeric artist id — join key for /soundcloud/artist."},"artistUrl":{"type":"string","description":"Artist profile URL (also on top-level artist.url)."},"artist":{"type":"object","properties":{"id":{"type":"string","description":"Id of this artist item."},"handle":{"type":"string","description":"Account handle."},"name":{"type":"string","description":"Name of this artist item."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"followers":{"type":"integer","description":"Follower count."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."}}},"requested":{"type":"integer","description":"The limit you sent (default 20, max 100)."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"listingHits":{"type":"integer","description":"Rows SoundCloud sent in this linked-partition page (may be below requested even when hasMore is true)."},"hydrateFailures":{"type":"integer","description":"Rows SoundCloud sent that did not become a track. 0 means we mapped every listing hit."},"nextCursor":{"type":"string","description":"Opaque pagination token, emitted only when the next native page has rows. Pass as cursor on the next call. Not a SoundCloud URL — do not edit."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"tracks":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"soundcloud\" on this endpoint."},"id":{"type":"string","description":"Id of this tracks item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of this tracks item."},"genre":{"type":"string","description":"Music genre."},"durationMs":{"type":"integer","description":"Full track length in milliseconds (SoundCloud full_duration — not the 30s preview clip)."},"plays":{"type":"integer","description":"Playback count for the track."},"likes":{"type":"integer","description":"Like count (number)."},"reposts":{"type":"integer","description":"Repost count."},"downloads":{"type":"integer","description":"Downloads. Example: 0."},"comments":{"type":"integer","description":"Comment count as a number, including 0. Every measured artist-tracks row (350+) ships this key; omit-if-null remains only as a safety net if SoundCloud sends a null count."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"releaseDate":{"type":"string","description":"Release date as ISO-8601 when SoundCloud exposes it; omitted otherwise."},"license":{"type":"string","description":"License identifier."},"isrc":{"type":"string","description":"ISRC when SoundCloud's publisher_metadata exposes it; omitted otherwise."},"downloadable":{"type":"boolean","description":"Downloadable. Example: false."},"streamable":{"type":"boolean","description":"Streamable. Example: true."},"waveformUrl":{"type":"string","description":"Waveform url URL."},"artwork":{"type":"string","description":"Artwork URL."},"tags":{"type":"array","items":{},"description":"Track tags from SoundCloud's tag_list. Always an array — [] when the track has none."}}}}}}}},"example":{"success":true,"data":{"platform":"soundcloud","artistId":"2976616","artistUrl":"https://soundcloud.com/flume","artist":{"id":"2976616","handle":"flume","name":"Flume","url":"https://soundcloud.com/flume","avatar":"https://i1.sndcdn.com/avatars-sAZPcKyZpXJ0J0u5-JHfNSg-large.jpg","followers":2227831,"verified":true},"requested":2,"totalReturned":2,"listingHits":2,"hydrateFailures":0,"nextCursor":"eyJ1IjoiMjk3NjYxNiIsIm8iOiIyMDI1LTA4LTIyVDAwOjAwOjAwLjAwMFosdHJhY2tzLDAwMDAwMDAwMDAyMTE5ODYyMjMyIn0","hasMore":true,"tracks":[{"platform":"soundcloud","id":"2119863225","url":"https://soundcloud.com/flume/all-of-the-worlds","title":"All Of The Worlds","genre":"Electronic","durationMs":125780,"plays":33195,"likes":979,"reposts":61,"downloads":0,"comments":24,"publishedAt":"2025-06-26T13:01:21Z","releaseDate":"2025-08-22T00:00:00Z","license":"all-rights-reserved","isrc":"US38Y2548239","downloadable":false,"streamable":true,"waveformUrl":"https://wave.sndcdn.com/0AX3G8zwAkiV_m.json","artwork":"https://i1.sndcdn.com/artworks-bvBQ1BhZQSM2-0-large.jpg","tags":[]},{"platform":"soundcloud","id":"2119862232","url":"https://soundcloud.com/flume/feel-ur-love","title":"Feel Ur Love","genre":"Electronic","durationMs":251638,"plays":23538,"likes":596,"reposts":17,"downloads":0,"comments":6,"publishedAt":"2025-06-26T13:00:44Z","releaseDate":"2025-08-22T00:00:00Z","license":"all-rights-reserved","isrc":"US38Y2548242","downloadable":false,"streamable":true,"waveformUrl":"https://wave.sndcdn.com/YLJYjhEwU6KR_m.json","artwork":"https://i1.sndcdn.com/artworks-wu5UUJhLSWSO-0-large.jpg","tags":[]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/soundcloud/track":{"get":{"operationId":"soundcloud_track","tags":["SoundCloud"],"summary":"SoundCloud Track API","description":"SoundCloud track — plays/likes/license, tags[], nested artist{}, streamUrl when streamable (1 credit).\n\nPass a SoundCloud track URL and get clean JSON: title, artist{id,handle,name,url,avatar,followers,verified} (chain id/handle into /soundcloud/artist), plays/likes/reposts/comments/downloads, license, genre/tags[] (always an array), publishedAt, isrc/releaseDate when exposed, streamable/downloadable (SoundCloud permission flags), and when the public api-v2 allows it — streamUrl (progressive MP3), hlsUrl, downloadUrl, plus mediaUrlsExpireAt for signed CDN links. Strict superset of an artist-tracks row (adds artist{} and stream URLs). waveformUrl is the waveform JSON endpoint, not audio. Flat 1 credit. Accepts cache / cacheMaxAge.\n\nDocs: https://captapi.com/apis/soundcloud-track","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"SoundCloud track URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"SoundCloud track — plays/likes/license, tags[], nested artist{}, streamUrl when streamable (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"soundcloud\" on this endpoint."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"title":{"type":"string","description":"Title of the item."},"genre":{"type":"string","description":"Music genre."},"artist":{"type":"object","properties":{"id":{"type":"string","description":"Id of this artist item."},"handle":{"type":"string","description":"Account handle."},"name":{"type":"string","description":"Name of this artist item."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"followers":{"type":"integer","description":"Follower count."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."}}},"durationMs":{"type":"integer","description":"Full track length in milliseconds (SoundCloud full_duration — not the 30s preview clip)."},"plays":{"type":"integer","description":"Playback count for the track."},"likes":{"type":"integer","description":"Like count for the track."},"reposts":{"type":"integer","description":"Repost count for the track."},"downloads":{"type":"integer","description":"How many times the track was downloaded on SoundCloud (their counter)."},"comments":{"type":"integer","description":"Comment count when SoundCloud exposes one. Omitted when the track has no count (not a read failure). 0 means zero comments."},"publishedAt":{"type":"string","description":"Track created/publish time as ISO-8601."},"releaseDate":{"type":"string","description":"Release date as ISO-8601 when SoundCloud exposes it; omitted otherwise."},"license":{"type":"string","description":"Track license string from SoundCloud (e.g. all-rights-reserved) — reuse-policy signal."},"isrc":{"type":"string","description":"ISRC when SoundCloud's publisher_metadata exposes it; omitted otherwise."},"downloadable":{"type":"boolean","description":"SoundCloud permission flag — the uploader allows downloads. Does not guarantee downloadUrl (public api-v2 often requires OAuth)."},"streamable":{"type":"boolean","description":"SoundCloud permission flag — the track may be streamed. When true we usually mint streamUrl / hlsUrl."},"streamUrl":{"type":"string","description":"Signed progressive MP3 CDN URL when we can mint one from api-v2 transcodings. Expires — see mediaUrlsExpireAt."},"hlsUrl":{"type":"string","description":"Signed HLS playlist URL when available. Expires — see mediaUrlsExpireAt."},"waveformUrl":{"type":"string","description":"URL of SoundCloud's waveform JSON (peaks), not an audio file."},"artwork":{"type":"string","description":"Artwork URL."},"tags":{"type":"array","items":{"type":"string"},"description":"Track tags from SoundCloud's tag_list. Always an array — [] when the track has none."}}}}},"example":{"success":true,"data":{"platform":"soundcloud","id":"2088451047","url":"https://soundcloud.com/flume/is-it-real-feat-ravyn-lenae","title":"Is It Real (feat. Ravyn Lenae)","genre":"Electronic","artist":{"id":"2976616","handle":"flume","name":"Flume","url":"https://soundcloud.com/flume","avatar":"https://i1.sndcdn.com/avatars-sAZPcKyZpXJ0J0u5-JHfNSg-large.jpg","followers":2227831,"verified":true},"durationMs":169091,"plays":44210,"likes":2280,"reposts":63,"downloads":0,"comments":29,"publishedAt":"2025-05-01T19:13:22Z","releaseDate":"2025-05-02T00:00:00Z","license":"all-rights-reserved","isrc":"US38Y2516905","downloadable":false,"streamable":true,"streamUrl":"https://cf-preview-media.sndcdn.com/preview/0/30/XtegK92YX8gU.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLXByZXZpZXctbWVkaWEuc25kY2RuLmNvbS9wcmV2aWV3LzAvMzAvWHRlZ0s5MllYOGdVLjEyOC5tcDMqIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzg2ODczNDg3fX19XX0_&Signature=Wc2sqfYkWQKvk8ctkZJgq-jw2a11mGQy6uQkU4UNjTlPNmFnkJCNrkCXaVnuptZcJZIy2tIbzVxEiMy7aDJlGNSK6ND8aF6Bijs1o43SSK~pvKZiJha5g-vvO0Xz3~XpNPVWD75KhGzXZn1~kF6DYFHjVFQKFdNcMK~7GSL-QxBsSfBdBPc8jgJ0XXiXiZLXKrMdoso5GwqObqMUI-7I0ifV0Gtsrx8A19MA9D6lg88xXzA5WgaJVD1rtq5L5VVkfDZ9k6p-tAs8iyTtOQjkOseSjTDkqHRQJdZjFHlCChJUVVtQejrjMcKyCsWqqpIJV-Pi12zumc2MlcYc8lJmHw__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ","hlsUrl":"https://cf-hls-media.sndcdn.com/playlist/0/30/XtegK92YX8gU.128.mp3/playlist.m3u8?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL3BsYXlsaXN0LzAvMzAvWHRlZ0s5MllYOGdVLjEyOC5tcDMvcGxheWxpc3QubTN1OCoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE3ODY4NzM0ODd9fX1dfQ__&Signature=VmTi2itOt1q7gN0nu1-HBXW2aV2121NFo0lCQl3zXt9-7mY2d4SwS6nQzZKwp3dhBcM7k1pC0FHw-eSX7knmOjmnOrS4PvLXTrqCR3qnEGkHoa-kGIX-rGmkmq-aKcMCIFT7ym0o~t2c1D89Jms-Xmd5SkQgCOjzerYlbVwssWPPSd8siyErWJpaIw7U1BZgta57MA3a3ElAULF~8vDjeGt-VslZiWcPmu~Kuw~yPQsEJvdFpqmXGaVxSrS54A0KVYhmcp0gkc6xS2OvJavOp57b8rhijAgb3KvWk7s~PR1m~zLt9o1kHgfa-p2P7ePq0uxp4Rwk2y1v4xQJDPHX6Q__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ","waveformUrl":"https://wave.sndcdn.com/XtegK92YX8gU_m.json","artwork":"https://i1.sndcdn.com/artworks-4pqckrEbaBNo-0-large.jpg","tags":["Pop"]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linktree/page":{"get":{"operationId":"linktree_page","tags":["Linktree"],"summary":"Linktree Page API","description":"Link-in-bio → creator graph: typed links, socialAccounts{} that feed TikTok/Instagram/Spotify/SoundCloud, email, verticals.\n\nPaste a Linktree URL or username and get the public page as clean JSON. Canonical profile fields: platform, id (string), handle/username, url, displayName (name is a deprecated alias), description, avatar, verified. Also verticals[] (Linktree niche labels, e.g. music_artist), linkPlatforms[] (platforms Linktree detected on the page), timezone, and email when the creator publishes a mailto social. links[] are typed (CLASSIC, PRODUCT, SPOTIFY_*, YOUTUBE_VIDEO, GROUP, …) with id/url/thumbnail; PRODUCT rows resolve shopUrl when Linktree leaves url empty (url is always present — null only when no destination exists); GROUP children nest under links with parentId. socials[] is the icon list (incl. EMAIL_ADDRESS). socialAccounts{} is the camelCase HTTP map for catalog joins (instagram/tiktok/spotify/soundcloud/appleMusic/youtube/…) — email is not duplicated there (use top-level email). YouTube watch URLs in socialAccounts are resolved to the channel via oEmbed so they pipe into youtube/channel-details. Accepts cache / cacheMaxAge. Flat 1 credit. This is the fan-out point for a creator graph: one Linktree call feeds the rest of the catalog.\n\nDocs: https://captapi.com/apis/linktree-page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Linktree profile URL or username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Link-in-bio → creator graph: typed links, socialAccounts{} that feed TikTok/Instagram/Spotify/SoundCloud, email, verticals.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"On the page: Linktree profile URL. On a link row: outbound destination (PRODUCT may use shopUrl when Linktree leaves url empty)."},"id":{"type":"integer","description":"Linktree account id as a string (catalog-wide id convention)."},"username":{"type":"string","description":"Account username / handle."},"name":{"type":"string","description":"Deprecated alias of displayName — prefer displayName."},"description":{"type":"string","description":"Description text."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"verticals":{"type":"array","items":{"type":"string"},"description":"Linktree niche/vertical labels for the page (e.g. music_artist, musician_band). Empty when Linktree exposes none."},"linkPlatforms":{"type":"array","items":{"type":"string"},"description":"Platforms Linktree detected among the page's links/socials (e.g. Spotify, Instagram). Distinct from socialAccounts URLs."},"timezone":{"type":"string","description":"Timezone. Example: \"America/New_York\"."},"email":{"type":"string","description":"Public email when the creator adds an EMAIL_ADDRESS mailto social on Linktree. Null/omitted when not published."},"linkCount":{"type":"integer","description":"Total link rows including GROUP children."},"links":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Title of this links item."},"type":{"type":"string","description":"On links[]: Linktree link type (CLASSIC, PRODUCT, SPOTIFY_ALBUM, SPOTIFY_SONG, YOUTUBE_VIDEO, SOUNDCLOUD_PLAYLIST, GROUP, …). On socials[]: icon type (INSTAGRAM, TIKTOK, EMAIL_ADDRESS, …)."},"id":{"type":"string","description":"Id of this links item."},"url":{"type":"string","description":"On the page: Linktree profile URL. On a link row: outbound destination (PRODUCT may use shopUrl when Linktree leaves url empty)."},"thumbnail":{"type":"string","description":"Thumbnail image URL."}}}},"socials":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"On links[]: Linktree link type (CLASSIC, PRODUCT, SPOTIFY_ALBUM, SPOTIFY_SONG, YOUTUBE_VIDEO, SOUNDCLOUD_PLAYLIST, GROUP, …). On socials[]: icon type (INSTAGRAM, TIKTOK, EMAIL_ADDRESS, …)."},"url":{"type":"string","description":"On the page: Linktree profile URL. On a link row: outbound destination (PRODUCT may use shopUrl when Linktree leaves url empty)."}}}},"socialAccounts":{"type":"object","properties":{"instagram":{"type":"string","description":"Instagram URL."},"tiktok":{"type":"string","description":"Tiktok URL."},"spotify":{"type":"string","description":"Spotify URL."},"youtube":{"type":"string","description":"Youtube URL."},"soundcloud":{"type":"string","description":"Soundcloud URL."},"appleMusic":{"type":"string","description":"Apple music URL."}}}}}}},"example":{"success":true,"data":{"platform":"linktree","url":"https://linktr.ee/miguelangeles","id":15278008,"username":"miguelangeles","name":"MIGUEL ANGELES","description":"☆☆☆☆ IRL ANGEL ☆☆☆☆\nψ EMBRACE CHAOS ψ","avatar":"https://ugc.production.linktr.ee/d3141538-f586-4f3f-bc9a-a82fbebab798_DEATHRATTLE-slowed-COVER.jpeg","verified":false,"verticals":["music","creative"],"linkPlatforms":["TikTok","Instagram"],"timezone":"America/New_York","email":"miguel@irlangel.com","linkCount":8,"links":[{"title":"new project \"BEFORE THE SUN RISES & WINTERR ENDS\"","type":"SPOTIFY_ALBUM","id":"463416775","url":"https://open.spotify.com/album/0pgrg7phBbnwGJ2HBEl9EG?si=Zub7J4I3RySAaM9WVX3Okg","thumbnail":"https://ugc.production.linktr.ee/8ed131c7-6d74-47fc-bceb-8be7f6bae4c8_ab67616d0000b2739bd93cc6e406b820dfff691f.jpeg"},{"title":"stream \"NOVEMBERR\"","type":"SPOTIFY_SONG","id":"460281204","url":"https://open.spotify.com/track/62HnBMEdZjeFCd2T8g37T8?si=7bd35dd0e9f24d65","thumbnail":"https://ugc.production.linktr.ee/3bd59146-cd44-4187-9601-4341b21070d2_ab67616d0000b2739ad10104c60fb9deff5b7f34.jpeg"}],"socials":[{"type":"INSTAGRAM","url":"https://instagram.com/miguelangeles"},{"type":"TIKTOK","url":"https://tiktok.com/@irlangel"}],"socialAccounts":{"instagram":"https://instagram.com/miguelangeles","tiktok":"https://tiktok.com/@irlangel","spotify":"https://open.spotify.com/artist/14xRX3JR8H4RWh8R7V3fvZ?si=EgRxWIPiRcaEHtSnqk5PAQ","youtube":"https://www.youtube.com/watch?v=xiFUzOJaiC4","soundcloud":"https://soundcloud.com/miguelangeles","appleMusic":"https://music.apple.com/ca/artist/miguel-angeles/1209423162"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/snapchat/user-profile":{"get":{"operationId":"snapchat_user_profile","tags":["Snapchat"],"summary":"Snapchat User Profile API","description":"Snapchat profile — stable identity card, millisecond timestamps, mediaType image/video (1 credit).\n\nPass a Snapchat username or profile URL and get the public profile as clean JSON — not Snapchat's protobuf wrappers. This is an identity card: highlights / spotlightHighlights / relatedAccounts are always keyed ([] when we know there are none — hasCuratedHighlights: false is [], not a missing key). Canonical card: username, displayName, bio, avatar, banner (square hero), url, followers, verified (from badge), human-readable category (public-profile-category-v3-business-group → Business Group), absolute website URL, snapcode. createdAt / updatedAt / publishedAt are ISO-8601 milliseconds; unix twins live under raw (creationTimestampMs / lastUpdateTimestampMs / timestampInSec). Identical-value aliases (handle/subscriberCount/profilePictureUrl/squareHeroImageUrl/firstSnapUrl/firstSnapType) are not emitted — read snapList[0] for the first snap. Regular (non-creator) accounts are supported too — Snapchat's web page only exposes username, displayName, snapcode and bitmoji avatar for them (no followers/bio/highlights exist on the web), so their card is legitimately slim. An unresolvable handle is 404 at 0 credits with username and url echoed on the error — and when Snapchat's own site answers 404 (the username has no public web profile; the account may still exist in-app), we return that verdict immediately instead of burning seconds re-checking — never a 200 with verified: false about an account that does not exist. highlights[] are curated Story albums; spotlightHighlights[] are Spotlight posts — different collections. Highlight ids/titles unwrap to plain strings (never Python dict repr). Each snap has mediaType image|video; the raw Snapchat enum is raw.snapMediaType. story.snapCount always equals story.snapList length. Spotlight rows add engagement{views,shares,comments,boosts,recommends}. relatedAccounts[] use the same avatar/url/verified keys as the top-level card. . mediaUrlsExpireAt is null — sc-cdn.net mo= is a content timestamp (matches publishedAt), not a CDN expiry. Flat 1 credit.\n\nDocs: https://captapi.com/apis/snapchat-user-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Snapchat username or profile URL. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Snapchat profile — stable identity card, millisecond timestamps, mediaType image/video (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"username":{"type":"string","description":"Snapchat @handle without @. Canonical account identifier (no handle twin). Echoed on every response, including 404 misses."},"url":{"type":"string","description":"Canonical URL of the item."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"category":{"type":"string","description":"Human-readable category label derived from categoryId (e.g. Business Group)."},"categoryId":{"type":"string","description":"Snapchat public-profile category string id (e.g. public-profile-category-v3-business-group). Prefer human-readable category."},"subcategory":{"type":"string","description":"Subcategory. Example: \"Sports League\"."},"subcategoryId":{"type":"string","description":"Subcategory id."},"followers":{"type":"integer","description":"Subscriber count from Snapchat's public profile (no subscriberCount twin)."},"verified":{"type":"boolean","description":"Whether the resolved profile shows Snapchat's official badge (badge === 1). Only emitted when the handle resolved; a miss is 404 at 0 credits, never verified: false."},"badge":{"type":"integer","description":"Snapchat official badge code: 0/absent = none, 1 = official verified. verified is derived from this — only when a profile resolved."},"avatar":{"type":"string","description":"Profile picture URL (no profilePictureUrl twin)."},"banner":{"type":"string","description":"Square hero / cover image URL (no squareHeroImageUrl twin)."},"snapcode":{"type":"string","description":"Snapcode URL."},"website":{"type":"string","description":"Absolute https website URL (scheme added when Snapchat omits it, e.g. NBA.com → https://NBA.com)."},"businessProfileId":{"type":"string","description":"Business profile id. Example: \"ea71b19b-5eb1-4dda-afb8-13ced485f180\"."},"createdAt":{"type":"string","description":"Profile creation time as ISO-8601 UTC with millisecond precision (…T22:48:15.058Z). The unix twin is raw.creationTimestampMs."},"updatedAt":{"type":"string","description":"Last public-profile update as ISO-8601 UTC milliseconds. The unix twin is raw.lastUpdateTimestampMs."},"hasStory":{"type":"boolean","description":"Has story. Example: false."},"hasCuratedHighlights":{"type":"boolean","description":"Has curated highlights. Example: true."},"hasSpotlightHighlights":{"type":"boolean","description":"Has spotlight highlights. Example: true."},"highlights":{"type":"array","items":{"type":"object","properties":{"highlightId":{"type":"string","description":"Curated highlight id as a plain UUID string — never a protobuf {value} wrapper or Python dict repr."},"storyTitle":{"type":"string","description":"Highlight title as a plain string (unwrapped from Snapchat's {value} wrapper)."},"thumbnailUrl":{"type":"string","description":"Highlight album cover Snapchat publishes. Often matches snapList[0].mediaPreviewUrl; it is Snapchat's cover field, not a firstSnap alias we invent."},"snapCount":{"type":"integer","description":"Number of snaps in snapList for this story/highlight — always equals len(snapList)."},"snapList":{"type":"array","items":{"type":"object","properties":{"snapIndex":{"type":"integer"},"mediaType":{"type":"string"},"mediaUrl":{"type":"string"},"mediaPreviewUrl":{"type":"string"},"publishedAt":{"type":"string","description":"Snap publish time as ISO-8601 UTC milliseconds. The unix twin is raw.timestampInSec."},"raw":{"type":"object","properties":{"snapMediaType":{"type":"integer"},"timestampInSec":{"type":"integer"}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."}}},"description":"Array of objects with snapIndex, mediaType, mediaUrl, mediaPreviewUrl, publishedAt, raw."}}}},"spotlightHighlights":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this spotlight highlights item."},"title":{"type":"string","description":"Title of this spotlight highlights item."},"description":{"type":"string","description":"Description of this spotlight highlights item."},"thumbnailUrl":{"type":"string","description":"Highlight album cover Snapchat publishes. Often matches snapList[0].mediaPreviewUrl; it is Snapchat's cover field, not a firstSnap alias we invent."},"contentUrl":{"type":"string","description":"Content url URL."},"durationMs":{"type":"integer","description":"Length in milliseconds."},"width":{"type":"integer","description":"Width in pixels."},"height":{"type":"integer","description":"Height in pixels."},"publishedAt":{"type":"string","description":"Snap publish time as ISO-8601 UTC milliseconds. The unix twin is raw.timestampInSec."},"deeplink":{"type":"string","description":"Deeplink URL."},"creator":{"type":"object","properties":{"username":{"type":"string","description":"Snapchat @handle without @. Canonical account identifier (no handle twin). Echoed on every response, including 404 misses."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."}},"description":"Creator handle or account for this item (platform-specific — e.g. who founded a community, or who cut a clip)."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"shares":{"type":"integer"},"comments":{"type":"integer"},"boosts":{"type":"integer"},"recommends":{"type":"integer"}},"description":"Engagement metrics for the item."},"snapList":{"type":"array","items":{"type":"object","properties":{"snapIndex":{"type":"integer"},"snapId":{"type":"string"},"mediaType":{"type":"string"},"mediaUrl":{"type":"string"},"mediaPreviewUrl":{"type":"string"},"publishedAt":{"type":"string","description":"Snap publish time as ISO-8601 UTC milliseconds. The unix twin is raw.timestampInSec."},"raw":{"type":"object","properties":{"snapMediaType":{"type":"integer"},"timestampInSec":{"type":"integer"}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."}}},"description":"Array of objects with snapIndex, snapId, mediaType, mediaUrl, mediaPreviewUrl, publishedAt."},"raw":{"type":"object","properties":{"uploadDateMs":{"type":"integer"}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."}}}},"relatedAccounts":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string","description":"Snapchat @handle without @. Canonical account identifier (no handle twin). Echoed on every response, including 404 misses."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"avatar":{"type":"string","description":"Profile picture URL (no profilePictureUrl twin)."},"verified":{"type":"boolean","description":"Whether the resolved profile shows Snapchat's official badge (badge === 1). Only emitted when the handle resolved; a miss is 404 at 0 credits, never verified: false."},"hasStory":{"type":"boolean","description":"Has story. Example: true."},"hasCuratedHighlights":{"type":"boolean","description":"Has curated highlights. Example: false."},"hasSpotlightHighlights":{"type":"boolean","description":"Has spotlight highlights. Example: false."},"subscribeLink":{"type":"object","properties":{"oneLinkBaseUrl":{"type":"string"},"deepLinkUrl":{"type":"string"},"iosAppStoreUrl":{"type":"string"}},"description":"Object with oneLinkBaseUrl, deepLinkUrl, iosAppStoreUrl."}}}},"raw":{"type":"object","properties":{"creationTimestampMs":{"type":"integer"},"lastUpdateTimestampMs":{"type":"integer"}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."},"mediaUrlsExpireAt":{"description":"Earliest parseable CDN expiry across avatar / banner / highlight / snap URLs. sc-cdn.net mo= is a content timestamp (matches publishedAt ± seconds), not an expiry. A sampled highlight URL from June 2026 still 200s in August; Cache-Control max-age=86400 is a cache hint, not a signature lifetime. The field is null — we do not invent an expiry."},"source":{"description":"\"native\" on a live profile-page parse, \"extended\" on the backup path, \"cache\" on a hit. Always keyed."}}}}},"example":{"success":true,"data":{"platform":"snapchat","username":"nba","url":"https://www.snapchat.com/@nba","displayName":"NBA","bio":"30 teams, 1 goal.","category":"Business Group","categoryId":"public-profile-category-v3-business-group","subcategory":"Sports League","subcategoryId":"public-profile-subcategory-v3-sports-league","followers":3653600,"verified":true,"badge":1,"avatar":"https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvcGxQanhqRDFZRk9IUWdGMUZLRHNqP2JvPUVna3lBUVJJQWxBWllBRSUzRCZ1Yz0yNQ._RS0,90_FMjpeg","banner":"https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvcUZBYjExSEY3QkdkeHNiOXpkMTREP2JvPUVna3lBUVJJQWxBWllBRSUzRCZ1Yz0yNQ._RS0,1080_FMjpeg","snapcode":"https://app.snapchat.com/web/deeplink/snapcode?username=nba&type=SVG&bitmoji=enable","website":"https://NBA.com","businessProfileId":"ea71b19b-5eb1-4dda-afb8-13ced485f180","createdAt":"2018-05-17T22:48:15.058Z","updatedAt":"2026-08-01T22:01:14.522Z","hasStory":false,"hasCuratedHighlights":true,"hasSpotlightHighlights":true,"highlights":[{"highlightId":"029f2cc3-c0df-46c2-b610-485c137f9a0a","storyTitle":"2025-26 NBA Finals 🏆","thumbnailUrl":"https://cf-st.sc-cdn.net/d/ZXSSacNIpSYqxAm21SSGc.410?mo=GjcaFjIBBDoBfUIGCMqG99AGSAJQXmABcAFQxQFaEERmTGFyZ2VUaHVtYm5haWyiAQcImgMiAhIA&uc=94","snapCount":4,"snapList":[{"snapIndex":0,"mediaType":"image","mediaUrl":"https://cf-st.sc-cdn.net/d/ZXSSacNIpSYqxAm21SSGc.400?mo=Gk8aDDIBBDoBfVBeYAFwAVDBAVoQUHVibGljSW1hZ2VTdG9yeaIBEwiQAyIOCgpCBgjKhvfQBkgCEgCiARMI5wciDgoKQgYIy4b30AZIAxIA&uc=94","mediaPreviewUrl":"https://cf-st.sc-cdn.net/d/ZXSSacNIpSYqxAm21SSGc.410?mo=GjcaFjIBBDoBfUIGCMqG99AGSAJQXmABcAFQxQFaEERmTGFyZ2VUaHVtYm5haWyiAQcImgMiAhIA&uc=94","publishedAt":"2026-06-01T17:36:48.000Z","raw":{"snapMediaType":0,"timestampInSec":1780335408}},{"snapIndex":1,"mediaType":"image","mediaUrl":"https://cf-st.sc-cdn.net/d/FgntIqJi6clNRLmaxXkXN.400?mo=Gk0aDjIBBDoBfUgCUF5gAXABUMEBWhBQdWJsaWNJbWFnZVN0b3J5ogERCJADIgwKCEIGCMuG99AGEgCiAREI5wciDAoIQgYIyob30AYSAA%3D%3D&uc=94","mediaPreviewUrl":"https://cf-st.sc-cdn.net/d/FgntIqJi6clNRLmaxXkXN.410?mo=GjcaFjIBBDoBfUIGCMuG99AGSAJQXmABcAFQxQFaEERmTGFyZ2VUaHVtYm5haWyiAQcImgMiAhIA&uc=94","publishedAt":"2026-06-01T17:36:48.000Z","raw":{"snapMediaType":0,"timestampInSec":1780335408}}]},{"highlightId":"2941c1a3-96ba-45aa-bdf4-30b344e63e42","storyTitle":"Your 2025-26 Kia NBA MVP 🏆","thumbnailUrl":"https://cf-st.sc-cdn.net/d/iqFfVpTceYNBTtMJvlQns.410.IRZXSOY?mo=GkAaFjIBBDoBfUIGCPa5qdAGSAJQXmABcAFQxQFaEERmTGFyZ2VUaHVtYm5haWyiARAImgMiCxIAKgdJUlpYU09Z&uc=94","snapCount":19,"snapList":[{"snapIndex":0,"mediaType":"image","mediaUrl":"https://cf-st.sc-cdn.net/d/iqFfVpTceYNBTtMJvlQns.400.IRZXSOY?mo=GlwaCTIBBFBeYAFwAVDBAVoQUHVibGljSW1hZ2VTdG9yeaIBHwiQAyIaCg06AX1CBgj2uanQBkgCEgAqB0lSWlhTT1miARcI5wciEgoFMgF9SAQSACoHSVJaWFNPWQ%3D%3D&uc=94","mediaPreviewUrl":"https://cf-st.sc-cdn.net/d/iqFfVpTceYNBTtMJvlQns.410.IRZXSOY?mo=GkAaFjIBBDoBfUIGCPa5qdAGSAJQXmABcAFQxQFaEERmTGFyZ2VUaHVtYm5haWyiARAImgMiCxIAKgdJUlpYU09Z&uc=94","publishedAt":"2026-05-17T23:43:34.000Z","raw":{"snapMediaType":0,"timestampInSec":1779061414}},{"snapIndex":1,"mediaType":"video","mediaUrl":"https://cf-st.sc-cdn.net/d/eHfqR7qRY9kuVjZbupqN4.1034.IRZXSOY?mo=GlgaDDICBH1IA1BeYAFwAVDIAVoHRGZNZWRpYaIBNwiKCBIlCiMIk84gIAEw4AM41AZAAUoOCgk9ExQVFBIUFRUQ9ANQ_E1oAiILEgAqB0lSWlhTT1mQA_xN&uc=94","mediaPreviewUrl":"https://cf-st.sc-cdn.net/d/eHfqR7qRY9kuVjZbupqN4.410.IRZXSOY?mo=GkAaFjIBBDoBfUIGCP25qdAGSAJQXmABcAFQxQFaEERmTGFyZ2VUaHVtYm5haWyiARAImgMiCxIAKgdJUlpYU09Z&uc=94","publishedAt":"2026-05-17T23:50:52.000Z","raw":{"snapMediaType":1,"timestampInSec":1779061852}}]}],"spotlightHighlights":[{"id":"W7_EDlXWTBiXAEEniNoMPwAAYZ214b2ZqdWhiAZ-_WJm3AZ-_WHoaAAAAAQ","title":"Spotlight Snap","description":"Another Spotlight Snap brought to you by Snapchat","thumbnailUrl":"https://cf-st.sc-cdn.net/d/Qmm68dwXUXh0Rk6RHsywT.256.IRZXSOY?mo=GkYaCTIBBEgCUC5gAVCgAVoQRGZMYXJnZVRodW1ibmFpbKIBEAiAAiILEgAqB0lSWlhTT1miARAImgoiCxIAKgdJUlpYU09Z&uc=46","contentUrl":"https://cf-st.sc-cdn.net/d/Qmm68dwXUXh0Rk6RHsywT.27.IRZXSOY?mo=Gl8aCTIBBEgCUC5gAVCiAVoQU3BvdGxpZ2h0U2hhcmluZ6IBNwgbEiYKJAjP-XQgATCcBDjAB0ABSg4KCVgeHCgsJis0LxD0A1DirgFoAiILEgAqB0lSWlhTT1mQA-KuAQ%3D%3D&uc=46","durationMs":22370,"width":540,"height":960,"publishedAt":"2026-08-01T22:01:14.522Z","deeplink":"https://click.snapchat.com/aVHG?pid=snapchat_download_page&af_dp=https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYZ214b2ZqdWhiAZ-_WJm3AZ-_WHoaAAAAAQ&af_web_dp=https://snapchat.com/download?purpose%3Dweb_stories%26sp%3Dspotlight&af_ios_url=https://apps.apple.com/app/apple-store/id447188370?pt%3D614006%26ct%3Dspotlight%26mt%3D8","creator":{"username":"nba","displayName":"NBA","url":"https://www.snapchat.com/@nba"},"engagement":{"views":20844,"shares":21,"comments":37,"boosts":1618,"recommends":108},"snapList":[{"snapIndex":0,"snapId":"W7_EDlXWTBiXAEEniNoMPwAAYZ214b2ZqdWhiAZ-_WJm3AZ-_WHoaAAAAAQ","mediaType":"video","mediaUrl":"https://cf-st.sc-cdn.net/d/Qmm68dwXUXh0Rk6RHsywT.27.IRZXSOY?mo=Gl8aCTIBBEgCUC5gAVCiAVoQU3BvdGxpZ2h0U2hhcmluZ6IBNwgbEiYKJAjP-XQgATCcBDjAB0ABSg4KCVgeHCgsJis0LxD0A1DirgFoAiILEgAqB0lSWlhTT1mQA-KuAQ%3D%3D&uc=46","mediaPreviewUrl":"https://cf-st.sc-cdn.net/d/Qmm68dwXUXh0Rk6RHsywT.256.IRZXSOY?mo=GkYaCTIBBEgCUC5gAVCgAVoQRGZMYXJnZVRodW1ibmFpbKIBEAiAAiILEgAqB0lSWlhTT1miARAImgoiCxIAKgdJUlpYU09Z&uc=46","publishedAt":"2026-08-01T22:01:14.000Z","raw":{"snapMediaType":1,"timestampInSec":1785621674}}],"raw":{"uploadDateMs":1785621674522}},{"id":"W7_EDlXWTBiXAEEniNoMPwAAYcm95aXJwZW1tAZ-_U_PhAZ-_U8m2AAAAAQ","title":"Spotlight Snap","description":"Another Spotlight Snap brought to you by Snapchat","thumbnailUrl":"https://cf-st.sc-cdn.net/d/pnucYwUhWRai63fD72ieX.256.IRZXSOY?mo=GkYaCTIBBEgCUC5gAVCgAVoQRGZMYXJnZVRodW1ibmFpbKIBEAiAAiILEgAqB0lSWlhTT1miARAImgoiCxIAKgdJUlpYU09Z&uc=46","contentUrl":"https://cf-st.sc-cdn.net/d/pnucYwUhWRai63fD72ieX.27.IRZXSOY?mo=GmAaCTIBBEgCUC5gAVCiAVoQU3BvdGxpZ2h0U2hhcmluZ6IBOAgbEicKJQieqbECIAEwnAQ4wAdAAUoOCglqLFtrV1FcVE8Q9ANQqskBaAIiCxIAKgdJUlpYU09ZkAOqyQE%3D&uc=46","durationMs":25770,"width":540,"height":960,"publishedAt":"2026-08-01T21:56:07.222Z","deeplink":"https://click.snapchat.com/aVHG?pid=snapchat_download_page&af_dp=https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYcm95aXJwZW1tAZ-_U_PhAZ-_U8m2AAAAAQ&af_web_dp=https://snapchat.com/download?purpose%3Dweb_stories%26sp%3Dspotlight&af_ios_url=https://apps.apple.com/app/apple-store/id447188370?pt%3D614006%26ct%3Dspotlight%26mt%3D8","creator":{"username":"nba","displayName":"NBA","url":"https://www.snapchat.com/@nba"},"engagement":{"views":10051,"shares":3,"comments":4,"boosts":533,"recommends":33},"snapList":[{"snapIndex":0,"snapId":"W7_EDlXWTBiXAEEniNoMPwAAYcm95aXJwZW1tAZ-_U_PhAZ-_U8m2AAAAAQ","mediaType":"video","mediaUrl":"https://cf-st.sc-cdn.net/d/pnucYwUhWRai63fD72ieX.27.IRZXSOY?mo=GmAaCTIBBEgCUC5gAVCiAVoQU3BvdGxpZ2h0U2hhcmluZ6IBOAgbEicKJQieqbECIAEwnAQ4wAdAAUoOCglqLFtrV1FcVE8Q9ANQqskBaAIiCxIAKgdJUlpYU09ZkAOqyQE%3D&uc=46","mediaPreviewUrl":"https://cf-st.sc-cdn.net/d/pnucYwUhWRai63fD72ieX.256.IRZXSOY?mo=GkYaCTIBBEgCUC5gAVCgAVoQRGZMYXJnZVRodW1ibmFpbKIBEAiAAiILEgAqB0lSWlhTT1miARAImgoiCxIAKgdJUlpYU09Z&uc=46","publishedAt":"2026-08-01T21:56:07.000Z","raw":{"snapMediaType":1,"timestampInSec":1785621367}}],"raw":{"uploadDateMs":1785621367222}}],"relatedAccounts":[{"username":"warriors","displayName":"Golden State Warriors","url":"https://www.snapchat.com/@warriors","avatar":"https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvNjRqVjdIRlJMaHk1V21yS0MwNUZ2P2JvPUVnMGFBQm9BTWdFRVNBSlFHV0FCJnVjPTI1._RS0,640_FMjpeg","verified":true,"hasStory":true,"hasCuratedHighlights":false,"hasSpotlightHighlights":false,"subscribeLink":{"oneLinkBaseUrl":"https://click.snapchat.com/aVHG","deepLinkUrl":"https://www.snapchat.com/@warriors","iosAppStoreUrl":"https://apps.apple.com/app/apple-store/id447188370?pt=614006&ct=add_user&mt=8"}},{"username":"nfl","displayName":"NFL Official","url":"https://www.snapchat.com/@nfl","avatar":"https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvT3NjakFOS0dwSWh1VzQwek9qRnowP2JvPUVnMGFBQm9BTWdFRVNBSlFHV0FCJnVjPTI1._RS0,640_FMjpeg","verified":true,"hasStory":true,"hasCuratedHighlights":false,"hasSpotlightHighlights":false,"subscribeLink":{"oneLinkBaseUrl":"https://click.snapchat.com/aVHG","deepLinkUrl":"https://www.snapchat.com/@nfl","iosAppStoreUrl":"https://apps.apple.com/app/apple-store/id447188370?pt=614006&ct=add_user&mt=8"}}],"raw":{"creationTimestampMs":1526597295058,"lastUpdateTimestampMs":1785621674522},"mediaUrlsExpireAt":null}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/truth-social/profile":{"get":{"operationId":"truth_social_profile","tags":["Truth Social"],"summary":"Truth Social Profile API","description":"Prominent public Truth Social profiles — isPrivate/bot/group, CP-F counts, avatar/banner.\n\nPass a Truth Social @username or profile URL and get the public account as clean JSON. Canonical profile core: platform, id, username, url, displayName, bio, avatar, banner, followers, following, postCount, verified, createdAt. Each count carries followersIsApproximate / followingIsApproximate / postCountIsApproximate (CP-F). Also: bot/isPrivate/group, discoverable (nullable Mastodon field — null means Truth Social omitted it, not a mapping gap), location/website, ISO lastStatusAt. Mastodon extras live under raw (emojis[], fields[] with verifiedAt, chatsOnboarded, tvAccount). Twin keys (handle/acct/name/avatarStatic/headerStatic/locked) are omitted. Avatar/banner/media on static-assets-1.truthsocial.com are unsigned and do not expire — there is no mediaUrlsExpireAt. As of late 2025, Truth Social only lets you view public profiles/posts of prominent users (e.g. Trump, Vance) without authentication; most other accounts require auth and will 404 here. Flat 1 credit.\n\nDocs: https://captapi.com/apis/truth-social-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Truth Social profile URL or @username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Prominent public Truth Social profiles — isPrivate/bot/group, CP-F counts, avatar/banner.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"truth_social\" on this endpoint."},"id":{"type":"string","description":"Stable platform ID for the item."},"username":{"type":"string","description":"Local username (canonical). Upstream acct matches on reachable public accounts."},"url":{"type":"string","description":"Canonical URL of the item."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"banner":{"type":"string","description":"Banner / cover image URL. Canonical across profile endpoints."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"followersIsApproximate":{"type":"boolean","description":"CP-F on followers. Same ladder as Twitter/TikTok identity cards."},"followingIsApproximate":{"type":"boolean","description":"CP-F on following."},"postCountIsApproximate":{"type":"boolean","description":"CP-F on postCount."},"location":{"description":"Profile location string when Truth Social exposes one; null when empty."},"website":{"type":"string","description":"Website listed on the profile."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"lastStatusAt":{"type":"string","description":"Last status day from Truth Social, normalized to ISO-8601 UTC midnight (e.g. 2026-08-02T00:00:00.000Z). Upstream often sends YYYY-MM-DD only."},"bot":{"type":"boolean","description":"Whether Truth Social marks the account as a bot — filter before creator metrics."},"isPrivate":{"type":"boolean","description":"Follow-approval / locked account (upstream locked). Catalogue name shared with Instagram/Threads."},"group":{"type":"boolean","description":"Whether this is a Truth Social group account (not a personal creator)."},"discoverable":{"description":"Mastodon's nullable discoverable bit. null means Truth Social omitted the field (common on public figures) — not a Captapi mapping gap. false is an explicit no."},"acceptingMessages":{"type":"boolean","description":"Accepting messages. Example: false."},"raw":{"type":"object","properties":{"emojis":{"type":"array","items":{}},"fields":{"type":"array","items":{}},"chatsOnboarded":{"type":"boolean"},"tvAccount":{"type":"boolean"}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."}}}}},"example":{"success":true,"data":{"platform":"truth_social","id":"107780257626128497","username":"realDonaldTrump","url":"https://truthsocial.com/@realDonaldTrump","displayName":"Donald J. Trump","bio":"","avatar":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg","banner":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg","verified":true,"followers":12956933,"following":69,"postCount":35371,"followersIsApproximate":false,"followingIsApproximate":false,"postCountIsApproximate":false,"location":null,"website":"www.DonaldJTrump.com","createdAt":"2022-02-11T16:16:57.705Z","lastStatusAt":"2026-08-02T00:00:00.000Z","bot":false,"isPrivate":false,"group":false,"discoverable":null,"acceptingMessages":false,"raw":{"emojis":[],"fields":[],"chatsOnboarded":true,"tvAccount":false}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/truth-social/user-posts":{"get":{"operationId":"truth_social_user_posts","tags":["Truth Social"],"summary":"Truth Social User Posts API","description":"Recent Truths — same post mapper as /post (links, card, reblog/quote, mentions).\n\nPass a Truth Social @username or profile URL and get recent public posts as clean JSON — same status mapper as /post (not a slim sibling). Full author{} once at the top (same shape as /profile, including CP-F flags); each post keeps a slim author {id,username,displayName,avatar,verified}. text + links[] (unbroken URLs), card, media.meta, externalVideoId→Rumble, engagement {replies,reblogs,likes,downvotes} (likes is favourites/upvotes; downvotes is null when Truth Social omits the key, 0 when it sends 0). language is Truth Social/Mastodon's auto-detect — not Captapi's — and is null on an empty body; short URL-heavy English can be tagged nl/fy upstream. Chain fields when present: reblog{}, quote{}/quoteId, inReplyToId/inReplyToAccountId/inReplyTo{}. Native timeline excludes replies; reblogs and quotes still appear. Pagination: native emits nextCursor (Mastodon max_id) when the statuses page is full (~20), the Link header has rel=next, or author.postCount > totalReturned — hasMore is true only with a cursor. The extended path cannot page: hasMore true, nextCursor null, truncatedReason=single_page_only when author.postCount > totalReturned. Media URLs on static-assets-1.truthsocial.com are unsigned (no mediaUrlsExpireAt). As of late 2025, Truth Social only lets you view public profiles/posts of prominent users (e.g. Trump, Vance) without authentication; most other accounts require auth and will 404 here. Flat 2 credits.\n\nDocs: https://captapi.com/apis/truth-social-user-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Truth Social profile URL or @username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max posts to return (default 20, max 80). Truth Social's statuses page is ~20 items — a full page returns nextCursor. On the extended path hasMore can be true with nextCursor null (truncatedReason=single_page_only). Flat 2 credits.","schema":{"type":"integer","maximum":80,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Recent Truths — same post mapper as /post (links, card, reblog/quote, mentions).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"username":{"type":"string","description":"Account username / handle."},"author":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"truth_social\" on this endpoint (posts[].platform)."},"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"url":{"type":"string","description":"Canonical URL of the item."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"banner":{"type":"string","description":"Banner / cover image URL. Canonical across profile endpoints."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"followersIsApproximate":{"type":"boolean","description":"True when followers was parsed from a compact Facebook chrome label (e.g. 28M) rather than an exact integer."},"followingIsApproximate":{"type":"boolean","description":"Following is approximate. Example: false."},"postCountIsApproximate":{"type":"boolean","description":"Post count is approximate. Example: false."},"location":{"description":"Location shown on the profile or item."},"website":{"type":"string","description":"Website listed on the profile."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"lastStatusAt":{"type":"string","description":"Top-level author's last status time as ISO-8601 UTC (date-only upstream → midnight Z)."},"bot":{"type":"boolean","description":"Top-level author bot flag when present."},"isPrivate":{"type":"boolean","description":"Top-level author isPrivate (upstream locked) when the account payload is rich."},"group":{"type":"boolean","description":"Author.group on the top-level card; posts[].group when the status itself is a group post."},"discoverable":{"description":"Discoverable."},"acceptingMessages":{"type":"boolean","description":"Accepting messages. Example: false."},"raw":{"type":"object","properties":{"emojis":{"type":"array","items":{}},"fields":{"type":"array","items":{}},"chatsOnboarded":{"type":"boolean"},"tvAccount":{"type":"boolean"}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."}},"description":"Top-level: full profile card (same _normalize_account as /profile). On each post: slim {id, username, displayName, avatar, verified} only — stats live once at the top."},"requested":{"type":"integer","description":"The limit you sent."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"type":"string","description":"Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches)."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"truncatedReason":{"description":"null on the native path. single_page_only when the extended path cannot paginate and author.postCount > totalReturned (hasMore true, nextCursor null)."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"truth_social\" on this endpoint (posts[].platform)."},"id":{"type":"string","description":"Id of this posts item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Plain text from the status HTML. <a href> is replaced by the real URL so Truth Social span soft-wraps do not insert spaces into links."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."}},"description":"Top-level: full profile card (same _normalize_account as /profile). On each post: slim {id, username, displayName, avatar, verified} only — stats live once at the top."},"engagement":{"type":"object","properties":{"replies":{"type":"integer"},"reblogs":{"type":"integer"},"likes":{"type":"integer"},"upvotes":{},"downvotes":{}},"description":"Engagement metrics for the item."},"language":{"type":"string","description":"Truth Social/Mastodon auto-detect, passed through. Not Captapi-classified. Empty text → null. Short URL-heavy English is often tagged nl/fy upstream — do not treat language as a country filter."},"sensitive":{"type":"boolean","description":"Whether the content is flagged sensitive."},"media":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"previewUrl":{"type":["string","null"]},"description":{}}},"description":"Media attached to the item."},"links":{"type":"array","items":{},"description":"Authoritative http(s) URLs from <a href> attributes (deduped). Prefer this over regex on text."}}}}}}}},"example":{"success":true,"data":{"username":"realDonaldTrump","author":{"platform":"truth_social","id":"107780257626128497","username":"realDonaldTrump","url":"https://truthsocial.com/@realDonaldTrump","displayName":"Donald J. Trump","bio":"","avatar":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg","banner":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg","verified":true,"followers":12956933,"following":69,"postCount":35371,"followersIsApproximate":false,"followingIsApproximate":false,"postCountIsApproximate":false,"location":null,"website":"www.DonaldJTrump.com","createdAt":"2022-02-11T16:16:57.705Z","lastStatusAt":"2026-08-02T00:00:00.000Z","bot":false,"isPrivate":false,"group":false,"discoverable":null,"acceptingMessages":false,"raw":{"emojis":[],"fields":[],"chatsOnboarded":true,"tvAccount":false}},"requested":20,"totalReturned":2,"nextCursor":"116936997445912023","hasMore":true,"truncatedReason":null,"posts":[{"platform":"truth_social","id":"116938579137506694","url":"https://truthsocial.com/@realDonaldTrump/116938579137506694","text":"Tim Sheehy is GREAT. A Winner!!! President DJT","publishedAt":"2026-07-18T02:18:32.394Z","author":{"id":"107780257626128497","username":"realDonaldTrump","displayName":"Donald J. Trump","avatar":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg","verified":true},"engagement":{"replies":827,"reblogs":2584,"likes":8321,"upvotes":null,"downvotes":null},"language":"fy","sensitive":false,"media":[{"type":"image","url":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/116/938/578/476/026/646/original/5b31cf2bfc5bfa22.jpg","previewUrl":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/116/938/578/476/026/646/small/5b31cf2bfc5bfa22.jpg","description":null}],"links":[]},{"platform":"truth_social","id":"116938558790759096","url":"https://truthsocial.com/@realDonaldTrump/116938558790759096","text":"Ensuring the integrity of our elections is fundamental to preserving trust in American democracy. Following the 2020 presidential election, concerns about potential irregularities prompted detailed examinations of voting processes, data security, and registration practices across multiple states… Download documents and reports addressing key areas of election integrity, here: https://www. whitehouse.gov/election-integr ity/","publishedAt":"2026-07-18T02:13:21.858Z","author":{"id":"107780257626128497","username":"realDonaldTrump","displayName":"Donald J. Trump","avatar":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg","verified":true},"engagement":{"replies":1388,"reblogs":3509,"likes":11543,"upvotes":null,"downvotes":null},"language":"en","sensitive":false,"media":[{"type":"video","url":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/116/938/518/347/491/612/original/9bb622c2a7cb73f9.mp4","previewUrl":null,"description":null}],"links":[]}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/truth-social/post":{"get":{"operationId":"truth_social_post","tags":["Truth Social"],"summary":"Truth Social Post API","description":"One Truth — text, links[], card, reblog/quote chain, media.meta, externalVideoId.\n\nPass a Truth Social post URL or numeric ID and get the public status as clean JSON (same mapper as user-posts rows): text with unbroken URLs, links[], full author{} (same _normalize_account as /profile, including CP-F flags and raw Mastodon extras), engagement {replies,reblogs,likes,downvotes} (downvotes null when omitted), language from Truth Social's detector (null on empty text), card, media[] with meta/durationSeconds, externalVideoId when the clip is on Rumble, plus reblog/quote/inReplyTo chain fields, mentions[]/tags[], poll, visibility, spoilerText, sponsored, pinned when present. Media URLs on static-assets-1.truthsocial.com are unsigned — no mediaUrlsExpireAt. Session-only favourited/reblogged/muted/bookmarked are omitted. As of late 2025, Truth Social only lets you view public profiles/posts of prominent users (e.g. Trump, Vance) without authentication; most other accounts require auth and will 404 here. Flat 1 credit.\n\nDocs: https://captapi.com/apis/truth-social-post","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Truth Social post URL or post ID. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"One Truth — text, links[], card, reblog/quote chain, media.meta, externalVideoId.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"truth_social\" on this endpoint."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"text":{"type":"string","description":"Plain text from the status HTML with unbroken URLs (href preferred over span-broken visible text)."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"author":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"truth_social\" on this endpoint."},"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"url":{"type":"string","description":"Canonical URL of the item."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio. Canonical across profile endpoints (prefer over description on YouTube)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"banner":{"type":"string","description":"Banner / cover image URL. Canonical across profile endpoints."},"verified":{"type":"boolean","description":"Whether the account is verified on this platform."},"followers":{"type":"integer","description":"Follower count."},"following":{"type":"integer","description":"Number of accounts followed."},"postCount":{"type":"integer","description":"Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount)."},"followersIsApproximate":{"type":"boolean","description":"True when followers was parsed from a compact Facebook chrome label (e.g. 28M) rather than an exact integer."},"followingIsApproximate":{"type":"boolean","description":"Following is approximate. Example: false."},"postCountIsApproximate":{"type":"boolean","description":"Post count is approximate. Example: false."},"website":{"type":"string","description":"Website listed on the profile."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"lastStatusAt":{"type":"string","description":"Author's last status time as ISO-8601 UTC (date-only upstream → midnight Z)."},"isPrivate":{"type":"boolean","description":"Author isPrivate (upstream locked) when the embedded account is rich."},"bot":{"type":"boolean","description":"Author bot flag when present."},"group":{"type":"boolean","description":"Author group flag, or post-level group when the status itself is a group post."},"location":{"description":"Location shown on the profile or item."},"raw":{"type":"object","properties":{"emojis":{"type":"array","items":{}},"fields":{"type":"array","items":{}}},"description":"Raw upstream payload for advanced use (fields may change). Prefer the normalized top-level fields when available."}}},"engagement":{"type":"object","properties":{"replies":{"type":"integer","description":"Number of replies."},"reblogs":{"type":"integer","description":"Reblogs. Example: 2586."},"likes":{"type":"integer","description":"Favourites count (identical to upstream upvotes_count). Catalogue name — upvotes twin omitted."},"downvotes":{"description":"Truth Social downvotes_count when the key is present (0 stays 0). null when omitted."}}},"language":{"type":"string","description":"Truth Social/Mastodon auto-detect, passed through. Not Captapi-classified. Empty text → null."},"sensitive":{"type":"boolean","description":"Whether the content is flagged sensitive."},"media":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Content type of the item."},"url":{"type":"string","description":"Canonical URL of the item."},"previewUrl":{"type":"string","description":"Media thumbnail URL, or null for Truth Social's missing.png placeholder."},"description":{"description":"Description of this media item."}}}},"links":{"type":"array","items":{},"description":"Authoritative http(s) URLs from <a href> attributes (deduped)."}}}}},"example":{"success":true,"data":{"platform":"truth_social","id":"116938579137506694","url":"https://truthsocial.com/@realDonaldTrump/116938579137506694","text":"Tim Sheehy is GREAT. A Winner!!! President DJT","publishedAt":"2026-07-18T02:18:32.394Z","author":{"platform":"truth_social","id":"107780257626128497","username":"realDonaldTrump","url":"https://truthsocial.com/@realDonaldTrump","displayName":"Donald J. Trump","bio":"","avatar":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg","banner":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg","verified":true,"followers":12908903,"following":69,"postCount":35050,"followersIsApproximate":false,"followingIsApproximate":false,"postCountIsApproximate":false,"website":"www.DonaldJTrump.com","createdAt":"2022-02-11T16:16:57.705Z","lastStatusAt":"2026-07-18T00:00:00.000Z","isPrivate":false,"bot":false,"group":false,"location":null,"raw":{"emojis":[],"fields":[]}},"engagement":{"replies":827,"reblogs":2586,"likes":8328,"downvotes":null},"language":"fy","sensitive":false,"media":[{"type":"image","url":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/116/938/578/476/026/646/original/5b31cf2bfc5bfa22.jpg","previewUrl":"https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/116/938/578/476/026/646/small/5b31cf2bfc5bfa22.jpg","description":null}],"links":[]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/kick/clip":{"get":{"operationId":"kick_clip","tags":["Kick"],"summary":"Kick Clip API","description":"Get a Kick clip — source, 7d clip cache, fallback paths on a miss.\n\nTwo modes. Clip URL → {channelUrl, clip, source} with creator (who cut the clip) separate from channel (broadcaster), privacy, isMature, startedAt, livestreamId, vod{id,url,urlWithOffset}, vodStartsAt, and categorySlug/parentCategory. source is native | extended | cache, so a fallback is visible. Playback is HLS: videoType is \"hls\" and videoUrl is the .m3u8 playlist (not a progressive MP4 — download that URL and you get a text manifest). Clip mode caches by default (7d) — twenty of twenty-four fields never change; set cache=false to refetch views/likes. Channel input accepts kick.com/{name}, kick.com/@{name}, @{name}, or bare {name} → {channelUrl, totalReturned, clips[]} only — no top-level clip and no cursor (Kick's channel clips list is a single page; use limit, default 30, max 100). Channel listings stay fresh unless cache=true. Several fetch paths are tried in order, the slowest last. Kick has its own retry budget, independent of other platforms. An empty clips[] is 200 at 0 credits, not 404. A VOD URL is 400 WRONG_RESOURCE_TYPE (Kick coverage is clips only). Session-only liked is omitted. Flat 1 credit on a 200 with rows.\n\nDocs: https://captapi.com/apis/kick-clip","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Kick clip URL for one enriched clip (e.g. https://kick.com/{channel}/clips/clip_…), or channel input for recent clips[]: kick.com/{name}, kick.com/@{name}, @{name}, or {name}. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Channel mode only — max recent clips to return (default 30, max 100). Ignored when url is a clip. Flat 1 credit. No cursor — Kick returns a single page.","schema":{"type":"integer","maximum":100,"minimum":1,"default":30}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean"}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Get a Kick clip — source, 7d clip cache, fallback paths on a miss.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"channelUrl":{"type":"string","description":"Canonical Kick channel URL derived from the request."},"clip":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Id of this clip item."},"url":{"type":"string","description":"Kick clip web page (https://kick.com/{channel}/clips/clip_…). Not the HLS playlist."},"title":{"type":"string","description":"Title of this clip item."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."},"startedAt":{"type":"string","description":"When the stream, clip, or broadcast segment started (ISO 8601)."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"views":{"type":"integer","description":"View count when the platform exposes one."},"likes":{"type":"integer","description":"Like count (number)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"HLS playlist URL (.m3u8) for this clip — not a progressive MP4 file. Use an HLS player or ffmpeg; do not save as .mp4."},"privacy":{"type":"string","description":"Clip privacy (e.g. public)."},"isMature":{"type":"boolean","description":"Whether Kick marks the clip as mature content."},"livestreamId":{"type":"string","description":"Kick livestream id the clip was taken from."},"vodStartsAt":{"type":"integer","description":"Offset into the source VOD (seconds) where the clip starts. Paired with vod.urlWithOffset."},"vod":{"type":"object","properties":{"id":{"type":"string","description":"Id of this clip item."}},"description":"Source VOD — {id, url, urlWithOffset}. url is https://kick.com/{channel}/videos/{id}; urlWithOffset appends ?t={vodStartsAt} seconds."},"category":{"type":"string","description":"Kick category display name (e.g. Just Chatting)."},"categoryId":{"type":"string","description":"Kick category id."},"categorySlug":{"type":"string","description":"Kick category slug (e.g. just-chatting)."},"parentCategory":{"type":"string","description":"Kick parent category (e.g. irl)."},"categoryBanner":{"type":"string","description":"Category banner image URL when Kick exposes one."},"channel":{"type":"object","properties":{"id":{"type":"string","description":"Id of this clip item."},"username":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","description":"Kick clip web page (https://kick.com/{channel}/clips/clip_…). Not the HLS playlist."},"profilePicture":{"type":"string"}},"description":"Kick broadcaster channel for the clip — {id, username, displayName, url, profilePicture}."},"creator":{"type":"object","properties":{"id":{"type":"string","description":"Id of this clip item."},"username":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","description":"Kick clip web page (https://kick.com/{channel}/clips/clip_…). Not the HLS playlist."},"profilePicture":{"type":"string"}},"description":"Who created/cut the Kick clip (distinct from the broadcaster channel) — {id, username, displayName, url, profilePicture}."}}},"totalReturned":{"description":"Channel mode only — number of clips in this response. No nextCursor — Kick's channel clips list is a single page (use limit)."}}}}},"example":{"success":true,"data":{"channelUrl":"https://kick.com/xqc","clip":{"platform":"kick","id":"clip_01KZ0X5PGT228PY3QEB3RMR3YC","url":"https://kick.com/xqc/clips/clip_01KZ0X5PGT228PY3QEB3RMR3YC","title":"Vegas farming sadges","createdAt":"2026-08-02T09:36:01.061092Z","startedAt":"2026-08-02T05:45:57Z","durationSeconds":38,"views":18,"likes":0,"thumbnailUrl":"https://clips.kick.com/clips/fb/clip_01KZ0X5PGT228PY3QEB3RMR3YC/thumbnail.webp","videoUrl":"https://clips.kick.com/clips/fb/clip_01KZ0X5PGT228PY3QEB3RMR3YC/playlist.m3u8","privacy":"public","isMature":false,"livestreamId":"120226226","vodStartsAt":29450,"vod":{"id":"8faf0a05-dcdf-4ab1-8538-e87c6eef573e"},"category":"Just Chatting","categoryId":"15","categorySlug":"just-chatting","parentCategory":"irl","categoryBanner":"https://files.kick.com/images/subcategories/15/banner/b697a8a3-62db-4779-aa76-e4e47662af97","channel":{"id":"668","username":"xqc","name":"xQc","url":"https://kick.com/xqc","profilePicture":"https://files.kick.com/images/user/676/profile_image/conversion/931b4e8f-5445-427c-bd82-b473530390cc-thumb.webp"},"creator":{"id":"7458058","username":"ghosteld","name":"Ghosteld","url":"https://kick.com/ghosteld","profilePicture":"https://files.kick.com/images/user/7458058/profile_image/conversion/d0bd5606-ab8a-42f7-b535-6f7c4a672c34-thumb.webp"}}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/account/balance":{"get":{"operationId":"account_balance","tags":["Account"],"summary":"Credit Balance API","description":"Plan, subscription vs top-up credits, monthly quota, and renewsAt — 0 credits.\n\nLive (never cached) credit balance for the calling Captapi key as camelCase JSON: plan, monthlyQuota, subscriptionCredits, topupCredits, totalCredits, subscriptionRenewsAt / quotaResetsAt, usedThisMonth, keyName, rateLimitPerMinute, and rateLimitRemaining. usedThisMonth is all spend (subscription + top-up) — not comparable to monthlyQuota, which is the plan's subscription allotment only. Remaining subscription is subscriptionCredits; remaining top-up is topupCredits. Free — does not consume credits.\n\nDocs: https://captapi.com/apis/account-balance","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[],"x-credit-cost":{"credits":0,"label":"0 credits","billedOnCacheHit":false},"x-one-liner":"Plan, subscription vs top-up credits, monthly quota, and renewsAt — 0 credits.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"plan":{"type":"string","description":"Plan. Example: \"free\"."},"monthlyQuota":{"type":"integer","description":"Plan monthly subscription allotment (e.g. free=100). Not a cap on usedThisMonth, which also counts top-up spend."},"subscriptionCredits":{"type":"integer","description":"Remaining subscription credits (reset at quotaResetsAt / subscriptionRenewsAt). This is the quota account — not monthlyQuota − usedThisMonth."},"topupCredits":{"type":"integer","description":"Remaining purchased top-up credits (never expire)."},"totalCredits":{"type":"integer","description":"subscriptionCredits + topupCredits."},"subscriptionRenewsAt":{"description":"Subscription renews at."},"usedThisMonth":{"type":"integer","description":"All credits spent this billing window (subscription + top-up). Different account from monthlyQuota — do not subtract the two."},"quotaResetsAt":{"description":"When subscription credits renew — same value as subscriptionRenewsAt when set. Null on plans with no renewal timestamp."},"keyName":{"type":"string","description":"Display name of the calling API key when set; null for session JWT calls."},"rateLimitPerMinute":{"type":"integer","description":"Plan RPM ceiling enforced by Captapi (not GitHub/etc.)."},"rateLimitRemaining":{"type":"integer","description":"Requests left in the current 60s window after this call. Null only when the limiter is unreachable."}}}}},"example":{"success":true,"data":{"plan":"free","monthlyQuota":100,"subscriptionCredits":0,"topupCredits":9599,"totalCredits":9599,"subscriptionRenewsAt":null,"usedThisMonth":498,"quotaResetsAt":null,"keyName":"production","rateLimitPerMinute":40,"rateLimitRemaining":39}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/account/request-history":{"get":{"operationId":"account_request_history","tags":["Account"],"summary":"Request History API","description":"Recent API requests for your key — requestId, status, credits, cacheHit (0 credits).\n\nLive (never cached) request log for your Captapi key — free. Each row includes requestId (same UUID as the response envelope / x-captapi-request-id for support matching), endpoint, platform, resource (public URL or internal cache key such as instagram_user:handle — resourceUrl is a deprecated alias), creditsUsed, cacheHit, statusCode, responseTimeMs, createdAt. errorMessage is omitted on successful rows. Filter with endpoint, statusCode, since, and until. Page with cursor / nextCursor (hasMore is true only when nextCursor is set). limit default 50, max 500 — it caps the page and does not bill.\n\nDocs: https://captapi.com/apis/account-request-history","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 50, max 500). Free — does not consume credits.","schema":{"type":"integer","maximum":500,"minimum":1,"default":50}},{"name":"endpoint","in":"query","required":false,"description":"Exact Captapi path filter, e.g. /v1/instagram/basic-profile.","schema":{"type":"string"}},{"name":"statusCode","in":"query","required":false,"description":"Filter by HTTP status code (e.g. 500).","schema":{"type":"integer","maximum":599,"minimum":100}},{"name":"since","in":"query","required":false,"description":"Inclusive lower bound on createdAt (ISO date or datetime).","schema":{"type":"string"}},{"name":"until","in":"query","required":false,"description":"Exclusive upper bound on createdAt (ISO date or datetime).","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from nextCursor (createdAt of the last row). Leave empty for the first page.","schema":{"type":"string"}}],"x-credit-cost":{"credits":0,"label":"0 credits","billedOnCacheHit":false},"x-one-liner":"Recent API requests for your key — requestId, status, credits, cacheHit (0 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"hasMore":{"type":"boolean","description":"true when another page exists — pass nextCursor as cursor."},"nextCursor":{"description":"createdAt of the last row on this page. Null when hasMore is false."},"requests":{"type":"array","items":{"type":"object","properties":{"requestId":{"type":"string","description":"UUID of the logged call — same value as the response envelope requestId / x-captapi-request-id header. Use when contacting support. Also present on 4xx validation envelopes."},"endpoint":{"type":"string","description":"Endpoint. Example: \"/v1/instagram/basic-profile\"."},"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"resource":{"type":"string","description":"Logged resource identifier: a public URL when the call had one, otherwise an internal cache key (e.g. instagram_user:handle)."},"resourceUrl":{"type":"string","description":"Deprecated alias of resource (not always a URL). Prefer resource."},"creditsUsed":{"type":"integer","description":"Credits charged for that call (0 on cache hits)."},"cacheHit":{"type":"boolean","description":"true when the call was served from the 24h shared cache (0 credits)."},"statusCode":{"type":"integer","description":"Status code. Example: 200."},"responseTimeMs":{"type":"integer","description":"Response time ms. Example: 154."},"createdAt":{"type":"string","description":"Creation date (ISO 8601)."}}}},"filters":{"type":"object","properties":{"endpoint":{"description":"Endpoint."},"statusCode":{"description":"Status code."},"since":{"description":"Since."},"until":{"description":"Until."},"limit":{"type":"integer","description":"Requested max items for this call."},"cursor":{"description":"Cursor."}}}}}}},"example":{"success":true,"data":{"totalReturned":5,"hasMore":false,"nextCursor":null,"requests":[{"requestId":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","endpoint":"/v1/instagram/basic-profile","platform":"instagram","resource":"instagram_user:adencylnozturk","resourceUrl":"instagram_user:adencylnozturk","creditsUsed":0,"cacheHit":true,"statusCode":200,"responseTimeMs":154,"createdAt":"2026-07-18T11:31:44.31599+00:00"},{"requestId":"b2c3d4e5-f6a7-8901-bcde-f12345678901","endpoint":"/v1/instagram/basic-profile","platform":"instagram","resource":"instagram_user:adencylnozturk","resourceUrl":"instagram_user:adencylnozturk","creditsUsed":1,"cacheHit":false,"statusCode":200,"responseTimeMs":4980,"createdAt":"2026-07-18T11:31:21.584147+00:00"},{"requestId":"c3d4e5f6-a7b8-9012-cdef-123456789012","endpoint":"/v1/instagram/basic-profile","platform":"instagram","resource":"instagram_user:adencylnozturk","resourceUrl":"instagram_user:adencylnozturk","creditsUsed":1,"cacheHit":false,"statusCode":200,"responseTimeMs":4168,"createdAt":"2026-07-18T11:31:20.30634+00:00"},{"requestId":"d4e5f6a7-b8c9-0123-def0-234567890123","endpoint":"/v1/pinterest/board","platform":"pinterest","resource":"https://www.pinterest.com/potterybarn/indigo-blues-lookbook/","resourceUrl":"https://www.pinterest.com/potterybarn/indigo-blues-lookbook/","creditsUsed":3,"cacheHit":false,"statusCode":200,"responseTimeMs":17558,"createdAt":"2026-07-18T11:29:07.873651+00:00"},{"requestId":"e5f6a7b8-c9d0-1234-ef01-345678901234","endpoint":"/v1/facebook/marketplace-item","platform":"facebook","resource":"https://www.facebook.com/marketplace/item/2228870800986975/","resourceUrl":"https://www.facebook.com/marketplace/item/2228870800986975/","creditsUsed":1,"cacheHit":false,"statusCode":200,"responseTimeMs":10482,"createdAt":"2026-07-18T11:28:59.677517+00:00"}],"filters":{"endpoint":null,"statusCode":null,"since":null,"until":null,"limit":5,"cursor":null}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/account/daily-usage":{"get":{"operationId":"account_daily_usage","tags":["Account"],"summary":"Daily Usage API","description":"Day-by-day credit usage for spend monitoring (0 credits).\n\nDaily credit usage buckets for your Captapi key — date, requests, creditsUsed, success/fail counts. Live account data — not cached. Free.\n\nDocs: https://captapi.com/apis/account-daily-usage","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"days","in":"query","required":false,"description":"Number of days to include (default 30, max 365).","schema":{"type":"integer","maximum":365,"minimum":1,"default":30}}],"x-credit-cost":{"credits":0,"label":"0 credits","billedOnCacheHit":false},"x-one-liner":"Day-by-day credit usage for spend monitoring (0 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"days":{"type":"integer","description":"Days. Example: 7."},"totalRequests":{"type":"integer","description":"Total requests. Example: 251."},"totalCreditsUsed":{"type":"integer","description":"Total credits used. Example: 498."},"usage":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date. Example: \"2026-07-18\"."},"requests":{"type":"integer","description":"Requests. Example: 251."},"creditsUsed":{"type":"integer","description":"Credits used. Example: 498."},"successfulRequests":{"type":"integer","description":"Successful requests. Example: 242."},"failedRequests":{"type":"integer","description":"Failed requests. Example: 9."}}}}}}}},"example":{"success":true,"data":{"days":7,"totalRequests":251,"totalCreditsUsed":498,"usage":[{"date":"2026-07-18","requests":251,"creditsUsed":498,"successfulRequests":242,"failedRequests":9}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/account/most-used-routes":{"get":{"operationId":"account_most_used_routes","tags":["Account"],"summary":"Most Used Routes API","description":"Ranked list of which Captapi routes your key calls most (0 credits).\n\nRanked routes for your Captapi key over a chosen window — endpoint, request counts, creditsUsed. Envelope includes totalRoutes + hasMore (and truncatedReason=limit when the page is a slice). Live account data — not cached. Free.\n\nDocs: https://captapi.com/apis/account-most-used-routes","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"days","in":"query","required":false,"description":"Number of days to include (default 30, max 365).","schema":{"type":"integer","maximum":365,"minimum":1,"default":30}},{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100). Free — does not consume credits.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}}],"x-credit-cost":{"credits":0,"label":"0 credits","billedOnCacheHit":false},"x-one-liner":"Ranked list of which Captapi routes your key calls most (0 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"days":{"type":"integer","description":"Days. Example: 30."},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"totalRoutes":{"type":"integer","description":"Distinct endpoints in the window, before limit is applied."},"hasMore":{"type":"boolean","description":"true when totalRoutes > limit — this page is a slice."},"routes":{"type":"array","items":{"type":"object","properties":{"endpoint":{"type":"string","description":"Endpoint. Example: \"/v1/instagram/details\"."},"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"requests":{"type":"integer","description":"Requests. Example: 161."},"creditsUsed":{"type":"integer","description":"Credits used. Example: 46."},"successfulRequests":{"type":"integer","description":"Successful requests. Example: 161."},"failedRequests":{"type":"integer","description":"Failed requests. Example: 0."}}}}}}}},"example":{"success":true,"data":{"days":30,"totalReturned":2,"totalRoutes":2,"hasMore":false,"routes":[{"endpoint":"/v1/instagram/details","platform":"instagram","requests":161,"creditsUsed":46,"successfulRequests":161,"failedRequests":0},{"endpoint":"/v1/instagram/basic-profile","platform":"instagram","requests":3,"creditsUsed":2,"successfulRequests":3,"failedRequests":0}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/analytics/post":{"get":{"operationId":"analytics_post","tags":["Utilities"],"summary":"Post Analytics API","description":"Unified metrics for one post, video, or reel — platform auto-detected (1 credit).\n\nPass a public post/video/reel URL from one of 11 platforms (YouTube, TikTok, Instagram, Facebook, X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble) — not the full Captapi catalog (Kwai, Twitch, Spotify, Snapchat, and others are out of scope). Platform is auto-detected; cross-platform URLs are the point of this endpoint. Returns one normalized metrics object: views, likes, comments, shares, saves, interactions, engagementRate with engagementRateBasis=interactions/views (ratio), plus commentsIsApproximate / interactionsIsApproximate when a compact UI count (e.g. YouTube \"2.4M\") contributed. Schema is stable across networks; unavailable values are null (YouTube has no public share/save counts; author.username is the @handle when known, never the display name). An unresolvable URL is 404 at 0 credits — never a zero-filled metrics object. Do not compare this engagementRate to TikTok popular-creators — that field uses a different engagementRateBasis (percent). Flat 1 credit. Pass cache=true for the 24h shared cache (0 credits on hit).\n\nDocs: https://captapi.com/apis/analytics-post","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Public post/video/reel URL from one of 11 platforms: YouTube, TikTok, Instagram, Facebook, X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, or Rumble. Platform is auto-detected — cross-platform URLs are expected here (unlike single-platform endpoints). Not in scope: Kwai, Twitch, Spotify, Snapchat, and other Captapi platforms.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Unified metrics for one post, video, or reel — platform auto-detected (1 credit).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Stable platform ID for the item."},"title":{"type":"string","description":"Title of the item."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"author":{"type":"object","properties":{"username":{"type":"string","description":"Author @handle when known — never the display name."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"description":"Whether the account is verified on this platform."}}},"metrics":{"type":"object","properties":{"views":{"type":"integer","description":"View count when the platform exposes one."},"viewsIsApproximate":{"type":"boolean","description":"true when views came from a compact UI count. Usually false on YouTube watch pages with exact viewCount."},"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count. On Reddit this is the public num_comments integer — not null. Reddit's documented nulls on this endpoint are views / shares / saves."},"commentsIsApproximate":{"type":"boolean","description":"true when comments came from a compact UI count (e.g. YouTube \"2.4M\"). The integer is still returned, but treat it as ± rounding error — not unit-precise."},"shares":{"description":"Null when this platform does not expose a public share count (e.g. YouTube). Analytics keeps the key as null on purpose — a stable 11-platform schema. Single-platform endpoints (Twitch / Spotify / SoundCloud) omit not-applicable keys instead."},"saves":{"description":"Null when this platform does not expose a public save/bookmark count (e.g. YouTube). Same present-and-null convention as shares — not the omit-when-absent rule used on single-platform endpoints."},"interactions":{"type":"integer","description":"Sum of available engagement counts (likes + comments + shares + saves). Null when none of those are present."},"interactionsIsApproximate":{"type":"boolean","description":"true when interactions (and thus engagementRate) inherit uncertainty from an approximate numerator such as comments."},"engagementRate":{"type":"number","description":"Engagement rate. Meaning depends on engagementRateBasis — never compare values across different bases. Post/compare analytics: interactions/views (ratio 0–1+). TikTok popular-creators: Creative Center interact rate (percent) or avgLikesPerVideo/followers × 100."},"engagementRateBasis":{"type":"string","description":"Always \"interactions/views\" (ratio). Do not compare to popular-creators without reading that field's basis."}}}}}}},"example":{"success":true,"data":{"platform":"youtube","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","id":"dQw4w9WgXcQ","title":"Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","publishedAt":"2009-10-25T06:57:33.000Z","durationSeconds":213,"thumbnailUrl":"https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/sddefault.webp","author":{"username":"RickAstleyYT","displayName":"Rick Astley","url":"https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","verified":null},"metrics":{"views":1799593805,"viewsIsApproximate":false,"likes":19303349,"comments":2400000,"commentsIsApproximate":true,"shares":null,"saves":null,"interactions":21703349,"interactionsIsApproximate":true,"engagementRate":0.0121,"engagementRateBasis":"interactions/views"}}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/analytics/compare":{"get":{"operationId":"analytics_compare","tags":["Utilities"],"summary":"Compare Analytics API","description":"Compare unified metrics across up to 10 URLs — each row is the analytics/post object (1 credit/resolved URL).\n\nPass up to 10 comma-separated post/video/reel URLs (any mix of the same 11 platforms as Post Analytics) and get count/resolved/failedCount plus results[] and failed[]. Each ok row is exactly the /v1/analytics/post object plus status — platform, id, title, url, publishedAt (full ISO), durationSeconds, thumbnailUrl, author{}, metrics{views, likes, comments, shares, saves, interactions, engagementRate, engagementRateBasis, approximate flags}. A URL that cannot be resolved is status error and also appears in failed[] — never status ok with zero metrics. Bills 1 credit per successfully resolved URL that is not served from the 24h cache shared with post analytics; failed URLs are not billed (including an all-failed batch). No bulk discount vs N separate /post calls — the win is one HTTP round-trip. Pass cache=true for free cache hits.\n\nDocs: https://captapi.com/apis/analytics-compare","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"urls","in":"query","required":true,"description":"Comma-separated post/video/reel URLs (up to 10), any mix of the same 11 platforms as Post Analytics. Example: a TikTok URL and a YouTube URL in one call.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit/url","billedOnCacheHit":false},"x-one-liner":"Compare unified metrics across up to 10 URLs — each row is the analytics/post object (1 credit/resolved URL).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"count":{"type":"integer","description":"Number of items in this bucket (e.g. commenters from this country in the sample)."},"resolved":{"type":"integer","description":"Resolved. Example: 2."},"failedCount":{"type":"integer","description":"Number of URLs that could not be resolved in this compare batch."},"results":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"url":{"type":"string","description":"Canonical URL of the item."},"id":{"type":"string","description":"Id of this results item."},"title":{"type":"string","description":"Title of this results item."},"publishedAt":{"type":"string","description":"Full ISO-8601 UTC with milliseconds (same as analytics/post) — never date-only."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"author":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"url":{"type":"string","description":"Canonical URL of the item."},"verified":{"type":["boolean","null"]}},"description":"Author name or handle."},"metrics":{"type":"object","properties":{"views":{"type":"integer"},"viewsIsApproximate":{"type":"boolean"},"likes":{"type":"integer"},"comments":{"type":"integer"},"commentsIsApproximate":{"type":"boolean"},"shares":{"type":["integer","null"]},"saves":{"type":["integer","null"]},"interactions":{"type":"integer"},"interactionsIsApproximate":{"type":"boolean"},"engagementRate":{"type":"number"},"engagementRateBasis":{"type":"string"}},"description":"Object with views, viewsIsApproximate, likes, comments, commentsIsApproximate, shares."},"status":{"type":"string","description":"Row status: ok when the URL resolved, error when it failed."}}}},"failed":{"type":"array","items":{},"description":"Unresolved URLs as {url, platform, reason}."}}}}},"example":{"success":true,"data":{"count":2,"resolved":2,"failedCount":0,"results":[{"platform":"tiktok","url":"https://www.tiktok.com/@khaby.lame/video/7646812028874673439","id":"7646812028874673439","title":"Thank you, please come again!!!🙋🏿‍♂️💸#learnfromkhaby #comedy","publishedAt":"2026-06-02T14:56:35.000Z","durationSeconds":29,"thumbnailUrl":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oUAHVIiQDac8uC75AEfyALAA1FrTAqEEQ3GRPe~tplv-tiktokx-origin.image?dr=9636&x-expires=1783263600&x-signature=2PlkofS3nAbuOWtQQSaCTJIU0bQ%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5","author":{"username":"khaby.lame","displayName":"Khabane lame","url":"https://www.tiktok.com/@khaby.lame","verified":true},"metrics":{"views":14700000,"viewsIsApproximate":false,"likes":1300000,"comments":13600,"commentsIsApproximate":false,"shares":13400,"saves":50705,"interactions":1377705,"interactionsIsApproximate":false,"engagementRate":0.0937,"engagementRateBasis":"interactions/views"},"status":"ok"},{"platform":"youtube","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","id":"dQw4w9WgXcQ","title":"Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","publishedAt":"2009-10-25T06:57:33.000Z","durationSeconds":213,"thumbnailUrl":"https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/sddefault.webp","author":{"username":"RickAstleyYT","displayName":"Rick Astley","url":"https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","verified":null},"metrics":{"views":1799593805,"viewsIsApproximate":false,"likes":19303349,"comments":2400000,"commentsIsApproximate":true,"shares":null,"saves":null,"interactions":21703349,"interactionsIsApproximate":true,"engagementRate":0.0121,"engagementRateBasis":"interactions/views"},"status":"ok"}],"failed":[]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/video/transcript":{"post":{"operationId":"video_transcript","tags":["Utilities"],"summary":"Video File Transcript API","description":"AI transcription of an uploaded file — 1 credit/min; noSpeech=true and 0 credits when there is no speech.\n\nPOST multipart form field `file` (not a query string). Returns transcript, transcriptSegments[{text,start,duration,timestamp}], wordCount, segments, language, durationSeconds, and noSpeech. Optional form fields: language (ISO-639-1 hint), translate=true (English), timestampGranularity=segment|word. Limits: 200MB / 60 minutes. No speech → empty transcript + noSpeech=true and 0 credits (same detection as File Summarizer). Billed 1 credit per minute of audio (rounded up, min 1) — verify with durationSeconds. durationSeconds is the only duration key; creditsCharged is not duplicated inside data.\n\nDocs: https://captapi.com/apis/video-transcript","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[],"x-credit-cost":{"credits":1,"label":"1 credit/min","billedOnCacheHit":false},"x-one-liner":"AI transcription of an uploaded file — 1 credit/min; noSpeech=true and 0 credits when there is no speech.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"filename":{"type":"string","description":"Filename. Example: \"sample.mp4\"."},"transcript":{"type":"string","description":"Complete text transcript (file-upload endpoints). Timed caption/ASR endpoints use text instead."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"start":{"type":"number","description":"Start time in seconds."},"duration":{"type":"number","description":"Duration when present — prefer durationSeconds (number) and durationText on endpoints that expose both."},"end":{"type":"number","description":"End time in seconds."},"timestamp":{"type":"string","description":"Human-readable timestamp (MM:SS format)."}}}},"wordCount":{"type":"integer","description":"Word count of the returned transcript (matches the text — not a truncated preview)."},"segments":{"type":"integer","description":"Number of timed segments in transcriptSegments."},"language":{"type":"string","description":"Detected (or hinted) speech language from transcription."},"durationSeconds":{"type":"number","description":"Audio duration in seconds from transcription — basis for per-minute billing. The only duration key on this payload (segment duration stays on transcriptSegments[])."},"noSpeech":{"type":"boolean","description":"true when no trustworthy speech was found. transcript is empty and creditsUsed is 0 — same detection as File Summarizer's 422."}}}}},"example":{"success":true,"data":{"filename":"sample.mp4","transcript":"Hey everyone, welcome back to the channel. Today we're breaking down structured data APIs.","transcriptSegments":[{"text":"Hey everyone, welcome back to the channel.","start":0,"duration":4.12,"end":4.12,"timestamp":"00:00"},{"text":"Today we're breaking down structured data APIs.","start":4.12,"duration":4.28,"end":8.4,"timestamp":"00:04"}],"wordCount":14,"segments":2,"language":"english","durationSeconds":8.4,"noSpeech":false}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}},"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_video_transcript_v1_video_transcript_post"}}},"required":true}}},"/v1/video/summarize":{"post":{"operationId":"video_summarize","tags":["Utilities"],"summary":"Video File Summarizer API","description":"AI transcription + summary of an uploaded file — transcript included; 1 credit/min + 1.\n\nPOST multipart form field `file` (use curl -F file=@path — not a query string). Transcribes the upload with AI speech-to-text, then an AI model returns summary, keyPoints, topics, and sentiment in the same JSON as the full transcript (transcript, transcriptSegments, wordCount, language, durationSeconds). Summary length scales with the audio — short clips may be one paragraph with fewer bullets; longer recordings aim for 2–3 paragraphs and 4–8 key points. same transcription controls (language, translate, timestampGranularity) and 200MB / 60 min limits as File Transcript. Empty/no-speech → HTTP 422 at 0 credits. Billing: ceil(durationSeconds/60) + 1 — verify with durationSeconds.\n\nDocs: https://captapi.com/apis/video-summarize","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[],"x-credit-cost":{"credits":2,"label":"1 credit/min +1","billedOnCacheHit":false},"x-one-liner":"AI transcription + summary of an uploaded file — transcript included; 1 credit/min + 1.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"filename":{"type":"string","description":"Filename. Example: \"sample.mp4\"."},"summary":{"type":"string","description":"AI executive summary. Length scales with the transcript — short clips may be one paragraph; longer audio aims for 2–3."},"keyPoints":{"type":"array","items":{"type":"string"},"description":"Bullet takeaways (typically 4–8 on longer audio; fewer on short clips)."},"topics":{"type":"array","items":{"type":"string"},"description":"Detected topics and themes."},"sentiment":{"type":"string","description":"Overall tone (positive, neutral, negative)."},"transcript":{"type":"string","description":"Full transcript of the upload — always present on success (not summary-only)."},"transcriptSegments":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Text content."},"start":{"type":"number","description":"Start time in seconds."},"duration":{"type":"number","description":"Duration when present — prefer durationSeconds (number) and durationText on endpoints that expose both."},"end":{"type":"number","description":"End time in seconds."},"timestamp":{"type":"string","description":"Human-readable timestamp (MM:SS format)."}}}},"wordCount":{"type":"integer","description":"Total number of words in the transcript (file-upload endpoints)."},"segments":{"type":"integer","description":"Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list."},"language":{"type":"string","description":"Detected (or hinted) speech language from transcription."},"durationSeconds":{"type":"number","description":"Audio duration in seconds from transcription — basis for the per-minute part of billing. The only duration key on this payload."},"noSpeech":{"type":"boolean","description":"Should be false on success — empty speech returns HTTP 422 at 0 credits instead."}}}}},"example":{"success":true,"data":{"filename":"sample.mp4","summary":"This walkthrough shows how teams extract structured data from social video at scale without standing up scrapers or OAuth apps. It covers a single API key across platforms, shared caching, and why clean JSON beats brittle HTML parses.\n\nThe speaker contrasts fresh fetches with cache hits: the same profile call can drop from multi-second billed work to a sub-second free response. They also stress verifying per-minute Whisper billing via durationSeconds and the envelope creditsUsed.\n\nClosing takeaways focus on bringing your own media files for transcript-plus-summary in one POST, and using request logs to prove cache savings.","keyPoints":["One Captapi key works across supported platforms — no per-network OAuth.","Pass cache=true for a free 24h shared cache hit on social endpoints.","Whisper file endpoints bill per minute; read durationSeconds and the envelope creditsUsed.","Summarize returns the full transcript alongside summary/keyPoints/topics.","Short clips yield shorter summaries; longer audio aims for 2–3 paragraphs and 4–8 bullets.","Account request history exposes cacheHit and responseTimeMs side by side.","Use multipart POST (-F file=@path) — never put the file in the query string.","Empty/no-speech audio returns HTTP 422 on summarize (cannot summarize silence)."],"topics":["APIs","data extraction","automation","billing","caching"],"sentiment":"positive","transcript":"Hey everyone, welcome back to the channel. Today we are breaking down structured data APIs for social video. First, one API key across platforms beats stitching OAuth apps together. Second, the shared cache turns expensive profile lookups into free sub-second hits. Third, when you upload a file for Whisper, always check durationSeconds against the envelope creditsUsed. Finally, summarize gives you the AI digest plus the full transcript in the same JSON payload.","transcriptSegments":[{"text":"Hey everyone, welcome back to the channel. Today we are breaking down structured data APIs for social video.","start":0,"duration":8.2,"end":8.2,"timestamp":"00:00"},{"text":"First, one API key across platforms beats stitching OAuth apps together.","start":8.2,"duration":5.1,"end":13.3,"timestamp":"00:08"},{"text":"Second, the shared cache turns expensive profile lookups into free sub-second hits.","start":13.3,"duration":5.4,"end":18.7,"timestamp":"00:13"},{"text":"Third, when you upload a file for Whisper, always check durationSeconds against the envelope creditsUsed.","start":18.7,"duration":6,"end":24.7,"timestamp":"00:18"},{"text":"Finally, summarize gives you the AI digest plus the full transcript in the same JSON payload.","start":24.7,"duration":5.5,"end":30.2,"timestamp":"00:24"}],"wordCount":72,"segments":5,"language":"english","durationSeconds":30.2,"noSpeech":false}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}},"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_video_summarize_v1_video_summarize_post"}}},"required":true}}},"/v1/kwai/profile":{"get":{"operationId":"kwai_profile","tags":["Kwai"],"summary":"Kwai Profile API","description":"Fetch Kwai profile — display name, bio, counts, and verification as structured JSON.\n\nPass a Kwai profile URL or @handle and get the public account as clean JSON — one fixed key set on every profile: id (Kwai's opaque eid string — no twin eid key), username, displayName, bio, avatar, verified, verifiedDescription, gender, followers, following, likedCount, publicPostCount, privatePostCount, postCount (= public + private when both known), isPrivate. Sparse fields are null, never omitted (verifiedDescription / gender / privatePostCount included). No videoCount (Kwai posts are videos — structurally equal to postCount). No verifiedNumber (Kwai's verified_num is an undocumented enum; use verified + verifiedDescription). No redundant raw{}. Parsed from Kwai's public web page (JSON-LD + Nuxt SSR state). Note: Kwai's web surface sometimes stubs follower/following to 1; when that happens we prefer schema.org counts for followers and set following to null rather than ship a fake 1. Flat 1 credit.\n\nDocs: https://captapi.com/apis/kwai-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Kwai profile URL or @handle, e.g. https://www.kwai.com/@topfilmeseseriesnatv. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Fetch Kwai profile — display name, bio, counts, and verification as structured JSON.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"kwai\" on this endpoint."},"id":{"type":"string","description":"Kwai opaque profile eid (same value as eid)."},"eid":{"type":"string","description":"Kwai opaque profile eid."},"url":{"type":"string","description":"Canonical URL of the item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"bio":{"type":"string","description":"Profile bio when Kwai's public page exposes it."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"verified":{"type":"boolean","description":"Whether Kwai shows a verified badge on this profile."},"verifiedDescription":{"type":"string","description":"Kwai verification label text when present (e.g. Conta Oficial)."},"verifiedNumber":{"type":"integer","description":"Kwai verification tier number when present."},"followers":{"type":"integer","description":"Follower count when Kwai exposes a non-stub value."},"likedCount":{"type":"integer","description":"Total likes received across the creator's posts."},"publicPostCount":{"type":"integer","description":"Public posts count."},"privatePostCount":{"type":"integer","description":"Private posts count when Kwai exposes it."},"postCount":{"type":"integer","description":"Public post/video count (same as publicPostCount / videoCount)."},"isPrivate":{"type":"boolean","description":"Whether the account is private."},"videoCount":{"type":"integer","description":"Alias of postCount — public video/post count for cadence joins."}}}}},"example":{"success":true,"data":{"platform":"kwai","id":"3xyutri4afq3qks","eid":"3xyutri4afq3qks","url":"https://www.kwai.com/@KwaiBrasilOficial","username":"KwaiBrasilOficial","displayName":"Kwai Brasil Oficial","bio":"Aqui, Geral Brilha ✨","avatar":"https://aws-br-pic.kwai.net/bs2/overseaHead/20260729230605_BNTU4ODQzMDkz_s.jpg","verified":true,"verifiedDescription":"Conta Oficial","verifiedNumber":3,"followers":414136454,"likedCount":17600139,"publicPostCount":3707,"privatePostCount":0,"postCount":3707,"isPrivate":false,"videoCount":3707}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/kwai/user-posts":{"get":{"operationId":"kwai_user_posts","tags":["Kwai"],"summary":"Kwai User Posts API","description":"Kwai profile posts — caption (\"\" when none), engagement, mp4 + transcript (~1 credit/post).\n\nPass a Kwai profile URL or @handle and get that creator's public posts as clean JSON. Each post: id/url, text (the post caption only — empty string when none; never Kwai's SEO title / \"Áudio original criado por …\" boilerplate), hashtags[] (always present — [] when the caption has no tags), publishedAt, durationSeconds, thumbnailUrl, videoUrl with videoType (\"mp4\" or \"hls\"), mediaUrlsExpireAt parsed from the signed CDN tag=, engagement{views,likes,comments,shares}, and transcript when Kwai's JSON-LD auto-captions are present (duplicate merged tracks are deduped). Author{id,username,displayName,avatar,url} is returned once at the top — not repeated on every row. Envelope uses url (the requested profile) — same key as /kwai/post and /kwai/profile. HARD PAGE LIMIT: Kwai's public web only SSR-embeds a first-page window of posts (typically a handful — observed ~6 on large accounts), not the full postCount from /kwai/profile. hasMore/nextCursor page within that window; hasMore=false means the window is exhausted, not that the account has no more posts upstream. ~1 credit per post returned (min 2; default limit 20 → ~20 credits). Transcript is included when Kwai publishes it — not a separate transcription bill. Shares _normalize_post with /kwai/post.\n\nDocs: https://captapi.com/apis/kwai-user-posts","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Kwai profile URL or @handle, e.g. https://www.kwai.com/@topfilmeseseriesnatv. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max posts to return (1–200). Default 20. ~1 credit per post returned (min 2).","schema":{"type":"integer","maximum":200,"minimum":1,"default":20}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor from the previous nextCursor. Pages within posts from one profile fetch.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":20,"perResult":1,"label":"~20 credits (1/result)","billedOnCacheHit":false},"x-one-liner":"Kwai profile posts — caption (\"\" when none), engagement, mp4 + transcript (~1 credit/post).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"profileUrl":{"type":"string","description":"Canonical Kwai profile URL for the request (https://www.kwai.com/@handle)."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"url":{"type":"string","description":"Canonical URL of the item."}}},"totalReturned":{"type":"integer","description":"Number of items returned in this response."},"nextCursor":{"description":"Opaque pagination token within the posts from one profile fetch. Pass as cursor. Null when exhausted."},"hasMore":{"type":"boolean","description":"Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page."},"posts":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"kwai\" on this endpoint."},"id":{"type":"string","description":"Id of this posts item."},"url":{"type":"string","description":"Canonical URL of the item."},"transcript":{"type":"string","description":"Auto-caption text from Kwai JSON-LD when present (deduped if two tracks were concatenated). Omitted when Kwai does not expose captions — not null."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Post cover image URL."},"videoUrl":{"type":"string","description":"Signed progressive playback URL (usually mp4). Check videoType; re-fetch before mediaUrlsExpireAt."},"engagement":{"type":"object","properties":{"views":{"type":"integer"},"likes":{"type":"integer"},"comments":{"type":"integer"},"shares":{"type":"integer"}},"description":"Engagement metrics for the item."},"videoType":{"type":"string","description":"Playback type: \"mp4\" (progressive) or \"hls\" (.m3u8)."},"mediaUrlsExpireAt":{"type":"string","description":"ISO expiry for signed videoUrl / CDN links, parsed from Kwai's tag= query param."}}}}}}}},"example":{"success":true,"data":{"profileUrl":"https://www.kwai.com/@topfilmeseseriesnatv","author":{"id":"3x9mhse7ekkvfa9","username":"topfilmeseseriesnatv","displayName":"Topseriesfilmetv","avatar":"https://aws-br-pic.kwai.net/bs2/overseaHead/20250507231107_BMTUwMDAxNDU1MDE5OTQ1_s.jpg","url":"https://www.kwai.com/@topfilmeseseriesnatv"},"totalReturned":2,"nextCursor":null,"hasMore":false,"posts":[{"platform":"kwai","id":"5240932700689736196","url":"https://www.kwai.com/@topfilmeseseriesnatv/video/5240932700689736196","transcript":"BANDIDO ESTAVA ESPERANDO ELE NA SAIDA DO BANCO.","publishedAt":"2026-01-24T00:50:13Z","durationSeconds":156,"thumbnailUrl":"https://aws-br-pic.kwai.net/upic/2026/01/24/08/BMjAyNjAxMjQwODQ4MTNfMTUwMDAxNDU1MDE5OTQ1XzE1MDExMDI4NTA4NDg3NF8yXzM=_oscn2_Befd2f922b58f2b5f72e4cb3c375d043d.webp","videoUrl":"https://aws-br-cdn.kwai.net/upic/2026/01/24/08/BMjAyNjAxMjQwODQ4MTNfMTUwMDAxNDU1MDE5OTQ1XzE1MDExMDI4NTA4NDg3NF8yXzM=_b_Bf1ce0ec42b4fe4482cd50678b3abd2d4.mp4?tag=1-1784753172-s-0-afgxvdpz8w-4a78f339bd4accdf","engagement":{"views":138841,"likes":9232,"comments":91,"shares":169},"videoType":"mp4","mediaUrlsExpireAt":"2026-07-22T20:46:12.000Z"},{"platform":"kwai","id":"5197304080333126332","url":"https://www.kwai.com/@topfilmeseseriesnatv/video/5197304080333126332","publishedAt":"2026-07-21T01:41:02Z","durationSeconds":125,"thumbnailUrl":"https://p16-kimg.kwai.net/kimg/EKzM1y8qmQEKAnMzEg1waG90by1vdmVyc2VhGoMBdXBpYy8yMDI2LzA3LzIxLzAxL0JNakF5TmpBM01qRXdNVFF3TVRCZk1UVXdNREF4TkRVMU1ERTVPVFExWHpFMU1ERXhNVEUwTlRFMU9UUTBNRjh5WHpNPV9vdXVfQjVkMzdmMDZiZTFmMmU5NjQ0MGNkNjhhMjc3ZTg1MjRlLndlYnA.webp","videoUrl":"https://aws-br-cdn.kwai.net/upic/2026/07/21/01/BMjAyNjA3MjEwMTQwMTBfMTUwMDAxNDU1MDE5OTQ1XzE1MDExMTE0NTE1OTQ0MF8yXzM=_b_B9e078740aaad1692190abe5e2e2e61c6.mp4?tag=1-1784753179-s-0-46g59inljw-0d434501e8fb5c1c","engagement":{"views":8998,"likes":441,"comments":7,"shares":16},"videoType":"mp4","mediaUrlsExpireAt":"2026-07-22T20:46:19.000Z"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/kwai/post":{"get":{"operationId":"kwai_post","tags":["Kwai"],"summary":"Kwai Post API","description":"Single Kwai video — caption (\"\" when none), hashtags[], author, mp4 (2 credits).\n\nPass a Kwai video URL and get one post as clean JSON: same core card as a user-posts row (text = caption only, empty string when the post has none — never SEO title boilerplate; hashtags[] always present — [] when none; author{}, engagement, videoUrl/videoType, mediaUrlsExpireAt, transcript when Kwai exposes auto-captions). Flat 2 credits — priced in line with one list item, not the old 17-credit rate. Shares _normalize_post with /kwai/user-posts.\n\nDocs: https://captapi.com/apis/kwai-post","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Kwai video URL, e.g. https://www.kwai.com/@topfilmeseseriesnatv/video/5240932700689736196. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Single Kwai video — caption (\"\" when none), hashtags[], author, mp4 (2 credits).","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Always \"kwai\" on this endpoint."},"id":{"type":"string","description":"Stable platform ID for the item."},"url":{"type":"string","description":"Canonical URL of the item."},"transcript":{"type":"string","description":"Auto-caption text from Kwai JSON-LD when present (deduped). Omitted when Kwai does not expose captions."},"publishedAt":{"type":"string","description":"Publish date (ISO 8601) when the platform exposes an absolute timestamp."},"durationSeconds":{"type":"integer","description":"Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end)."},"thumbnailUrl":{"type":"string","description":"Thumbnail image URL."},"videoUrl":{"type":"string","description":"Signed progressive playback URL (usually mp4). Check videoType; re-fetch before mediaUrlsExpireAt."},"author":{"type":"object","properties":{"id":{"type":"string","description":"Id of this author item."},"username":{"type":"string","description":"Account username / handle."},"displayName":{"type":"string","description":"Display name of the account. Canonical across profile endpoints (prefer over name)."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"url":{"type":"string","description":"Canonical URL of the item."}}},"engagement":{"type":"object","properties":{"views":{"type":"integer","description":"View count when the platform exposes one."},"likes":{"type":"integer","description":"Like count (number)."},"comments":{"type":"integer","description":"Comment count."},"shares":{"type":"integer","description":"Share count. On analytics endpoints: null when the platform has no public share metric (stable schema). On single-platform endpoints the key is omitted instead."}}},"videoType":{"type":"string","description":"Playback type: \"mp4\" (progressive) or \"hls\" (.m3u8)."},"mediaUrlsExpireAt":{"type":"string","description":"ISO expiry for signed videoUrl, parsed from Kwai's tag= query param."}}}}},"example":{"success":true,"data":{"platform":"kwai","id":"5240932700689736196","url":"https://www.kwai.com/@topfilmeseseriesnatv/video/5240932700689736196","transcript":"BANDIDO ESTAVA ESPERANDO ELE NA SAIDA DO BANCO.","publishedAt":"2026-01-24T00:50:13Z","durationSeconds":156,"thumbnailUrl":"https://aws-br-pic.kwai.net/upic/2026/01/24/08/BMjAyNjAxMjQwODQ4MTNfMTUwMDAxNDU1MDE5OTQ1XzE1MDExMDI4NTA4NDg3NF8yXzM=_oscn2_Befd2f922b58f2b5f72e4cb3c375d043d.webp","videoUrl":"https://aws-br-cdn.kwai.net/upic/2026/01/24/08/BMjAyNjAxMjQwODQ4MTNfMTUwMDAxNDU1MDE5OTQ1XzE1MDExMDI4NTA4NDg3NF8yXzM=_b_Bf1ce0ec42b4fe4482cd50678b3abd2d4.mp4?tag=1-1784753172-s-0-afgxvdpz8w-4a78f339bd4accdf","author":{"id":"3x9mhse7ekkvfa9","username":"topfilmeseseriesnatv","displayName":"Topseriesfilmetv","avatar":"https://aws-br-pic.kwai.net/bs2/overseaHead/20250507231107_BMTUwMDAxNDU1MDE5OTQ1_s.jpg","url":"https://www.kwai.com/@topfilmeseseriesnatv"},"engagement":{"views":138841,"likes":9232,"comments":91,"shares":169},"videoType":"mp4","mediaUrlsExpireAt":"2026-07-22T20:46:12.000Z"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/komi/page":{"get":{"operationId":"komi_page","tags":["Komi"],"summary":"Komi Page API","description":"Komi link-in-bio → identity, socials{} (incl.\n\nPaste a Komi URL (komi.io/user or user.komi.io) and get the public page as clean JSON. Identity: id (string UUID), username, url, displayName, firstName/lastName, bio (may be an empty string), avatar. socials{} maps typed Komi social icons (instagram/tiktok/youtube/twitter/facebook/snapchat/spotify/appleMusic/…) and includes website when the creator publishes a WEBSITE row. links[] are content modules only — every row shares the same keys (id, moduleId, versionId, order, type, title, url, visible, thumbnail, price, currency); absent values are null, never missing keys. type distinguishes PRODUCT (price/currency filled) from LINK/YOUTUBE_VIDEO. YouTube embed rows read title/thumbnail from item.metadata when the module label is empty. Social icon rows are not duplicated into links[]. Komi does not expose follower counts or a verified badge. Flat 1 credit via Komi's public JSON APIs (not HTML scrape). Pass cache=true or cacheMaxAge (1d/3d/7d/14d/30d) for the shared response cache.\n\nDocs: https://captapi.com/apis/komi-page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Komi page URL or username, e.g. https://komi.io/kimkardashian or https://kimkardashian.komi.io/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Komi link-in-bio → identity, socials{} (incl.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Komi talentProfile id as a string UUID (catalog-wide id convention)."},"url":{"type":"string","description":"On the page: https://komi.io/{username}. On a link row: outbound destination."},"username":{"type":"string","description":"Komi account username (bare, no @)."},"handle":{"type":"string","description":"Account handle."},"displayName":{"type":"string","description":"Creator display name from Komi."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"firstName":{"type":"string","description":"First name."},"lastName":{"type":"string","description":"Last name."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"linkCount":{"type":"integer","description":"Number of content rows in links[] (hidden PRODUCT rows included when Komi marks visible:false)."},"socials":{"type":"object","properties":{"instagram":{"type":"string","description":"Instagram URL."},"tiktok":{"type":"string","description":"Tiktok URL."},"youtube":{"type":"string","description":"Youtube URL."},"twitter":{"type":"string","description":"Twitter URL."},"facebook":{"type":"string","description":"Facebook URL."},"snapchat":{"type":"string","description":"Snapchat URL."}}},"bio":{"type":"string","description":"Creator bio. Always present — empty string when Komi has none."},"description":{"type":"string","description":"Description text."},"links":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this links item."},"url":{"type":"string","description":"On the page: https://komi.io/{username}. On a link row: outbound destination."},"title":{"type":"string","description":"Title of this links item."},"type":{"type":"string","description":"On links[]: Komi module type (LINK, PRODUCT, YOUTUBE_VIDEO, …)."},"order":{"type":"integer","description":"Order. Example: 0."},"visible":{"type":"boolean","description":"Visible. Example: true."},"thumbnail":{"type":"string","description":"Thumbnail image URL."},"moduleId":{"type":"string","description":"Module id. Example: \"e6ce39d2-e3df-4040-a5cc-ce016cacbc34\"."},"versionId":{"type":"string","description":"Version id. Example: \"944094bf-f124-4b13-866a-3498c492736d\"."},"price":{"type":"integer"},"currency":{"type":"string"}}}},"other":{"type":"array","items":{},"description":"Typed social rows that did not map into socials{} [{url, title?, type?}]. Empty when every published social mapped."}}}}},"example":{"success":true,"data":{"platform":"komi","id":"64d82830-59aa-4488-bfb0-93426971d139","url":"https://komi.io/kimkardashian","username":"kimkardashian","handle":"kimkardashian","displayName":"Kim Kardashian","name":"Kim Kardashian","firstName":"Kim","lastName":"Kardashian","avatar":"https://komi-production-assets.s3.amazonaws.com/photos/4Nd69ODJHs61_iNYPlqos.jpg","linkCount":22,"socials":{"instagram":"https://www.instagram.com/kimkardashian/","tiktok":"https://www.tiktok.com/@kimkardashian","youtube":"https://www.youtube.com/@KUWTK","twitter":"https://twitter.com/KimKardashian","facebook":"https://www.facebook.com/KimKardashian","snapchat":"https://www.snapchat.com/add/kimkardashian?locale=en-GB"},"bio":"","description":"","links":[{"id":"6d7086df-ede4-4f8a-85e5-0fa410e60bc2","url":"https://skims.social/shop-skims","title":"Visit SKIMS","type":"LINK","order":0,"visible":true,"thumbnail":"https://komi-production-assets.s3-accelerate.amazonaws.com/photos/x_LQCBYzoWiel0-yrAnrF.jpg","moduleId":"e6ce39d2-e3df-4040-a5cc-ce016cacbc34","versionId":"944094bf-f124-4b13-866a-3498c492736d"},{"id":"f43e198b-2fd5-45f4-80d1-389906c5c840","url":"https://skims.com/products/signature-swim-triangle-bikini-top-dune-crocodile-print","title":"TRIANGLE BIKINI TOP | DUNE CROCODILE","type":"PRODUCT","order":0,"visible":false,"thumbnail":"https://komi-production-assets.s3-accelerate.amazonaws.com/photos/dzDiYZjZFXPE4E8-ZwnSn.png","moduleId":"5c8bc46c-2d6b-4731-baf3-2f40aec1465c","versionId":"944094bf-f124-4b13-866a-3498c492736d","price":44,"currency":"USD"}],"other":[]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/pillar/page":{"get":{"operationId":"pillar_page","tags":["Pillar"],"summary":"Pillar Page API","description":"Pillar link-in-bio → identity, socials{}, links[] with per-link clicks, products[].\n\nPaste a Pillar URL (pillar.io/user) and get the public page as clean JSON. Identity: id (string UUID), handle/username, url, displayName (name is a deprecated alias), firstName/lastName, bio (description is a deprecated alias — may be an empty string), avatar, location, email. socials{} maps Pillar banner + connected channels (instagram/tiktok/youtube/twitter/facebook/spotify/soundcloud/linkedin/snapchat/patreon/discord/twitch/medium/amazon/appleAppStore/googleAppStore/…). links[] are custom link rows with id, type, title, url, clicks (public per-link click counts — Pillar's unique performance signal), and order. products[] carries featured commerce rows (id, title/name, price, url, description, image). Pillar does not expose follower counts or a verified badge on this endpoint. Flat 1 credit via Pillar's public GraphQL API (not HTML scrape). Pass cache=true or cacheMaxAge (1d/3d/7d/14d/30d) for the shared response cache.\n\nDocs: https://captapi.com/apis/pillar-page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Pillar page URL or username. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Pillar link-in-bio → identity, socials{}, links[] with per-link clicks, products[].","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Pillar influencer id as a string UUID (catalog-wide id convention)."},"url":{"type":"string","description":"On the page: https://pillar.io/{url_key}. On a link/product row: outbound destination."},"username":{"type":"string","description":"Account username / handle."},"handle":{"type":"string","description":"Pillar page url_key (path slug). Canonical alongside username."},"displayName":{"type":"string","description":"Creator display name from Pillar (banner user_alias / full name). Canonical; name is a deprecated alias."},"name":{"type":"string","description":"Deprecated alias of displayName — prefer displayName."},"firstName":{"type":"string","description":"First name."},"lastName":{"type":"string","description":"Last name."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"location":{"type":"string","description":"Public location string from Pillar page customizations (e.g. México). Null when unset."},"email":{"type":"string","description":"Public email from Pillar EMAIL social and/or account email when published."},"linkCount":{"type":"integer","description":"Number of ACTIVE custom-link rows in links[] (DELETED + referral chrome excluded)."},"socials":{"type":"object","properties":{"tiktok":{"type":"string","description":"Tiktok URL."},"spotify":{"type":"string","description":"Spotify URL."},"twitter":{"type":"string","description":"Twitter URL."},"youtube":{"type":"string","description":"Youtube URL."},"facebook":{"type":"string","description":"Facebook URL."},"linkedin":{"type":"string","description":"Linkedin URL."},"instagram":{"type":"string","description":"Instagram URL."},"soundcloud":{"type":"string","description":"Soundcloud URL."}}},"bio":{"type":"string","description":"Creator bio. Always present — empty string when Pillar has none. description is a deprecated alias."},"description":{"type":"string","description":"Deprecated alias of bio — prefer bio."},"links":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this links item."},"type":{"type":"string","description":"On links[]: host-derived social key when obvious (twitter, spotify, …), otherwise lowercase title."},"title":{"type":"string","description":"Title of this links item."},"url":{"type":"string","description":"On the page: https://pillar.io/{url_key}. On a link/product row: outbound destination."},"clicks":{"type":"integer","description":"On links[]: cumulative public click count for that custom link."},"order":{"type":["integer","null"],"description":"Order. Example: 2."},"description":{"type":"string","description":"Deprecated alias of bio — prefer bio."}}}},"products":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id of this products item."},"title":{"type":"string","description":"Title of this products item."},"name":{"type":"string","description":"Name of this products item."},"url":{"type":"string","description":"On the page: https://pillar.io/{url_key}. On a link/product row: outbound destination."},"description":{"type":"string","description":"Description of this products item."},"image":{"type":"string","description":"Image URL."},"price":{"type":"integer","description":"Price of the item."},"showPrice":{"type":"boolean","description":"Show price. Example: false."}}}}}}}},"example":{"success":true,"data":{"platform":"pillar","id":"d8a5cbb4-a64d-44f2-830d-27a489bbc608","url":"https://pillar.io/angelstrife","username":"angelstrife","handle":"angelstrife","displayName":"Ángel Strife","name":"Ángel Strife","firstName":"Angel","lastName":"Blanco","avatar":"https://res.cloudinary.com/pillario/image/upload/user-image/page/96024b21-566f-405a-b4f2-2784526b380b","location":"México","email":"angelrafaelcovablanco@gmail.com","linkCount":5,"socials":{"tiktok":"https://tiktok.com/@angelstrifeoficial","spotify":"https://open.spotify.com/artist/3Lse4fAlOchY8msotsYMA6?si=4nKqeTSRRsSDoNj1tfvNtA","twitter":"https://twitter.com/SoyAngelStrife","youtube":"https://www.youtube.com/channel/UCgZSHuBjHSFADbFQOCN1ifg","facebook":"https://www.facebook.com/AngelStrifeOficial","linkedin":"https://mx.linkedin.com/in/angelcovablanco","instagram":"https://www.instagram.com/angelstrifeoficial","soundcloud":"https://soundcloud.com/contienda-records"},"bio":"Awarded as Ángel Strife for the nomination for best #RealityShow at the KidsChoiceAwards 2020 for his participation in the TheVoice México Season 9 Program with the Acunmedya production company on the television network TvAzteca, Awarded in Film Score for the Epstein Mention of the Fotogenia Festival 2020, as well as the Special Selection of the Hidalgo Film Fest 2020, Guanajuato 3.0 Experimental Film Festival 2020 & the international festival of film sur l'art \"Le Fife\" 2021 (Canada)","description":"Awarded as Ángel Strife for the nomination for best #RealityShow at the KidsChoiceAwards 2020 for his participation in the TheVoice México Season 9 Program with the Acunmedya production company on the television network TvAzteca, Awarded in Film Score for the Epstein Mention of the Fotogenia Festival 2020, as well as the Special Selection of the Hidalgo Film Fest 2020, Guanajuato 3.0 Experimental Film Festival 2020 & the international festival of film sur l'art \"Le Fife\" 2021 (Canada)","links":[{"id":"669fef70-1ba7-11ee-b33b-e5396daf72e9","type":"spotify","title":"30 Mil Pies De Altura Para Morir de Amor","url":"https://open.spotify.com/album/14jqUYFbuBs0HcftvQ7jC3?si=bX_bInR7R9Wu-mC9_77Fvw&context=spotify%3Aalbum%3A14jqUYFbuBs0HcftvQ7jC3","clicks":0,"order":2},{"id":"657440b0-1ba7-11ee-b33b-e5396daf72e9","type":"instagram","title":"SINCRONICIDAD","url":"https://www.instagram.com/contiendarecords","clicks":5,"order":null,"description":"Sigue Nuestra Contienda"}],"products":[{"id":"254c8681-1d52-11ee-b065-850167411bb1","title":"\"30 Mil Pies De Altura Para Morir de Amor\" - LP","name":"\"30 Mil Pies De Altura Para Morir de Amor\" - LP","url":"https://angel-strife.ueniweb.com/products/merchandise/30-mil-pies-de-altura-para-morir-de-amor-lp-especial-edition-vynil-deluxe-53106871","description":"Especial Edition Vynil Deluxe","image":"https://athlane-file-management-prod.s3.amazonaws.com/a925f7b5-77ba-4095-b755-27b2bc221baa","price":0,"showPrice":false},{"id":"1ade72a0-5720-11ee-abe2-f1c4530bf5e3","title":"Sweater Negro Gōruden Tsukoyomi (Edición Especial)","name":"Sweater Negro Gōruden Tsukoyomi (Edición Especial)","url":"https://angel-strife.ueniweb.com/products/merchandise/sweater-negro-goruden-tsukoyomi-edicion-especial-52958670","description":"Sweater Negro Gōruden Tsukoyomi (Edición Especial) en todas las tallas con diseño Tsukoyomi (Dios de la Luna) & letras Rojas Sweater Negro. disponible en todas las tallas y entrega en territorio nacional e internacional.","image":"https://athlane-file-management-prod.s3.amazonaws.com/8b2ac54c-21cd-4339-9cef-49bec35f26b4","price":0,"showPrice":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkbio/page":{"get":{"operationId":"linkbio_page","tags":["Linkbio"],"summary":"Linkbio Page API","description":"lnk.bio → id, socials{}, titled links[], website/email/whatsapp, other[].\n\nPaste an lnk.bio URL and get the public page as clean JSON. Identity: id (lnk.bio numeric string, e.g. \"-1344625\"), handle/username, url, avatar. displayName/name are emitted only when lnk.bio publishes a real display name — @handle OG titles are not synthesised (null/omitted). socials{} is derived from data-network icon rows and username CTAs (facebook/twitter/instagram/tiktok/youtube/snapchat/triller/website/whatsapp/…) other[] holds typed social networks we could not map to a known key so nothing disappears. Top-level website / email / whatsapp when published. links[] includes content buttons (pb-linkbox) plus primary social icons with titles from icon labels (Facebook, Instagram, Triller, …) — not null. lnk.bio does not expose follower counts or a verified badge. Flat 1 credit. Pass cache=true or cacheMaxAge (1d/3d/7d/14d/30d).\n\nDocs: https://captapi.com/apis/linkbio-page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Linkbio (lnk.bio) page URL or username, e.g. https://lnk.bio/charlidamelio. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"lnk.bio → id, socials{}, titled links[], website/email/whatsapp, other[].","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"lnk.bio numeric profile id as a string (e.g. \"-1344625\"). From data-uid / avatar path."},"url":{"type":"string","description":"On the page: https://lnk.bio/{username}. On a link row: outbound destination."},"username":{"type":"string","description":"Account username / handle."},"handle":{"type":"string","description":"lnk.bio path slug. Canonical alongside username."},"avatar":{"type":"string","description":"Avatar / profile picture URL. Canonical across profile endpoints."},"website":{"type":"string","description":"Official website URL when published (hero TYPE_BUTTON / official-website CTA or SOCIAL_WEB). Null when unset."},"linkCount":{"type":"integer","description":"Content buttons + primary social icon rows (family deep-link dupes excluded)."},"socials":{"type":"object","properties":{"facebook":{"type":"string","description":"Facebook URL."},"twitter":{"type":"string","description":"Twitter URL."},"instagram":{"type":"string","description":"Instagram URL."},"triller":{"type":"string","description":"Triller URL."},"tiktok":{"type":"string","description":"Tiktok URL."},"youtube":{"type":"string","description":"Youtube URL."},"snapchat":{"type":"string","description":"Snapchat URL."},"website":{"type":"string","description":"Official website URL when published (hero TYPE_BUTTON / official-website CTA or SOCIAL_WEB). Null when unset."}}},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"On the page: https://lnk.bio/{username}. On a link row: outbound destination."},"title":{"type":"string","description":"Title of this links item."},"id":{"type":"string","description":"Id of this links item."},"type":{"type":"string","description":"Content type of the item."}}}},"other":{"type":"array","items":{},"description":"Typed social networks that did not map into socials{} [{url, title?, type?}]. Empty when every icon mapped."}}}}},"example":{"success":true,"data":{"platform":"linkbio","id":"-1344625","url":"https://lnk.bio/charlidamelio","username":"charlidamelio","handle":"charlidamelio","avatar":"https://s3.us-west-2.amazonaws.com/cdn.lnk.bio/profilepics/-1344625_20220123667.jpg","website":"https://www.charlidamelio.com","linkCount":15,"socials":{"facebook":"https://facebook.com/thecharlidamelio","twitter":"https://twitter.com/charlidamelio","instagram":"https://instagram.com/charlidamelio","triller":"https://triller.co/m/@charlidamelio","tiktok":"https://tiktok.com/@charlidamelio","youtube":"https://youtube.com/c/charlidamelio","snapchat":"https://www.snapchat.com/add/damelioc","website":"https://www.charlidamelio.com"},"links":[{"url":"https://www.charlidamelio.com","title":"official website of charli d'amelio","id":"61ec9244a0fa03.74794466","type":"TYPE_BUTTON"},{"url":"https://www.hollisterco.com/shop/us/social-tourist/shop-all?%20cmp=SOC:SPR21:ST:D:US:Brand:X:BioINF:PInf:X:X:CD:STHP-ST:x:Charli%20IG","title":"shop social tourist january 2022 drop","id":"2733218","type":"TYPE_BIOLINK"}],"other":[]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/linkme/profile":{"get":{"operationId":"linkme_profile","tags":["Linkme"],"summary":"Linkme Profile API","description":"Linkme profile → bio, profileVisitCount, featured links, webLinks, email/infoLinks, stripeStatus.\n\nPaste a Linkme URL (link.me/danucd) and get the public profile from Linkme's dehydrated SSR payload (TanStack $tsr) — not HTML meta tags or the site footer. Identity: id, username, displayName, firstName/lastName when distinct, bio, avatar + isDefaultProfilePicture. Audience: profileVisitCount (e.g. 15.9k) and totalLinks (Linkme's SSR counter — not links[].length). Flags: verifiedAccount, isAmbassador, isPrivate. Timestamps: createdAt/updatedAt. links[] are featured CTA rows; webLinks[] are social icon groups; infoLinks[] carry email/contact — three separate buckets, not a union. stripeStatus{tipsEnabled,stripeEnabled} signals monetization; socials{} + other[] cover mapped/unmapped networks. Flat 1 credit. Pass cache=true or cacheMaxAge (1d/3d/7d/14d/30d) for the shared response cache.\n\nDocs: https://captapi.com/apis/linkme-profile","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Linkme profile URL or username, e.g. https://link.me/danucd or danucd. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.","schema":{"type":"string"}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the response cache (default TTL). Default false — always fetch fresh. Prefer cacheMaxAge when you need 1d–30d freshness control.","schema":{"type":"boolean","default":false}},{"name":"cacheMaxAge","in":"query","required":false,"description":"Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL.","schema":{"enum":["1d","3d","7d","14d","30d"],"type":"string"}}],"x-credit-cost":{"credits":1,"label":"1 credit","billedOnCacheHit":false},"x-one-liner":"Linkme profile → bio, profileVisitCount, featured links, webLinks, email/infoLinks, stripeStatus.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"platform":{"type":"string","description":"Platform identifier for this response (matches the endpoint's platform)."},"id":{"type":"string","description":"Linkme profile id as a hex string."},"url":{"type":"string","description":"On the page: https://link.me/{username}. On a link row: outbound destination."},"username":{"type":"string","description":"Linkme account username (bare, no @). Canonical account handle."},"handle":{"type":"string","description":"Account handle."},"displayName":{"type":"string","description":"firstName + lastName when present. Canonical human-readable name (no name/handle twins)."},"name":{"type":"string","description":"Name of the item or account. On profile endpoints: deprecated alias of displayName (one release)."},"firstName":{"type":"string","description":"Given name from Linkme when distinct from displayName. Omitted when it would duplicate displayName with no lastName."},"avatar":{"type":"string","description":"Profile image URL on media.link.me. Check isDefaultProfilePicture before treating it as a real photo."},"profileVisitCount":{"type":"string","description":"Public profile visit count as Linkme displays it (string, e.g. \"15.9k\" or \"29\"). One of the few audience metrics in the link-in-bio block."},"createdAt":{"type":"string","description":"Profile createdAt from Linkme (YYYY-MM-DD HH:mm:ss)."},"updatedAt":{"type":"string","description":"Profile updatedAt from Linkme (YYYY-MM-DD HH:mm:ss)."},"email":{"type":"string","description":"Public email from infoLinks when published. Null when unset."},"socials":{"type":"object","properties":{"appleMusic":{"type":"string","description":"Apple music URL."},"spotify":{"type":"string","description":"Spotify URL."},"instagram":{"type":"string","description":"Instagram URL."},"facebook":{"type":"string","description":"Facebook URL."},"twitter":{"type":"string","description":"Twitter URL."},"youtube":{"type":"string","description":"Youtube URL."},"tiktok":{"type":"string","description":"Tiktok URL."},"twitch":{"type":"string","description":"Twitch URL."},"threads":{"type":"string","description":"Threads URL."}}},"chatId":{"type":"string","description":"Chat id. Example: \"LinkMe-1169288\"."},"bio":{"type":"string","description":"Creator bio from the dehydrated profile. Empty string when unset."},"description":{"type":"string","description":"Description text."},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"On the page: https://link.me/{username}. On a link row: outbound destination."},"title":{"type":"string","description":"Title of this links item."},"id":{"type":"string","description":"Id of this links item."},"thumbnail":{"type":"string","description":"Thumbnail image URL."}}},"description":"Featured CTA buttons [{id?, title, url, thumbnail?, description?}]. Never Privacy Policy / Terms footer rows. Not a union of webLinks/infoLinks — iterate links alone for CTAs."},"linkCount":{"type":"integer","description":"Number of featured CTA rows in links[] (not footer chrome). Prefer this when you need array length."},"totalLinks":{"type":"integer","description":"Linkme SSR profile.totalLinks — the platform's own counter from the dehydrated profile. Not derived from links[], webLinks[], or infoLinks[] (those are separate surfaces and their lengths can disagree with this number)."},"webLinks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Title of this web links item."},"linkId":{"type":"integer","description":"Stable id for a bio link when Meta exposes one."},"links":{"type":"array","items":{"type":"object","properties":{"linkValue":{"type":"string"},"faceValue":{"type":"string"},"baseUrl":{"type":"string"}}},"description":"Featured CTA buttons [{id?, title, url, thumbnail?, description?}]. Never Privacy Policy / Terms footer rows. Not a union of webLinks/infoLinks — iterate links alone for CTAs."}}}},"infoLinks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Title of this info links item."},"linkId":{"type":"integer","description":"Stable id for a bio link when Meta exposes one."},"links":{"type":"array","items":{"type":"object","properties":{"linkValue":{"type":"string"},"faceValue":{"type":"string"}}},"description":"Featured CTA buttons [{id?, title, url, thumbnail?, description?}]. Never Privacy Policy / Terms footer rows. Not a union of webLinks/infoLinks — iterate links alone for CTAs."}}}},"other":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","description":"On the page: https://link.me/{username}. On a link row: outbound destination."},"title":{"type":"string","description":"Title of this other item."},"type":{"type":"string","description":"Content type of the item."}}}},"stripeStatus":{"type":"object","properties":{"tipsEnabled":{"type":"boolean","description":"Tips enabled. Example: false."},"stripeEnabled":{"type":"boolean","description":"Stripe enabled. Example: false."}}},"isDefaultProfilePicture":{"type":"boolean","description":"True when Linkme is serving a placeholder avatar (e.g. default/profile/avatar-2.png) — not the creator's photo."},"verifiedAccount":{"type":"boolean","description":"True when Linkme marks the account verified."},"isAmbassador":{"type":"boolean","description":"True when the profile is a Linkme ambassador."},"isPrivate":{"type":"boolean","description":"True when the profile is private."}}}}},"example":{"success":true,"data":{"platform":"linkme","id":"1bf3efbf94cc4f55d3650ddc61094ac3","url":"https://link.me/danucd","username":"danucd","handle":"danucd","displayName":"Dana","name":"Dana","firstName":"Dana","avatar":"https://media.link.me/_resize/image/quality=90,format=webp/webp-images/user-profile/1169288/tmp-2541-1763300314455.webp","profileVisitCount":"54.1k","createdAt":"2024-11-01 12:37:51","updatedAt":"2025-11-16 13:43:17","email":"dana.danucd@gmail.com","socials":{"appleMusic":"https://music.apple.com/ng/artist/danucd/1562315189","spotify":"https://open.spotify.com/artist/0A8XmfCL2yangEtvot3peD?autoplay=true&source_application=google_assistant","instagram":"https://www.instagram.com/danucd/","facebook":"https://www.facebook.com/Danucd","twitter":"https://www.twitter.com/Danucd1","youtube":"https://www.youtube.com/@DanucD2","tiktok":"https://www.tiktok.com/@danucd_","twitch":"https://m.twitch.tv/danucd?fbclid=PAZXh0bgNhZW0CMTEAAaaw5KxeIr47f2JnvCWttLnzIFG35Q8vQ6dK_H4Pv7bQKefUMmqYXvRPm90_aem_qRBQ5McX7dnSwaw8aHxqaA&desktop-redirect=true","threads":"https://www.threads.net/@danucd?hl=en"},"chatId":"LinkMe-1169288","bio":"ALL MY LINKS👇","description":"ALL MY LINKS👇","links":[{"url":"https://twitch.tv/danucd","title":"Twitch","id":"231267","thumbnail":"small"},{"url":"https://www.youtube.com/@DanucD2","title":"Daily YouTube","id":"611348","thumbnail":"small"}],"linkCount":12,"totalLinks":7,"webLinks":[{"title":"Apple-music","linkId":9,"links":[{"linkValue":"https://music.apple.com/ng/artist/danucd/1562315189","faceValue":"1562315189","baseUrl":"https://music.apple.com/profile/"}]},{"title":"Spotify","linkId":10,"links":[{"linkValue":"https://open.spotify.com/artist/0A8XmfCL2yangEtvot3peD?autoplay=true&source_application=google_assistant","faceValue":"0A8XmfCL2yangEtvot3peD","baseUrl":"https://open.spotify.com/user/"}]}],"infoLinks":[{"title":"Email","linkId":1,"links":[{"linkValue":"dana.danucd@gmail.com","faceValue":"dana.danucdgmail.com"}]}],"other":[{"url":"https://www.deezer.com/artist/129733822/radio?autoplay=true","title":"Deezer","type":"Deezer"}],"stripeStatus":{"tipsEnabled":false,"stripeEnabled":false},"isDefaultProfilePicture":false,"verifiedAccount":false,"isAmbassador":true,"isPrivate":false}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/google/business-search":{"get":{"operationId":"google_maps_business_search","tags":["Google Maps"],"summary":"Google Maps Business Search API","description":"Local businesses from a Maps search — name, address, phone, website, rating, hours, place id.\n\nSearch Google Maps for a keyword and get up to 100 businesses. q is required (min 2 characters). Pass location as City,Region,Country — for example Austin,Texas,United States — or omit it and use locationCode (default 2840, the United States). When location is set, locationCode is not used and is left out of the response. language defaults to en. limit is 1–100 and is not a page you can walk: there is no nextCursor. A successful call costs 2 credits even when businesses is empty, because the lookup still ran. Failures cost 0. phone, website, rating, and reviewCount are null when Maps does not publish them — null is not zero. hoursStatus is Maps' own open/closed label (for example open or close), not a boolean we invented. image URLs are hosted by Google and can expire; there is no expiresAt. Ads and other non-business rows are left out and counted in omittedCount. This endpoint does not return owner emails. cache defaults to false. cache=true reuses a 24 hour response, and cache hits are free. The sample is one live listing captured on 10 October 2026, with every field Maps published on that row filled in. Other listings still leave unpublished fields null.\n\nDocs: https://captapi.com/apis/google-maps-business-search","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Keyword, for example plumber or coffee. Min 2 characters.","schema":{"type":"string","minLength":2,"maxLength":200}},{"name":"location","in":"query","required":false,"description":"Place name as City,Region,Country, for example Austin,Texas,United States. When set, locationCode is not used and is left out of the response. A free-text city alone (austin) is not a place name.","schema":{"type":"string","maxLength":180}},{"name":"locationCode","in":"query","required":false,"description":"Numeric place code, used only when location is omitted. Default 2840 (United States).","schema":{"type":"integer","maximum":10000000,"minimum":1}},{"name":"language","in":"query","required":false,"description":"Language code, for example en. Default en.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en"}},{"name":"limit","in":"query","required":false,"description":"Max businesses to return (default 20, max 100). Not a page cursor — there is no next page. Flat 2 credits on every successful call, including zero businesses.","schema":{"type":"integer","maximum":100,"minimum":1,"default":20}},{"name":"cache","in":"query","required":false,"description":"Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.","schema":{"type":"boolean","default":false}}],"x-credit-cost":{"credits":2,"label":"2 credits","billedOnCacheHit":false},"x-one-liner":"Local businesses from a Maps search — name, address, phone, website, rating, hours, place id.","responses":{"200":{"description":"Success. The data object for this endpoint.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"query":{"type":"string","description":"The keyword you sent."},"location":{"type":"string","description":"Place name you sent (City,Region,Country). Null when you used locationCode instead."},"language":{"type":"string","description":"Language code that was used. Default en."},"limit":{"type":"integer","description":"Max businesses requested (1–100). Not a page cursor."},"totalReturned":{"type":"integer","description":"How many businesses are in businesses[]."},"omittedCount":{"type":"integer","description":"Rows that were not businesses (ads and other listing types) and were left out of businesses[]."},"businesses":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"integer","description":"Position in the Maps results (1-based)."},"title":{"type":"string","description":"Business name."},"category":{"type":"string","description":"Primary Maps category. Null when omitted."},"additionalCategories":{"type":"array","items":{"type":"string"},"description":"Extra Maps categories. Null when the listing has none."},"snippet":{"type":"string","description":"Short Maps blurb. Null when omitted."},"address":{"type":"string","description":"Single-line address. Null when omitted."},"city":{"type":"string","description":"City from the address. Null when omitted."},"region":{"type":"string","description":"Region or state from the address. Null when omitted."},"zip":{"type":"string","description":"Postal code. Null when omitted."},"countryCode":{"type":"string","description":"Country code from the address. Null when omitted."},"phone":{"type":"string","description":"Phone number as published. Null when Maps does not show one — not an empty string."},"website":{"type":"string","description":"Business website. Null when Maps does not show one."},"contactUrl":{"type":"string","description":"Maps contact link when published. Null otherwise."},"bookOnlineUrl":{"type":"string","description":"Maps booking link when published. Null otherwise."},"rating":{"type":"number","description":"Star rating when published. Null when omitted — not zero."},"reviewCount":{"type":"integer","description":"Number of ratings when published. Null when omitted — not zero."},"ratingDistribution":{"type":"object","properties":{"1":{"type":"integer"},"2":{"type":"integer"},"3":{"type":"integer"},"4":{"type":"integer"},"5":{"type":"integer"}},"description":"Count of 1–5 star ratings when published. Null when omitted."},"priceLevel":{"type":"string","description":"Maps price label when published, such as inexpensive or moderate. Null when omitted."},"latitude":{"type":"number","description":"Latitude. Null when omitted."},"longitude":{"type":"number","description":"Longitude. Null when omitted."},"placeId":{"type":"string","description":"Maps place id."},"cid":{"type":"string","description":"Maps customer id, when published."},"mapsUrl":{"type":"string","description":"Maps URL for this place, built from placeId (or cid when placeId is missing)."},"image":{"type":"string","description":"Photo URL hosted by Google. It can expire. There is no expiresAt."},"photoCount":{"type":"integer","description":"Photo count when published. Null when omitted."},"isClaimed":{"type":"boolean","description":"Whether the listing is claimed. Null when omitted."},"hoursStatus":{"type":"string","description":"Maps' current open/closed label when published (for example open or close). Null when omitted. Not a boolean."},"hours":{"type":"object","properties":{"sunday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}},"monday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}},"tuesday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}},"wednesday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}},"thursday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}},"friday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}},"saturday":{"type":"array","items":{"type":"object","properties":{"open":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}},"close":{"type":"object","properties":{"hour":{"type":"integer"},"minute":{"type":"integer"}}}}}}},"description":"Weekly timetable when published. Null when omitted."},"isDirectoryItem":{"type":"boolean","description":"True when the row is a directory listing. Null when omitted."}}}},"locationCode":{"description":"Numeric place code that was used. Included only when location was omitted. 2840 is the United States."}}}}},"example":{"success":true,"data":{"query":"The Backspace","location":"Austin,Texas,United States","language":"en","limit":1,"totalReturned":1,"omittedCount":0,"businesses":[{"rank":1,"title":"The Backspace","category":"Pizza","additionalCategories":["Italian restaurant","Restaurant"],"snippet":"507 San Jacinto Blvd, Austin, TX 78701","address":"507 San Jacinto Blvd, Austin, TX 78701","city":"Austin","region":"Texas","zip":"78701","countryCode":"US","phone":"+1512-474-9899","website":"https://www.backspacepizza.com/?utm_source=GMBlisting&utm_medium=organic","contactUrl":"https://party-request.tripleseat.com/venues/O476HqLy/?rwg_token=AE37R_i_o_MnaL1e65JJJvaOltQTL9_QXm5sl_BttOhPUA7uJzO396kceRBPO9SmXs8ST8w4slgTPqEDJNYOTalzcn2EkPCQ-w%3D%3D","bookOnlineUrl":"https://www.google.com/maps/reserve/v/dine/c/ooA7fdRRGqw?source=pa&opi=79508299&hl=en-US&gei=HD7KarawF_38wbkP5Mq6wQE&ahbb=1&sourceurl=https://www.google.com/search?tbm%3Dmap%26authuser%3D0%26hl%3Den%26gl%3Dus%26pb%3D!4m9!1m3!1d546887.6385058826!2d-97.7430608!3d30.267153!2m0!3m2!1i1920!2i945!4f13.1!7i1!8i0!10b1!12m28!1m1!18b1!2m3!5m1!6e2!20e3!6m12!4b1!49b1!63m0!73m0!74i150000!75b1!85b1!89b1!91b1!110m0!114b1!149b1!10b1!14b1!16b1!17m1!3e1!20m3!5e2!6b1!14b1!19m4!2m3!1i360!2i120!4i8!20m57!2m2!1i203!2i100!3m2!2i4!5b1!6m6!1m2!1i86!2i86!1m2!1i408!2i240!7m42!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!2b1!4b1!9b0!22m6!1s!2s!4m1!2i20588!7e81!12e3!24m78!1m25!13m9!2b1!3b1!4b1!6i1!8b1!9b1!14b1!20b1!25b1!18m14!3b1!4b1!5b1!6b1!13b1!14b1!15b1!17b1!21b1!22b0!25b0!27m1!1b0!28b0!2b1!5m6!2b1!3b1!5b1!6b1!7b1!10b1!10m1!8e3!11m1!3e1!14m1!3b1!17b1!20m2!1e3!1e6!24b1!25b1!26b1!29b1!30m1!2b1!36b1!39m3!2m2!2i1!3i1!43b1!52b1!54m1!1b1!55b1!56m2!1b1!3b1!65m5!3m4!1m3!1m2!1i224!2i298!71b1!72m4!1m2!3b1!5b1!4b1!89b1!103b1!113b1!26m4!2m3!1i80!2i92!4i8!30m28!1m6!1m2!1i0!2i0!2m2!1i530!2i945!1m6!1m2!1i1870!2i0!2m2!1i1920!2i945!1m6!1m2!1i0!2i0!2m2!1i1920!2i20!1m6!1m2!1i0!2i925!2m2!1i1920!2i945!31b1!34m19!2b1!3b1!4b1!6b1!7b1!8m6!1b1!3b1!4b1!5b1!6b1!7b1!9b1!12b1!14b1!20b1!23b1!25b1!26b1!37m1!1e81!42b1!46m1!1e2!47m0!49m6!3b1!6m2!1b1!2b1!7m1!1e3!50m32!1m28!2m7!1u3!4s!5e1!9s!10m2!3m1!1e1!2m7!1u2!4s!5e1!9s!10m2!2m1!1e1!3m6!1u17!2m4!1m2!17m1!1e2!2s!3m1!1u2!3m1!1u3!4BIAE!2e2!3m1!3b1!61b1!67m5!7b1!10b1!14b1!15m1!1b0!69i780!77b1%26q%3DThe%2BBackspace%26ech%3D1","rating":4.5,"reviewCount":842,"ratingDistribution":{"1":22,"2":21,"3":41,"4":149,"5":609},"priceLevel":"moderate","latitude":30.2670094,"longitude":-97.7404066,"placeId":"ChIJVaujmae1RIYRpGyZcs9VBao","cid":"12251292710800551076","mapsUrl":"https://www.google.com/maps/search/?api=1&query=The%20Backspace&query_place_id=ChIJVaujmae1RIYRpGyZcs9VBao","image":"https://lh3.googleusercontent.com/grass-cs/AABkmLcIWRZviuv3jSiEDY36-7lOH1ag7TpPvLt3kIn-Dig0aM8HLNWGc9Lekz7Ia46FSyBDdDPZuc30kK8DEb4ebQejzCJke055K3jXy0SQcTLTe_KgHToXulcT4YIpyLhWGBnqzPLS=w408-h306-k-no","photoCount":629,"isClaimed":true,"hoursStatus":"close","hours":{"sunday":[{"open":{"hour":17,"minute":0},"close":{"hour":21,"minute":0}}],"monday":[{"open":{"hour":17,"minute":0},"close":{"hour":21,"minute":0}}],"tuesday":[{"open":{"hour":11,"minute":30},"close":{"hour":21,"minute":0}}],"wednesday":[{"open":{"hour":11,"minute":30},"close":{"hour":21,"minute":0}}],"thursday":[{"open":{"hour":11,"minute":30},"close":{"hour":21,"minute":0}}],"friday":[{"open":{"hour":11,"minute":30},"close":{"hour":22,"minute":0}}],"saturday":[{"open":{"hour":11,"minute":30},"close":{"hour":22,"minute":0}}]},"isDirectoryItem":false}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"402":{"$ref":"#/components/responses/Error402"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"},"502":{"$ref":"#/components/responses/Error502"}}}},"/v1/account/usage":{"get":{"operationId":"get_usage","tags":["Account"],"summary":"Current credit balance + recent requests","description":"Your live credit balance plus your most recent requests (endpoint, credits used, cache hit, status code, response time), newest first. limit sets how many requests to return. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20}}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"Your live credit balance plus your most recent requests (endpoint, credits used, cache hit, status code, response time), newest first.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"balance":{"type":"object","properties":{"plan":{"type":"string"},"monthlyQuota":{"type":"integer"},"subscriptionCredits":{"type":"integer"},"topupCredits":{"type":"integer"},"totalCredits":{"type":"integer"},"subscriptionRenewsAt":{"type":"string"},"usedThisMonth":{"type":"integer"},"quotaResetsAt":{"type":"string"},"keyName":{"type":"string"},"rateLimitPerMinute":{"type":"integer"},"rateLimitRemaining":{"type":"integer"}}},"recentRequests":{"type":"array","items":{"type":"object","properties":{"requestId":{"type":"string"},"endpoint":{"type":"string"},"platform":{"type":"string"},"resource":{"type":"string"},"resourceUrl":{"type":"string"},"creditsUsed":{"type":"integer"},"cacheHit":{"type":"boolean"},"statusCode":{"type":"integer"},"responseTimeMs":{"type":"integer"},"createdAt":{"type":"string"}}}}}}}},"example":{"success":true,"data":{"balance":{"plan":"starter","monthlyQuota":2000,"subscriptionCredits":1210,"topupCredits":0,"totalCredits":1210,"subscriptionRenewsAt":"2026-11-01T00:00:00+00:00","usedThisMonth":790,"quotaResetsAt":"2026-11-01T00:00:00+00:00","keyName":"production","rateLimitPerMinute":120,"rateLimitRemaining":119},"recentRequests":[{"requestId":"626e7192-201a-4726-b6c2-83e8d1b94749","endpoint":"/v1/tiktok/channel-details","platform":"tiktok","resource":"https://www.tiktok.com/@nasa","resourceUrl":"https://www.tiktok.com/@nasa","creditsUsed":1,"cacheHit":false,"statusCode":200,"responseTimeMs":873,"createdAt":"2026-10-10T17:28:08.026759+00:00"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/v1/account/limits":{"get":{"operationId":"get_limits","tags":["Account"],"summary":"Plan quotas + remaining credits","description":"Plan name, monthly quota, remaining subscription and top-up credits, and the per-minute rate limit for the calling key. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"Plan name, monthly quota, remaining subscription and top-up credits, and the per-minute rate limit for the calling key.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"plan":{"type":"string"},"monthlyQuota":{"type":"integer"},"subscriptionCreditsRemaining":{"type":"integer"},"topupCreditsRemaining":{"type":"integer"},"totalCreditsRemaining":{"type":"integer"},"rateLimitPerMinute":{"type":"integer"}}}}},"example":{"success":true,"data":{"plan":"starter","monthlyQuota":2000,"subscriptionCreditsRemaining":1210,"topupCreditsRemaining":0,"totalCreditsRemaining":1210,"rateLimitPerMinute":120}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/v1/monitors":{"get":{"operationId":"list_monitors","tags":["Monitors"],"summary":"List your monitors","description":"All monitors on your account, newest first. Secrets are not included. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"All monitors on your account, newest first.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"monitors":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"params":{"type":"object","properties":{"url":{"type":"string"}}},"interval_minutes":{"type":"integer"},"webhook_url":{"type":"string"},"active":{"type":"boolean"},"next_run_at":{"type":"string"},"created_at":{"type":"string"}}}}}}}},"example":{"success":true,"data":{"monitors":[{"id":"3f0c6a52-7f2e-4f4b-9a51-0d6b1f2c9e11","name":"r/programming new posts","endpoint":"/v1/reddit/subreddit-posts","params":{"url":"https://www.reddit.com/r/programming/"},"interval_minutes":60,"webhook_url":"https://example.com/hooks/captapi","active":true,"next_run_at":"2026-10-10T19:00:00+00:00","created_at":"2026-10-10T18:00:00+00:00"}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}},"post":{"operationId":"create_monitor","tags":["Monitors"],"summary":"Create a monitor","description":"Re-runs a list-returning Captapi GET endpoint on your interval and POSTs only new items to your webhook. endpoint must be a Captapi GET path; webhook_url must be an external https URL. interval_minutes is 15-1440 (default 60), at most 20 monitors per account. Each delivery is signed: X-Captapi-Signature is sha256=HMAC-SHA256(secret, \"{X-Captapi-Timestamp}.{raw body}\"). The secret is generated when omitted and returned here. Managing monitors is free; each scheduled run is billed like calling the endpoint directly.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"x-credit-cost":{"label":"Free to manage; each scheduled run is billed like a direct call","credits":0},"x-one-liner":"Re-runs a list-returning Captapi GET endpoint on your interval and POSTs only new items to your webhook.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"params":{"type":"object","properties":{"url":{"type":"string"}}},"interval_minutes":{"type":"integer"},"webhook_url":{"type":"string"},"active":{"type":"boolean"},"next_run_at":{"type":"string"},"created_at":{"type":"string"},"secret":{"type":"string"}}}}},"example":{"success":true,"data":{"id":"3f0c6a52-7f2e-4f4b-9a51-0d6b1f2c9e11","name":"r/programming new posts","endpoint":"/v1/reddit/subreddit-posts","params":{"url":"https://www.reddit.com/r/programming/"},"interval_minutes":60,"webhook_url":"https://example.com/hooks/captapi","active":true,"next_run_at":"2026-10-10T19:00:00+00:00","created_at":"2026-10-10T18:00:00+00:00","secret":"whsec_3b9f0c2d7a6e41f8b5c09d1e2a7f4c6b8d0e1f2a3b4c5d6e"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorCreate"}}},"required":true}}},"/v1/monitors/{monitor_id}":{"get":{"operationId":"get_monitor","tags":["Monitors"],"summary":"Get one monitor (includes webhook secret)","description":"One of your monitors, including its webhook secret. 404 when it is not yours. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string"}}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"One of your monitors, including its webhook secret.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"params":{"type":"object","properties":{"url":{"type":"string"}}},"interval_minutes":{"type":"integer"},"webhook_url":{"type":"string"},"active":{"type":"boolean"},"next_run_at":{"type":"string"},"created_at":{"type":"string"},"secret":{"type":"string"}}}}},"example":{"success":true,"data":{"id":"3f0c6a52-7f2e-4f4b-9a51-0d6b1f2c9e11","name":"r/programming new posts","endpoint":"/v1/reddit/subreddit-posts","params":{"url":"https://www.reddit.com/r/programming/"},"interval_minutes":60,"webhook_url":"https://example.com/hooks/captapi","active":true,"next_run_at":"2026-10-10T19:00:00+00:00","created_at":"2026-10-10T18:00:00+00:00","secret":"whsec_3b9f0c2d7a6e41f8b5c09d1e2a7f4c6b8d0e1f2a3b4c5d6e"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}},"patch":{"operationId":"update_monitor","tags":["Monitors"],"summary":"Update a monitor","description":"Change name, params, interval_minutes, webhook_url or active. Changing params resets the seen-items baseline so the next run does not flood your webhook. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string"}}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"Change name, params, interval_minutes, webhook_url or active.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"params":{"type":"object","properties":{"url":{"type":"string"}}},"interval_minutes":{"type":"integer"},"webhook_url":{"type":"string"},"active":{"type":"boolean"},"next_run_at":{"type":"string"},"created_at":{"type":"string"}}}}},"example":{"success":true,"data":{"id":"3f0c6a52-7f2e-4f4b-9a51-0d6b1f2c9e11","name":"r/programming new posts","endpoint":"/v1/reddit/subreddit-posts","params":{"url":"https://www.reddit.com/r/programming/"},"interval_minutes":60,"webhook_url":"https://example.com/hooks/captapi","active":true,"next_run_at":"2026-10-10T19:00:00+00:00","created_at":"2026-10-10T18:00:00+00:00"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUpdate"}}}}},"delete":{"operationId":"delete_monitor","tags":["Monitors"],"summary":"Delete a monitor","description":"Deletes one of your monitors. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string"}}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"Deletes one of your monitors.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}}}}},"example":{"success":true,"data":{"deleted":true,"id":"3f0c6a52-7f2e-4f4b-9a51-0d6b1f2c9e11"}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/v1/monitors/{monitor_id}/test":{"post":{"operationId":"test_monitor","tags":["Monitors"],"summary":"Send a signed test payload to your webhook","description":"POSTs a signed monitor.test payload to the monitor's webhook_url so you can check signature verification. delivered is true when your server answered below 400. When the webhook cannot be reached at all (connection refused, DNS, TLS, or no answer within 15 seconds) the call returns 502 WEBHOOK_UNREACHABLE with retryable true. Free.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string"}}],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"POSTs a signed monitor.test payload to the monitor's webhook_url so you can check signature verification.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"delivered":{"type":"boolean"},"webhook_status":{"type":"integer"}}}}},"example":{"success":true,"data":{"delivered":true,"webhook_status":200}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/v1/history":{"get":{"operationId":"metric_history","tags":["History"],"summary":"Metric time series for a profile or post","description":"Returns the counts (followers, views, likes, ...) Captapi stored each time a tracked profile or post was fetched fresh. The series starts at the first fresh fetch through Captapi and is not backfilled, so gaps between points are normal. Pass the same url you pass to the tracked endpoint. Tracked endpoints: /v1/bluesky/profile, /v1/facebook/details, /v1/facebook/page-details, /v1/instagram/channel-details, /v1/instagram/details, /v1/linkedin/post-details, /v1/linkedin/profile, /v1/pinterest/pin-details, /v1/reddit/post-details, /v1/reddit/subreddit-details, /v1/rumble/video-details, /v1/threads/profile, /v1/tiktok/channel-details, /v1/tiktok/video-details, /v1/twitter/profile, /v1/twitter/tweet-details, /v1/youtube/channel-details, /v1/youtube/video-details. Any other endpoint returns 400 untracked_endpoint. 1 credit.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"endpoint","in":"query","required":true,"description":"Tracked endpoint path, e.g. /v1/youtube/channel-details","schema":{"type":"string"}},{"name":"url","in":"query","required":true,"description":"The same URL you pass to that endpoint","schema":{"type":"string"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200}}],"x-credit-cost":{"label":"1 credit","credits":1},"x-one-liner":"Returns the counts (followers, views, likes, ...) Captapi stored each time a tracked profile or post was fetched fresh.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"endpoint":{"type":"string"},"resource":{"type":"string"},"windowDays":{"type":"integer"},"totalReturned":{"type":"integer"},"points":{"type":"array","items":{"type":"object","properties":{"capturedAt":{"type":"string"},"metrics":{"type":"object","properties":{"followers":{"type":"integer"},"postCount":{"type":"integer"},"viewCount":{"type":"integer"}}}}}}}}}},"example":{"success":true,"data":{"endpoint":"/v1/youtube/channel-details","resource":"https://www.youtube.com/@NASA","windowDays":30,"totalReturned":2,"points":[{"capturedAt":"2026-09-19T19:53:20.875115+00:00","metrics":{"followers":15100000,"postCount":6100,"viewCount":1121995986}},{"capturedAt":"2026-10-10T17:09:00.974952+00:00","metrics":{"followers":15100000,"postCount":6100,"viewCount":1128002504}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/v1/batch":{"post":{"operationId":"run_batch","tags":["Batch"],"summary":"Run up to 20 endpoint calls in one request","description":"Runs up to 20 Captapi GET calls in one request, 10 at a time, through the same auth, credit, cache and rate-limit pipeline as direct calls. Each item is billed exactly like the direct call and failed items are not billed. Results keep input order; each one carries the item's HTTP status and its full response body. A failed item's body uses the standard error envelope {success: false, error: {code, message, retryable}}, including BATCH_ITEM_TIMEOUT and BATCH_ITEM_FAILED when the item could not finish. An unknown path fails the whole batch with 400 before anything runs.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"x-credit-cost":{"label":"Sum of the items; each is billed like a direct call"},"x-one-liner":"Runs up to 20 Captapi GET calls in one request, 10 at a time, through the same auth, credit, cache and rate-limit pipeline as direct calls.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"total":{"type":"integer"},"succeeded":{"type":"integer"},"failed":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"params":{"type":"object","properties":{"url":{"type":"string"}}},"status":{"type":"integer"},"body":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"platform":{"type":"string"},"username":{"type":"string"}}},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"}}}}}}}}}}}},"example":{"success":true,"data":{"total":2,"succeeded":1,"failed":1,"results":[{"path":"/v1/twitter/profile","params":{"url":"https://x.com/NASA"},"status":200,"body":{"success":true,"data":{"platform":"twitter","username":"NASA"}}},{"path":"/v1/tiktok/video-details","params":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"},"status":400,"body":{"success":false,"error":{"code":"WRONG_RESOURCE_TYPE","message":"Expected a TikTok URL, but received a YouTube URL.","retryable":false}}}]}}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true}}},"/v1/status":{"get":{"operationId":"api_status","tags":["Status"],"summary":"Public API health (live, based on latest requests, no auth required)","description":"Per-platform health from the most recent requests in the last 24 hours. Only 5xx responses count against health; 4xx responses are caller errors. A platform is degraded after 1 trailing 5xx and in outage after 3. Cached for 120 seconds. No API key needed. Free. Example values are illustrative.","security":[],"x-credit-cost":{"label":"0 credits","credits":0},"x-one-liner":"Per-platform health from the most recent requests in the last 24 hours.","responses":{"200":{"description":"Success.","headers":{"X-Captapi-Credits":{"$ref":"#/components/headers/Credits"},"X-Captapi-Cache":{"$ref":"#/components/headers/Cache"},"X-Captapi-Source":{"$ref":"#/components/headers/Source"},"X-Captapi-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"overall":{"type":"object","properties":{"status":{"type":"string"},"requests_24h":{"type":"integer"}}},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"status":{"type":"string"},"success_rate":{"type":"integer"},"requests_24h":{"type":"integer"},"avg_response_ms":{"type":"integer"}}}},"window_hours":{"type":"integer"},"generated_at":{"type":"string"}}}}},"example":{"success":true,"data":{"overall":{"status":"operational","requests_24h":1200},"platforms":[{"platform":"youtube","status":"operational","success_rate":100,"requests_24h":200,"avg_response_ms":2000}],"window_hours":24,"generated_at":"2026-10-10T18:12:49.049323+00:00"}}}}},"429":{"$ref":"#/components/responses/Error429"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your API key: `Authorization: Bearer capt_live_...`. Create one at https://captapi.com/dashboard/api-keys."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternative to the bearer header: `X-API-Key: capt_live_...`."}},"headers":{"Credits":{"description":"Credits charged for this request. 0 on a free cache hit or a failed request.","schema":{"type":"integer"}},"Cache":{"description":"1 when the response was served from the 24h cache, 0 otherwise.","schema":{"type":"string","enum":["0","1"]}},"Source":{"description":"Which fetch path served the data, e.g. native or extended.","schema":{"type":"string"}},"RequestId":{"description":"Request id. Include it when contacting support.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"schemas":{"Error":{"type":"object","required":["success","error"],"properties":{"success":{"const":false},"error":{"type":"object","required":["code","message","retryable"],"properties":{"code":{"type":"string","description":"Machine-readable error code, e.g. WRONG_RESOURCE_TYPE, NOT_FOUND, insufficient_credits, rate_limit_exceeded. Compare case-sensitively; both upper and lower case codes exist."},"message":{"type":"string","description":"Human-readable explanation."},"retryable":{"type":"boolean","description":"true when the same request may succeed later (429, most 5xx). Do not retry when false."},"suggestedEndpoint":{"type":["string","null"],"description":"On platform mismatch, the endpoint that matches the URL you sent."}},"additionalProperties":true}}},"Body_video_transcript_v1_video_transcript_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Video or audio file to transcribe"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"ISO-639-1 language hint, e.g. \"en\" or \"tr\". Omit to auto-detect."},"translate":{"type":"boolean","title":"Translate","description":"When true, translate speech to English.","default":false},"timestampGranularity":{"type":"string","enum":["segment","word"],"title":"Timestampgranularity","description":"segment (default) or word — word-level timings when available.","default":"segment"}},"type":"object","required":["file"],"title":"Body_video_transcript_v1_video_transcript_post"},"Body_video_summarize_v1_video_summarize_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Video or audio file to transcribe and summarize"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"ISO-639-1 language hint, e.g. \"en\" or \"tr\". Omit to auto-detect."},"translate":{"type":"boolean","title":"Translate","description":"When true, translate speech to English before summarizing.","default":false},"timestampGranularity":{"type":"string","enum":["segment","word"],"title":"Timestampgranularity","description":"segment (default) or word.","default":"segment"}},"type":"object","required":["file"],"title":"Body_video_summarize_v1_video_summarize_post"},"MonitorCreate":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name","default":""},"endpoint":{"type":"string","title":"Endpoint","description":"Captapi GET path, e.g. /v1/reddit/subreddit-posts"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"interval_minutes":{"type":"integer","maximum":1440,"minimum":15,"title":"Interval Minutes","default":60},"webhook_url":{"type":"string","title":"Webhook Url","description":"HTTPS URL that receives new-item payloads"},"secret":{"anyOf":[{"type":"string","maxLength":128,"minLength":16},{"type":"null"}],"title":"Secret","description":"HMAC secret; generated if omitted"}},"type":"object","required":["endpoint","webhook_url"],"title":"MonitorCreate"},"MonitorUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"},"interval_minutes":{"anyOf":[{"type":"integer","maximum":1440,"minimum":15},{"type":"null"}],"title":"Interval Minutes"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"MonitorUpdate"},"BatchRequest":{"properties":{"requests":{"items":{"$ref":"#/components/schemas/BatchItem"},"type":"array","maxItems":20,"minItems":1,"title":"Requests"}},"type":"object","required":["requests"],"title":"BatchRequest"},"BatchItem":{"properties":{"path":{"type":"string","title":"Path","description":"Captapi GET path, e.g. /v1/youtube/video-details"},"params":{"additionalProperties":true,"type":"object","title":"Params"}},"type":"object","required":["path"],"title":"BatchItem"}},"responses":{"Error400":{"description":"Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"WRONG_RESOURCE_TYPE","message":"Expected a TikTok URL, but received a YouTube URL. Use the YouTube endpoint for that URL, or pass a TikTok URL like https://www.tiktok.com/@user/video/1234567890.","retryable":false,"suggestedEndpoint":"/v1/youtube/video-details"}}}}},"Error401":{"description":"Missing, invalid or revoked API key. Not billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"UNAUTHORIZED","message":"Invalid or revoked API key","retryable":false}}}}},"Error402":{"description":"Not enough credits for this request. Not billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"insufficient_credits","message":"This call needs 2 credits; 1 available. No credits charged.","retryable":false,"required":2,"available":1,"upgrade_url":"/dashboard/billing"}}}}},"Error404":{"description":"The resource does not exist or is not public. Not billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Monitor not found","retryable":false}}}}},"Error422":{"description":"A required parameter is missing or has the wrong type. Not billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Request validation failed. Fix the listed fields and retry.","retryable":false,"issues":[{"type":"missing","loc":["query","url"],"msg":"Field required","input":null}]}}}}},"Error429":{"description":"Rate limit reached. Wait for Retry-After seconds. Not billed.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"rate_limit_exceeded","message":"rate limit exceeded","retryable":true,"plan":"starter","limit_per_minute":120}}}}},"Error502":{"description":"The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"UPSTREAM_UNAVAILABLE","message":"The upstream data source failed for this request. Retry shortly.","retryable":true,"reason":"upstream_actor_error"}}}}}}}}