TikTok Shop scraper artworkUS products, prices & shops

TikTok Shop Scraper.

Collect public US TikTok Shop listings and compare competitor prices and offers. Save each run with a date so you can follow product changes over time.

Run on Apify

Ways to use this scraper.

Try these examples for marketing, growth and competitor research.

01

Follow competitor prices and promotions

For a consumer brand, check a set of competing shops daily. Compare current and original prices, badges and discounts. When an offer changes, review the listing before reacting.

Keep a dated price sheet that flags changes for each product.

02

Research a category before entering it

Review a US category and its subcategories. Compare the product mix, sellers, ratings and cumulative sold counts to choose the niches that deserve a closer look.

Keep a category comparison with source products and a note on the sample coverage.

03

Compare the product offer with its selling video

Review the TikTok video shown with a product alongside its description, price and variants. Use those examples to plan tests of a demonstration, bundle or product positioning.

Keep a product and creative brief with specific ideas to test.

FROM FIRST RUN TO REPEATABLE WORKFLOW

Your first run, step by step.

  1. Open the Actor on Apify, select its Input tab and switch to the JSON editor if you want to paste a configuration.
  2. Replace phone case with one product category you want to research. Use a US TikTok Shop URL if you already have a store or product in mind. Clear prefilled search phrases when collecting only URLs.
  3. Keep the US residential proxy configuration. Start with 20 products and scrapeProductDetails false. Inspect prices, seller names and source URLs before enabling variants and longer product records.
  4. Start the run and watch the log. Check which targets and filters were actually read before assuming an empty result means nothing exists.
  5. Open Storage → Dataset, inspect several records and export JSON for nested data or CSV for a first spreadsheet review.
First-run configuration
{
  "searchQueries": ["phone case"],
  "maxProducts": 20,
  "scrapeProductDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}

Paste this into the Actor’s JSON input editor. Replace the example targets with yours before running.

Check the current input form on Apify

Choose how to search.

This scraper covers US TikTok Shop. Search phrases are useful for discovery; store, category and product URLs give you a more specific starting point. Listing-only runs are faster than collecting each product’s details.

Search methodWhen to use itWhat changes
Product searchesWhen to use itYou want to find relevant results before choosing specific targets.What changesTikTok Shop product keywords, one per list item. Each search paginates until no more products are returned or a configured limit is reached. Queries are discovery searches, not exact product identifiers.
Store or product URLsWhen to use itYou already configured the search on the source website.What changesUS product, store, category or keyword-page URLs; supported share links and bare product IDs also work. A store collects its products, a product link collects one item, and non-US shop links are skipped.
Category coverageWhen to use itYou want broader coverage and can allow a larger run.What changesFor category URLs, follows their nested subcategories recursively. Turn off for a shallow category sample. It does not change keyword searches or turn a product URL into a catalog crawl.

The difference that matters

Adds descriptions, variants with price and stock, images, specifications, shipping, review samples and seller details with one extra request per product. Direct product links always receive details, even when false.

Compare the related scraper

Every input, explained.

Use the exact field names below in JSON. In Apify’s form, enter list items separately, choose filters, and keep numbers and booleans in their proper types.

Default and prefill are different. A default applies when you omit a setting; a prefill is an example already entered in Apify’s form. Review prefilled targets and limits before every run. Some settings have no schema default. You still need to supply at least one supported target.

Targets and search inputs2
searchQueries
ListForm prefill: ["phone case"]

TikTok Shop product keywords, one per list item. Each search paginates until no more products are returned or a configured limit is reached. Queries are discovery searches, not exact product identifiers.

startUrls
List

US product, store, category or keyword-page URLs; supported share links and bare product IDs also work. A store collects its products, a product link collects one item, and non-US shop links are skipped.

Limits, details and proxies6
maxProducts
IntegerForm prefill: 100

Global cap on unique products across searches, stores and links. The same product found twice is written once. Empty removes the cap; start with 50 while checking the output.

maxProductsPerSearch
Integer

Cap each search, store or category separately. With three keywords and a cap of 20 each, up to 60 products can be found before global limits and deduplication.

scrapeProductDetails
True or falseDefault: false

Adds descriptions, variants with price and stock, images, specifications, shipping, review samples and seller details with one extra request per product. Direct product links always receive details, even when false.

includeSubcategories
True or falseDefault: true

For category URLs, follows their nested subcategories recursively. Turn off for a shallow category sample. It does not change keyword searches or turn a product URL into a catalog crawl.

maxConcurrency
IntegerDefault: 5

1-20 pages in parallel, each using its own proxy session. The default is 5. Raising it needs enough US residential exits and can increase traffic faster than coverage.

proxyConfiguration
ObjectDefault: {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}Form prefill: {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}

US residential proxy is the working default. TikTok Shop’s US pages can show empty shells or security checks to other regions or datacenter exits. A non-US Apify proxy country is switched to US.

Advanced settings and recovery2
resume
True or falseDefault: true

Saves progress about every 30 seconds so an Apify restart or migration can continue the current run. Leave it on for normal use.

continueFromLastRun
True or falseDefault: false

Continues unfinished work from the previous run with matching input. Earlier results remain in that run’s dataset. Keep false for a fresh collection or a recurring snapshot.

This reference follows the Actor’s published input fields. Check the live form before changing a production workflow. Check the current input form on Apify.

Configurations you can copy.

Each example is a separate run. Start small, inspect the results, then increase coverage. Update the targets, countries and dates to match your question.

Map a small product category

Sample three related searches, with at most 20 products from each and 60 overall. Keep listing-only collection for a quick market map. Search overlap means the final unique count may be lower.

Map a small product category
{
  "searchQueries": ["phone case", "phone stand", "screen protector"],
  "maxProducts": 60,
  "maxProductsPerSearch": 20,
  "scrapeProductDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}

Inspect prices and variants

Enable product details for a 20-product sample. Compare variants and available price fields in Sheets, and retain the collection date. Listed prices, discounts and stock can change between runs.

Inspect prices and variants
{
  "searchQueries": ["phone case"],
  "maxProducts": 20,
  "scrapeProductDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}

Build a balanced research sample

Collect up to ten products from each of three skincare searches, with details and a lower concurrency of three. This keeps the initial review manageable before you commit to a larger catalog run.

Build a balanced research sample
{
  "searchQueries": ["vitamin c serum", "retinol serum", "hyaluronic acid serum"],
  "maxProducts": 30,
  "maxProductsPerSearch": 10,
  "scrapeProductDetails": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}

Run, check, export, repeat.

Keep product IDs, seller names, source links and collection dates. Detail mode can add variants, descriptions, stock and review samples; it is not an unlimited review export. Sold counts and listed prices are marketplace signals, not a transaction ledger. Use repeated snapshots for price comparisons, retaining changes instead of overwriting them.

  1. Check the dataset and the run’s SUMMARY record. Compare the number collected with your cap, inspect failed or skipped inputs, and verify a few original source links.
  2. Keep the original IDs and add collected_at and run_id when saving results. Export CSV for flat columns; retain JSON when arrays or nested details matter.
  3. Save the tested configuration as an Apify Task and schedule it. For repeated snapshots, leave continueFromLastRun false. Deduplicate new records by source ID while retaining each observation date.
  4. In Make or n8n, wait for a successful run, fetch its dataset and map fields into Sheets or your warehouse. Send records to Looker Studio through a reporting table; use dbt to flatten and test warehouse models.
  5. The same JSON works with Apify’s Actor API. In Claude with Apify MCP, name this Actor, ask it to inspect the live schema, and give explicit targets, markets and result limits before it runs.

Resume is not a fresh snapshot

resume protects the current run if Apify restarts it. continueFromLastRun continues an earlier run with the same configuration; earlier records stay in the earlier dataset. Combine both datasets for the complete collection, and raise a previously reached result cap when continuing. Start fresh when you want to see what changed today.

Follow the Sheets, Claude, Looker and BigQuery setup guides
Run this Actor from the API

Save one configuration above as input.json. Set APIFY_TOKEN to your Apify API token in your terminal, then send the file as the request body.

Start the run
curl --fail-with-body --request POST \
  --url "https://api.apify.com/v2/actors/jmlp~tiktok-shop-scraper/runs" \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header "Content-Type: application/json" \
  --data-binary @input.json

The response contains a run ID and defaultDatasetId, not finished results. Wait for the run to succeed, set DATASET_ID to that dataset ID, then fetch its items. For large datasets, use limit and offset to page through the export.

Fetch the dataset
curl --fail-with-body \
  --url "https://api.apify.com/v2/datasets/$DATASET_ID/items?format=json" \
  --header "Authorization: Bearer $APIFY_TOKEN"

Apify’s run and export API reference
Dataset export options

When the results look wrong.

Change one setting at a time, keep a small cap, and check the run summary before scaling up.

The selected country returns no useful results.

US residential proxy is the working default. TikTok Shop’s US pages can show empty shells or security checks to other regions or datacenter exits. A non-US Apify proxy country is switched to US.

The listing exists, but detailed fields are missing.

Adds descriptions, variants with price and stock, images, specifications, shipping, review samples and seller details with one extra request per product. Direct product links always receive details, even when false.

The results are only part of the catalog.

Cap each search, store or category separately. With three keywords and a cap of 20 each, up to 60 products can be found before global limits and deduplication.

The run succeeded but returned nothing

Success means the Actor finished handling the request, not that the source returned data. Check SUMMARY.inputProblem, SUMMARY.problem and the log for missing targets, unsupported filters or refused requests. Test one known target with fewer filters.

Fewer records than expected

Check the global limit, per-search or per-page limits, platform coverage and deduplication. Several searches can find the same record. A source’s headline count can include records the public endpoint does not return. Review unfinished jobs before treating the dataset as complete.

Use the results in your tools.

Google Sheets

Append product_id, shop_name, price, discount, sold_count and scraped_at. Compare with a reviewed baseline to flag price changes. Treat changes in the cumulative sold count separately from verified sales.

Read the setup
Claude + MCP

Ask Claude to compare positioning, offers and review themes, citing product URLs. Keep featured reviews separate from any claim about the full review sample.

Read the setup
Looker Studio

Show price ranges and promotions with shop and category filters. Use repeated snapshots, label cumulative sold counts, and state what your sample covers.

Read the setup
BigQuery + dbt

Partition product snapshots by collection date. Store variants and reviews separately. Match SKUs before calculating price changes, and label sold-count differences as observed net changes.

Read the setup
Copy a prompt for Claude
Prompt for Claude + Apify MCP
Check jmlp/tiktok-shop-scraper and collect at most 50 US phone case products with details. Compare price ranges, discounts, shop identities and featured review themes, cite product URLs, and flag variation by SKU. Do not treat cumulative sold_count as daily sales or revenue.

The fields you’ll get.

Keep the collection time and original IDs with your records. You’ll need them to check where a result came from or compare it with a later run.

Before you draw conclusions

This scraper covers US TikTok Shop. Search and category results are limited samples of the market. sold_count is TikTok's cumulative figure, so changes can reflect returns or source updates and aren't daily revenue. The headline price is the cheapest variant; check matching variants before comparing prices.

product_id / url / scraped_at
Product identity, source page and collection time.
price / price_max / original_price / discount
Current listing pricing and published promotion data.
sold_count / rating / review_count
TikTok’s cumulative sales count and public review signals.
seller_id / shop_name / shop_url
The shop behind a product.
variants / shipping / specifications
Optional product-detail data for stock, delivery and attributes.
video / top_reviews
The displayed promoting video and, with details, featured reviews.

Common questions.

Does it cover TikTok Shop in every country?

No. This Actor currently targets the US TikTok Shop. Other-country shop links are outside its supported coverage.

Can I measure daily sales with sold_count?

It is a cumulative platform count. Repeated snapshots can show observed net changes, but returns, source adjustments and coverage mean you should not treat those differences as verified daily sales or revenue.

Source and current product details: JMLP’s TikTok Shop Actor on Apify.

Other scrapers
you might use.

Let’s talk about
your project.

Tell me what you need to collect or understand. I can help with a custom scraper, a pipeline or the analysis.

Start a project