Pinterest API alternative: public pins, boards and search without app approval
A Pinterest API alternative for public pins, boards and keyword search as JSON. No developer app or OAuth. A search of up to 50 pins costs 2 credits.
By Scrape Everything team · · 12 min read
TL;DR: The official Pinterest API manages your own account's pins, boards and ads, and it needs app approval and OAuth. If you only need to read public data, a Pinterest API alternative like Scrape Everything returns public profiles, pins, boards and keyword search results as JSON with one API key. A search of up to 50 pins costs 2 credits.
If you want to publish pins or run ads, stop here and use the official API. Nothing below writes to Pinterest.
What is the official Pinterest API for?
The Pinterest API (v5) is an OAuth 2.0 (RFC 6749) API for apps that act on behalf of a Pinterest user: creating pins, managing boards, running ads, syncing catalogs and pulling analytics for accounts that authorized your app.
It's built around the authenticated account. In Pinterest's published v5 OpenAPI description, "Search user's Pins" and "Search user's boards" search the "operation user_account", which by default is the account behind the token. There is a public keyword search, search_partner_pins, but the spec marks it as beta and "not available to all apps", and it returns the top 10 pins for a term.
How do I get a Pinterest API key?
Slowly. According to Pinterest's guide to connecting a developer app, you:
- Log in with (or create) a Pinterest business account and verify its email.
- Accept the Developer Terms of Service under My apps.
- Submit a "Connect app" request form, which Pinterest reviews and answers by email.
- Request Trial access, and only after approval see your app ID and secret.
- Register a redirect URI and implement the OAuth 2 flow to get and refresh access tokens.
Then comes Trial access. Pinterest's access tiers page says "all Pins and Boards created with Trial access are only visible to their creator as Sandbox entities", and "Apps with Trial access are rate limited based on calls per day/per app."
To move up to Standard access you record a video of your app completing an action through the API. Solo developers don't get a pass: "If you are the only intended user of the Pinterest API, we will still require a video recording of the OAuth flow."
Is the API free? Pinterest's docs don't list a per-call fee for v5, so you pay in time instead: the review, the OAuth build and the video. Fair for a scheduling tool. A lot of paperwork for "what do the top 50 pins for linen bedding link to?"
What public Pinterest data does a Pinterest API alternative return?
A Pinterest scraper API is a service that reads the pages Pinterest shows to logged-out visitors and returns them as structured JSON. Scrape Everything is a REST API for public social media data, returned as clean JSON, covering Instagram, TikTok, X, YouTube, Facebook, Telegram, Spotify, Pinterest and Twitch. You send a POST request with a JSON body and a bearer token. No Pinterest account, no app review, no redirect URI.
These are the five Pinterest endpoints, from our Pinterest endpoint docs:
| Endpoint | What you send | What you get back | Max pins | Credits |
|---|---|---|---|---|
pinterest.search | query (up to 200 chars), limit | Pins in Pinterest's logged-out relevance order | 50 (default 20) | 2 |
pinterest.pins | username, limit | Profile plus its recent pins | 50 (default 12) | 2 |
pinterest.board | board url, or username + board | Board details plus its first pins | 25 (default 20) | 2 |
pinterest.pin | pin url or id | One pin with full engagement counts | 1 | 1 |
pinterest.profile | username | Name, bio, website, verification, follower/pin/board counts | n/a | 1 |
How does it compare with the official API and other scrapers?
Here's the read-only research job side by side. Competitor prices come from their own pricing pages as listed on October 22, 2026, and they may change. They're list prices in different units (credits, Actor usage, records), so they aren't like-for-like.
| Official Pinterest API v5 | Scrape Everything | Apify | Bright Data | |
|---|---|---|---|---|
| Account needed | Pinterest business account | Google or GitHub sign-in | Apify account | Bright Data account |
| Approval | App review, then a video demo for Standard access | None | See their docs | See their docs |
| Auth | OAuth 2.0 access and refresh tokens | Authorization: Bearer ssk_live_... | Apify API token | Bright Data API key |
| Public keyword search | Beta partner endpoint, not available to all apps, top 10 pins | Up to 50 pins per call, 2 credits | Depends on the Actor you pick | Its Social Media Scraper API lists Pinterest; see their docs |
| Writes (pins, ads) | Yes | No, read-only | See their docs | See their docs |
| Pricing model | No per-call fee listed; gated by approval and per-app daily limits | One-time credit packs from $39, credits never expire | Monthly plan from $19 (free plan with $5 of usage), Actor prices vary by Actor | $1.50 per 1,000 records pay as you go (Web Scraper API) |
Product names are trademarks of their owners; we are not affiliated with them. Figures from each vendor's public pricing page, verified October 22, 2026. Spot an error? Email [email protected] and we correct it.
Our cost per 1,000 pins: a search returns up to 50 pins for 2 credits, so 1,000 search pins is 40 credits. That's about $0.06 on Builder and about $0.036 on Scale. Search pins carry fewer counts than a full record, though. Fully detailed through pinterest.pin, 1,000 pins cost 1,000 credits: $1.56 on Builder, $0.90 on Scale. Compare like with like. For the longer vendor write-ups, see Scrape Everything vs Apify, Scrape Everything vs Bright Data and our social media scraping API pricing comparison.
Which route should I use?
| You want to | Use |
|---|---|
| Publish pins or run ads for your own account | Official API v5 |
| Publish pins for clients without building the OAuth app yourself | A third-party posting service that holds an approved Pinterest app |
| See which products rank for a keyword | pinterest.search |
| Track a competitor's recent pins and outbound links | pinterest.pins, once a week |
| Get save and comment counts for specific pins | pinterest.pin |
| See how interest in a search term changes over time | Pinterest Trends |
Can I post pins without the official Pinterest API?
Not with us. Scrape Everything is read-only and can't create pins, boards or ads.
Your honest options are the official v5 API with Standard access, or a posting service that has already passed Pinterest's app review. Either way the user still authorizes through Pinterest's OAuth screen. I'd be suspicious of anyone selling a shortcut around that.
How do I search Pinterest pins by keyword?
Send a keyword to pinterest.search and get up to 50 pins in the order a logged-out visitor sees them. We skip promoted pins and board suggestions, so you get organic results. It costs 2 credits whatever limit you pick, so you may as well ask for 50.
curl -X POST https://api.scrapeeverything.com/v1/pinterest/search \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "minimalist kitchen", "limit": 20}'Every endpoint returns the same success, data, meta envelope. Trimmed, with placeholder values:
{
"success": true,
"data": {
"query": "minimalist kitchen",
"pins": [
{
"id": "100000000000000001",
"link": "https://www.pinterest.com/pin/100000000000000001/",
"title": "Small minimalist kitchen with open shelving",
"description": "Light oak shelves and a matte white backsplash.",
"image_url": "https://i.pinimg.com/originals/aa/bb/cc/example.jpg",
"is_video": false,
"repin_count": null,
"reaction_count": 214,
"outbound_link": "https://shop.example-store.com/products/oak-shelf",
"outbound_domain": "shop.example-store.com",
"board_name": "Kitchen ideas",
"pinner_username": "example_user"
}
],
"pins_fetched": 20,
"has_more": true
},
"meta": {
"scraper": "pinterest.search",
"cached": false,
"credits_charged": 2,
"credits_remaining": 98
}
}The 100 free credits you get at sign-up cover that call 50 times.
The same search from Node 18+ with the built-in fetch:
const res = await fetch("https://api.scrapeeverything.com/v1/pinterest/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCRAPEEVERYTHING_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ query: "minimalist kitchen", limit: 50 }),
});
const body = await res.json();
if (!body.success) throw new Error(`${res.status} ${body.code}: ${body.message}`);
for (const pin of body.data.pins) console.log(pin.id, pin.outbound_domain);Keep pin.id a string. Pin IDs run to 18 digits, past JavaScript's Number.MAX_SAFE_INTEGER (2^53 - 1), so parsing one as a number rounds the last digits and you look up a pin that doesn't exist. That's why pinterest.pin wants the ID as a string.
One catch: in search, repin_count, comment_count, favorite_count and share_count are usually null. If saves matter, look the pin up with pinterest.pin.
How do I scrape a Pinterest board or an account's recent pins?
pinterest.board takes a board URL, or a username plus a board slug (names with spaces get slugified for you). You get the board object (name, description, pin_count, follower_count, section_count, cover image, owner) and its first pins in board order.
Logged-out Pinterest only serves the first 25 or so pins of a board. That's why limit stops at 25 here, and why you can get fewer pins back than you asked for. has_more is true when the board holds more than you received.
curl -X POST https://api.scrapeeverything.com/v1/pinterest/board \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.pinterest.com/nasa/learn-with-nasa/", "limit": 20}'pinterest.pins takes a username, @handle or profile URL and returns the profile plus up to 50 recent pins. I think it's the most underrated of the five. Point it at a competitor once a week and diff the outbound links to see which product pages they've started pushing:
import json, os, pathlib, requests
STATE = pathlib.Path("brand_links.json")
r = requests.post(
"https://api.scrapeeverything.com/v1/pinterest/pins",
json={"username": "example_brand", "limit": 50},
headers={"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}"},
timeout=60,
)
r.raise_for_status()
links = {p["outbound_link"] for p in r.json()["data"]["pins"] if p.get("outbound_link")}
seen = set(json.loads(STATE.read_text())) if STATE.exists() else set()
for link in sorted(links - seen):
print("new:", link)
STATE.write_text(json.dumps(sorted(links | seen)))That's 2 credits a week per brand. For just the profile numbers, pinterest.profile costs 1 credit.
What does a single pin lookup return?
pinterest.pin takes a pin URL or a numeric ID (as a string) and returns the complete record for 1 credit:
outbound_linkandoutbound_domain: where the pin sends traffic. For e-commerce research, nothing else Pinterest exposes is as useful.board_nameandboard_url: the board it lives on.pinner_usernameandpinner_full_name: who saved it.- Engagement:
repin_count,reaction_count,comment_count,favorite_count,share_count. - Media:
image_url(original size when available),image_width,image_height,dominant_color,is_video,video_url,video_duration_ms. created_atas Pinterest gives it, andalt_text.
Every count is nullable. Pinterest doesn't show every number on every pin, and we'd rather return null than guess a zero.
Example: which products rank for a keyword on Pinterest?
Say you sell kitchen storage and want to know which stores show up for "pantry organization" on Pinterest. Pinterest Trends tells you how much people search a term. This tells you whose products they see when they do.
The plan:
- Run one search with
limitset to 50 (2 credits). - Count how often each
outbound_domainappears. - Look up the top 10 pins individually to get repin counts (10 credits).
- Print the domains and the best-performing product links.
That's 12 credits per keyword, about two cents on the Builder pack. Planning a hundred keywords? Plug the numbers into the pricing calculator to see which pack fits.
import os
import time
from collections import Counter
import requests
API = "https://api.scrapeeverything.com/v1/pinterest"
HEADERS = {
"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}",
"Content-Type": "application/json",
}
def call(action, body, retries=3):
for _ in range(retries):
r = requests.post(f"{API}/{action}", json=body, headers=HEADERS, timeout=60)
if r.status_code == 429:
# RATE_LIMITED or CONCURRENCY_LIMIT: wait for the window to reset
time.sleep(int(r.headers.get("RateLimit-Reset", "5")))
continue
payload = r.json()
if not payload.get("success"):
# 402 INSUFFICIENT_CREDITS, 404 NOT_FOUND, 5xx and so on
raise RuntimeError(f"{r.status_code} {payload.get('code')}: {payload.get('message')}")
return payload["data"]
raise RuntimeError("still rate limited after retries")
keyword = "pantry organization"
results = call("search", {"query": keyword, "limit": 50, "cache_days": 7})
pins = results["pins"]
print(f"{results['pins_fetched']} pins for '{results['query']}'")
# Which sites do the organic results link to?
domains = Counter(p["outbound_domain"] for p in pins if p.get("outbound_domain"))
for domain, n in domains.most_common(10):
print(f"{n:>3} {domain}")
# Search results usually lack repin counts, so look up the top 10 pins.
detailed = [call("pin", {"id": p["id"], "cache_days": 7}) for p in pins[:10]]
detailed.sort(key=lambda p: p.get("repin_count") or 0, reverse=True)
for p in detailed:
print(p.get("repin_count"), p.get("outbound_domain"), p.get("outbound_link"))Not every pin links out to a website, so outbound_domain is nullable and the domain count can cover fewer pins than you fetched.
The cache_days is there on purpose. Every successful live result is stored for 14 days, and a cache hit within your window (1 to 14 days) costs 0 credits, so a second run that week is free. See the caching docs.
Not a Python person? The MCP server (@scrapeeverything/mcp, listed in the official MCP Registry as io.github.scrapeeverything/mcp) lets Claude or another MCP client run the search. There's an n8n node for scheduled pulls and an OpenAPI spec at https://scrapeeverything.com/openapi.json. Agencies can read how agencies use the API.
What are the limits of a Pinterest scraper API?
Here's what will bite you if you skip this section.
- Logged-out visibility only. Pins Pinterest hides from logged-out visitors are missing, and private or secret boards are out of reach.
- 50 pins per request for search and
pinterest.pins, and about 25 for boards. There's no cursor parameter, so you can't page deeper into a keyword.has_moretells you more exists; it doesn't fetch it. - Fewer counts in grids. Search, board and profile pin lists carry fewer counts than a single pin. Use
pinterest.pinwhen you need repins and comments. - Read-only. No posting, no ads, no analytics for your own account.
- Rate limits per account. Every key on an account shares the same allowance. Go over it and you get a
429with codeRATE_LIMITEDorCONCURRENCY_LIMIT; rejected requests are never charged. The current numbers are on the rate limits page. - Unofficial. Scrape Everything isn't affiliated with or endorsed by Pinterest.
People assume the wrong thing about deleted pins, so to be exact: if Pinterest blocks us, times out or we hit a server error, the credits are refunded automatically. A 404 NOT_FOUND for a deleted pin is a definitive answer, so it is charged, and so is every retry. Cache it on your side. The full table is in the error docs.
You could scrape Pinterest yourself. Then page changes, blocked IPs and session handling are your problem, and a block costs you the run.
On the legal side, public doesn't mean anything goes. Pin descriptions and pinner names can be personal data under GDPR, Pinterest's terms apply to how you use what you collect, and the person who saved a pin usually isn't the person who owns the image, so downloading an image_url doesn't give you the right to reuse it. We wrote up the details, with sources, in is scraping public social media data legal? Read it before you store pinner data at scale.
How do I get started?
- Sign in with Google or GitHub. You get 100 free credits, no payment details needed.
- Copy your
ssk_live_...key and export it asSCRAPEEVERYTHING_API_KEY. - Run the cURL search above. It costs 2 of your 100 credits.
- Open the Pinterest scraper page to try the other endpoints.
When you need more, credit packs are one-time payments, credits never expire, and payment is in crypto:
| Pack | Price | Credits | Per 1k credits | 50-pin searches it buys |
|---|---|---|---|---|
| Builder | $39 | 25,000 | $1.56 | 12,500 |
| Growth | $119 | 100,000 | $1.19 | 50,000 |
| Scale | $449 | 500,000 | $0.90 | 250,000 |
Enterprise volumes of 1M+ credits are available on request. Full details are on the pricing page.
FAQ
Is there a Pinterest API alternative that doesn't need app approval?
Yes. Scrape Everything reads public Pinterest profiles, pins, boards and search results with a single API key. You don't need a Pinterest developer app, a business account or OAuth tokens. It's read-only, so it can't create pins or manage ads.
Is the Pinterest API free?
Pinterest's developer docs don't list a per-call fee for the v5 API. Access is gated instead: you need a business account, an approved app, OAuth, and a video demo to move from Trial to Standard access, and Trial apps are rate limited per day.
Can the official Pinterest API search public pins by keyword?
Only in a limited way. The v5 pin and board search operations are scoped to the authenticated account. A partner keyword search exists, but Pinterest's spec lists it as beta, not available to all apps, and limited to the top 10 pins. pinterest.search returns up to 50 organic pins per request for 2 credits.
Why are repin counts null in search results?
Pinterest's search results carry fewer counts than a pin's own page. Repin, comment, favorite and share counts are usually null in pinterest.search. Call pinterest.pin with the pin ID (1 credit) to get them.
How much does Pinterest data cost with Scrape Everything?
Profile and single pin lookups cost 1 credit. Search, board and recent pins cost 2 credits each. Credits come in one-time packs from $39 for 25,000 credits ($1.56 per 1k) down to $0.90 per 1k on the Scale pack, and new accounts get 100 free credits.