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:

  1. Log in with (or create) a Pinterest business account and verify its email.
  2. Accept the Developer Terms of Service under My apps.
  3. Submit a "Connect app" request form, which Pinterest reviews and answers by email.
  4. Request Trial access, and only after approval see your app ID and secret.
  5. 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:

EndpointWhat you sendWhat you get backMax pinsCredits
pinterest.searchquery (up to 200 chars), limitPins in Pinterest's logged-out relevance order50 (default 20)2
pinterest.pinsusername, limitProfile plus its recent pins50 (default 12)2
pinterest.boardboard url, or username + boardBoard details plus its first pins25 (default 20)2
pinterest.pinpin url or idOne pin with full engagement counts11
pinterest.profileusernameName, bio, website, verification, follower/pin/board countsn/a1

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 v5Scrape EverythingApifyBright Data
Account neededPinterest business accountGoogle or GitHub sign-inApify accountBright Data account
ApprovalApp review, then a video demo for Standard accessNoneSee their docsSee their docs
AuthOAuth 2.0 access and refresh tokensAuthorization: Bearer ssk_live_...Apify API tokenBright Data API key
Public keyword searchBeta partner endpoint, not available to all apps, top 10 pinsUp to 50 pins per call, 2 creditsDepends on the Actor you pickIts Social Media Scraper API lists Pinterest; see their docs
Writes (pins, ads)YesNo, read-onlySee their docsSee their docs
Pricing modelNo per-call fee listed; gated by approval and per-app daily limitsOne-time credit packs from $39, credits never expireMonthly 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 toUse
Publish pins or run ads for your own accountOfficial API v5
Publish pins for clients without building the OAuth app yourselfA third-party posting service that holds an approved Pinterest app
See which products rank for a keywordpinterest.search
Track a competitor's recent pins and outbound linkspinterest.pins, once a week
Get save and comment counts for specific pinspinterest.pin
See how interest in a search term changes over timePinterest 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.

bash
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:

json
{
  "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:

js
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.

bash
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:

python
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_link and outbound_domain: where the pin sends traffic. For e-commerce research, nothing else Pinterest exposes is as useful.
  • board_name and board_url: the board it lives on.
  • pinner_username and pinner_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_at as Pinterest gives it, and alt_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:

  1. Run one search with limit set to 50 (2 credits).
  2. Count how often each outbound_domain appears.
  3. Look up the top 10 pins individually to get repin counts (10 credits).
  4. 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.

python
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_more tells 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.pin when 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 429 with code RATE_LIMITED or CONCURRENCY_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?

  1. Sign in with Google or GitHub. You get 100 free credits, no payment details needed.
  2. Copy your ssk_live_... key and export it as SCRAPEEVERYTHING_API_KEY.
  3. Run the cURL search above. It costs 2 of your 100 credits.
  4. 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:

PackPriceCreditsPer 1k credits50-pin searches it buys
Builder$3925,000$1.5612,500
Growth$119100,000$1.1950,000
Scale$449500,000$0.90250,000

Enterprise volumes of 1M+ credits are available on request. Full details are on the pricing page.

Get 100 free credits

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.

More from the blog

Start with 100 free credits.

Continue with Google, create an API key and send your first request in under a minute.

Get 100 free credits