{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Shop Creators Finder — Affiliates, Sales & Emails",
    "description": "Find TikTok Shop creators and affiliates by niche keyword. Each row has followers, engagement, bio and link-in-bio emails, and the products in their public Shop showcase with price, rating, units sold and a sales-value estimate. Filter and rank by sales, followers, price or rating. No login.",
    "version": "0.3",
    "x-build-id": "Ya89Vd5hTL0NAgpLr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/khadinakbar~tiktok-shop-creators-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-khadinakbar-tiktok-shop-creators-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/khadinakbar~tiktok-shop-creators-scraper/runs": {
      "post": {
        "operationId": "runs-sync-khadinakbar-tiktok-shop-creators-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/khadinakbar~tiktok-shop-creators-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-khadinakbar-tiktok-shop-creators-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",
        "properties": {
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "description": "Use this when you want to find TikTok creators by niche, product category, brand, or creator style. Accepts one query per line, for example tiktok shop finds, beauty creator, or kitchen gadgets. Defaults to the prefilled example for quick testing. Not for scraping videos, comments, followers, or Creator Marketplace private data.",
            "items": {
              "type": "string"
            }
          },
          "creatorUsernames": {
            "title": "Creator usernames",
            "type": "array",
            "description": "Use this when you already know which creators to check, for example from a brand list or an earlier run. Accepts TikTok usernames, @usernames or profile links, one per item. Each one is looked up on its own (full profile: complete bio, emails, link-in-bio page email, Shop-seller flag, account age), then checked for a Shop showcase and filtered like any other creator, so every filter, ranking and field works on them. Each lookup is charged as the profile-enriched event, on top of the normal check and creator events. Usernames that do not exist are listed in OUTPUT.usernamesNotFound and are not charged. Available once the profile-enriched price is live (see the Pricing tab); until then the usernames are skipped and the run says so. Can be combined with Search Queries; a creator found both ways is saved once. Defaults to empty.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxProfilesPerQuery": {
            "title": "Max Profiles Per Query",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Use this to cap how many TikTok user-search profiles are inspected for each query. Accepts integers from 1 to 10000. Defaults to 50 and the prefill is 25 for fast tests. This is a scan cap, not the final saved creator count.",
            "default": 50
          },
          "maxPagesPerQuery": {
            "title": "Max Pages Per Query",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Use this as a safety cap for search pagination on each TikTok user search. Accepts integers from 1 to 500. Defaults to 10 and the prefill is 1 for quick checks. Not a result limit by itself.",
            "default": 10
          },
          "maxProfilesScanned": {
            "title": "Max Profiles Scanned",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Use this to cap public showcase checks across the whole run. Accepts integers from 1 to 50000. Defaults to 500 and the prefill is 25. This is the main billing guard for showcase lookup costs. Free Apify plan runs check up to 50 profiles per run.",
            "default": 500
          },
          "maxTotalCreators": {
            "title": "Max Total Creators",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Use this to cap saved TikTok Shop creator rows across all queries. Accepts integers from 1 to 50000. Defaults to 50 and the prefill is 10. This prevents accidental overbilling on broad keyword batches. Free Apify plan runs return up to 25 creators per run.",
            "default": 50
          },
          "discoveryMode": {
            "title": "How to find creators",
            "enum": [
              "profiles",
              "shopTaggedVideos"
            ],
            "type": "string",
            "description": "Use 'Shop-tagged videos' to search videos and keep only creators whose video carries a TikTok Shop product tag. In testing these creators had a shop almost every time, so far fewer paid shop checks are wasted and you also get the tagged product's id and title. Best for shop-heavy keywords such as 'tiktok shop finds'; a niche with few tagged videos returns fewer creators. Use 'Account search' to match creator names and bios as before.",
            "default": "profiles"
          },
          "requireShowcaseProducts": {
            "title": "Require Showcase Products",
            "type": "boolean",
            "description": "Use this to save only creators with public TikTok Shop showcase products. Defaults to true because this actor is for TikTok Shop creator discovery. Set false to save searched creator profiles even when no showcase products are found. This does not fetch full product reviews.",
            "default": true
          },
          "minFollowerCount": {
            "title": "Minimum Follower Count",
            "minimum": 0,
            "type": "integer",
            "description": "Use this to keep only creator profiles at or above a follower threshold. Accepts 0 or any positive integer, for example 10000 for micro-influencer discovery. Defaults to 0, which keeps all returned profiles. This filter is applied before showcase lookup when follower data is available.",
            "default": 0
          },
          "requireBioEmail": {
            "title": "Only creators with an email in their bio",
            "type": "boolean",
            "description": "Use this to keep only creators who wrote an email address in their public TikTok bio. Applied before the paid showcase check, so skipped profiles cost nothing. Defaults to false. Emails in bios are uncommon, so expect few rows; leave off for broad discovery.",
            "default": false
          },
          "minUnitsSold": {
            "title": "Minimum units sold",
            "minimum": 0,
            "type": "integer",
            "description": "Use this to keep only creators whose showcase products sold at least this many units in total. Counts the products shown in the row (see Max Showcase Products Per Creator). Accepts 0 or a positive integer. Defaults to 0, which keeps every creator with a showcase. The profile check is still charged for creators that are filtered out here.",
            "default": 0
          },
          "minShowcaseProducts": {
            "title": "Minimum showcase products",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Use this to keep only creators with at least this many products in their public TikTok Shop showcase, for example 3 to skip creators with a single token item. Counts the products read for the row (see Max Showcase Products Per Creator). Accepts 0 to 50. Defaults to 0 (no minimum). Applied after the paid shop check, so creators filtered out here are still charged the check.",
            "default": 0
          },
          "minAverageRating": {
            "title": "Minimum average product rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Use this to keep only creators whose showcase products average at least this star rating (0 to 5), for example 4.5 for well-reviewed products. Products without a rating are ignored. Defaults to 0 (no minimum). Applied after the paid shop check.",
            "default": 0
          },
          "minAveragePrice": {
            "title": "Minimum average product price",
            "minimum": 0,
            "type": "number",
            "description": "Use this to keep only creators who promote higher-priced products, for example 50 for premium brands. The average is taken over the showcase products in the row, in the row's own currency (USD for the US shop). Defaults to 0 (no minimum). Applied after the paid shop check.",
            "default": 0
          },
          "maxAveragePrice": {
            "title": "Maximum average product price",
            "minimum": 0,
            "type": "number",
            "description": "Use this to keep only creators who promote lower-priced products, for example 25 for impulse-buy items. Creators with no readable product price are dropped when this is set. Defaults to 0 (no maximum). Applied after the paid shop check.",
            "default": 0
          },
          "bioIncludes": {
            "title": "Bio must contain any of these words",
            "type": "array",
            "description": "Use this to target a niche you cannot search for directly. Add words such as skincare or mom; a profile is checked only if its display name or bio contains at least one (case-insensitive). Applied BEFORE the paid shop check, so skipped profiles cost nothing. Leave empty to check every profile found.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "bioExcludes": {
            "title": "Skip bios containing these words",
            "type": "array",
            "description": "Use this to avoid unwanted accounts, for example agency, giveaway or fanpage. A profile whose display name or bio contains any of these words (case-insensitive) is skipped BEFORE the paid shop check, so it costs nothing. Leave empty to skip nothing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "enrichProfiles": {
            "title": "Enrich profiles (full bio, emails, link page)",
            "type": "boolean",
            "description": "Use this when you want contact details. For each creator that passes your filters, the Actor looks up the full TikTok profile: the complete bio (search results show only a short one, so emails are usually missing there), the bio link, whether they are a Shop seller and the account's creation date. If the bio shows no email it also reads the creator's public link-in-bio page (Linktree, Beacons, a personal site) for an email or phone. Adds emails, emailSource, linkEmails, linkPhones, socialHandles, isShopSeller and accountCreatedAt to the row. Charged as a separate event (profile-enriched, $0.005 per profile looked up, only when the lookup really answered), available once its price is live (see the Pricing tab); until then the option is ignored and the run says so. With a ranking option only the creators kept are enriched. Defaults to false.",
            "default": false
          },
          "onlyWithEmail": {
            "title": "Only creators with an email",
            "type": "boolean",
            "description": "Use this for outreach lists. Switches on profile enrichment and keeps only creators who have an email in their full bio or on their link-in-bio page. Every candidate is looked up before the cut (and charged the enrichment event), so expect to pay for more lookups than rows; in a small test, four of six creators published an email in the full bio. Available once the profile-enriched price is live (see the Pricing tab); until then this option is ignored and the run says so. Defaults to false.",
            "default": false
          },
          "verifiedOnly": {
            "title": "Verified Only",
            "type": "boolean",
            "description": "Use this when you only want TikTok profiles marked verified or with a verification label. Defaults to false so discovery is broad. Set true for brand safety, public figures, or official creator research. Not all public profiles expose identical verification metadata.",
            "default": false
          },
          "excludePrivateAccounts": {
            "title": "Exclude Private Accounts",
            "type": "boolean",
            "description": "Use this to skip profiles marked private by TikTok. Defaults to true because private accounts are weak TikTok Shop outreach candidates. Set false if private-account metadata still helps your research. This does not bypass privacy settings or return private content.",
            "default": true
          },
          "maxShowcaseProductsPerCreator": {
            "title": "Max Showcase Products Per Creator",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Use this to cap showcase products attached to each creator. Accepts integers from 1 to 50. Defaults to 5 for campaign shortlisting. This controls row size and does not change how many profiles are checked.",
            "default": 5
          },
          "maxShowcasePagesPerCreator": {
            "title": "Max Showcase Pages Per Creator",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Use this to cap search pagination for each creator showcase. Accepts integers from 1 to 5. Defaults to 1 for predictable cost. Increase only when you need more public product examples per creator. This is not a product-detail scraper.",
            "default": 1
          },
          "showcaseRegion": {
            "title": "Showcase Region",
            "enum": [
              "US"
            ],
            "type": "string",
            "description": "TikTok Shop region used for the public showcase check. Only the US shop is currently available from the data source; other regions return nothing, so they are not offered. Defaults to US. Not a creator-location filter.",
            "default": "US"
          },
          "sortBy": {
            "title": "Sort creators by",
            "enum": [
              "relevance",
              "unitsSold",
              "salesValue",
              "followers",
              "avgLikesPerVideo"
            ],
            "type": "string",
            "description": "Use 'Search order' for the normal fast run. Any other option ranks every qualifying creator found (up to Max Profiles Scanned) and returns the best first: 'Units sold' by total units sold across the showcase products, 'Sales value' by estimated showcase sales (price times units sold), 'Followers' by audience size, 'Likes per video' by how well their videos perform. Ranking checks every qualifying profile before choosing, so set Max Profiles Scanned deliberately: it is your cost limit. Creators are charged only after ranking.",
            "default": "relevance"
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}