Pinterest Boards Scraper With Product Prices & Stores
Pricing
from $5.99 / 1,000 results
Pinterest Boards Scraper With Product Prices & Stores
Automate Pinterest board data collection at scale. Pinterest Boards Scraper pulls board metadata, pins, media URLs, and performance metrics. Perfect for SEO research, trend tracking, brand monitoring, and analytics workflows.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Pinterest Boards Scraper — Pins, Product Prices and Store Data
Point this Pinterest boards scraper at a board, profile or pin URL and get back every pin's content — plus, where Pinterest publishes it, the merchant behind the outbound link and a product row with real price, list price, discount % and in-stock flag from Shop-the-look pins. Every response is structured JSON, ready to pass straight to an LLM, load into a spreadsheet, or feed a price-monitoring pipeline. It runs logged out, needs no Pinterest account, and re-measures its own product-price coverage inside every run so you can audit the numbers on your own boards instead of trusting a table in a README.
🧭 What is Pinterest Boards Scraper With Product Prices & Stores?
It is a Pinterest board, profile and pin scraper that returns the full pin record — image variants, alt text, saves, board and section metadata, outbound link and domain — and adds a merchant/store record and Shop-the-look product line items for the minority of pins that carry them. It does not require a Pinterest login, cookie, or API key: every request hits Pinterest's public, logged-out /resource/ endpoints.
What makes it different from a plain board scraper is that it reads the merchant and product data Pinterest already publishes on collection pins — at no extra request cost — instead of stopping at the pin's image and caption.
- 📌 Full base pin data: image variants, alt text, saves/repins, board and section metadata, outbound link and domain
- 🏪 Merchant/store record: name, destination site URL and domain, page title/description, locale, Pinterest's own link-status code
- 🛒 Product line items from Shop-the-look pins: price, list price, discount %, in-stock flag, purchase URL
- 🎯 Query controls: max kept pins per target, product-pins-only filter, store-domain filter, min/max price band
- 🕒 Optional extra-request enrichments: pin engagement details (comments, shares, creation date), board-section attribution
🛒 What data can you get with Pinterest Boards Scraper With Product Prices & Stores?
The Actor pushes three row types to the dataset — pin rows, product child rows, and uncharged error rows — plus a nested store record on any pin whose destination Pinterest has published.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
Pin (type: "pin") | id, title, description, imageUrl, images[], videos, savesCount, repinCount, link, domain, board, boardInfo, user, pinner, store, merchantName, productCount, productPriceMin/productPriceMax, products[] | Board content inventory, engagement and merchant tracking |
Product (type: "product") | productName, price, priceValue, currency, standardPrice, discountPercent, inStock, purchaseUrl, itemDomain, merchantName | Price and stock monitoring, catalogue building |
Error (type: "error", uncharged) | sourceUrl, errorReason, errorMessage | Run diagnostics for a board, profile or pin that doesn't exist or wasn't reachable |
🏪 Store & product pricing (Shop-the-look pins)
This is the capability a plain Pinterest board scraper doesn't have. When a pin carries a collection_pin block — Pinterest's "Shop the look" format — the Actor reads every item in it and turns it into a products[] array on the pin row and a separate type: "product" child row per item, plus a store object built from the pin's own destination-link metadata. Both cost zero extra Pinterest requests: the data already rides on the board feed. A price only exists where Pinterest published one — an item with no offer ships with price/priceValue/currency as null, never 0.
{"id": "487293841029384756","type": "pin","isProductPin": true,"productCount": 2,"productPriceMin": 24.99,"productPriceMax": 39.5,"productCurrency": "USD","merchantName": "West Elm","store": {"merchantName": "West Elm","siteUrl": "https://www.westelm.com/products/mid-century-planter","siteDomain": "westelm.com","linkStatus": 200,"source": "grid+closeup"},"products": [{"productName": "Mid-Century Ceramic Planter","price": "$24.99","priceValue": 24.99,"currency": "USD","standardPrice": "$29.99","discountPercent": 16.7,"inStock": true,"purchaseUrl": "https://www.westelm.com/products/mid-century-planter"}]}
📁 Pin engagement & board-section enrichment
Two optional toggles add a second layer of data at the cost of one extra Pinterest request per pin: fetchPinDetails fills date (ISO 8601 creation time), commentCount, shareCount and the pinner's follower count — all null without it, since the board grid carries no creation date. includeBoardSections walks the board's declared sections and stamps sectionId/sectionTitle/sectionSlug onto each pin it covers, useful for splitting a merchant catalogue board into its own product categories.
⚡ How does this differ from the official Pinterest API?
Pinterest publishes an official API (v5), but per Pinterest's own developer documentation (developers.pinterest.com/docs/api/v5/, checked 2026-08-04), it authenticates to your own connected Pinterest business account and is built for managing and posting your own content, ads and analytics — not for reading an arbitrary third party's public board or pin. Pinterest Boards Scraper With Product Prices & Stores instead reads any public board, profile or pin URL directly, with no OAuth app review and no account ownership required.
| Feature | Pinterest API v5 | This Actor |
|---|---|---|
| Reads any public board/profile/pin | No — scoped to your own connected account (per Pinterest docs) | Yes — any public URL |
| Setup | Business account + app review + OAuth 2.0 | Enter URLs, click Start |
| Shop-the-look product/price data on third-party pins | Not exposed as a read endpoint for accounts you don't own | store + products[] on every applicable pin, no extra request |
| Output | Raw per-endpoint API JSON | Normalized dataset — one row per pin, one row per product |
| Rate limits | Set by Pinterest's own developer tiers (see their docs) | Configurable per-run caps: maxItems, maxStoreLookups, maxPinDetailFetches |
Use the official API when you manage your own Pinterest business account and need to post pins or pull your own analytics. Use this Actor when you need data from boards, profiles or pins you don't own — competitor catalogues, influencer boards, or your own boards without going through app review.
🛍️ What is the difference between a Pinterest board scraper and a Pinterest product/price scraper?
A Pinterest board scraper returns each pin's content — image, description, save count, outbound link. A Pinterest product or price scraper additionally reads the merchant and Shop-the-look product records Pinterest publishes alongside a minority of pins. The distinction matters because a plain board scrape tells you what is pinned but not what it costs or whether it's in stock, and Pinterest's collection-pin format is where merchants actually publish that commerce data — a board-only scrape has no visibility into it at all.
Pinterest Boards Scraper With Product Prices & Stores returns both in one run: every base pin field on the type: "pin" row, plus the merchant store object and products[] array nested on that same row, plus a standalone type: "product" row for each item so price data can be filtered and exported on its own.
🚀 How to scrape Pinterest boards with this Actor
- Open Pinterest Boards Scraper With Product Prices & Stores on its Apify Store page and click Try for free.
- Enter one or more board, profile or pin URLs (or bare usernames/pin IDs) in the required
urlsfield, one per line. - Set the query controls you need:
maxItemsfor how many pins to keep per target,productPinsOnly/linkDomains/minPrice/maxPriceto screen for commerce pins,fetchStoreDetailsto enrich the merchant record. - Click Start and watch the run log — it prints the measured product-price coverage for your boards as it scrapes.
- Download the dataset as JSON or CSV from the Storage tab, or pull it programmatically via the Apify API or
apify_client.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("scrapier/pinterest-boards-scraper-with-product-prices-and-stores").call(run_input={"urls": ["https://www.pinterest.com/etsy/artwork-for-your-home/"],"maxItems": 100,"fetchStoreDetails": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("type"), item.get("title") or item.get("productName"))
📦 How to run multiple boards, profiles or pins in one job
urls accepts an array — add as many board, profile or pin entries as you need, one per line, and the run processes each target in turn, applying maxItems per target rather than per run. There is no separate per-target run cost beyond the pin and product rows it actually returns; failed targets are logged as uncharged type: "error" rows instead of stopping the run.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
urls | Yes | array (string list) | Board URLs, profile URLs or bare usernames, and pin URLs or bare pin IDs. One per line. | ["https://www.pinterest.com/etsy/artwork-for-your-home/"] |
maxItems | No | integer (1–5000, default 10) | Max pins kept per target, counted after the screens below. | 100 |
includeProductDetails | No | boolean (default true) | Read the merchant/store record and every product item Pinterest publishes on the pin. Zero extra requests. | true |
includeProductRows | No | boolean (default true) | Also push one type: "product" row per item on a Shop-the-look pin. | true |
maxProductsPerPin | No | integer (0–200, default 20) | Ceiling on product items kept per pin. 0 = no ceiling. | 20 |
productPinsOnly | No | boolean (default false) | Keep only pins that carry a product record. | false |
linkDomains | No | array (string list, default []) | Keep only pins whose destination lands on one of these hosts (subdomains included). Empty keeps every domain. | ["etsy.com"] |
minPrice | No | integer (0–1000000, default 0) | Keep only pins publishing at least one product at or above this price. 0 = no floor. | 20 |
maxPrice | No | integer (0–1000000, default 0) | Keep only pins publishing at least one product at or below this price. 0 = no ceiling. | 200 |
fetchStoreDetails | No | boolean (default false) | Open each pin's closeup (1 extra request per pin) to add store.pageTitle, store.pageDescription, store.locale, store.linkStatus. | true |
maxStoreLookups | No | integer (0–5000, default 100) | Ceiling on the closeup requests above, across the whole run. 0 = no ceiling. | 100 |
fetchPinDetails | No | boolean (default false) | Fills date, commentCount, shareCount and the pinner's follower count (1 extra request per pin). | false |
maxPinDetailFetches | No | integer (0–5000, default 50) | Ceiling on the engagement closeups above. 0 = no ceiling. | 50 |
fetchLinkDetails | No | boolean (default true) | Fills link/externalLink/domain. Off returns those three as null. | true |
includeBoardSections | No | boolean (default false) | Stamps sectionId/sectionTitle/sectionSlug onto each pin. | false |
proxyConfiguration | No | object (proxy editor, default {"useApifyProxy": false}) | Your own proxy selection — groups, country and custom proxy URLs all reach the fetch layer. | {"useApifyProxy": false} |
Example JSON input
{"urls": ["https://www.pinterest.com/etsy/artwork-for-your-home/"],"maxItems": 100,"includeProductDetails": true,"includeProductRows": true,"maxProductsPerPin": 20,"productPinsOnly": false,"linkDomains": ["etsy.com"],"minPrice": 20,"maxPrice": 200,"fetchStoreDetails": true,"maxStoreLookups": 100,"fetchLinkDetails": true,"proxyConfiguration": { "useApifyProxy": false }}
⚠️ Common pitfall: maxItems counts pins kept after productPinsOnly, linkDomains and the price band are applied — not pins scanned. If you set a tight filter and get only a handful of rows out of a maxItems of 50, that is the filter working as designed, not a broken scrape. Check the run log's dropped by filter count before concluding the board has no product pins.
⬆️ Output
Every run pushes typed, normalized JSON with a consistent field set across runs — one row per pin, one row per product item, one uncharged row per failed target. Download it from the Apify Console as JSON, CSV, Excel, HTML table, XML or RSS, or pull it programmatically via the Apify API or apify_client.
📋 Scraped results
[{"type": "pin","id": "487293841029384756","index": 1,"pinUrl": "https://www.pinterest.com/pin/487293841029384756/","title": "Mid-Century Ceramic Planter Set","description": "Handmade ceramic planters for indoor plants","imageUrl": "https://i.pinimg.com/736x/aa/bb/cc/mid-century-planter.jpg","images": [{ "url": "https://i.pinimg.com/736x/aa/bb/cc/mid-century-planter.jpg", "width": 736, "height": 981, "quality": "736x", "extension": "jpg" }],"hasVideo": false,"videos": null,"savesCount": 214,"repinCount": null,"link": "https://www.westelm.com/products/mid-century-planter","domain": "westelm.com","boardName": "West Elm Local","board": { "id": "9182736451", "url": "https://www.pinterest.com/westelm/west-elm-local/", "privacy": "public", "name": "West Elm Local" },"boardInfo": { "boardName": "West Elm Local", "totalPins": 340, "boardId": "9182736451" },"user": "westelm","pinner": { "id": "5566", "fullName": "West Elm", "username": "westelm", "isVerifiedMerchant": true },"store": {"merchantName": "West Elm","siteUrl": "https://www.westelm.com/products/mid-century-planter","siteDomain": "westelm.com","linkStatus": 200,"source": "grid+closeup"},"merchantName": "West Elm","merchantDomain": "westelm.com","isProductPin": true,"productCount": 1,"productPriceMin": 24.99,"productPriceMax": 24.99,"productCurrency": "USD","hasProductDiscount": true,"products": [{"position": 1,"productName": "Mid-Century Ceramic Planter","price": "$24.99","priceValue": 24.99,"currency": "USD","standardPrice": "$29.99","discountPercent": 16.7,"inStock": true,"purchaseUrl": "https://www.westelm.com/products/mid-century-planter","itemDomain": "westelm.com"}],"linkDomainMatched": null,"scrapedAt": "2026-08-04T09:12:03Z"},{"type": "pin","id": "487293841029385001","index": 2,"pinUrl": "https://www.pinterest.com/pin/487293841029385001/","title": "Cozy reading nook inspiration","imageUrl": "https://i.pinimg.com/736x/dd/ee/ff/reading-nook.jpg","savesCount": 58,"link": null,"domain": null,"boardName": "West Elm Local","user": "westelm","isProductPin": false,"productCount": 0,"productPriceMin": null,"productPriceMax": null,"store": null,"products": [],"scrapedAt": "2026-08-04T09:12:04Z"},{"type": "product","isChild": true,"id": "487293841029384756:1","index": 1,"parentPinId": "487293841029384756","parentPinUrl": "https://www.pinterest.com/pin/487293841029384756/","productName": "Mid-Century Ceramic Planter","price": "$24.99","priceValue": 24.99,"currency": "USD","standardPrice": "$29.99","discountPercent": 16.7,"inStock": true,"merchantName": "West Elm","purchaseUrl": "https://www.westelm.com/products/mid-century-planter","itemDomain": "westelm.com","boardName": "West Elm Local","user": "westelm","scrapedAt": "2026-08-04T09:12:03Z"}]
A target that doesn't exist or can't be reached pushes an uncharged accounting row instead of a pin: {"type": "error", "sourceUrl": "...", "errorReason": "target_not_found", "errorMessage": "...", "scrapedAt": "..."}. Filter it out of any export with type != "error".
⚠️ Two output details worth knowing before you build on top of this: priceValue and currency are stable for sorting/filtering, but the display string price is locale-dependent ("$24.99" from one exit, "US$24.99" from another) — and prices are never converted between currencies, so a board mixing USD, EUR and GBP listings needs per-currency filtering on your side.
💡 How can I use the data extracted with this Actor?
- 🛍️ Ecommerce and dropshipping researchers: pull a competitor's or supplier's board, filter
productPinsOnlyand aminPrice/maxPriceband, and get a shortlist ofproducts[]withpriceValue,discountPercentandpurchaseUrlready for sourcing decisions. - 🤖 AI engineers and LLM developers: call the Actor from an agent, pass the returned pin and product JSON as grounding context, and let the model answer questions like "which pins on this board are on sale" from real
store/productsfields instead of a hallucinated guess. - 📊 Market researchers: track which merchant domains (
merchantDomain,itemDomain) and price bands recur across a set of boards to gauge store coverage and price positioning in a category. - 🔗 Affiliate and link auditors: use
linkDomainsandpurchaseUrlto check which of your own or a partner's product links Pinterest still resolves to a live destination (store.linkStatus), and which have gone dead.
📈 How do you monitor product prices and stock over time?
Price and stock monitoring means running the same board or product-pin list on a schedule and diffing the result against the previous run. Because priceValue, standardPrice, discountPercent and inStock are read fresh from Pinterest's board feed on every run, a scheduled run lets you catch a markdown, a restock, or a listing going out of stock without watching the board yourself.
Diff these fields between runs, keyed by the product's id (or the pin's id for the roll-up fields): priceValue, discountPercent, inStock, and the pin-level productCount/productPriceMin/productPriceMax for boards where you care about the range rather than one item. A productCount that drops to 0 on a pin that previously had products, or an inStock: true → false flip, is usually the alert worth acting on.
A concrete workflow: schedule a daily run across your watched board list with productPinsOnly: true, export the dataset, and compare each product's priceValue/inStock against yesterday's export by id. Set this up with an Apify Schedule on the Actor, and use a webhook on run completion to push the new dataset to your own pipeline instead of checking the Console manually.
🔌 Integrate Pinterest Boards Scraper With Product Prices & Stores and automate your workflow
This Actor works with any language or tool that can send an HTTP request — it runs on the Apify platform, so the standard Apify API, apify_client SDKs, schedules and webhooks all apply directly.
🐍 REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("scrapier/pinterest-boards-scraper-with-product-prices-and-stores").call(run_input={"urls": ["https://www.pinterest.com/etsy/artwork-for-your-home/"],"productPinsOnly": True,"minPrice": 10,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("type") == "product":print(item["productName"], item["priceValue"], item["currency"])
⏱️ Scheduled monitoring and delivery
Attach an Apify Schedule to run this Actor on a cron interval against the same board list, and add a webhook on the run's ACTOR.RUN.SUCCEEDED event to push the dataset URL to your own endpoint the moment a run finishes — there is no built-in push-notification feature beyond the platform's own webhooks.
⚖️ Is it legal to scrape Pinterest boards, pins and product data?
Yes — this Actor reads only publicly accessible, logged-out Pinterest pages; it returns the same board, pin, merchant and product data any visitor's browser can already see, and requires no login or account credentials to run. Courts have generally treated scraping of publicly accessible data as permissible, notably hiQ Labs v. LinkedIn Corp., 9th Circuit, 2019 (cert. denied 2022).
The primary data here — merchant/store names, destination domains, prices, discounts, stock status — is product and business data, not personal data, so GDPR and CCPA do not attach to it; Pinterest's own Terms of Service and any applicable database-rights law are the relevant framework instead. The pin rows also carry the pinner's public username and display name (user, pinner.username, pinner.fullName), which is personal data under GDPR/CCPA if that applies to you — treat that slice accordingly if you store it.
Scraping for AI training and scraping for operational price monitoring carry different risk profiles. Consult your legal team for commercial use cases involving bulk data storage.
❓ Frequently asked questions
Are prices converted to one currency?
No. priceValue and currency are read exactly as Pinterest published them, and one board can mix USD, EUR and GBP listings. Filter or convert on your own side using the currency field alongside priceValue.
Can I filter pins by store domain or price band?
Yes. linkDomains keeps only pins whose destination (or product link) matches one of the listed hosts, subdomains included, case-insensitive. minPrice/maxPrice keep only pins publishing at least one product inside that price range, in the currency the pin reports.
Does maxItems count only the pins I filtered for, or everything scanned?
Only the pins kept after productPinsOnly, linkDomains and the price band are applied. The screens run before the cap specifically so a tight filter keeps scrolling the board instead of returning a handful of rows out of a much larger maxItems.
How does the scraper handle Pinterest's anti-bot measures?
It fetches Pinterest's public endpoints with a Chrome-impersonating HTTP client, retries transport failures and HTTP 403/429/5xx responses up to 3 times with a short backoff, and rotates through your configured proxy pool between retries when one is supplied. Pinterest's endpoints answered testing without any proxy at all; proxyConfiguration is available for runs that do get blocked.
Does this Actor extract store and product pricing data?
Yes — the merchant/store record arrives in the store object on each pin row (merchantName, siteUrl, siteDomain, linkStatus, and more with fetchStoreDetails on), and product pricing arrives in the nested products[] array plus standalone type: "product" rows (price, priceValue, standardPrice, discountPercent, inStock). Both are only present on pins that carry Pinterest's "Shop the look" collection format — most ordinary pins have neither, and store/products are null/[] rather than fabricated.
How many pins and products does this Actor return per run?
Up to maxItems kept pins per target (default 10, maximum 5000), and up to maxProductsPerPin product items per pin (default 20, maximum 200, 0 for no ceiling). There is no separate platform-imposed page limit beyond Pinterest's own bookmark-cursor pagination, which the Actor follows until it either fills the requested count or the board runs out of pins.
What happens when a target board, profile or pin doesn't exist?
It's pushed as an uncharged type: "error" row (errorReason: target_not_found, fetch_failed or invalid_input) instead of silently skipped, so a failed target is always visible in the dataset. If every target in a run returns zero pins, the run fails loudly with a non-zero exit code rather than finishing green with an empty dataset.
How do I monitor board prices and stock over time?
Schedule the same board/target list to run daily (or on whatever cadence fits) via an Apify Schedule, and diff each product's priceValue/inStock/discountPercent against the previous run's export by id. See the monitoring section above for the full workflow.
Does this Actor work with Claude, ChatGPT and AI agent frameworks?
It's callable as an HTTP endpoint by any agent framework through the Apify API or apify_client — an agent can issue a run with a board URL, receive the pin/product JSON back, and ground its answer in real prices and stock status instead of a guess. There is no dedicated MCP server documented for this Actor.
How does this Actor compare to other Pinterest scrapers?
It's a strict superset of the base Pinterest Boards Scraper in the same family: every base pin field is preserved with the same value, plus the merchant store record and Shop-the-look products[]/type: "product" rows this variant adds. We didn't find a directly comparable competitor listing to cite with a checked date — compare any Pinterest scraper you're evaluating against this one on the same observable axis: does its dataset actually include a merchant/store record and per-item price, discount and stock fields, or only the pin's image and caption.
Can I use this Actor without managing proxies or Pinterest credentials?
Yes. It scrapes Pinterest's public endpoints logged out — no Pinterest account, cookie, or API key to supply — and testing showed Pinterest's endpoints answering every request without a proxy. proxyConfiguration is there if your own runs start getting blocked; you only need to supply proxy details if you choose to enable it.
💬 Your feedback
Found a bug, or a field that doesn't match what's documented here? Open an issue from the Actor's page in Apify Console, or reach out through Apify's support chat — reports like these keep this documentation matched to what the source actually ships.