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
| Item | Details |
|---|---|
| Endpoint | https://api.meowload.net/openapi/v1/extract/playlist |
| Method | POST with a JSON body |
| Authentication | Authorization: Bearer <your API key> header, with a key from the Developer Console |
| Billing | Charged only on success (200); rules are listed in the Developer Console |
New to the API? Start with the Quickstart.
📋 Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The profile URL (channel, playlist, topic and so on) |
cursor | string | - | 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,authorand the other post fields may all appear, and videos may carryvariants[]andheadersjust as they do there.- While
has_moreistrue, passnext_cursorunchanged ascursorin the next request to get the following page.falsemeans this is the last page, andnext_cursoris then an empty string. The cursor is an opaque string: do not parse or build it yourself. profiledescribes the subject of the page (the channel, creator or hashtag), andsiteis 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.