Pinterest Easy Scraper
Pricing
$19.99/month + usage
Pinterest Easy Scraper
Discover unlimited public data on Pinterest with our Easy Scraper. Dive into profiles and "pins" with more depth than ever. Your free, go-to tool for seamless Pinterest insights.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
codemaster devops
Maintained by CommunityActor stats
5
Bookmarked
154
Total users
1
Monthly active users
22 days ago
Last modified
Categories
Share
What does Pinterest Scraper do?
Pinterest Scraper extracts public profile information and public pins from Pinterest profiles. It is a Pinterest data extraction actor for users who need profile metadata, pin URLs, image URLs, board names, outbound links, descriptions, and engagement stats in a clean Apify dataset.
This actor is built for Pinterest profile pages. It accepts profile URLs and bare usernames. It does not scrape Pinterest search result pages, board pages, pin detail pages as start URLs, private content, login-only data, messages, emails, or any hidden user data.
Why use this Pinterest Scraper?
Use this actor when you need Pinterest profile and pin data without manually opening profiles and copying pin details.
Common use cases:
- Track public Pinterest content from brands, creators, shops, and competitors.
- Collect pin images, descriptions, source links, and board metadata for content research.
- Export Pinterest profile and pin data to JSON, CSV, Excel, HTML, RSS, or XML from Apify.
- Schedule recurring Pinterest monitoring runs in Apify Console.
- Connect results to webhooks, Google Sheets, Make, Zapier, or your own API workflow.
The actor uses a tiered scraping flow. Small runs use Pinterest's public widget endpoint when possible. Larger runs use Pinterest resource endpoints with pagination. A browser fallback is available for difficult profiles, but it is disabled by default because it costs more compute.
What data can Pinterest Scraper extract?
The actor creates one dataset record for each scraped profile and one dataset record for each scraped pin.
| Field | Record type | Description |
|---|---|---|
recordType | profile, pin | Shows whether the row is a profile record or a pin record. |
username | profile | Pinterest username. |
fullName | profile | Public display name from the profile. |
about | profile | Public profile bio or about text. |
profileUrl | profile | Canonical Pinterest profile URL. |
imageLargeUrl | profile | Public profile image URL. |
pinCount | profile | Number of pins reported by Pinterest when available. |
followerCount | profile | Number of followers reported by Pinterest when available. |
verified | profile | Whether Pinterest marks the profile as verified. |
id | pin | Pinterest pin ID. |
profile | pin | Username that the pin came from. |
pinUrl | pin | Canonical Pinterest pin URL. |
title | pin | Pin title when available. |
description | pin | Pin description. |
link | pin | Outbound URL attached to the pin. |
domain | pin | Domain of the outbound URL. |
image | pin | Best available image object with URL, width, and height. |
board | pin | Board ID, name, and URL when available. |
aggregatedStats | pin | Engagement stats such as saves when Pinterest returns them. |
If you enable includeRaw, pin records also include a sanitized raw object. Profile key-value store records include sanitized raw profile fields.
How to scrape Pinterest profiles
- Open the actor in Apify Console.
- Add one or more Pinterest profile URLs or usernames in
startUrls. - Choose
maxPinsCnt, which controls how many pins to collect per profile. - Keep Apify Proxy enabled with the
RESIDENTIALgroup, or provide your own residential proxy URLs. - Click Start.
- Open the Dataset tab when the run finishes.
- Download the results as JSON, CSV, Excel, HTML, RSS, or XML.
For a quick first run, use one profile and maxPinsCnt: 25. This usually stays on the faster widget tier.
Input
See the Input tab in Apify Console for the full form. These are the options users normally need.
| Input | Required | Default | How to use it |
|---|---|---|---|
startUrls | yes | none | Add Pinterest profile URLs or bare usernames. Examples: https://www.pinterest.com/herbalshotzOfficial/, www.pinterest.com/natgeo/, natgeo. |
maxPinsCnt | no | 50 | Maximum pins to save per profile. Use 1-25 for fast small runs. Use larger values for pagination. |
includeRaw | no | false | Set to true only if you need extra raw Pinterest fields. Leave false for cleaner CSV and Excel exports. |
widgetFirst | no | true | Keep enabled. Small runs start with the public Pinterest widget endpoint. |
fallbackToBrowser | no | false | Enable only when HTTP tiers repeatedly fail for a profile. It costs more memory and runtime. |
proxyConfig | yes | Apify Residential Proxy | Use Apify Proxy with RESIDENTIAL, or provide your own residential proxy URLs. |
minConcurrency | no | 1 | Minimum parallel requests. Keep at 1 for most runs. |
maxConcurrency | no | 5 | Maximum parallel requests. Use 2-5 to reduce Pinterest rate limiting. |
maxRequestRetries | no | 5 | Retry limit for failed requests. |
requestHandlerTimeoutSecs | no | 30 | Timeout for processing one request. |
minDelayMs | no | 500 | Minimum random delay before each request. |
maxDelayMs | no | 2000 | Maximum random delay before each request. Increase delays if you see rate limits. |
Supported start URL formats
These work:
https://www.pinterest.com/herbalshotzOfficial/www.pinterest.com/herbalshotzOfficial/https://www.pinterest.com/en-gb/herbalshotzOfficial/herbalshotzOfficial
These are not supported as start targets:
https://www.pinterest.com/pin/123456789012345678/https://www.pinterest.com/search/pins/?q=recipeshttps://www.pinterest.com/exampleuser/example-board/
Example input
Use this input for a simple Apify Proxy run:
{"startUrls": ["https://www.pinterest.com/herbalshotzOfficial/","natgeo"],"maxPinsCnt": 25,"includeRaw": false,"widgetFirst": true,"fallbackToBrowser": false,"proxyConfig": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]},"minConcurrency": 1,"maxConcurrency": 3,"maxRequestRetries": 5,"requestHandlerTimeoutSecs": 30,"minDelayMs": 500,"maxDelayMs": 2000}
Use this input if you bring your own residential proxy:
{"startUrls": ["https://www.pinterest.com/herbalshotzOfficial/"],"maxPinsCnt": 50,"includeRaw": true,"widgetFirst": true,"fallbackToBrowser": false,"proxyConfig": {"useApifyProxy": false,"proxyUrls": ["http://username:password@residential-proxy.example.com:8000"]},"minConcurrency": 1,"maxConcurrency": 2,"maxRequestRetries": 5,"requestHandlerTimeoutSecs": 45,"minDelayMs": 1000,"maxDelayMs": 3000}
The same examples are available in examples/basic-input.json and examples/custom-proxy-input.json.
Output
The actor stores results in the default Apify dataset. You can download the dataset in JSON, CSV, Excel, HTML, RSS, or XML.
The actor also stores each profile in the key-value store under a stable key shaped like:
profile-<sanitizedUsername>-<hash>
If DEBUG_SNAPSHOT=1 or DEBUG_SNAPSHOT=true is set as an environment variable, debug samples are stored under debug-* keys.
Example profile record
{"recordType": "profile","username": "exampleuser","fullName": "Example Creator","about": "Ideas, recipes, and inspiration.","websiteUrl": "https://www.example.com/","profileUrl": "https://www.pinterest.com/exampleuser/","imageLargeUrl": "https://i.pinimg.com/60x60_RS/example.jpg","pinCount": 123,"boardCount": 45,"followerCount": 6789,"followingCount": 12,"country": "US","locale": "en-US","verified": false}
Example pin record
{"recordType": "pin","id": "123456789012345678","profile": "exampleuser","sourceUrl": "https://www.pinterest.com/exampleuser/","pinUrl": "https://www.pinterest.com/pin/123456789012345678/","title": "Example dinner idea","description": "A simple example idea saved from the web.","link": "https://www.example.com/article","domain": "example.com","createdAt": "Tue, 01 Jan 2025 12:00:00 +0000","image": {"url": "https://i.pinimg.com/originals/example.jpg","width": 736,"height": 1104},"board": {"id": "987654321","name": "Example Ideas","url": "/exampleuser/example-ideas/"},"commentCount": 0,"richMetadata": {"title": "Example article","site_name": "Example"},"aggregatedStats": {"saves": 150,"done": 2}}
How much will it cost to scrape Pinterest?
Cost depends on the number of profiles, maxPinsCnt, proxy type, retry behavior, and whether the browser fallback is enabled.
For lower cost:
- Keep
maxPinsCntat25or less for quick profile checks. - Keep
fallbackToBrowserdisabled unless you need it. - Use low concurrency such as
maxConcurrency: 2or3. - Increase delays instead of raising concurrency if Pinterest rate-limits requests.
Residential proxy traffic is more expensive than datacenter proxy traffic, but Pinterest commonly blocks datacenter IPs. For reliable runs, use Apify Proxy with the RESIDENTIAL group or your own residential proxy URLs.
Tips for reliable Pinterest scraping
- Start with one profile and
maxPinsCnt: 25to confirm your input. - Keep
widgetFirst: true. - Use Apify Residential Proxy for cloud runs.
- Use
maxConcurrencybetween2and5. - Increase
minDelayMsandmaxDelayMsif you see429or403responses. - Enable
includeRawonly when you need additional Pinterest fields. - Enable
fallbackToBrowseronly for profiles that fail through the HTTP tiers.
Troubleshooting
The actor says Apify Proxy must include RESIDENTIAL
Pinterest blocks many datacenter IPs. If useApifyProxy is true, set:
{"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}
If you do not want to use Apify Proxy, set useApifyProxy to false and provide your own residential proxyUrls.
The run returns fewer pins than requested
Pinterest may return fewer public pins than the requested maxPinsCnt, may repeat pagination cursors, or may temporarily rate-limit requests. The actor stops safely instead of looping forever.
The widget endpoint fails for a profile
Some regions or profiles may not return usable widget data. The actor falls back to the resource tier automatically. If all HTTP tiers fail and you still need the profile, try fallbackToBrowser: true.
Can this scrape boards, searches, or individual pin pages?
Not as start URLs. This actor is designed for profile URLs and usernames. It collects pins that Pinterest returns for those profiles.
API access
Every Apify actor can be run through the Apify API. Open the API tab on the actor page to copy ready-made code snippets for JavaScript, Python, curl, and other clients.
The most important API input field is startUrls. Example:
{"startUrls": ["natgeo"],"maxPinsCnt": 25,"proxyConfig": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Local development
Use Apify CLI for local actor runs so input, storage, and environment behavior match the Apify platform.
npm ciNew-Item -ItemType Directory -Force -Path storage/key_value_stores/defaultCopy-Item examples/basic-input.json storage/key_value_stores/default/INPUT.jsonapify run --purge
If you want to test the browser fallback locally, install Chromium first:
npx playwright install --with-deps chromium
Technical notes
- The main crawler is a
CheerioCrawler. - The optional browser fallback uses
PlaywrightCrawler. - Profile and pin records are pushed with
Actor.pushData. - Profile lookup records are stored with
Actor.setValue. - Dataset, output, and key-value store schemas are wired in
.actor/actor.json. - The actor includes tests for input parsing, headers, routing, session behavior, and each scraping tier.
Responsible use
This actor extracts public Pinterest data. It does not extract private user data such as emails, messages, or hidden profile details. Results can still contain personal data if a Pinterest user has publicly shared it. You should only scrape and process personal data when you have a lawful reason to do so and when your use complies with applicable laws and Pinterest's terms.
Support
If a profile stops working, open an issue with:
- The profile URL or username.
- Your input JSON with proxy credentials removed.
- The run ID from Apify Console.
- Whether you used Apify Residential Proxy or custom residential proxies.
