MeowLoad Docs
On this page

Profile (Playlist/Channel/Hashtag/Topic) Batch Extraction API

Pass a profile URL (a creator or channel page, a playlist, a collection, a hashtag or a topic page) and get its posts one page at a time, along with the profile itself (name, avatar, follower count and so on). Each post has the same shape as the single post extraction API, and following the returned next_cursor page by page walks the whole profile. Every platform supported by MeowLoad's profile batch extraction works here, such as YouTube (channels, Shorts, hashtags, playlists), Instagram (profiles, hashtags), Twitter (X), TikTok (profiles, hashtags), Douyin (profiles, collections), Bilibili (profiles, collections) and Weibo.

🎯 Basic Information

ItemDetails
Endpointhttps://api.meowload.net/openapi/v1/extract/playlist
MethodPOST with a JSON body
AuthenticationAuthorization: Bearer <your API key> header, with a key from the Developer Console
BillingCharged only on success (200); rules are listed in the Developer Console

New to the API? Start with the Quickstart.

📋 Request Parameters

ParameterTypeRequiredDescription
urlstringYesThe profile URL (channel, playlist, topic and so on)
cursorstring-Pagination cursor: omit for the first page, then pass the previous page's next_cursor

Error messages are in English by default; send an Accept-Language header (for example zh or ja) to localize them.

Request Example

# First page
curl -X POST https://api.meowload.net/openapi/v1/extract/playlist \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your API key>" \
  -d '{"url": "https://www.youtube.com/@Nike/videos"}'

# Second page: pass the next_cursor from the previous page as cursor
curl -X POST https://api.meowload.net/openapi/v1/extract/playlist \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your API key>" \
  -d '{"url": "https://www.youtube.com/@Nike/videos", "cursor": "4qmFsgKRARIYVUNzQlZQMWpGeU1CQ21Za2xaeXhpVEE0"}'

🟢 Success Response

Response Example

A successful call returns HTTP 200, and the body is one page of the profile. The example below is trimmed to the most commonly used fields:

{
  "site": "youtube",
  "posts": [
    {
      "id": "EXAMPLE0002",
      "title": "Top plays of the week",
      "post_url": "https://www.youtube.com/watch?v=EXAMPLE0002",
      "created_at": "2025-07-20T08:00:00.000Z",
      "medias": [
        {
          "media_type": "video",
          "resource_url": "https://video.example.com/v/EXAMPLE0002/720p.mp4?expire=1700000000&sig=EXAMPLE",
          "preview_url": "https://images.example.com/EXAMPLE0002/cover.jpg",
          "duration": 128
        }
      ]
    },
    {
      "id": "EXAMPLE0003",
      "title": "Behind the scenes",
      "post_url": "https://www.youtube.com/watch?v=EXAMPLE0003",
      "created_at": "2025-07-18T15:30:00.000Z",
      "medias": [{ "media_type": "image", "resource_url": "https://images.example.com/EXAMPLE0003/cover.jpg" }]
    }
  ],
  "next_cursor": "4qmFsgKRARIYVUNzQlZQMWpGeU1CQ21Za2xaeXhpVEE0",
  "has_more": true,
  "profile": {
    "username": "@techchannel",
    "display_name": "Tech Channel",
    "avatar_url": "https://images.example.com/channel/avatar.jpg",
    "post_count": 342
  }
}

Response Field Descriptions

  • posts[] holds the posts on this page. Each one has the same shape as a single post response: medias[], title, text, author and the other post fields may all appear, and videos may carry variants[] and headers just as they do there.
  • While has_more is true, pass next_cursor unchanged as cursor in the next request to get the following page. false means this is the last page, and next_cursor is then an empty string. The cursor is an opaque string: do not parse or build it yourself.
  • profile describes the subject of the page (the channel, creator or hashtag), and site is the platform the URL belongs to.
  • Media URLs are short-lived, so download promptly. When a media item carries headers, send them as-is with the download request, or the platform will reject it.

The full list of parameters and response fields is in the API reference.

🔴 Error Response

A failed extraction returns HTTP 400 and is never charged. The body carries a machine-readable code and a retryable flag (whether retrying the same URL later might succeed):

{ "message": "The content has been deleted or does not exist", "code": "content_deleted", "retryable": false }

401 (invalid API key), 402 (out of credits), 422 (invalid request body), 429 (rate limited) and every extraction error code are covered in Error Codes.