Tony Wang6 min readHow to Scrape Pinterest in 2026 (API & Python)
Scrape Pinterest in 2026 — DIY Python, no-code tools, or a structured API for public pins, boards, and search — plus what the official API covers.
The fastest way to scrape Pinterest in 2026 is to call a structured Pinterest API that returns normalized JSON — pins, boards, profiles, and search results — instead of driving a headless browser past Pinterest's bot allowlist and infinite scroll. Pinterest's own v5 API exists, but it's built for managing a connected business account's own content, not for reading arbitrary public pins and boards. This guide covers all three approaches, what each returns, where each breaks, and the legal basics.
Why scrape Pinterest data?
- Trend and idea research — track what's rising in home decor, fashion, food, or DIY before it peaks elsewhere.
- Visual content datasets — build image/caption pairs for computer-vision or recommendation models from public pins.
- Competitor board monitoring — see what boards and pins a competitor brand is curating and how their following moves.
- AI-vision and RAG pipelines — feed structured pin metadata (title, description, dominant color, source domain) into agents that reason about visual trends.
- Affiliate and product discovery — find pins that link out to product pages and track which domains get repinned most.
Is it legal to scrape Pinterest?
Option 1: DIY in Python (and why it breaks)
Pinterest renders pin and board pages with data embedded in a script tag (__PWS_DATA__ or similar), so a naive scraper parses HTML instead of calling a documented endpoint:
import requests
from bs4 import BeautifulSoup
import json, re
resp = requests.get(
"https://www.pinterest.com/patrontequila/el-cafecito/",
headers={"User-Agent": "Mozilla/5.0"},
)
soup = BeautifulSoup(resp.text, "html.parser")
script = soup.find("script", {"id": "__PWS_DATA__"})
data = json.loads(script.string) if script else None
It works in a demo and then breaks:
- Bot allowlisting — Pinterest's
robots.txtblocks any user agent not on its published allowlist, and unapproved automated traffic gets flagged fast regardless of what the file technically permits. - Infinite scroll, not pagination — boards, search results, and profile pin grids load via scroll-triggered XHR calls with bookmark tokens, so a plain HTTP client only ever sees the first batch.
- Fragile embedded JSON — the script-tag payload's shape shifts between page template versions, so selectors and JSON paths break on redesigns.
- Image-heavy pages — Pinterest is dense with
srcsetvariants and lazy-loaded images; picking the right size (736x,originals, etc.) from raw HTML is error-prone.
Option 2: No-code / ready-made tools
Browser-extension pin savers and visual scraper builders can export a board or search result to CSV for one-off research, but they still hit the same allowlist and scroll-pagination problems at any real volume, and they don't give you predictable fields for a pipeline.
Option 3: A structured Pinterest API
For repeatable workflows over public data, a Pinterest scraping API returns normalized JSON with no browser to run. Search public pins by keyword:
curl "https://api.crawlora.net/api/v1/pinterest/search?query=minimalist+living+room" \
-H "x-api-key: $CRAWLORA_API_KEY"
import requests
resp = requests.get(
"https://api.crawlora.net/api/v1/pinterest/search",
headers={"x-api-key": "YOUR_API_KEY"},
params={"query": "minimalist living room"},
)
for pin in resp.json()["data"]["pins"]:
print(pin.get("title"), pin.get("link"))
A search response is normalized JSON (check the docs for the full schema):
{
"code": 200,
"msg": "OK",
"data": {
"query": "minimalist living room",
"pins": [
{
"id": "21673641953485811",
"url": "https://www.pinterest.com/pin/21673641953485811/",
"title": "Minimalist Luxury Living Spaces That Look Clean But Still Cozy",
"description": "Minimalist Luxury Living Spaces can feel cozy when the room uses texture, lighting, and practical furniture instead of extra clutter.",
"image_url": "https://i.pinimg.com/736x/da/b7/2a/dab72a3f9f2b9f18274752facb0349ef.jpg",
"domain": "impactdriverdrill.com",
"link": "https://impactdriverdrill.com/minimalist-luxury-living-spaces/",
"board_name": "Løkken hus",
"pinner_username": "annlizeth9550"
}
]
}
}
Pull a public profile, their pins, their boards, and a single board's pins:
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/pinterest"
user = requests.get(f"{base}/user/patrontequila", headers=h).json()["data"]
pins = requests.get(f"{base}/user/patrontequila/pins", headers=h).json()["data"]["pins"]
boards = requests.get(f"{base}/user/patrontequila/boards", headers=h).json()["data"]["boards"]
board = requests.get(f"{base}/board/patrontequila/el-cafecito", headers=h).json()["data"]
A board's url field (from the boards call) is where the slug for /board/{username}/{slug} comes from — you need the boards list before you can fetch an individual board.
Fetch a single pin by id, or browse Pinterest's "Ideas" taxonomy and pull the trending pins under a category:
pin = requests.get(f"{base}/pin/52846995624279072", headers=h).json()["data"]
categories = requests.get(f"{base}/categories", headers=h).json()["data"]["categories"]
animals_id = next(c["id"] for c in categories if c["slug"] == "animals")
idea = requests.get(f"{base}/ideas/{animals_id}", headers=h).json()["data"]
What you can collect
- Search — public pins by keyword: title, description, image URL, dominant color, source domain and link, board name, pinner username.
- Pin — full pin detail by id: the above plus comment count, repin count, and creation date.
- User — public profile fields by username: display name, bio, website, follower/following counts, pin/board counts, avatar.
- User pins / boards — a public profile's pins or boards, each board with its own pin/follower counts and privacy setting.
- Board — a specific board's metadata plus a page of its pins, addressed by
username/slug. - Categories & ideas — Pinterest's top-level "Ideas" taxonomy (10 categories) and the trending public pins under each one.
Limitations
- No open public-search API from Pinterest itself. The official v5 API is OAuth-scoped to a connected account's own pins, boards, and ads — it's not a substitute for reading arbitrary public content, which is what search, board, and profile endpoints above are built for.
- Bot allowlist. Pinterest's
robots.txtdisallows unlisted crawlers by default; unapproved automated traffic risks being blocked regardless of the data being public. - Infinite scroll and cursors. Boards, profiles, and search results paginate through scroll-triggered calls rather than simple page numbers — a managed API absorbs that instead of you replicating it.
- The username → slug hop. Fetching a specific board needs its
slug, which comes from the user's boards list, not just the board name. - Identities are personal data. Usernames, display names, and bios are personal under GDPR/CCPA — collect only public, non-personal fields with a lawful basis.
Where this gets used
- Trend research — track rising home, fashion, and food aesthetics before they surface in search demand.
- Competitor and brand monitoring — watch a competitor's public boards and pin activity over time.
- Content and dataset pipelines — feed public pin images and metadata into vision models or recommendation systems.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the search endpoint in the Playground, check the schema in the API docs, and review pricing. See also how to scrape Instagram and how to scrape TikTok for the rest of the visual-social stack, and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does Pinterest have an official public API?
Yes, Pinterest runs an official v5 REST API, but it's OAuth-based and scoped to a connected business account's own pins, boards, and ad data — it does not provide open read access to arbitrary public pins, boards, or search results without that account's consent.
Is it legal to scrape public Pinterest pins and boards?
Scraping strictly public, non-personal data sits in a lower-risk category, and hiQ v. LinkedIn held that accessing public data isn't a CFAA violation in the US. But Pinterest's developer guidelines prohibit automated scraping except as expressly permitted, and its robots.txt disallows unlisted bots by default. This isn't legal advice — review Pinterest's terms yourself.
Why does a DIY Pinterest scraper break?
Pinterest enforces a bot allowlist in robots.txt that blocks unlisted crawlers, paginates boards and search results through scroll-triggered calls rather than simple page numbers, and embeds page data in script tags whose shape shifts between template versions.
How do I get a board's pins if I only have a username?
Call the user's boards endpoint first to get each board's slug from its url field, then pass that username/slug pair to the board endpoint, which returns the board's metadata plus a page of its pins.
What fields does a Pinterest pin API return?
Typical fields include the pin id and URL, title, description, image URL, dominant color, source domain and outbound link, board name, and pinner username; a single-pin lookup also adds comment count, repin count, and creation date.
Can I use the Pinterest categories endpoint to find trending pins?
Yes. The categories endpoint returns Pinterest's top-level Ideas taxonomy (about 10 categories), and each category's id can be passed to the ideas endpoint to get that category's public pins.
What should I avoid when collecting Pinterest data?
Avoid collecting anything behind a login, treat usernames and bios as personal data under GDPR/CCPA, don't bypass Pinterest's bot allowlist, and stick to public, non-personal fields with a lawful basis for collection.