
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Crawl public websites and extract emails, phone numbers, and social profile links into a table.
Turn any list of websites into a clean contact list. Crawl public sites and collect the emails, phone numbers, and social profile links they already publish, in one tidy row per site or per page. No login, plain HTTP by default, and about $1.50 per 1,000 pages.
Paste a few start URLs, set how deep to crawl, and download the result as JSON, CSV, or Excel. A linktr.ee link-in-bio page is expanded to the sites it lists, so one link can lead you to a whole set of contacts.
linktr.ee pages are expanded to the sites they list.| Field | Type | Description |
|---|---|---|
startUrls | array | Pages to start from. Objects like { "url": "..." } or plain URL strings. |
maxRequestsPerStartUrl | integer | Pages to open per start URL, including the start page. Default 10. |
maxDepth | integer | How many links away to follow. 0 reads only the start pages. Default 2. |
maxRequests | integer | Hard cap on pages across the whole run. Default 100. |
sameDomain | boolean | Follow only links on the same registered domain. Default on. |
mergeContacts | boolean | One merged row per start URL instead of one row per page. Default on. |
considerChildFrames | boolean | Also read same-domain iframes. Default on. |
useBrowser | boolean | Render pages in a browser for JavaScript-added contacts. Default off. |
waitUntil | string | Browser read moment: commit, domcontentloaded, load, networkidle. |
proxyConfiguration | object | Proxy settings. Datacenter is the default. |
{
"startUrls": [{ "url": "https://webscraper.io/" }],
"maxRequestsPerStartUrl": 10,
"maxDepth": 2,
"maxRequests": 100,
"sameDomain": true,
"mergeContacts": true,
"considerChildFrames": true,
"useBrowser": false,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": ["DATACENTER"]
}
}
| Field | Description |
|---|---|
originalStartUrl | The start URL this row belongs to. |
domain | Registered domain of the site. |
url, depth, referrerUrl | Page URL, link depth, and the page that linked to it (per-page rows). |
scrapedUrls | Pages folded into the row (merged rows). |
emails | Email addresses found. |
phones | tel: links and numbers written with a + or separators. |
phonesUncertain | Digit sequences that look like numbers but are not confirmed, such as registration numbers. |
linkedIns, twitters, instagrams, facebooks, youtubes, tiktoks, pinterests, discords, snapchats, threads, telegrams, reddits, whatsapps | Social profile links by network. |
A per-page row from a real run:
{
"originalStartUrl": "https://webscraper.io/contact",
"url": "https://webscraper.io/contact",
"domain": "webscraper.io",
"depth": 0,
"referrerUrl": null,
"emails": ["info@webscraper.io"],
"phones": [],
"phonesUncertain": [],
"linkedIns": ["https://lv.linkedin.com/company/web-scraper"],
"twitters": [],
"instagrams": [],
"facebooks": ["https://www.facebook.com/webscraperio"],
"youtubes": ["https://youtube.com/@WebScraper"],
"tiktoks": [],
"pinterests": [],
"discords": [],
"snapchats": [],
"threads": [],
"telegrams": [],
"reddits": [],
"whatsapps": []
}
With Merge contacts on, the row carries scrapedUrls instead of url and referrerUrl.
You pay $0.0015 per page parsed, which is $1.50 per 1,000 pages. Platform usage (compute and proxy) is billed in addition to that, at the usual platform rates. Datacenter proxy traffic is $1 per GB, and browser pages use browser credits, so leave Use a browser off unless a page needs JavaScript.
Worked example: an 8-page crawl on 4 GB of memory cost $0.012 in page fees plus about $0.0047 in compute and proxy, roughly $0.0167 in total. Failed pages are not charged. If you set a maximum charge, pages already parsed are kept. With Merge contacts on, a site summary that would go over the maximum charge keeps only the first pages the remaining budget pays for, is charged for exactly those pages, and is marked truncatedAtChargeLimit: true; the run then stops.
The actor reads public web pages. Results can contain personal data, so you need a lawful basis to collect and use it, and you should follow the rules that apply to your outreach.
No login is needed. Datacenter proxies are used by default. Switch to residential only if a site refuses datacenter addresses, or supply your own proxy URLs.
Links on the same registered domain, up to the depth and page caps. Social profile hosts are saved on the row and not crawled. linktr.ee outbound sites are crawled even with Stay within domain on.
phonesUncertain?Bare digit sequences are reported separately from numbers clearly formatted as phones. Review them before treating them as contacts.
Empty lists mean nothing of that kind was found on the crawled pages. Many sites publish no phone numbers or no social links.
Yes. Schedule runs, call the actor through the API, and read the dataset in JSON, CSV, or Excel.
If you are moving over a similar contact scraper input from another platform, the field names match; the proxy object is proxyConfiguration.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayRequiredStart URLs
Pages to start from. A link-in-bio page on linktr.ee is expanded to the sites it lists, even when Stay within domain is on.
maxRequestsPerStartUrlintegerOptionaldefault 10Maximum pages per start URL
How many pages to open from each start URL, including the start page itself.
Limit how far the crawl goes and which links it follows.
maxDepthintegerOptionaldefault 2Maximum link depth
How many links away from a start URL to follow. 0 opens only the start pages. Depth counts from a link-in-bio page as well.
maxRequestsintegerOptionaldefault 100Maximum pages for the whole run
Hard cap on pages opened across every start URL.
sameDomainbooleanOptionaldefault trueStay within domain
Follow links only when they share the registered domain of the page that linked them. linktr.ee pages are the exception: their outbound sites are still opened.
Choose how results are combined and how pages are loaded.
mergeContactsbooleanOptionaldefault trueMerge contacts
Combine every email, phone number, and social link found for one start URL into a single row. Turn this off to get one row per page.
considerChildFramesbooleanOptionaldefault trueRead iframes
Also read contact details from iframes on the page. Same-domain frames are fetched. Other frames contribute only the link itself, so ad iframes are not crawled.
useBrowserbooleanOptionaldefault falseUse a browser
Open pages in a browser when the contact details are added by JavaScript. Leave this off for ordinary HTML. Browser pages use browser credits.
waitUntilenumOptionaldefault "domcontentloaded"When to read a browser page
Used only when Use a browser is on.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies are the default. Switch to residential only if a site blocks datacenter addresses, or supply your own proxy URLs.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| originalStartUrl | string | Start URL this row belongs to |
| url | string | Page this row was extracted from. Present when contacts are not merged. |
| domain | string | Registered domain of the page |
| depth | integer | Link depth from the start URL. Merged rows use 0. |
| referrerUrl | string | null | Page that linked here. Empty on the start page and on merged rows. |
| scrapedUrls | array | Pages combined into this row when contacts are merged. |
| emails | array | Email addresses found on the page or pages |
| phones | array | Phone numbers from tel: links or formatted numbers |
| phonesUncertain | array | Digit sequences that look like phone numbers but are not confirmed |
| linkedIns | array | |
| twitters | array | |
| instagrams | array | |
| facebooks | array | |
| youtubes | array | |
| tiktoks | array | |
| pinterests | array | |
| discords | array | |
| snapchats | array | |
| threads | array | |
| telegrams | array | |
| reddits | array | |
| whatsapps | array | |
| truncatedAtChargeLimit | boolean | Present (true) on a merged row that was cut to the pages the run's maximum charge still paid for. |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Scraped page | One web page parsed for emails, phone numbers, and social links. | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/contact-info-scraper').call({
"startUrls": [
{
"url": "https://webscraper.io/"
}
],
"maxRequestsPerStartUrl": 10,
"maxDepth": 2,
"maxRequests": 100,
"sameDomain": true,
"mergeContacts": true,
"considerChildFrames": true,
"useBrowser": false,
"waitUntil": "domcontentloaded",
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/contact-info-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/contact-info-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Emails, phones and social links per crawled page.
Merged contact details from a 2-level crawl.
Contact details found with a real browser.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.