Pinterest Boards Scraper & Pinner Profiles
Pricing
from $3.99 / 1,000 results
Pinterest Boards Scraper & Pinner Profiles
Scrape Pinterest board data quickly and reliably. This actor gathers board details, pin lists, descriptions, and engagement stats from public boards. Built for marketers, analysts, and developers needing structured Pinterest board data.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Pinterest Scraper — Extract Pins, Boards and Pinner Profiles
Pinterest Boards Scraper & Pinner Profiles scrapes every pin on a Pinterest board, profile or pin URL and attaches the public Pinterest profile of whoever posted it — followers, bio, website, claimed domain, merchant and identity verification, pin and board counts. Unlike scraping frameworks that return raw HTML, it returns typed JSON, ready for a spreadsheet, a database or an LLM context window without any parsing. The profile is fetched once per distinct pinner, not once per pin, so a 1,196-pin board with one curator costs one extra request. This guide covers every input and output field, the three list-shaping screens (follower floor, verification, one-row-per-creator), and how teams actually run it — real-time enrichment, scheduled monitoring, and bulk dataset builds.
🧭 What Does Pinterest Boards Scraper & Pinner Profiles Do?
It takes a board URL, a profile URL/username, or a pin URL/ID and returns one row per pin (or one per creator, if you turn that on), each row carrying the pin's content, its board, its board section, and the public profile of the account that pinned it. No Pinterest account or login is required — the client talks to Pinterest's own public /resource/ endpoints logged out.
- 📌 Boards — every pin on a board, walked page by page until Pinterest stops serving pages or your
maxItemscap is hit - 👤 Profiles — every board a profile publishes, scraped board by board, newest-pinned first
- 📍 Pins — a single pin by URL or bare numeric ID, with its own board resolved automatically
- 🗂️ Board sections — optionally tag each pin with the section it sits in
- 👥 Pinner profiles — followers, bio, website, verification flags, joined onto every pin
- 🔎 Pin closeups — optional per-pin detail fetch for creation date, comment count and share count
- 🧍 Creator collapse — fold a whole board into one row per distinct pinner
⚡ Features & Capabilities
The core is a full-detail pin scraper; the pinner-profile join and the two list-shaping screens are what this variant adds on top.
Core features
- 40+ fields per pin, including media variants (
images, six size keys), video metadata (videos,videoDurationMs), outbound link (link,domain), engagement (savesCount,repinCount), and nestedboard/boardInfoobjects pinnerProfilejoin — 18 fields per account:followerCount,followingCount,pinCount,boardCount,about,websiteUrl,domainUrl,domainVerified,impressumUrl,isVerifiedMerchant,verifiedIdentity,isPartner,createdAt,lastPinSaveTime, plus identity fields- One request per distinct pinner — usernames are deduplicated as the feed is walked; each profile is fetched once and fanned back out to every row that account contributed
- Two pinner screens applied before the cap —
minPinnerFollowersandverifiedPinnersOnlyrun after the profile is in hand and before a row counts againstmaxItems, so a filtered run still returns the number of usable rows requested - One row per creator —
uniquePinnersOnlycollapses a board into a creator list, keeping each account's highest-savesCountpin as the representative row - Honest nulls, not zeros — a save count, board pin count or creation date that Pinterest did not send comes back
null, never a fabricated0
When another tool might suit you better
If all you need is the pins themselves — no follower counts, no verification flags, no creator dedupe — the pinner-profile join adds one extra request per distinct account for no benefit to that use case. A plain board-scraping tool with fewer inputs is a better fit for a one-off "get me the pins" job. This Actor earns its keep specifically when the who posted it question matters: partnership sourcing, creator research, or filtering a board down to verified accounts.
Pinterest Boards Scraper & Pinner Profiles within the Scrapio data stack
This Actor covers pins, boards and the profile of who pinned them. For Pinterest ad creatives and advertiser/brand data, use Pinterest Ads Scraper (advertiser and brand search). For a Pinterest shop's product catalogue and prices, use Pinterest Profile Scraper (shop products and prices) — this Actor deliberately does not return price, currency or availability, since Pinterest's public pin data does not carry it reliably.
💼 Why Do Developers and Data Teams Scrape Pinterest?
🏢 Marketing and influencer-partnership teams
Feed a niche board or a set of profile URLs in with minPinnerFollowers set to a partnership floor (1,000 is a reasonable starting point) and uniquePinnersOnly on. The output is a deduplicated creator contact list: user, pinnerProfileUrl, pinnerProfile.followerCount, pinnerProfile.websiteUrl, pinnerProfile.about, and pinnerProfile.isVerifiedMerchant — a sourcing sheet without a single manual profile visit.
📊 AI training data and RAG indexing
title, description, altText and visualAnnotations are the pin's high-information text fields; pinnerProfile.about is the creator's bio. For RAG enrichment, index description and about alongside the pin/profile URLs so retrieval can cite the source. For training data, followerCount, pinCount, boardCount and the verification booleans are consistently structured numeric/boolean fields across every row, with no text parsing required before they hit a feature vector.
📱 Competitive and content intelligence
Track savesCount (aggregated saves across every duplicate of an image) and repinCount (this pin's own saves) over repeated scheduled runs of a competitor's board to see which pins and which board sections are gaining traction, and which pinners are driving it.
🔬 Research and academic use
Public board and profile data supports research into content curation networks, creator-economy structure, and platform verification patterns. Only publicly accessible pages are scraped — no private boards, no authenticated-only data.
🎥 Product and SaaS development
pinnerProfile and the board/section structure are enough to build a directory product (searchable creator database) or a monitoring tool (board-change alerts) on top of scheduled runs, without building or maintaining a Pinterest scraping layer yourself.
🍚 Input Parameters
All eleven parameters, read directly from .actor/actor.json. urls is the only required field.
| Parameter | Required | Type | Default | Description |
|---|---|---|---|---|
urls | Yes | array (stringList) | — | Board URLs (https://www.pinterest.com/<user>/<board>/), profile URLs or bare usernames, and pin URLs or bare pin IDs. One per line. |
maxItems | No | integer | 10 (min 1, max 5000) | Maximum pins kept per board, counted after the pinner screens below. |
fetchLinkDetails | No | boolean | true | Fill link / externalLink / domain. Off returns all three as null. |
fetchPinDetails | No | boolean | false | Open each pin's closeup for date, commentCount, shareCount, its section and pinner.followerCount. One extra request per pin. |
maxPinDetailFetches | No | integer | 50 (min 0, max 5000) | Ceiling on the closeup requests above, across the whole run. 0 = no ceiling. |
includeBoardSections | No | boolean | false | Stamp sectionId / sectionTitle / sectionSlug on each pin. Roughly one request per 50 section pins. |
includePinnerProfiles | No | boolean | true | Fill pinnerProfile with the account's public profile. Off leaves it null on every row (pinnerProfileUrl still resolves). |
minPinnerFollowers | No | integer | 0 (min 0, max 100000000) | Drop pins from accounts below this follower count. 0 keeps every account. |
verifiedPinnersOnly | No | boolean | false | Keep only accounts with Pinterest MERCHANT or IDENTITY verification. |
uniquePinnersOnly | No | boolean | false | One row per creator instead of one per pin, keeping the highest-savesCount pin as the representative row. |
maxProfileFetches | No | integer | 0 (min 0, max 5000) | Ceiling on UserResource (profile) requests for the whole run. 0 = no ceiling. |
proxyConfiguration | No | object (proxy editor) | {"useApifyProxy": false} | Your own proxy selection — groups, country and custom proxy URLs all reach the fetch layer. |
{"urls": ["https://www.pinterest.com/craftmartpins/home-decor/","https://www.pinterest.com/HGTV/hgtv-dream-home/"],"maxItems": 250,"fetchLinkDetails": true,"fetchPinDetails": false,"includeBoardSections": true,"includePinnerProfiles": true,"minPinnerFollowers": 1000,"verifiedPinnersOnly": false,"uniquePinnersOnly": true,"maxProfileFetches": 0,"proxyConfiguration": { "useApifyProxy": false }}
Supported URL types and input formats
Each line in urls is classified independently, so a single run can mix boards, profiles and pins:
- Board —
https://www.pinterest.com/officialflawliz/cherry-cola-lips/→ every pin on that board - Profile —
https://www.pinterest.com/HGTV/or the bare usernameHGTV→ every board that profile publishes - Pin —
https://www.pinterest.com/pin/1234567890123456789/or the bare numeric ID1234567890123456789→ that single pin
A path with two segments where the second is not _saved, _created, pins or boards is read as a board; a bare numeric string is read as a pin ID; everything else is read as a profile username.
📦 Output Format
Every run produces typed, normalized JSON rows in the Actor's dataset — one row per pin (or per creator, in collapse mode) plus one uncharged accounting row per target that could not be scraped. Export from the Apify Console or API as JSON, CSV, Excel or XML.
Output for a pin
Every key build_pin_row() writes, in full — the dataset's default view surfaces 18 of these; the rest are still on every row:
{"type": "pin","id": "987654321098765432","index": 1,"pinUrl": "https://www.pinterest.com/pin/987654321098765432/","sourceUrl": "https://www.pinterest.com/craftmartpins/home-decor/","title": "Cozy farmhouse entryway makeover","gridTitle": "Farmhouse entryway","description": "Warm neutral tones, reclaimed wood bench, layered textiles.","altText": "Farmhouse-style entryway with a wood bench and woven baskets","visualAnnotations": ["home decor", "entryway", "farmhouse style"],"imageUrl": "https://i.pinimg.com/736x/aa/bb/cc/aabbcc112233445566.jpg","images": [{ "url": "https://i.pinimg.com/236x/aa/bb/cc/....jpg", "width": 236, "height": 354, "quality": "236x", "extension": "jpg" },{ "url": "https://i.pinimg.com/736x/aa/bb/cc/....jpg", "width": 736, "height": 1104, "quality": "736x", "extension": "jpg" },{ "url": "https://i.pinimg.com/originals/aa/bb/cc/....jpg", "width": 1200, "height": 1800, "quality": "orig", "extension": "jpg" }],"dominantColor": "#B08D6B","imageSignature": "a1b2c3d4e5f6","hasVideo": false,"videoDurationMs": null,"videos": null,"isIdeaPin": false,"isRepin": true,"repins": 412,"savesCount": 412,"repinCount": 37,"commentCount": null,"shareCount": null,"date": null,"externalLink": "https://craftmartpins.com/blog/farmhouse-entryway","link": "https://craftmartpins.com/blog/farmhouse-entryway","domain": "craftmartpins.com","boardName": "Home Decor","sectionId": "5551112223334445556","sectionTitle": "Entryways","sectionSlug": "entryways","board": {"id": "1112223334445556667","url": "https://www.pinterest.com/craftmartpins/home-decor/","privacy": "public","name": "Home Decor"},"boardInfo": {"boardName": "Home Decor","boardDescription": "Ideas for every room, curated weekly.","boardUrl": "https://www.pinterest.com/craftmartpins/home-decor/","totalPins": 2943,"boardId": "1112223334445556667","boardPrivacy": "public","boardFollowerCount": 18420,"boardSectionCount": 12,"boardCollaboratorCount": 3,"boardIsCollaborative": true,"boardCreatedAt": "2019-03-11T14:02:09Z","boardOwnerUsername": "craftmartpins"},"user": "craftmartpins","pinner": {"id": "665544332211","fullName": "Craftmart Pins","username": "craftmartpins","imageUrl": "https://i.pinimg.com/236x/pp/pp/pp/profile.jpg","isVerifiedMerchant": false,"followerCount": null},"nativeCreator": null,"scrapedAt": "2026-08-04T10:15:32Z","pinnerProfile": {"id": "665544332211","username": "craftmartpins","fullName": "Craftmart Pins","about": "DIY home decor, one project at a time.","followerCount": 18420,"followingCount": 312,"pinCount": 8901,"boardCount": 47,"websiteUrl": "https://craftmartpins.com","domainUrl": "craftmartpins.com","domainVerified": true,"impressumUrl": null,"isVerifiedMerchant": false,"verifiedIdentity": false,"isPartner": true,"createdAt": "2016-05-02T09:11:00Z","lastPinSaveTime": "2026-08-03T21:40:12Z","imageXlargeUrl": "https://i.pinimg.com/originals/pp/pp/pp/profile-xl.jpg"},"pinnerProfileFetched": true,"pinnerProfileUrl": "https://www.pinterest.com/craftmartpins/","pinnerPinsOnThisBoard": 1,"pinsDroppedByFilter": 58}
pinner.followerCount is null unless fetchPinDetails supplied a closeup — the board-grid pinner object never carries a follower count on its own. nativeCreator, when present, has the same shape as pinner minus followerCount (no Pinterest surface reached by this Actor carries a follower count for that field).
Output for a pinner profile
pinnerProfile is null when includePinnerProfiles is off, the account could not be resolved, or maxProfileFetches was reached before that account was seen. pinnerProfileFetched distinguishes "not fetched" from "fetched and turned out empty." An error row (see below) carries the same key with a null value so columns line up on export.
Board & section data, and error rows
boardInfo (nested on every pin row, shown above) is the only place a board's own metadata lives — totalPins, boardFollowerCount, boardCreatedAt and boardOwnerUsername come exclusively from the target board's own BoardResource call, never estimated. A target that cannot be reached (bad URL, deleted board, transport failure) produces one uncharged error row instead of vanishing silently:
{"type": "error","id": null,"index": null,"sourceUrl": "https://www.pinterest.com/this-board-does-not-exist/","errorReason": "target_not_found","errorMessage": "board /this-board-does-not-exist/ returned no data","scrapedAt": "2026-08-04T10:15:00Z","pinnerProfile": null,"pinnerProfileFetched": false,"pinnerProfileUrl": null,"pinnerPinsOnThisBoard": null,"pinsDroppedByFilter": 0}
Filter these out of any downstream pipeline with type === "pin" (or type !== "error").
Schema stability and export options
Field names are fixed by this Actor's own row builder, not by Pinterest's raw response shape — Pinterest's internal snake_case keys (follower_count, is_verified_merchant, …) are re-keyed to camelCase before they ever reach the dataset, so a Pinterest front-end change does not rename your columns. A count Pinterest did not send is null, never a substituted 0 or "". Export any run's dataset from the Apify Console or via apify_client as JSON, CSV, Excel (XLSX) or XML; the dataset also exposes two extra pre-built views (creators and enrichment) alongside the default pin view for quicker inspection in the Console.
💡 Pinterest Boards Scraper & Pinner Profiles Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run whenever a new Pinterest board or pin URL lands in your system — a form submission, a CRM record, a lead list. Run the Actor with that single URL in urls and includePinnerProfiles: true, then read pinnerProfile.followerCount, pinnerProfile.websiteUrl, pinnerProfile.isVerifiedMerchant and pinnerProfile.domainVerified straight off the pushed row and write them back onto the CRM record as enrichment fields — no separate profile lookup step.
🎯 Strategy 2: Scheduled monitoring and alerting
Set up an Apify Schedule to re-run the Actor against the same tracked board URLs daily or weekly. Export each run's dataset and diff savesCount, repinCount and boardInfo.totalPins against the previous run's export on the same id values; alert when a pin's savesCount jumps sharply or a new sectionId appears. The Actor has no built-in diffing — the comparison happens in your own pipeline against the exported rows.
🎯 Strategy 3: Bulk dataset build
For a research or training corpus, put every target board/profile URL as its own line in urls for one run; the Actor works through them in order and pushes every kept row to that run's single dataset. There is no documented per-run concurrency setting — for very large lists, split urls across several runs (via the Apify API) and merge the resulting datasets afterward. Export the finished dataset to CSV or JSON for loading into a database or notebook.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | CRM / lead scoring | Single-target, on-demand run | One JSON row per target, written back to a field |
| Scheduled monitoring | Board/creator tracking over time | Recurring Apify Schedule | Dataset diffed run-over-run |
| Bulk dataset build | Research or training corpora | One run with a large urls list, or sharded runs | Dataset export to CSV/JSON |
🌴 Related Pinterest Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| Pinterest Ads Scraper — advertiser and brand search | Pinterest ad creatives, advertiser and brand data |
| Pinterest Profile Scraper — shop products and prices | A Pinterest profile's shop catalogue and prices |
| X (Twitter) Tweets & Profiles Scraper — with follower lists | Same content-plus-creator-profile pattern, on X/Twitter |
| Reddit Subreddit Members Scraper — with user profiles | Community members and their public profiles, on Reddit |
🔌 How to Integrate Pinterest Boards Scraper & Pinner Profiles With Your Stack
Pinterest Boards Scraper & Pinner Profiles works with any language or tool that can make an HTTP request — the examples below use Apify's official client libraries.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<APIFY_API_TOKEN>")run_input = {"urls": ["https://www.pinterest.com/craftmartpins/home-decor/"],"maxItems": 250,"includePinnerProfiles": True,"minPinnerFollowers": 1000,"uniquePinnersOnly": True,}run = client.actor("<YOUR_APIFY_USERNAME>/pinterest-boards-scraper-and-pinner-profiles").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("pinterest_creators.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(["user", "pinnerProfileUrl", "followerCount", "websiteUrl", "pinnerPinsOnThisBoard"])for row in rows:profile = row.get("pinnerProfile") or {}writer.writerow([row.get("user"),row.get("pinnerProfileUrl"),profile.get("followerCount"),profile.get("websiteUrl"),row.get("pinnerPinsOnThisBoard"),])print(f"Wrote {len(rows)} rows.")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_API_TOKEN });const input = {urls: ['https://www.pinterest.com/craftmartpins/home-decor/'],maxItems: 250,includePinnerProfiles: true,minPinnerFollowers: 1000,};const run = await client.actor('<YOUR_APIFY_USERNAME>/pinterest-boards-scraper-and-pinner-profiles').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const row of items) {console.log(row.user, row.pinnerProfile?.followerCount, row.pinUrl);}
Async and scheduled pipelines
There is no webhook fired from inside the Actor's own code, but the Apify platform can call one for you on any run — configure a webhook on the run-finished event from the Console or the API to push a notification once a run completes. For recurring jobs, use an Apify Schedule (cron) to re-run the Actor on a fixed interval instead of polling. For a one-off large job, start the run with apify_client and poll client.run(run_id).get() for its status, or just call .call(), which blocks until the run finishes.
🎯 Who Needs Pinterest Boards Scraper & Pinner Profiles? (Use Cases & Industries)
🏢 Marketing and influencer-partnership teams
Building a creator outreach list from a niche board: set minPinnerFollowers to a partnership floor, uniquePinnersOnly to true, and read pinnerProfile.websiteUrl, pinnerProfile.about and pinnerProfile.isVerifiedMerchant off the resulting one-row-per-creator dataset.
📊 E-commerce and brand teams
Tracking which pinners are driving saves on a product board over time, using savesCount, repinCount and pinnerProfile.followerCount to prioritize which accounts to engage.
📱 Content and social media strategists
Pulling a competitor's board structure — boardInfo.boardSectionCount, sectionTitle per pin, and boardInfo.boardFollowerCount — to understand how a rival organizes and grows a topic.
🔬 Researchers
Studying creator-economy structure or content-curation networks using only public board, pin and profile data — no private boards, no authenticated-only fields.
🎥 Product and SaaS builders
Building a Pinterest-creator directory or a board-monitoring tool on top of scheduled runs, using pinnerProfile and boardInfo as the underlying data layer instead of maintaining a Pinterest scraping stack in-house.
⚖️ Is It Legal to Scrape Pinterest?
Scraping publicly accessible web pages is generally lawful in the United States — courts have repeatedly distinguished scraping public data from unauthorized computer access, notably in hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), which held that scraping data a site makes publicly available does not violate the Computer Fraud and Abuse Act. That precedent concerned a different platform and does not guarantee an outcome for every jurisdiction or every use of Pinterest data — consult counsel for your specific situation.
Separately, scraping in a way that breaches Pinterest's own Terms of Service can expose you to civil claims (breach of contract), which is a different question from criminal or CFAA liability. This Actor returns pinnerProfile data — real names, bios, follower counts and websites tied to identifiable individuals or brand accounts — which is personal data under GDPR and CCPA-type frameworks. The lawful basis for collecting, storing and using it is the user's responsibility, not this Actor's.
Pinterest Boards Scraper & Pinner Profiles returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.
❓ Frequently Asked Questions
Does Pinterest Boards Scraper & Pinner Profiles work without a Pinterest account?
Yes. The Actor's client talks to Pinterest's public /resource/ endpoints logged out — no cookie, no CSRF token, no Pinterest login. You only need an Apify account to run the Actor itself.
How does it handle Pinterest's anti-scraping measures?
It impersonates a real browser TLS/HTTP fingerprint (curl_cffi, Chrome 131), retries transport failures and HTTP 403/429/5xx responses up to three times with a short backoff, treats an HTTP 200 response with an empty body as a soft block and retries that too, and rotates through your configured proxy on each retry if proxyConfiguration is set.
Can I run it at scale without getting blocked?
There is no published uptime or success-rate figure. The code does have real hard ceilings: board-feed pagination stops after 200 pages (up to 50,000 scanned pins per board before maxItems even applies), a board section's own pin listing stops after 60 pages, and a profile's board listing stops after 40 pages. Within those, the pinner-profile join scales with distinct accounts, not pins — a single-curator board costs one extra request, a repin-heavy board can approach one per pin. Watch the distinct-account count the Actor logs per board before scaling a run.
How fresh is the data Pinterest Boards Scraper & Pinner Profiles returns?
It is a live fetch on every run — there is no caching layer. Every row carries scrapedAt, the timestamp of that run.
Which Pinterest fields work best for AI training and RAG indexing?
For RAG, index description, altText and pinnerProfile.about alongside the pin and profile URLs so retrieval can cite the source. For training data, pinnerProfile.followerCount, pinCount, boardCount and the verification booleans (isVerifiedMerchant, verifiedIdentity, domainVerified) are consistently structured typed primitives across every row — no text parsing or normalization needed before feature extraction.
Is scraping and storing Pinterest pinner profiles GDPR- or CCPA-compliant?
The Actor returns only publicly available Pinterest profile data. Whether your storage and use of that data satisfies GDPR, CCPA or an equivalent framework depends on your own purpose and jurisdiction — that lawful-basis determination sits with you, not with the Actor.
Does Pinterest Boards Scraper & Pinner Profiles work with Claude, ChatGPT and other AI agent tools?
It is not exposed through an MCP server. It is callable as a standard Apify Actor run by any agent framework that can make an HTTP request or use apify_client — every response is typed JSON, so an agent can consume it directly without an HTML-parsing step.
What happens if my minPinnerFollowers or verifiedPinnersOnly filter removes every pin?
The run fails loudly instead of finishing green with an empty dataset — it raises an error naming how many pins were scraped and dropped, and by which screen, so you can lower the floor or turn verification off rather than silently getting zero rows.
ℹ️ Disclaimer
Pinterest Boards Scraper & Pinner Profiles extracts only publicly available data from Pinterest. This tool is intended for lawful use cases only. Users are responsible for complying with Pinterest's terms of service and applicable data protection laws in their jurisdiction.