---
title: "Kwai User Posts API"
method: GET
path: "/v1/kwai/user-posts"
tags: ["Kwai"]
---

# Kwai User Posts API

`GET /v1/kwai/user-posts`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/kwai/user-posts`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Kwai profile posts — caption ("" when none), engagement, mp4 + transcript (~1 credit/post).

Pass 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.

Docs: https://captapi.com/apis/kwai-user-posts

## Query parameters

- `url` string, required
- `limit` integer
- `cursor` string
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `profileUrl` string: Canonical Kwai profile URL for the request (https://www.kwai.com/@handle).
    - `author` object
      - `id` string: Id of this author item.
      - `username` string: Account username / handle.
      - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
      - `avatar` string: Avatar / profile picture URL. Canonical across profile endpoints.
      - `url` string: Canonical URL of the item.
    - `totalReturned` integer: Number of items returned in this response.
    - `nextCursor` unknown
    - `hasMore` boolean: Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page.
    - `posts` object[]
      - `platform` string: Always "kwai" on this endpoint.
      - `id` string: Id of this posts item.
      - `url` string: Canonical URL of the item.
      - `transcript` string: 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` string: Publish date (ISO 8601) when the platform exposes an absolute timestamp.
      - `durationSeconds` integer: Length in seconds for this item (full media length, or a segment span when the endpoint documents a start/end).
      - `thumbnailUrl` string: Post cover image URL.
      - `videoUrl` string: Signed progressive playback URL (usually mp4). Check videoType; re-fetch before mediaUrlsExpireAt.
      - `engagement` object: Engagement metrics for the item.
        - `views` integer
        - `likes` integer
        - `comments` integer
        - `shares` integer
      - `videoType` string: Playback type: "mp4" (progressive) or "hls" (.m3u8).
      - `mediaUrlsExpireAt` string: ISO expiry for signed videoUrl / CDN links, parsed from Kwai's tag= query param.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
