{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Discover Scraper: Sound Finder by keyword",
    "description": "TikTok Discover Scraper: Sound Finder by Keyword extracts trending TikTok sounds matching keywords, including sound names, creators, usage counts, video links, music details, and engagement data. Ideal for trend research, content discovery, competitor analysis, and viral sound tracking.",
    "version": "0.1",
    "x-build-id": "WB22MPYKSvN7mha2e"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~tiktok-discover-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-tiktok-discover-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapier~tiktok-discover-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-tiktok-discover-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapier~tiktok-discover-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-tiktok-discover-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "🎼 Topics / keywords (one per line)",
            "type": "array",
            "description": "Examples:\n\n• `phonk`\n• `skincare routine`\n• `#gymtok` (the `#` is stripped)\n• `https://www.tiktok.com/search?q=lofi` → searches `lofi`\n• `https://www.tiktok.com/music/Lalala-Phonk-7195227075836381185` → searches `Lalala Phonk`\n\nEach line is searched separately and its sounds are deduplicated on sound ID.",
            "items": {
              "type": "string"
            }
          },
          "maxSoundsPerQuery": {
            "title": "🔢 Sounds to keep per topic",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "How many sounds to keep for each line above, **after** the filters below have run. Leave empty to fall back to the legacy `maxItems` value. `0` = keep everything the page budget returns.\n\nTikTok serves 20 sounds per page; 160 unique sounds over 8 pages was the deepest measured."
          },
          "maxPagesPerQuery": {
            "title": "📄 How deep to page (20 sounds per page)",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Page budget per topic. Raise it when your filters are strict, because filtered-out sounds still consume pages. Measured ceiling: 8 pages = 160 unique sounds, still `has_more: 1`.",
            "default": 8
          },
          "maxItems": {
            "title": "🧩 Legacy cap (`maxItems`)",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Kept for backwards compatibility with the original Discover actor and its saved tasks. It is used **only when `Sounds to keep per topic` is left empty**. `0` here means \"keep everything the page budget returns\" — unlike the old actor, that no longer disables paging.",
            "default": 10
          },
          "minSoundVideoCount": {
            "title": "📈 Minimum videos using the sound",
            "minimum": 0,
            "type": "integer",
            "description": "Drops one-off tracks. Applied to TikTok's own `user_count`. On a single measured page the range was 70 → 599 842 videos, so `10000` already cuts most of the long tail.\n\n`0` = keep every sound.",
            "default": 0
          },
          "onlyCommerciallyUsable": {
            "title": "💼 Only sounds cleared for business accounts",
            "type": "boolean",
            "description": "Keeps only sounds where TikTok reports `has_commerce_right = true` (commercial-right code 2). Measured 6/20 on `phonk` and 11/20 on `skincare` — expect this to remove roughly half the results.",
            "default": false
          },
          "soundLanguages": {
            "title": "🗣️ Keep only these sound languages",
            "type": "array",
            "description": "TikTok's own language label on the track, e.g. `English`, `Korean`, `Spanish`. Leave empty to keep every language.\n\n⚠️ The label is present on ~19 of 20 sounds; a sound with no language label is dropped while this filter is on.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortSoundsBy": {
            "title": "↕️ Order the kept sounds by",
            "enum": [
              "relevance",
              "videoCount",
              "newest",
              "oldest",
              "longest"
            ],
            "type": "string",
            "description": "Re-orders the sounds this run fetched. It does **not** ask TikTok for a different ranking — `relevance` is TikTok's own order, everything else is applied to the rows in hand.",
            "default": "relevance"
          },
          "proxyConfiguration": {
            "title": "🛰️ Apify Proxy",
            "type": "object",
            "description": "Left off, the run tries a direct connection first and only escalates to datacenter, then residential, if TikTok's WAF challenges the exit IP. Turn it on to pin your own group instead."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}