tiktok.profile_videos. The transport rules that apply to every API a seller serves - signed requests, the response envelope, timeouts, and body limits - are on the operator endpoint contract.
The price you compete with
AnyAPI publishes this API from $0.60 per 1,000 requests. That is the price a buyer sees today, so it is the price your endpoint has to come in under to win traffic.The request your endpoint receives
| Field | Type | Required | What it means |
|---|---|---|---|
cursor | string | no | Pagination cursor from a previous response’s nextCursor. |
handle | string | yes | TikTok username without the leading @. |
requireFields | array | no | Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example nextCursor, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a video that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. On a paginated walk it applies to the first page only; later pages stay with the source that page chose, at the price it was quoted. |
Full input JSON Schema
Full input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://getanyapi.com/schemas/tiktok.profile_videos.input.json",
"example": {
"handle": "zachking"
},
"title": "TikTok profile videos input",
"type": "object",
"additionalProperties": false,
"x-aliases": {
"username": "handle"
},
"required": [
"handle"
],
"properties": {
"handle": {
"type": "string",
"description": "TikTok username without the leading @."
},
"cursor": {
"type": "string",
"description": "Pagination cursor from a previous response's nextCursor."
},
"requireFields": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"enum": [
"authorFollowers",
"authorVerified",
"locationName",
"nextCursor",
"paidPartnership",
"soundAuthor",
"soundTitle"
]
},
"description": "Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `nextCursor`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a video that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. On a paginated walk it applies to the first page only; later pages stay with the source that page chose, at the price it was quoted."
}
}
}
The response your endpoint must return
| Field | Type | Always present | What it means |
|---|---|---|---|
data | null or object | yes | |
data.nextCursor | string or null | yes | Opaque cursor for the next page of videos, or null when this lane has no more. Pass it back as cursor to continue. |
data.videos | array | yes | |
data.videos[].authorFollowers | integer or null | no | The author’s follower count at the time of the request. Some sources round large counts; name authorFollowers in requireFields to be served only by a source that returns the exact count. Null when the serving source does not report it. |
data.videos[].authorHandle | string | no | Author’s TikTok handle, without the leading @. |
data.videos[].authorImage | string | no | Author’s avatar image URL. Signed and short-lived, so the query string is load-bearing and kept intact. |
data.videos[].authorName | string | no | Author’s display name. |
data.videos[].authorUserId | string | no | Author’s numeric TikTok user id. |
data.videos[].authorVerified | boolean or null | no | Whether the author’s account carries a TikTok verification badge. Null when the serving source does not report it. |
data.videos[].caption | string | yes | |
data.videos[].comments | integer | yes | |
data.videos[].createdUtc | number | yes | UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. |
data.videos[].durationSeconds | number | no | Video duration in seconds. |
data.videos[].hashtags | array | no | Hashtags carried in the caption, without the leading #. Empty when the post uses none; @-mentions are excluded. |
data.videos[].id | string | yes | |
data.videos[].image | string | no | URL of the video’s cover/thumbnail image. A signed, short-lived TikTok CDN URL (typically expires within about a day; query params are load-bearing and kept intact), often served as HEIC rather than JPEG, so fetch it promptly and transcode if you need broad browser support. Absent when the upstream provides no cover. |
data.videos[].isPinned | boolean | no | Whether the video is pinned to the top of the creator’s profile grid. |
data.videos[].likes | integer | yes | |
data.videos[].locationName | string or null | no | Name of the place the video is tagged at. Absent when the video has no location tag. Null when the serving source does not report it. |
data.videos[].paidPartnership | boolean or null | no | Whether the video is labeled as a paid partnership. Null when the serving source does not report it. |
data.videos[].saves | integer | no | |
data.videos[].shares | integer | no | Share count. |
data.videos[].soundAuthor | string or null | no | Credited author of the sound. Null when the serving source does not report it. |
data.videos[].soundClipId | string | no | Id of the sound the video uses. Pass it to tiktok.song or tiktok.song_videos as clipId. |
data.videos[].soundTitle | string or null | no | Name of the sound. “original sound” means the creator’s own audio rather than a licensed track. Null when the serving source does not report it. |
data.videos[].url | string | yes | |
data.videos[].videoUrl | string | no | Playable video URL. Signed and short-lived, so the query string is load-bearing and kept intact. |
data.videos[].views | integer | yes | |
found | boolean | yes |
Full output JSON Schema
Full output JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://getanyapi.com/schemas/tiktok.profile_videos.output.json",
"title": "TikTok profile videos output",
"type": "object",
"additionalProperties": false,
"required": [
"found",
"data"
],
"properties": {
"found": {
"type": "boolean"
},
"data": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"additionalProperties": false,
"required": [
"videos",
"nextCursor"
],
"properties": {
"nextCursor": {
"type": [
"string",
"null"
],
"description": "Opaque cursor for the next page of videos, or null when this lane has no more. Pass it back as cursor to continue."
},
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url",
"caption",
"views",
"likes",
"comments",
"createdUtc"
],
"properties": {
"id": {
"x-anyapi-must-populate": true,
"type": "string"
},
"url": {
"x-anyapi-must-populate": true,
"type": "string"
},
"caption": {
"x-anyapi-must-populate": true,
"type": "string"
},
"image": {
"type": "string",
"description": "URL of the video's cover/thumbnail image. A signed, short-lived TikTok CDN URL (typically expires within about a day; query params are load-bearing and kept intact), often served as HEIC rather than JPEG, so fetch it promptly and transcode if you need broad browser support. Absent when the upstream provides no cover."
},
"views": {
"type": "integer"
},
"likes": {
"type": "integer"
},
"comments": {
"type": "integer"
},
"createdUtc": {
"x-anyapi-must-populate": true,
"type": "number",
"description": "UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds."
},
"saves": {
"type": "integer"
},
"shares": {
"type": "integer",
"description": "Share count."
},
"durationSeconds": {
"type": "number",
"description": "Video duration in seconds."
},
"videoUrl": {
"type": "string",
"description": "Playable video URL. Signed and short-lived, so the query string is load-bearing and kept intact."
},
"authorHandle": {
"type": "string",
"description": "Author's TikTok handle, without the leading @."
},
"authorName": {
"type": "string",
"description": "Author's display name."
},
"authorUserId": {
"type": "string",
"description": "Author's numeric TikTok user id."
},
"authorImage": {
"type": "string",
"description": "Author's avatar image URL. Signed and short-lived, so the query string is load-bearing and kept intact."
},
"soundClipId": {
"x-anyapi-must-populate": true,
"type": "string",
"description": "Id of the sound the video uses. Pass it to tiktok.song or tiktok.song_videos as clipId."
},
"soundTitle": {
"type": [
"string",
"null"
],
"description": "Name of the sound. \"original sound\" means the creator's own audio rather than a licensed track. Null when the serving source does not report it."
},
"soundAuthor": {
"type": [
"string",
"null"
],
"description": "Credited author of the sound. Null when the serving source does not report it."
},
"hashtags": {
"type": "array",
"description": "Hashtags carried in the caption, without the leading #. Empty when the post uses none; @-mentions are excluded.",
"items": {
"type": "string"
}
},
"isPinned": {
"type": "boolean",
"description": "Whether the video is pinned to the top of the creator's profile grid."
},
"authorFollowers": {
"type": [
"integer",
"null"
],
"description": "The author's follower count at the time of the request. Some sources round large counts; name `authorFollowers` in requireFields to be served only by a source that returns the exact count. Null when the serving source does not report it."
},
"authorVerified": {
"type": [
"boolean",
"null"
],
"description": "Whether the author's account carries a TikTok verification badge. Null when the serving source does not report it."
},
"locationName": {
"type": [
"string",
"null"
],
"description": "Name of the place the video is tagged at. Absent when the video has no location tag. Null when the serving source does not report it."
},
"paidPartnership": {
"type": [
"boolean",
"null"
],
"description": "Whether the video is labeled as a paid partnership. Null when the serving source does not report it."
}
}
}
}
}
}
]
}
}
}
Fields that must never come back empty
captioncreatedUtcidsoundClipIdurl
Not found, and how it differs from empty
When the entity does not exist, answer 2xx with the not-found shape:{
"found": false,
"data": null
}
found: true and an empty videos array.
This output schema declares no reason field, so found: false is the whole not-found answer.
Example request
{
"handle": "zachking"
}
Next
- The operator endpoint contract for signing, budgets, and the live trial.
- Every API open to sellers.
- Want to sell an API that is not on that list? Email support@getanyapi.com.