Pinterest Easy Scraper avatar

Pinterest Easy Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Pinterest Easy Scraper

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

codemaster devops

Maintained by Community

Actor 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.

FieldRecord typeDescription
recordTypeprofile, pinShows whether the row is a profile record or a pin record.
usernameprofilePinterest username.
fullNameprofilePublic display name from the profile.
aboutprofilePublic profile bio or about text.
profileUrlprofileCanonical Pinterest profile URL.
imageLargeUrlprofilePublic profile image URL.
pinCountprofileNumber of pins reported by Pinterest when available.
followerCountprofileNumber of followers reported by Pinterest when available.
verifiedprofileWhether Pinterest marks the profile as verified.
idpinPinterest pin ID.
profilepinUsername that the pin came from.
pinUrlpinCanonical Pinterest pin URL.
titlepinPin title when available.
descriptionpinPin description.
linkpinOutbound URL attached to the pin.
domainpinDomain of the outbound URL.
imagepinBest available image object with URL, width, and height.
boardpinBoard ID, name, and URL when available.
aggregatedStatspinEngagement 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

  1. Open the actor in Apify Console.
  2. Add one or more Pinterest profile URLs or usernames in startUrls.
  3. Choose maxPinsCnt, which controls how many pins to collect per profile.
  4. Keep Apify Proxy enabled with the RESIDENTIAL group, or provide your own residential proxy URLs.
  5. Click Start.
  6. Open the Dataset tab when the run finishes.
  7. 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.

InputRequiredDefaultHow to use it
startUrlsyesnoneAdd Pinterest profile URLs or bare usernames. Examples: https://www.pinterest.com/herbalshotzOfficial/, www.pinterest.com/natgeo/, natgeo.
maxPinsCntno50Maximum pins to save per profile. Use 1-25 for fast small runs. Use larger values for pagination.
includeRawnofalseSet to true only if you need extra raw Pinterest fields. Leave false for cleaner CSV and Excel exports.
widgetFirstnotrueKeep enabled. Small runs start with the public Pinterest widget endpoint.
fallbackToBrowsernofalseEnable only when HTTP tiers repeatedly fail for a profile. It costs more memory and runtime.
proxyConfigyesApify Residential ProxyUse Apify Proxy with RESIDENTIAL, or provide your own residential proxy URLs.
minConcurrencyno1Minimum parallel requests. Keep at 1 for most runs.
maxConcurrencyno5Maximum parallel requests. Use 2-5 to reduce Pinterest rate limiting.
maxRequestRetriesno5Retry limit for failed requests.
requestHandlerTimeoutSecsno30Timeout for processing one request.
minDelayMsno500Minimum random delay before each request.
maxDelayMsno2000Maximum 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=recipes
https://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 maxPinsCnt at 25 or less for quick profile checks.
  • Keep fallbackToBrowser disabled unless you need it.
  • Use low concurrency such as maxConcurrency: 2 or 3.
  • 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: 25 to confirm your input.
  • Keep widgetFirst: true.
  • Use Apify Residential Proxy for cloud runs.
  • Use maxConcurrency between 2 and 5.
  • Increase minDelayMs and maxDelayMs if you see 429 or 403 responses.
  • Enable includeRaw only when you need additional Pinterest fields.
  • Enable fallbackToBrowser only 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 ci
New-Item -ItemType Directory -Force -Path storage/key_value_stores/default
Copy-Item examples/basic-input.json storage/key_value_stores/default/INPUT.json
apify 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.