{
  "data": {
    "id": "LmWHGTW7L3zReLZ3O",
    "actId": "IqJBdUeSYHgtHc7Lb",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-31T18:24:07.454Z",
    "finishedAt": "2026-10-31T18:24:34.245Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 26709,
      "runTimeSecs": 26.709,
      "computeUnits": 0.029676666666666667,
      "imageSizeBytes": 3105804800
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"TikTok Sound & Music Scraper Input\",\n  \"description\": \"Look up TikTok sounds by URL/ID or search by keyword. Returns sound metadata, artist and DSP details, plus the videos using each sound.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"Choose how to find sounds: by sound URL/ID, or by keyword search.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"bySound\",\n        \"searchSounds\"\n      ],\n      \"enumTitles\": [\n        \"Look up sounds by URL or ID\",\n        \"Search sounds by keyword\"\n      ],\n      \"default\": \"bySound\",\n      \"prefill\": \"bySound\"\n    },\n    \"musicUrls\": {\n      \"title\": \"Sound URLs\",\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"(mode=bySound) TikTok sound page URLs. Example: https://www.tiktok.com/music/original-sound-7595604258835401494\",\n      \"editor\": \"stringList\"\n    },\n    \"musicIds\": {\n      \"title\": \"Sound IDs\",\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"(mode=bySound) Numeric TikTok sound IDs, 15-20 digits, as an alternative to full URLs.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"7595604258835401494\"\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Sound Search Queries\",\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"(mode=searchSounds) Keywords to search in TikTok's sound catalogue, e.g. lofi, phonk, afrobeats. Each query returns up to 30 sounds; duplicates are removed across queries.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxSoundsPerQuery\": {\n      \"title\": \"Max Sounds Per Query\",\n      \"type\": \"integer\",\n      \"default\": 10,\n      \"minimum\": 1,\n      \"maximum\": 30,\n      \"description\": \"(mode=searchSounds) Keep at most this many sounds per keyword. TikTok returns a maximum of 30.\"\n    },\n    \"maxPostsPerSound\": {\n      \"title\": \"Max Videos Per Sound\",\n      \"type\": \"integer\",\n      \"default\": 30,\n      \"minimum\": 0,\n      \"maximum\": 500,\n      \"description\": \"Videos to collect per sound (0-500). Set 0 for sound metadata only. TikTok can cap the public feed per run, so fewer rows may be returned and the run status reports any shortfall.\",\n      \"prefill\": 5\n    },\n    \"includeMusicMetadata\": {\n      \"title\": \"Include Sound Metadata\",\n      \"type\": \"boolean\",\n      \"default\": true,\n      \"description\": \"Emit a metadata row per sound with title, creator/artist, duration, covers, DSP IDs, tags and video count.\",\n      \"prefill\": true\n    },\n    \"includePosts\": {\n      \"title\": \"Include Videos Using The Sound\",\n      \"type\": \"boolean\",\n      \"default\": true,\n      \"description\": \"Emit one row per video that uses the sound, with author, caption, hashtags, mentions, POI, effects, slideshow images and engagement counts.\",\n      \"prefill\": true\n    },\n    \"includeErrorRows\": {\n      \"title\": \"Include Error Rows\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Emit a row with rowType='error' when an input cannot be read, instead of only logging it. Off by default.\",\n      \"prefill\": false\n    },\n    \"publishedWithin\": {\n      \"title\": \"Published Within\",\n      \"type\": \"string\",\n      \"description\": \"Keep only videos published inside this window. Applied after collection, to video rows.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"day\",\n        \"week\",\n        \"month\",\n        \"year\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Last 24 hours\",\n        \"Last 7 days\",\n        \"Last 30 days\",\n        \"Last 365 days\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"minPlayCount\": {\n      \"title\": \"Minimum Play Count\",\n      \"type\": \"integer\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000000000,\n      \"description\": \"Drop videos below this play count. 0 keeps everything. Videos without a play count are kept only when this is 0.\"\n    },\n    \"minLikeCount\": {\n      \"title\": \"Minimum Like Count\",\n      \"type\": \"integer\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000000000,\n      \"description\": \"Drop videos below this like count. 0 keeps everything. Videos without a like count are kept only when this is 0.\"\n    },\n    \"uniqueCreatorsOnly\": {\n      \"title\": \"One Video Per Creator\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Keep only the highest-play video per author across the run. Useful for audience and creator discovery.\",\n      \"prefill\": false\n    }\n  },\n  \"required\": []\n}",
    "readme": "# TikTok Sound Lookup: Metadata & Videos Using It\n\nGive this actor a TikTok sound — by page URL, numeric ID, or a keyword search — and it returns the sound's own metadata and the videos using it. Sound rows carry title, creator and artist, duration, cover art, DSP/streaming IDs, licensing flags, tags and total video count. Video rows carry the author, caption, hashtags, mentions, location, effects, slideshow images and engagement counters. No TikTok login, cookies or API key needed.\n\n## What this actor does\n\n- **Two modes:** `bySound` resolves one or more sound URLs/IDs; `searchSounds` discovers sounds from one or more keywords.\n- **Complete sound metadata:** title, author name, credited `artist`/`artists`, owner handle, language, release info, tags, licensing flags, covers and video count.\n- **DSP and partner IDs:** `dspLinks` and `externalSongInfo` expose the IDs TikTok holds for Spotify, Apple Music and other partners, without inventing links.\n- **Every video using the sound:** request up to 500 per sound, collected 30 at a time and deduplicated by video ID. TikTok can cap the public feed per run, so the actor returns what it can read and reports any shortfall.\n- **Slideshow-aware:** photo posts are labelled `postType: \"slideshow\"` and include their `images` array.\n- **Client-side filters:** publish window, minimum plays, minimum likes and one-video-per-creator, applied after collection.\n- **Opt-in error rows:** turn on `includeErrorRows` when you want a machine-readable row for each failed input.\n- Every empty field is omitted — no nulls or blank placeholders.\n\n## Output per sound (`rowType: \"music\"`)\n\n- `musicId`, `musicUrl` — sound ID and canonical TikTok page URL\n- `musicTitle`, `authorName`, `album` — track identity\n- `artist` — credited artist profile snapshot (id, secUid, username, displayName, bio, verified, avatarUrl)\n- `artists` — every credited artist TikTok returns\n- `ownerHandle`, `ownerNickname` — sound owner identity, when TikTok exposes one\n- `duration`, `durationHighPrecision`, `shootDuration` — track length and allowed clip length\n- `language`, `createTime`, `createdAt`, `musicReleaseInfo` — release and language metadata\n- `isCopyrighted`, `isCommerceMusic`, `isUnlimitedMusic`, `isOriginal`, `isPrivate` — licensing and visibility flags\n- `isPgc`, `isAuthorArtist`, `hasCommerceRight`, `commercialRightType` — commercial-use classification\n- `playUrl`, `coverLarge`, `coverMedium`, `coverThumb` — signed audio and cover URLs\n- `videoCount` — number of videos using the sound (kept as a string for very large counts)\n- `dspLinks` — streaming-platform IDs, names and links derived from TikTok's partner data\n- `externalSongInfo` — raw partner IDs (partnerName, partnerSongId, externalSongKey, links)\n- `tagList`, `themeTags` — mood, genre and theme tags\n- `matchedSongId`, `shareMeta` — matched licensed track ID and share text\n- `searchKeyword`, `searchPosition` — lineage when the sound came from `searchSounds`\n- `author` — creator profile snapshot for the sound\n- `rowType: \"music\"`\n\n## Output per video (`rowType: \"post\"`)\n\n- `postId`, `postType`, `postUrl` — video identifier, `video` or `slideshow`, and link\n- `matchedMusicId` — the sound this video was collected under\n- `searchKeyword`, `searchPosition` — search lineage when applicable\n- `caption`, `textLanguage`, `createTime`, `createdAt` — caption and publish time\n- `locationCreated`, `poi` — country and point-of-interest tag, when present\n- `stitchEnabled`, `shareEnabled`, `duetEnabled`, `isAd` — interaction and ad flags\n- `playCount`, `likeCount`, `commentCount`, `shareCount`, `collectCount`, `repostCount` — engagement counters\n- `hashtags` — `{name, id, isCommerce}` entries\n- `mentions` — `{username, userId, secUid, userUniqueId, start, end}` entries from TikTok's mention metadata\n- `author` — full author snapshot with bio, avatar and follower/heart/video counts\n- `music` — the sound object embedded in the video (id, title, authorName, album, playUrl, coverUrl, dspLinks)\n- `video` — width, height, duration, ratio, definition, bitrate, codec, format, size, quality and cover URLs\n- `images` — slideshow image URLs with width/height for `postType: \"slideshow\"`\n- `effectStickers` — effects used in the video\n- `mediaUrlExpiresAt` — expiry timestamp for signed media URLs\n- `rowType: \"post\"`\n\n## Output per failed input (`rowType: \"error\"`, opt-in)\n\n- `errorCode` — `invalid_music_input`, `sound_unavailable`, `no_search_results`, `feed_blocked` or `blocked`\n- `errorMessage` — plain-language explanation\n- `inputValue`, `musicId`, `searchKeyword` — which input failed\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `bySound` | `bySound` / `searchSounds` |\n| `musicUrls` | array | – | Sound page URLs (mode=bySound) |\n| `musicIds` | array | – | Numeric sound IDs, 15–20 digits (mode=bySound) |\n| `searchQueries` | array | – | Keywords to search (mode=searchSounds) |\n| `maxSoundsPerQuery` | integer | `10` | Sounds kept per keyword, 1–30 |\n| `maxPostsPerSound` | integer | `30` | Videos per sound, 0–500; `0` means metadata only |\n| `includeMusicMetadata` | boolean | `true` | Emit sound metadata rows |\n| `includePosts` | boolean | `true` | Emit video rows |\n| `includeErrorRows` | boolean | `false` | Emit rows for failed inputs |\n| `publishedWithin` | string | `all` | `all` / `day` / `week` / `month` / `year` (video rows) |\n| `minPlayCount` | integer | `0` | Drop videos below this play count |\n| `minLikeCount` | integer | `0` | Drop videos below this like count |\n| `uniqueCreatorsOnly` | boolean | `false` | Keep the highest-play video per author |\n\n### Example: one sound by URL\n\n```json\n{\n  \"mode\": \"bySound\",\n  \"musicUrls\": [\"https://www.tiktok.com/music/original-sound-7595604258835401494\"],\n  \"maxPostsPerSound\": 100\n}\n```\n\n### Example: several sounds by ID\n\n```json\n{\n  \"mode\": \"bySound\",\n  \"musicIds\": [\"6799585653702019073\", \"7181527934435117058\"],\n  \"maxPostsPerSound\": 50,\n  \"includeErrorRows\": true\n}\n```\n\n### Example: keyword discovery with filters\n\n```json\n{\n  \"mode\": \"searchSounds\",\n  \"searchQueries\": [\"lofi\", \"phonk\", \"afrobeats\"],\n  \"maxSoundsPerQuery\": 10,\n  \"maxPostsPerSound\": 30,\n  \"publishedWithin\": \"month\",\n  \"minPlayCount\": 10000,\n  \"uniqueCreatorsOnly\": true\n}\n```\n\n### Example: metadata only\n\n```json\n{\n  \"mode\": \"bySound\",\n  \"musicIds\": [\"6799585653702019073\"],\n  \"includeMusicMetadata\": true,\n  \"includePosts\": false,\n  \"maxPostsPerSound\": 0\n}\n```\n\n## Use cases\n\n- **A&R and label teams** tracking how a track spreads and which creators are driving it\n- **Brand and campaign teams** checking a sound's licensing flags, DSP IDs and audience before using it\n- **Trend researchers** discovering sounds by keyword and pulling the videos that define each trend\n- **Rights-management teams** auditing reuse of licensed or copyrighted tracks\n- **Creator-discovery platforms** finding the highest-performing video per creator for a sound\n- **Music catalogues** enriching tracks with TikTok's artist, release and streaming-partner identifiers\n\n## FAQ\n\n**Do I need a TikTok account or cookies?** No. The actor reads public sound and video data without a login, cookie or API key.\n\n**Where do I find a sound's ID?** Open the sound page on TikTok; the URL ends in `/music/<name>-<digits>`. The trailing digits are the ID, and you can paste either the full URL or the number.\n\n**What is the difference between `authorName` and `artist`?** `authorName` is the label TikTok shows for the sound. `artist` and `artists` are the credited performer profiles TikTok returns for licensed tracks. For user-recorded sounds the artist fields are usually absent.\n\n**Why are `dspLinks` or `externalSongInfo` missing for some sounds?** Streaming-partner IDs only exist for licensed commercial tracks. Original user sounds do not have them, and the field is omitted rather than filled with a guess.\n\n**How many sounds can one keyword return?** TikTok returns up to 30 sounds per query and does not paginate this catalogue, so `maxSoundsPerQuery` is capped at 30. Use several keywords to broaden coverage; duplicates are removed across queries.\n\n**Why did I get fewer videos than the sound's video count?** The actor collects up to `maxPostsPerSound` (maximum 500) from the public feed. TikTok may return fewer items for very old, private or region-restricted posts, and it can cap anonymous feed pages per IP. When that happens the actor returns everything it could read and reports the shortfall in the run status. Large pulls are read 30 videos at a time and can take several minutes to finish.\n\n**Why do some slideshow videos have no playback URL?** Photo posts use `images` instead of a video file; their `postType` is `slideshow` and the `video` object may only carry covers and dimensions.\n\n**Are `playUrl`, covers and video URLs permanent?** No. TikTok signs media URLs with a short expiry. Treat them as temporary and download promptly if you need the media itself.\n\n**Do the filters apply to sound rows too?** No. `publishedWithin`, `minPlayCount`, `minLikeCount` and `uniqueCreatorsOnly` apply to video rows after collection. Sound rows are always returned for the inputs you asked for.\n\n**Is this affiliated with TikTok?** No. This is an independent actor that reads TikTok's public sound and video data; it is not endorsed by or affiliated with TikTok or ByteDance.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "tiktok-sound-lookup-metadata-and-videos-using-it",
      "title": "TikTok Sound Lookup: Metadata & Videos Using It",
      "description": "Look up any TikTok sound by URL or ID, or search sounds by keyword. Get sound metadata, artist and DSP IDs, plus every video using the sound with captions, hashtags, mentions, POI, effects and engagement counts.",
      "version": "1.1",
      "buildTag": "latest",
      "readme": "# TikTok Sound Lookup: Metadata & Videos Using It\n\nGive this actor a TikTok sound — by page URL, numeric ID, or a keyword search — and it returns the sound's own metadata and the videos using it. Sound rows carry title, creator and artist, duration, cover art, DSP/streaming IDs, licensing flags, tags and total video count. Video rows carry the author, caption, hashtags, mentions, location, effects, slideshow images and engagement counters. No TikTok login, cookies or API key needed.\n\n## What this actor does\n\n- **Two modes:** `bySound` resolves one or more sound URLs/IDs; `searchSounds` discovers sounds from one or more keywords.\n- **Complete sound metadata:** title, author name, credited `artist`/`artists`, owner handle, language, release info, tags, licensing flags, covers and video count.\n- **DSP and partner IDs:** `dspLinks` and `externalSongInfo` expose the IDs TikTok holds for Spotify, Apple Music and other partners, without inventing links.\n- **Every video using the sound:** request up to 500 per sound, collected 30 at a time and deduplicated by video ID. TikTok can cap the public feed per run, so the actor returns what it can read and reports any shortfall.\n- **Slideshow-aware:** photo posts are labelled `postType: \"slideshow\"` and include their `images` array.\n- **Client-side filters:** publish window, minimum plays, minimum likes and one-video-per-creator, applied after collection.\n- **Opt-in error rows:** turn on `includeErrorRows` when you want a machine-readable row for each failed input.\n- Every empty field is omitted — no nulls or blank placeholders.\n\n## Output per sound (`rowType: \"music\"`)\n\n- `musicId`, `musicUrl` — sound ID and canonical TikTok page URL\n- `musicTitle`, `authorName`, `album` — track identity\n- `artist` — credited artist profile snapshot (id, secUid, username, displayName, bio, verified, avatarUrl)\n- `artists` — every credited artist TikTok returns\n- `ownerHandle`, `ownerNickname` — sound owner identity, when TikTok exposes one\n- `duration`, `durationHighPrecision`, `shootDuration` — track length and allowed clip length\n- `language`, `createTime`, `createdAt`, `musicReleaseInfo` — release and language metadata\n- `isCopyrighted`, `isCommerceMusic`, `isUnlimitedMusic`, `isOriginal`, `isPrivate` — licensing and visibility flags\n- `isPgc`, `isAuthorArtist`, `hasCommerceRight`, `commercialRightType` — commercial-use classification\n- `playUrl`, `coverLarge`, `coverMedium`, `coverThumb` — signed audio and cover URLs\n- `videoCount` — number of videos using the sound (kept as a string for very large counts)\n- `dspLinks` — streaming-platform IDs, names and links derived from TikTok's partner data\n- `externalSongInfo` — raw partner IDs (partnerName, partnerSongId, externalSongKey, links)\n- `tagList`, `themeTags` — mood, genre and theme tags\n- `matchedSongId`, `shareMeta` — matched licensed track ID and share text\n- `searchKeyword`, `searchPosition` — lineage when the sound came from `searchSounds`\n- `author` — creator profile snapshot for the sound\n- `rowType: \"music\"`\n\n## Output per video (`rowType: \"post\"`)\n\n- `postId`, `postType`, `postUrl` — video identifier, `video` or `slideshow`, and link\n- `matchedMusicId` — the sound this video was collected under\n- `searchKeyword`, `searchPosition` — search lineage when applicable\n- `caption`, `textLanguage`, `createTime`, `createdAt` — caption and publish time\n- `locationCreated`, `poi` — country and point-of-interest tag, when present\n- `stitchEnabled`, `shareEnabled`, `duetEnabled`, `isAd` — interaction and ad flags\n- `playCount`, `likeCount`, `commentCount`, `shareCount`, `collectCount`, `repostCount` — engagement counters\n- `hashtags` — `{name, id, isCommerce}` entries\n- `mentions` — `{username, userId, secUid, userUniqueId, start, end}` entries from TikTok's mention metadata\n- `author` — full author snapshot with bio, avatar and follower/heart/video counts\n- `music` — the sound object embedded in the video (id, title, authorName, album, playUrl, coverUrl, dspLinks)\n- `video` — width, height, duration, ratio, definition, bitrate, codec, format, size, quality and cover URLs\n- `images` — slideshow image URLs with width/height for `postType: \"slideshow\"`\n- `effectStickers` — effects used in the video\n- `mediaUrlExpiresAt` — expiry timestamp for signed media URLs\n- `rowType: \"post\"`\n\n## Output per failed input (`rowType: \"error\"`, opt-in)\n\n- `errorCode` — `invalid_music_input`, `sound_unavailable`, `no_search_results`, `feed_blocked` or `blocked`\n- `errorMessage` — plain-language explanation\n- `inputValue`, `musicId`, `searchKeyword` — which input failed\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `bySound` | `bySound` / `searchSounds` |\n| `musicUrls` | array | – | Sound page URLs (mode=bySound) |\n| `musicIds` | array | – | Numeric sound IDs, 15–20 digits (mode=bySound) |\n| `searchQueries` | array | – | Keywords to search (mode=searchSounds) |\n| `maxSoundsPerQuery` | integer | `10` | Sounds kept per keyword, 1–30 |\n| `maxPostsPerSound` | integer | `30` | Videos per sound, 0–500; `0` means metadata only |\n| `includeMusicMetadata` | boolean | `true` | Emit sound metadata rows |\n| `includePosts` | boolean | `true` | Emit video rows |\n| `includeErrorRows` | boolean | `false` | Emit rows for failed inputs |\n| `publishedWithin` | string | `all` | `all` / `day` / `week` / `month` / `year` (video rows) |\n| `minPlayCount` | integer | `0` | Drop videos below this play count |\n| `minLikeCount` | integer | `0` | Drop videos below this like count |\n| `uniqueCreatorsOnly` | boolean | `false` | Keep the highest-play video per author |\n\n### Example: one sound by URL\n\n```json\n{\n  \"mode\": \"bySound\",\n  \"musicUrls\": [\"https://www.tiktok.com/music/original-sound-7595604258835401494\"],\n  \"maxPostsPerSound\": 100\n}\n```\n\n### Example: several sounds by ID\n\n```json\n{\n  \"mode\": \"bySound\",\n  \"musicIds\": [\"6799585653702019073\", \"7181527934435117058\"],\n  \"maxPostsPerSound\": 50,\n  \"includeErrorRows\": true\n}\n```\n\n### Example: keyword discovery with filters\n\n```json\n{\n  \"mode\": \"searchSounds\",\n  \"searchQueries\": [\"lofi\", \"phonk\", \"afrobeats\"],\n  \"maxSoundsPerQuery\": 10,\n  \"maxPostsPerSound\": 30,\n  \"publishedWithin\": \"month\",\n  \"minPlayCount\": 10000,\n  \"uniqueCreatorsOnly\": true\n}\n```\n\n### Example: metadata only\n\n```json\n{\n  \"mode\": \"bySound\",\n  \"musicIds\": [\"6799585653702019073\"],\n  \"includeMusicMetadata\": true,\n  \"includePosts\": false,\n  \"maxPostsPerSound\": 0\n}\n```\n\n## Use cases\n\n- **A&R and label teams** tracking how a track spreads and which creators are driving it\n- **Brand and campaign teams** checking a sound's licensing flags, DSP IDs and audience before using it\n- **Trend researchers** discovering sounds by keyword and pulling the videos that define each trend\n- **Rights-management teams** auditing reuse of licensed or copyrighted tracks\n- **Creator-discovery platforms** finding the highest-performing video per creator for a sound\n- **Music catalogues** enriching tracks with TikTok's artist, release and streaming-partner identifiers\n\n## FAQ\n\n**Do I need a TikTok account or cookies?** No. The actor reads public sound and video data without a login, cookie or API key.\n\n**Where do I find a sound's ID?** Open the sound page on TikTok; the URL ends in `/music/<name>-<digits>`. The trailing digits are the ID, and you can paste either the full URL or the number.\n\n**What is the difference between `authorName` and `artist`?** `authorName` is the label TikTok shows for the sound. `artist` and `artists` are the credited performer profiles TikTok returns for licensed tracks. For user-recorded sounds the artist fields are usually absent.\n\n**Why are `dspLinks` or `externalSongInfo` missing for some sounds?** Streaming-partner IDs only exist for licensed commercial tracks. Original user sounds do not have them, and the field is omitted rather than filled with a guess.\n\n**How many sounds can one keyword return?** TikTok returns up to 30 sounds per query and does not paginate this catalogue, so `maxSoundsPerQuery` is capped at 30. Use several keywords to broaden coverage; duplicates are removed across queries.\n\n**Why did I get fewer videos than the sound's video count?** The actor collects up to `maxPostsPerSound` (maximum 500) from the public feed. TikTok may return fewer items for very old, private or region-restricted posts, and it can cap anonymous feed pages per IP. When that happens the actor returns everything it could read and reports the shortfall in the run status. Large pulls are read 30 videos at a time and can take several minutes to finish.\n\n**Why do some slideshow videos have no playback URL?** Photo posts use `images` instead of a video file; their `postType` is `slideshow` and the `video` object may only carry covers and dimensions.\n\n**Are `playUrl`, covers and video URLs permanent?** No. TikTok signs media URLs with a short expiry. Treat them as temporary and download promptly if you need the media itself.\n\n**Do the filters apply to sound rows too?** No. `publishedWithin`, `minPlayCount`, `minLikeCount` and `uniqueCreatorsOnly` apply to video rows after collection. Sound rows are always returned for the inputs you asked for.\n\n**Is this affiliated with TikTok?** No. This is an independent actor that reads TikTok's public sound and video data; it is not endorsed by or affiliated with TikTok or ByteDance.\n",
      "meta": {
        "templateId": "python-playwright"
      },
      "input": {
        "title": "TikTok Sound & Music Scraper Input",
        "description": "Look up TikTok sounds by URL/ID or search by keyword. Returns sound metadata, artist and DSP details, plus the videos using each sound.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "Choose how to find sounds: by sound URL/ID, or by keyword search.",
            "editor": "select",
            "enum": [
              "bySound",
              "searchSounds"
            ],
            "enumTitles": [
              "Look up sounds by URL or ID",
              "Search sounds by keyword"
            ],
            "default": "bySound",
            "prefill": "bySound"
          },
          "musicUrls": {
            "title": "Sound URLs",
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "(mode=bySound) TikTok sound page URLs. Example: https://www.tiktok.com/music/original-sound-7595604258835401494",
            "editor": "stringList"
          },
          "musicIds": {
            "title": "Sound IDs",
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "(mode=bySound) Numeric TikTok sound IDs, 15-20 digits, as an alternative to full URLs.",
            "editor": "stringList",
            "prefill": [
              "7595604258835401494"
            ]
          },
          "searchQueries": {
            "title": "Sound Search Queries",
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "(mode=searchSounds) Keywords to search in TikTok's sound catalogue, e.g. lofi, phonk, afrobeats. Each query returns up to 30 sounds; duplicates are removed across queries.",
            "editor": "stringList"
          },
          "maxSoundsPerQuery": {
            "title": "Max Sounds Per Query",
            "type": "integer",
            "default": 10,
            "minimum": 1,
            "maximum": 30,
            "description": "(mode=searchSounds) Keep at most this many sounds per keyword. TikTok returns a maximum of 30."
          },
          "maxPostsPerSound": {
            "title": "Max Videos Per Sound",
            "type": "integer",
            "default": 30,
            "minimum": 0,
            "maximum": 500,
            "description": "Videos to collect per sound (0-500). Set 0 for sound metadata only. TikTok can cap the public feed per run, so fewer rows may be returned and the run status reports any shortfall.",
            "prefill": 5
          },
          "includeMusicMetadata": {
            "title": "Include Sound Metadata",
            "type": "boolean",
            "default": true,
            "description": "Emit a metadata row per sound with title, creator/artist, duration, covers, DSP IDs, tags and video count.",
            "prefill": true
          },
          "includePosts": {
            "title": "Include Videos Using The Sound",
            "type": "boolean",
            "default": true,
            "description": "Emit one row per video that uses the sound, with author, caption, hashtags, mentions, POI, effects, slideshow images and engagement counts.",
            "prefill": true
          },
          "includeErrorRows": {
            "title": "Include Error Rows",
            "type": "boolean",
            "default": false,
            "description": "Emit a row with rowType='error' when an input cannot be read, instead of only logging it. Off by default.",
            "prefill": false
          },
          "publishedWithin": {
            "title": "Published Within",
            "type": "string",
            "description": "Keep only videos published inside this window. Applied after collection, to video rows.",
            "editor": "select",
            "enum": [
              "all",
              "day",
              "week",
              "month",
              "year"
            ],
            "enumTitles": [
              "Any time",
              "Last 24 hours",
              "Last 7 days",
              "Last 30 days",
              "Last 365 days"
            ],
            "default": "all",
            "prefill": "all"
          },
          "minPlayCount": {
            "title": "Minimum Play Count",
            "type": "integer",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000,
            "description": "Drop videos below this play count. 0 keeps everything. Videos without a play count are kept only when this is 0."
          },
          "minLikeCount": {
            "title": "Minimum Like Count",
            "type": "integer",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000,
            "description": "Drop videos below this like count. 0 keeps everything. Videos without a like count are kept only when this is 0."
          },
          "uniqueCreatorsOnly": {
            "title": "One Video Per Creator",
            "type": "boolean",
            "default": false,
            "description": "Keep only the highest-play video per author across the run. Useful for audience and creator discovery.",
            "prefill": false
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "TikTok Sound & Music Scraper Output",
        "description": "Sound metadata rows (rowType=music), videos using each sound (rowType=post), and optional error rows (rowType=error), joined by matchedMusicId and searchKeyword.",
        "properties": {
          "data": {
            "type": "string",
            "title": "Sounds, Videos and Errors",
            "description": "Dataset containing sound metadata, videos using the sounds, and opt-in error rows. Use rowType to distinguish them.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "TikTok Sound & Music Scraper Dataset",
          "views": {
            "overview": {
              "title": "Sounds and Videos",
              "transformation": {
                "fields": [
                  "rowType",
                  "musicTitle",
                  "authorName",
                  "artist",
                  "duration",
                  "videoCount",
                  "postId",
                  "caption",
                  "likeCount",
                  "playCount",
                  "matchedMusicId",
                  "searchKeyword",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "rowType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "musicTitle": {
                    "label": "Sound Title",
                    "format": "text"
                  },
                  "authorName": {
                    "label": "Sound Author",
                    "format": "text"
                  },
                  "artist": {
                    "label": "Artist",
                    "format": "object"
                  },
                  "duration": {
                    "label": "Duration (s)",
                    "format": "number"
                  },
                  "videoCount": {
                    "label": "Videos Using Sound",
                    "format": "text"
                  },
                  "postId": {
                    "label": "Video ID",
                    "format": "text"
                  },
                  "caption": {
                    "label": "Caption",
                    "format": "text"
                  },
                  "likeCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "playCount": {
                    "label": "Plays",
                    "format": "number"
                  },
                  "matchedMusicId": {
                    "label": "Sound ID",
                    "format": "text"
                  },
                  "searchKeyword": {
                    "label": "Search Keyword",
                    "format": "text"
                  },
                  "postUrl": {
                    "label": "Video URL",
                    "format": "link"
                  }
                }
              }
            },
            "errors": {
              "title": "Errors",
              "transformation": {
                "fields": [
                  "rowType",
                  "errorCode",
                  "errorMessage",
                  "inputValue",
                  "musicId",
                  "searchKeyword"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "rowType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "errorCode": {
                    "label": "Error Code",
                    "format": "text"
                  },
                  "errorMessage": {
                    "label": "Error Message",
                    "format": "text"
                  },
                  "inputValue": {
                    "label": "Input",
                    "format": "text"
                  },
                  "musicId": {
                    "label": "Sound ID",
                    "format": "text"
                  },
                  "searchKeyword": {
                    "label": "Search Keyword",
                    "format": "text"
                  }
                }
              }
            }
          },
          "fields": {
            "rowType": {
              "type": "string",
              "title": "Row Type",
              "description": "Discriminator: 'music' for sound metadata, 'post' for videos using a sound, 'error' for opt-in failure rows."
            },
            "musicId": {
              "type": "string",
              "title": "Music ID",
              "description": "Unique TikTok sound ID (string, 15-20 digits)"
            },
            "musicTitle": {
              "type": "string",
              "title": "Music Title",
              "description": "Title of the sound or track"
            },
            "authorName": {
              "type": "string",
              "title": "Author Name",
              "description": "Credited creator or artist name for the sound"
            },
            "artist": {
              "type": "object",
              "title": "Artist",
              "description": "Artist profile snapshot for a credited/licensed track (id, secUid, username, displayName, bio, verified, avatarUrl)"
            },
            "artists": {
              "type": "array",
              "title": "Artists",
              "description": "All credited artists returned for a licensed track"
            },
            "ownerHandle": {
              "type": "string",
              "title": "Owner Handle",
              "description": "TikTok handle of the sound owner when TikTok returns one"
            },
            "ownerNickname": {
              "type": "string",
              "title": "Owner Nickname",
              "description": "Display name of the sound owner when TikTok returns one"
            },
            "language": {
              "type": "string",
              "title": "Language",
              "description": "Language code of the sound when TikTok returns one"
            },
            "duration": {
              "type": "integer",
              "title": "Duration",
              "description": "Duration of the sound in seconds"
            },
            "durationHighPrecision": {
              "type": "number",
              "title": "Duration High Precision",
              "description": "Higher-precision sound duration in seconds when available"
            },
            "isCopyrighted": {
              "type": "boolean",
              "title": "Is Copyrighted",
              "description": "Whether the sound is under copyright"
            },
            "isCommerceMusic": {
              "type": "boolean",
              "title": "Is Commerce Music",
              "description": "Whether the sound is a commercial music track"
            },
            "isUnlimitedMusic": {
              "type": "boolean",
              "title": "Is Unlimited Music",
              "description": "Whether the sound is an unlimited-use music track"
            },
            "isOriginal": {
              "type": "boolean",
              "title": "Is Original Sound",
              "description": "Whether this is an original sound recorded by a user"
            },
            "isPrivate": {
              "type": "boolean",
              "title": "Is Private",
              "description": "Whether the sound is private"
            },
            "shootDuration": {
              "type": "integer",
              "title": "Shoot Duration",
              "description": "Clip length TikTok allows creators to use with this sound"
            },
            "album": {
              "type": "string",
              "title": "Album",
              "description": "Album name when the track belongs to a release"
            },
            "playUrl": {
              "type": "string",
              "title": "Play URL",
              "description": "Signed CDN URL for the sound audio (time-limited)"
            },
            "coverLarge": {
              "type": "string",
              "title": "Cover Large",
              "description": "Large cover image URL"
            },
            "coverMedium": {
              "type": "string",
              "title": "Cover Medium",
              "description": "Medium cover image URL"
            },
            "coverThumb": {
              "type": "string",
              "title": "Cover Thumb",
              "description": "Thumbnail cover image URL"
            },
            "videoCount": {
              "type": "string",
              "title": "Video Count",
              "description": "Number of TikTok videos using this sound, kept as a string to avoid integer overflow for viral sounds"
            },
            "musicUrl": {
              "type": "string",
              "title": "Music URL",
              "description": "Canonical TikTok page URL for this sound"
            },
            "dspLinks": {
              "type": "array",
              "title": "DSP Links",
              "description": "Streaming-platform IDs and links derived from TikTok's DSP partner data (platform, platformName, songId, metaSongId, url)"
            },
            "externalSongInfo": {
              "type": "array",
              "title": "External Song Info",
              "description": "Raw partner IDs TikTok returns for the track (partnerName, partnerSongId, externalSongKey, h5Url, appLink, deepLink)"
            },
            "musicReleaseInfo": {
              "type": "object",
              "title": "Music Release Info",
              "description": "Release metadata TikTok returns for licensed tracks"
            },
            "tagList": {
              "type": "array",
              "title": "Tag List",
              "description": "Mood/genre tags TikTok returns for the sound"
            },
            "themeTags": {
              "type": "array",
              "title": "Theme Tags",
              "description": "Theme tags TikTok returns for the sound"
            },
            "isPgc": {
              "type": "boolean",
              "title": "Is PGC",
              "description": "Whether TikTok classifies the sound as professionally generated content"
            },
            "isAuthorArtist": {
              "type": "boolean",
              "title": "Is Author Artist",
              "description": "Whether the credited author is the artist"
            },
            "hasCommerceRight": {
              "type": "boolean",
              "title": "Has Commerce Right",
              "description": "Whether the sound carries commercial usage rights"
            },
            "commercialRightType": {
              "type": "integer",
              "title": "Commercial Right Type",
              "description": "TikTok's commercial-right category code"
            },
            "matchedSongId": {
              "type": "string",
              "title": "Matched Song ID",
              "description": "Internal TikTok matched-song ID for licensed tracks"
            },
            "shareMeta": {
              "type": "object",
              "title": "Share Meta",
              "description": "Share title and description TikTok uses for the sound page"
            },
            "createTime": {
              "type": "integer",
              "title": "Create Time",
              "description": "Unix timestamp when the sound or video was created"
            },
            "createdAt": {
              "type": "string",
              "title": "Created At",
              "description": "ISO 8601 UTC timestamp when the sound or video was created"
            },
            "searchKeyword": {
              "type": "string",
              "title": "Search Keyword",
              "description": "Keyword that surfaced this sound or video (searchSounds mode only)"
            },
            "searchPosition": {
              "type": "integer",
              "title": "Search Position",
              "description": "1-based position of the sound in its keyword's result list (searchSounds mode only)"
            },
            "author": {
              "type": "object",
              "title": "Author",
              "description": "Profile snapshot for the sound's creator/artist or the video author (id, secUid, username, displayName, bio, verified, avatarUrl, followerCount, followingCount, heartCount, videoCount)"
            },
            "matchedMusicId": {
              "type": "string",
              "title": "Matched Music ID",
              "description": "Sound ID this video was collected under (video rows only)"
            },
            "postId": {
              "type": "string",
              "title": "Post ID",
              "description": "Unique TikTok video/post ID (string)"
            },
            "postType": {
              "type": "string",
              "title": "Post Type",
              "description": "Either 'video' or 'slideshow'"
            },
            "postUrl": {
              "type": "string",
              "title": "Post URL",
              "description": "Direct URL to the TikTok video or photo post"
            },
            "caption": {
              "type": "string",
              "title": "Caption",
              "description": "Video caption text"
            },
            "textLanguage": {
              "type": "string",
              "title": "Text Language",
              "description": "Language code of the caption"
            },
            "playCount": {
              "type": "integer",
              "title": "Play Count",
              "description": "Number of video plays"
            },
            "likeCount": {
              "type": "integer",
              "title": "Like Count",
              "description": "Number of likes"
            },
            "commentCount": {
              "type": "integer",
              "title": "Comment Count",
              "description": "Number of comments"
            },
            "shareCount": {
              "type": "integer",
              "title": "Share Count",
              "description": "Number of shares"
            },
            "collectCount": {
              "type": "integer",
              "title": "Collect Count",
              "description": "Number of times the video was saved"
            },
            "repostCount": {
              "type": "integer",
              "title": "Repost Count",
              "description": "Number of reposts (from statsV2)"
            },
            "stitchEnabled": {
              "type": "boolean",
              "title": "Stitch Enabled",
              "description": "Whether stitching is allowed on this video"
            },
            "duetEnabled": {
              "type": "boolean",
              "title": "Duet Enabled",
              "description": "Whether duets are allowed on this video"
            },
            "shareEnabled": {
              "type": "boolean",
              "title": "Share Enabled",
              "description": "Whether sharing is enabled on this video"
            },
            "isAd": {
              "type": "boolean",
              "title": "Is Ad",
              "description": "Whether the video is a paid advertisement"
            },
            "music": {
              "type": "object",
              "title": "Music",
              "description": "The sound used in this video (id, title, authorName, original, duration, album, playUrl, coverUrl, dspLinks)"
            },
            "video": {
              "type": "object",
              "title": "Video",
              "description": "Video file metadata (width, height, duration, ratio, definition, bitrate, codecType, format, size, videoQuality, playUrl, cover, originCover, dynamicCover)"
            },
            "hashtags": {
              "type": "array",
              "title": "Hashtags",
              "description": "Hashtags used in the caption"
            },
            "mentions": {
              "type": "array",
              "title": "Mentions",
              "description": "@mentions in the caption with username, userId, secUid, userUniqueId and caption offsets"
            },
            "images": {
              "type": "array",
              "title": "Images",
              "description": "Slideshow images for photo posts (postType='slideshow')"
            },
            "poi": {
              "type": "object",
              "title": "POI",
              "description": "Point-of-interest object when the video is tagged with a location"
            },
            "effectStickers": {
              "type": "array",
              "title": "Effect Stickers",
              "description": "Effect stickers used in the video"
            },
            "locationCreated": {
              "type": "string",
              "title": "Location Created",
              "description": "Country code where the video was created, when TikTok returns it"
            },
            "mediaUrlExpiresAt": {
              "type": "string",
              "title": "Media URL Expires At",
              "description": "ISO 8601 UTC timestamp when signed video or cover URLs expire"
            },
            "errorCode": {
              "type": "string",
              "title": "Error Code",
              "description": "Machine-readable failure code on opt-in error rows"
            },
            "errorMessage": {
              "type": "string",
              "title": "Error Message",
              "description": "Plain-language failure description on opt-in error rows"
            },
            "inputValue": {
              "type": "string",
              "title": "Input Value",
              "description": "The URL, ID or keyword that could not be read"
            }
          }
        }
      },
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "categories": [
        "SOCIAL_MEDIA",
        "VIDEOS"
      ],
      "environmentVariables": {}
    },
    "buildNumber": "1.1.1",
    "imageDigest": "7e425330579fa4f471c3ccfe7602f858b47f103f314f753324d90201ead53b8f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.029676666666666667
    }
  }
}