Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Captapi Kick 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.
Auth: 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.
Billing: 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.
Empty 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.
Errors: every non-2xx response uses the same envelope, `{ success: false, error: { code, message, retryable } }`. Retry only when `retryable` is true, honouring `Retry-After`.
Timing: every response carries `Server-Timing: total;dur=`, the total time the request took. Deprecated: the `timings` object some endpoints still return in `data` will be removed from response bodies on 2026-12-17; use the header instead. It is not part of the response schemas below.
Response 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.
Endpoint 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
security:
- bearerAuth: []
- apiKeyHeader: []
tags:
- name: Kick
description: Public data from Kick.
paths:
/v1/kick/clip:
get:
operationId: kick_clip
tags:
- Kick
summary: Kick Clip API
description: 'Get a Kick clip, or a channel''s recent clips — 7d clip cache.
Two 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 | cache. 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) — a clip is a finished recording; set cache=false to refetch current 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: up to limit clips, newest first (default 20, max 100). Channel listings stay fresh unless cache=true. 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.
Docs: 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
example: https://kick.com/xqc/clips/clip_01KZ0X5PGT228PY3QEB3RMR3YC
- name: limit
in: query
required: false
description: Channel mode only — max recent clips to return (default 20, max 100). Ignored when url is a clip. Flat 1 credit. No cursor — one response holds up to limit clips.
schema:
type: integer
maximum: 100
minimum: 1
default: 20
example: 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
- 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, or a channel's recent clips — 7d clip cache.
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-Request-Id:
$ref: '#/components/headers/RequestId'
Server-Timing:
$ref: '#/components/headers/ServerTiming'
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 (at most limit; fewer when the channel has fewer). No nextCursor.
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'
components:
responses:
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
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
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
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
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
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
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
headers:
ServerTiming:
description: 'Total time the request took, in milliseconds: `total;dur=<ms>`. No per-step breakdown.'
schema:
type: string
example: total;dur=4387
Cache:
description: 1 when the response was served from the 24h cache, 0 otherwise.
schema:
type: string
enum:
- '0'
- '1'
RequestId:
description: Request id. Include it when contacting support.
schema:
type: string
RetryAfter:
description: Seconds to wait before retrying.
schema:
type: integer
Credits:
description: Credits charged for this request. 0 on a free cache hit or a failed request.
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
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_...`.'
externalDocs:
description: Docs
url: https://captapi.com/docs