Pinterest Profile Scraper — Shop Products & Prices avatar

Pinterest Profile Scraper — Shop Products & Prices

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Pinterest Profile Scraper — Shop Products & Prices

Pinterest Profile Scraper — Shop Products & Prices

Scrape Pinterest profile data quickly and reliably. This actor gathers boards, pins, engagement metrics, and profile details from public accounts. Built for marketers, analysts, and developers needing structured Pinterest data.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapio

Scrapio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Pinterest Profile Scraper — Shop Products & Prices reads any public Pinterest account and returns one structured row: the account's full profile record, every product carried by its "shop the look" collection pins with the merchant's own published price, currency, store name and destination URL, and a census of every domain the account's pins send traffic to. Unlike scraping raw HTML yourself, it returns typed JSON — ready for a database, a spreadsheet or an LLM context window without any parsing. This guide covers every field it returns, the real limits of what Pinterest publishes to a logged-out visitor, and three ways teams put the data to work.

🧭 What Does Pinterest Profile Scraper — Shop Products & Prices Do?

It is a Pinterest scraper: give it a username or a profile URL, and it fetches the account's public profile from Pinterest's own guest endpoints, pages its pin grid to find "shop the look" collection products, and rolls both up into one dataset row plus a destination-domain census. No Pinterest account, login or cookie is required — every request hits Pinterest's guest API, gated by a request header rather than a session. One run covers three entity types: the account profile, the shop products it publishes, and the destination domains its pins and products point traffic to.

  • Reads the full public profile — 45 fields including follower/pin/board counts, bio, merchant flags, SEO metadata and verification status
  • Extracts every "shop the look" collection-pin product — title, description, published price, currency, store name, destination URL and image
  • Filters products by destination store domain and by price band, applied before the per-account cap
  • Builds a destination-domain census from every outbound link on the account's pins and its products, so you can see whether it sells direct or through a marketplace
  • Optionally screens out accounts with no sign of selling, if you only want merchants
  • Falls back through three surfaces (guest API → profile HTML → ld+json) so a partial profile still returns something rather than nothing
  • Pushes a typed, uncharged accounting row for any target that fails, with a machine-readable errorReason

⚡ Features & Capabilities

Three things matter here: what the base profile record carries, what the shop catalogue adds on top of it, and where this actor's own product line already covers a narrower job more cheaply.

Core features

  • Profile fields straight from Pinterest's own unauth_profile object: username, full_name, about, follower_count, following_count, pin_count, board_count, is_verified_merchant, is_inspirational_merchant, is_partner, domain_verified, website_url, seo_title, seo_description, image_xlarge_url, created_at / createdAtIso.
  • Shop catalogue fields per product: product_id, title, description, price, price_value, currency, store_name, product_url, product_domain, image_url, pin_id, pin_url.
  • Account-level shop summary: shopProductsReturned, shopProductsWithPrice, shopPriceCurrency, shopPriceMin, shopPriceMax, shopPriceCurrencies, isMerchantProfile.
  • Destination-domain census: destinationDomains ([{domain, links, share}]), destinationDomainCount, outboundLinkPins, pinsScanned.
  • Store-domain and price-band filters (productDomains, minPrice, maxPrice) applied before the per-account cap, so the cap counts products you actually asked for.
  • A merchant screen (merchantProfilesOnly) that checks Pinterest's own merchant flags or live shop-product evidence — not a Shop tab, because Pinterest publishes none to a logged-out visitor.

When another tool might suit you better

If all you need is the bare profile record, the includeShopProducts: false switch returns exactly that — the same output the base Pinterest Profile Scraper produces — at the same per-row price, so there is no reason to reach for a separate actor. If your unit of work is the pin or the board rather than the account, Pinterest Boards Scraper reads every pin on a board or profile and attaches the pinner's profile per pin — a better fit for auditing content at the pin level than for a shop catalogue. If the account you care about advertises rather than sells organically through collection pins, Pinterest Ads Scraper searches Pinterest's Ads Library by brand name instead of scanning a pin grid.

Pinterest Profile Scraper — Shop Products & Prices within the Scrapio data stack

This actor covers Pinterest profiles and their shop products. For pin-level detail with the pinner's profile attached, use Pinterest Boards Scraper (pinterest-boards-scraper-and-pinner-profiles). For brand and advertiser search inside Pinterest's Ads Library, use Pinterest Ads Scraper (pinterest-ads-scraper-advertiser-and-brand-search). All three read Pinterest's public, logged-out surfaces — no login, cookie or shared session between them.

Why do developers and data teams scrape Pinterest?

🏢 E-commerce and retail merchandising teams

Point the actor at a supplier's, a competitor's or your own brand's Pinterest handle and get back shopProducts[] with price_value, currency, store_name and product_url per product, plus the account-level shopPriceMin / shopPriceMax band. Load the CSV export into a pricing sheet or a merchandising dashboard, filter to a productDomains list of the marketplaces you track, and rerun on a schedule to catch a catalogue change or a price move before your next buying cycle.

📊 AI training data and RAG indexing

about (the account bio) and each product's title / description are the highest-information free-text fields here — they are what a RAG index should embed for account or product lookup. For training data, the numeric and typed fields (follower_count, price_value, shopPriceMin, shopPriceMax, pin_count) return as consistent primitives across every row, with no string-to-number cleanup needed before they enter a feature table. Both use cases benefit from the same guarantee: a field Pinterest did not publish ships as null, never as a fabricated zero or empty string.

📱 Competitive and market intelligence

Track shopPriceMin / shopPriceMax and shopProductsReturned across scheduled runs to catch a competitor's price move or a catalogue expansion, and watch destinationDomainCount / destinationDomains to see whether an account is shifting sales from a marketplace listing to its own domain (or the reverse). isMerchantProfile flags the moment a previously inspirational account starts actually selling.

🔬 Research and academic use

Building a dataset of visual-commerce or influencer-merchant behavior on Pinterest — who sells, what they sell, and where the traffic lands — using only what Pinterest serves to any logged-out visitor. Public-data scope only: no private profile, no follower list, no email.

🎥 Product and SaaS development

The same fields feed a price-monitoring tool, a supplier-discovery directory, or a merchant-verification API: isMerchantProfile, domain_verified and is_verified_merchant for a trust signal, shopPriceCurrency / shopPriceMin / shopPriceMax for a pricing feed, and destinationDomains for a direct-vs-marketplace classifier — all typed and ready to sit behind your own endpoint.

🍚 Input Parameters

Read directly from .actor/actor.json.

ParameterRequiredTypeDefaultConstraintsDescription
startUrlsYesarrayeditor: stringListOne entry per account: a bare username, a profile URL, a regional domain, or any sub-path below the profile root.
includeShopProductsNobooleantrueRead the pin grid and return shopProducts[]. Off = profile record only.
maxProductsPerProfileNointeger50min 1, max 1000Products kept per account, applied after the store-domain and price filters.
maxPinsScannedPerProfileNointeger100min 25, max 1000How deep to page the pin grid looking for products and destination links.
productDomainsNoarray[]editor: stringListKeep only products landing on these hosts. Subdomains included.
minPriceNointeger(unset)min 0, max 100000000Price floor, compared against the merchant's own published price.
maxPriceNointeger(unset)min 0, max 100000000Price ceiling. Same comparison rule as the floor.
merchantProfilesOnlyNobooleanfalseDrop accounts with no sign of selling. Skipped accounts are not pushed and not charged.
maxProfilesNointeger(no schema default — see note)min 0, max 1000Hard cap on how many supplied accounts are processed.
proxyConfigurationNoobject(no proxy)editor: proxyUsed for every request in the run. No hidden ladder, no silent fallback.

Undocumented but functional aliases, read straight from src/main.py: the input object accepts merchantProfileUrls anywhere startUrls is expected, and maxStoreProfiles is checked before maxProfiles if both keys are present. Neither appears in the input editor — use the names in the table above for a new run; the aliases exist only so payloads built for a related actor keep working unchanged.

maxProfiles has no default in the schema, only a prefill of 10 shown in the Apify Console's input form. If the key is omitted entirely (for example, a raw API call with no maxProfiles field), the code falls back to 0, meaning every supplied account is processed.

{
"startUrls": ["etsy", "potterybarn", "https://www.pinterest.com/nike/_created/"],
"includeShopProducts": true,
"maxProductsPerProfile": 50,
"maxPinsScannedPerProfile": 100,
"productDomains": ["potterybarn.com", "etsy.com"],
"merchantProfilesOnly": false,
"maxProfiles": 10,
"proxyConfiguration": { "useApifyProxy": false }
}

Supported URL types and input formats

  • Bare username: etsy
  • Full profile URL: https://www.pinterest.com/potterybarn/
  • Regional domain: https://au.pinterest.com/etsy/
  • Board or tab sub-path (resolves to the parent profile): https://www.pinterest.com/nike/_created/

Search phrases are not supported — this actor reads accounts you name, it does not discover them. Anything that does not resolve to a username produces an uncharged row with errorReason: invalid_input rather than a silent skip.

📦 Output Format

Typed, normalized JSON. Every charged row carries the same 60-column shape (45 base profile columns plus 15 shop columns) whether the account sells anything or not — a field Pinterest did not publish is null, never dropped from the row and never back-filled with 0 or "". One row_result event is charged per profile row, regardless of how many shop products it carries; uncharged accounting rows (errorReason is not null) and accounts removed by merchantProfilesOnly cost nothing — filter a dataset export with errorReason == null to keep only charged rows.

Output for profile

{
"username": "potterybarn",
"profileUrl": "https://www.pinterest.com/potterybarn/",
"full_name": "Pottery Barn",
"first_name": null,
"about": "Furniture, home decor and more for every room in your home.",
"follower_count": 1913430,
"following_count": 850,
"pin_count": 118342,
"board_count": 210,
"website_url": "https://www.potterybarn.com/",
"domain_url": "potterybarn.com",
"domain_verified": true,
"instagram_data": { "url": "https://www.instagram.com/potterybarn/", "username": "potterybarn" },
"is_verified_merchant": true,
"is_inspirational_merchant": false,
"is_partner": true,
"is_private_profile": false,
"seo_title": "Pottery Barn (potterybarn) - Profile | Pinterest",
"seo_canonical_domain": "www.pinterest.com",
"image_xlarge_url": "https://i.pinimg.com/original/potterybarn_avatar.jpg",
"eligible_profile_tabs": ["Created", "Saved"],
"created_at": "Tue, 07 May 2024 13:19:53 +0000",
"createdAtIso": "2024-05-07T13:19:53Z",
"id": "1234567890",
"node_id": "VXNlcjoxMjM0NTY3ODkw",
"input": "potterybarn",
"dataSource": "user_resource_api",
"errorReason": null,
"scrapedAt": "2026-08-03T09:15:00Z",
"isMerchantProfile": true,
"shopProductsReturned": 50,
"shopProductsWithPrice": 50,
"shopProductsDroppedByFilter": 0,
"shopProductsDroppedNoPrice": 0,
"shopProductsTruncated": true,
"shopPriceCurrency": "USD",
"shopPriceMin": 29.5,
"shopPriceMax": 3899,
"shopPriceCurrencies": ["USD"],
"destinationDomainCount": 2,
"outboundLinkPins": 16,
"pinsScanned": 100
}

The remaining base columns — interest_following_count, is_primary_website_verified, impressum_url, verified_identity, partner, is_ads_only_profile, is_gco_account, indexed, seo_noindex_reason, seo_description, image_medium_url, profile_cover_url, profile_cover, last_pin_save_time / lastPinSaveTimeIso, errorMessage — are always present in the row, populated with Pinterest's own value or null.

Output for shop product

Each entry in shopProducts[]:

{
"product_id": "246455678506512",
"title": "Audrey Striped Patchwork Quilted Sham, Blue Multi, King",
"description": "Layer your bed in relaxed, textured comfort with this quilted patchwork sham.",
"price": "US$79.50",
"price_value": 79.5,
"currency": "USD",
"store_name": "potterybarn",
"product_url": "https://www.potterybarn.com/products/audrey-striped-patchwork-quilt-sham/",
"product_domain": "potterybarn.com",
"image_url": "https://i.pinimg.com/736x/potterybarn_sham.jpg",
"pin_id": "987654321098765",
"pin_url": "https://www.pinterest.com/pin/987654321098765/"
}

Output for destination domain

Each entry in destinationDomains[] — the census of hosts the account's pins and products send traffic to, descending by link count:

[
{ "domain": "potterybarn.com", "links": 110, "share": 0.873 },
{ "domain": "instagram.com", "links": 16, "share": 0.127 }
]

Schema stability and export options

Field names stay stable across runs: the shared profile-row builder is copied byte-for-byte from the base Pinterest Profile Scraper and sha256-verified rather than re-implemented, so the base's 45 columns do not drift when the variant's own shop-catalogue code changes. A field Pinterest stops publishing ships as null, not as a removed column, so a downstream schema never silently breaks. Export the dataset as JSON, CSV, Excel or XML from the Apify Console's dataset view, or pull it programmatically through the Apify API or apify-client. shopProducts and destinationDomains are nested arrays — they appear whole in JSON/API output and are flattened by Apify's CSV/Excel export (shopProducts/0/price_value, …); the dataset's default table view shows the scalar summary columns instead of the nested arrays.

💡 Pinterest Profile Scraper — Shop Products & Prices Strategy Guide

🎯 Strategy 1: Real-time enrichment pipeline

Enrich an inbound supplier or partner record the moment it's created. Trigger a run with that account's username in startUrls, wait for the single row it returns, and append isMerchantProfile, shopPriceMin, shopPriceMax, shopProductsReturned and destinationDomainCount onto the source record in your CRM or supplier database. A record for an account that turns out not to sell through collection pins still gets shopProducts: [] — a real answer, not a missing one.

🎯 Strategy 2: Scheduled monitoring and alerting

Track a competitor's or a partner brand's shop catalogue over time using an Apify schedule to run this actor daily or weekly against the same startUrls list. Diff each new run's dataset against the previous one on shopPriceMin, shopPriceMax, shopProductsReturned and destinationDomainCount, and alert when shopProductsTruncated flips to true (the catalogue outgrew your maxProductsPerProfile cap) or when a price band moves outside the range you care about.

🎯 Strategy 3: Bulk dataset build

Build a research or pricing dataset across hundreds of accounts in one run: supply the full account list in startUrls, set maxProfiles to the budget you want to spend, and let merchantProfilesOnly pre-filter to sellers if that's the population you need. Export the finished dataset to CSV or Excel directly from the Apify Console, or pull it with apify-client into your own database.

Strategy comparison at a glance

StrategyBest forRun patternOutput format
Real-time enrichmentOne account at intake timeSingle triggered run per recordJSON row appended to the source system
Scheduled monitoringTracking price/catalogue changeRecurring Apify schedule + diffDataset compared run-over-run
Bulk dataset buildResearch or pricing datasetsOne run, large startUrls listCSV/Excel export or database load
ScraperWhat it extracts
Pinterest Boards ScraperEvery pin on a board, profile or pin URL, with the posting pinner's public profile attached per pin.
Pinterest Ads ScraperPinterest's public Ads Library, searched by advertiser or brand name, with targeting and outbound destination URLs.
TikTok Shop Data ScraperThe cross-platform equivalent for shop-product data — TikTok Shop products plus the seller's shop profile.

How to integrate Pinterest Profile Scraper — Shop Products & Prices with your stack

Pinterest Profile Scraper — Shop Products & Prices works with any language or tool that can make an HTTP request, through the Apify API or an official client library.

Python

from apify_client import ApifyClient
import csv
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": ["etsy", "potterybarn"],
"includeShopProducts": True,
"maxProductsPerProfile": 50,
"maxPinsScannedPerProfile": 100,
"maxProfiles": 10,
"proxyConfiguration": {"useApifyProxy": False},
}
# Actor ID from the Apify Console — Actor page -> API -> "Actor ID"
run = client.actor("<ACTOR_ID>").call(run_input=run_input)
rows = []
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
rows.append({
"username": item.get("username"),
"isMerchantProfile": item.get("isMerchantProfile"),
"shopProductsReturned": item.get("shopProductsReturned"),
"shopPriceMin": item.get("shopPriceMin"),
"shopPriceMax": item.get("shopPriceMax"),
"destinationDomainCount": item.get("destinationDomainCount"),
})
with open("pinterest_shop_export.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const input = {
startUrls: ['etsy', 'potterybarn'],
includeShopProducts: true,
maxProductsPerProfile: 50,
merchantProfilesOnly: false,
};
// Actor ID from the Apify Console -> Actor page -> API -> "Actor ID"
const run = await client.actor('<ACTOR_ID>').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items) {
console.log(row.username, row.shopProductsReturned, row.shopPriceMin, row.shopPriceMax);
}

Async and scheduled pipelines

For a large startUrls list, start the run and poll client.run(runId).get() for its status instead of blocking on .call(), or set up a recurring Apify schedule in the Console to run this actor on a cron interval and read the latest dataset afterward. There is no webhook-specific feature documented for this actor beyond Apify's platform-level run webhooks, configurable from the Console on any run.

🎯 Who Needs Pinterest Profile Scraper — Shop Products & Prices? (Use Cases & Industries)

🏢 E-commerce and retail merchandising teams

A merchandiser tracking a supplier's Pinterest presence runs the actor against that account's handle and reads shopProducts[].price_value, store_name and product_domain straight into a sourcing spreadsheet — no manual pin-by-pin lookup.

📊 AI/ML engineers and data scientists

Feed about, product title and description text into a RAG index for account or product lookup, and use follower_count, price_value and shopPriceMin / shopPriceMax as typed numeric features in a training set — both without any string parsing.

📱 Competitive intelligence analysts

Run the same startUrls list on a schedule and watch shopPriceMin, shopPriceMax and destinationDomainCount move between runs to catch a competitor's price change or a shift between direct-sale and marketplace traffic.

🔬 Researchers

Academic or market researchers building a dataset of merchant behavior on a visual-commerce platform, scoped to public data only — no private profile, no follower list.

🎥 Product and SaaS developers

Teams building a pricing-monitoring tool, a supplier-directory product, or a merchant-verification API on top of isMerchantProfile, domain_verified and shopPriceCurrency / shopPriceMin / shopPriceMax.

Yes — scraping Pinterest's publicly accessible, logged-out pages is generally lawful; the legal exposure sits in how the data is used and whether Pinterest's Terms of Service are breached, not in the act of reading a public page. In the United States, hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), held that scraping data from publicly accessible parts of a website does not violate the Computer Fraud and Abuse Act — the same reasoning applies to any logged-out, unauthenticated page, including Pinterest's guest endpoints this actor reads. Breaching Pinterest's Terms of Service is a separate question: it is a contractual, civil matter between the scraper and Pinterest, not a criminal one. Data protection is the third question, and it applies here: profile fields such as full_name, about and image_xlarge_url can be personal data when the account belongs to an identifiable individual, so GDPR/CCPA obligations attach to that portion of the output; the shop-product and price fields (price_value, store_name, product_url) describe business listings, not people, and sit outside that framing. Pinterest Profile Scraper — Shop Products & Prices 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 Profile Scraper — Shop Products & Prices work without a Pinterest account?

Yes. Every field is read from Pinterest's guest UserResource and UserPinsResource endpoints, gated by a request header rather than a login session — no account, cookie or API key is used.

How does it handle Pinterest's anti-scraping measures?

It uses curl_cffi with Chrome TLS impersonation against the guest endpoints, retries up to 3 times per account with exponential backoff and a rotated proxy exit on retryable statuses (403, 408, 425, 429, 500, 502, 503, 504), and falls back from the guest API to the profile HTML and then to its ld+json block if the API path fails.

Can I run it at scale without getting blocked?

Pinterest served both the profile endpoint and the pin grid to a bare Apify datacenter IP in measured testing, so a proxy is optional; switch on Apify Proxy in proxyConfiguration if a run starts reporting blocked accounting rows. No uptime or success-rate figure is published for this or any run.

How fresh is the data it returns?

Live — every run fetches the profile and pin grid fresh from Pinterest at run time; nothing is cached between runs. Each row carries its own scrapedAt timestamp.

Which Pinterest fields work best for AI training and RAG indexing?

For RAG, embed the free-text fields: the account's about bio and each product's title and description. For training data, use the typed numeric fields — follower_count, pin_count, price_value, shopPriceMin, shopPriceMax — which return as consistent primitives across every row with no normalization required.

Does it return personal data, and who is responsible for using it lawfully?

Some profile fields (full_name, about, image_xlarge_url, website_url) can be personal data when they describe an identifiable individual rather than a brand account. The actor returns only what Pinterest already publishes to a logged-out visitor; the lawful basis for storing and using that data sits with whoever runs the actor, not with the actor itself.

Does it work with Claude, ChatGPT and other AI agent tools?

There is no dedicated MCP integration documented for this actor. It is callable as an HTTP endpoint through the Apify API by any agent framework, and every response is typed JSON — no HTML parsing required before it enters an LLM's context window.

What happens if an account doesn't sell anything through collection pins?

The row still comes back with the full profile record and destination-domain census, but shopProducts is [] and shopProductsReturned is 0 — that is a real, measured answer for an account that does not publish a shop-the-look catalogue, not a scrape failure.

Does merchantProfilesOnly ever drop a real seller?

Yes. A small brand with no Pinterest merchant verification and no collection pins inside the scanned pin window has no signal for the screen to detect, so it gets dropped. Raising maxPinsScannedPerProfile widens the window; this is why the screen defaults to off.

Does the price shown match the price on the merchant's site right now?

Not necessarily. price_value is whatever the merchant's own feed last pushed to Pinterest — it can be stale relative to the live store, and it excludes shipping, tax and regional pricing. Verify anything you intend to act on directly against the merchant's site.

ℹ️ Disclaimer

Pinterest Profile Scraper — Shop Products & Prices extracts only publicly accessible data from Pinterest's logged-out pages. 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, particularly for any profile fields that identify a natural person.