Pinterest Search Lookup: pinterest scraper from $3/1k
Pricing
from $2.28 / 1,000 pin returneds
Pinterest Search Lookup: pinterest scraper from $3/1k
Pinterest scraper for keyword search. Give it search terms and get one flat row per pin: title, description, image URL, outbound link, source domain, board, pinner and reaction count. No login and no cookies. Pay per pin returned; a search that finds nothing is free.
Pricing
from $2.28 / 1,000 pin returneds
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
You give this actor a list of Pinterest searches, the same words you would type into Pinterest's own search box. For each search it reads Pinterest's public, logged-out results and returns one flat row per pin: the pin title, the pinner's description, Pinterest's own alt text for the image, a direct link to the full size image, the outbound source URL where the pin has one, the board it sits on, who pinned it, when, and how many reactions it has. No login, no cookies, no session token. This actor has no input field that could accept one. Nothing is stored between runs, so every row is what Pinterest was showing at fetch time.
Who it's for
Interior, food, fashion and wedding content teams who need a running feed of what is actually being pinned in their category this week, not what ranked last quarter. Trend researchers building a mood board dataset they can filter and sort instead of scrolling. SEO and content strategists mining pin titles and descriptions for the phrasing real people use, which is frequently nothing like keyword tool output. Affiliate and e-commerce teams tracing pins back to the sites that published them, using the source domain column to find who is already winning a visual niche. Agencies reporting on a client's category week over week from a scheduled run. And AI agents, which get a flat, one row per pin shape over a plain HTTP endpoint with no pagination to manage and no nested payload to unpick.
Why this one
- One row per pin, and the field names never move.
pinId,title,description,altText,imageUrl,link,domain,boardName,boardUrl,pinnerName,pinnerUsername,reactionCount,createdAt,url. Apify's MCP layer infers an actor's output shape from its recent runs, so a renamed field breaks every agent that calls it. These are frozen. - You pay per pin, not per search, and never for a miss. A search that returns nothing costs nothing. A search that returns 12 pins bills 12, not 25. Pins your filters removed are not billed either.
- The same pin is never billed twice. Overlapping searches routinely surface the same pin, and Pinterest repeats pins between pages of one search. "Never return the same pin twice" is on by default, so each pin is returned, and charged, once per run.
- It says which fields a pin actually has. About half of Pinterest search results are images
a user uploaded directly, with no title and no outbound link. Those come back with andtitle: null
link: nullrather than a description copied into the title slot to make the column look full.altText, which Pinterest generates for every pin, is offered as the field that is always there. - There is no fake save count. Pinterest does not send repin or save counts to a logged-out
request. That was checked directly against both the default and the detailed field set:
repin_count,aggregated_stats.saves,comment_countandfavorite_user_countwere absent on all 25 pins of the build probe. So norepinCountcolumn is declared.reactionCountis offered instead, and it is real. - It is a search, not a login. Everything here comes from the same public endpoint a signed-out browser uses. There is no account to connect, nothing to authorise, and no private or follower-only content is reachable.
What you get
Every row starts with the same five fields, then adds the columns you selected in "Which columns do you want?" (all included by default). With "One row per pin" on, which is the default, each pin gets its own row.
| Field | Type | Description | Filled on the build probe |
|---|---|---|---|
query | text | The search you submitted, echoed back | always |
found | boolean | true if at least one pin was returned for this search | always |
status | text | OK on a hit; NOT_FOUND, BAD_FORMAT, BLOCKED or REQUEST_FAILED on a miss | always |
message | text | Plain-English reason for a miss, present only when found is false | on misses |
scrapedAt | ISO 8601 datetime | When the search was run | always |
searchQuery | text | The search term, after a pasted search URL has been unpacked | always |
pinCount | number | How many pins this search returned. This is what you are billed | always |
truncated | boolean | true when Pinterest had more and your per-search cap stopped it | always |
pinId | text | Pinterest's numeric pin id, as a string | 25/25 |
title | text | The pin title | 14/25 |
description | text | The description the pinner wrote | 15/25 |
altText | text | Pinterest's own generated description of the image | 25/25 |
imageUrl | link | Largest available version of the image on i.pinimg.com | 25/25 |
link | link | The off-Pinterest URL the pin points at | 8/25 |
domain | text | Host of that link, for example instagram.com | 8/25 |
boardName | text | Board the pin sits on | 25/25 |
boardUrl | link | Public URL of that board | 25/25 |
pinnerName | text | Display name of the account that pinned it | 25/25 |
pinnerUsername | text | Pinterest username of that account | 25/25 |
reactionCount | number | Total reactions, summed across reaction types | 25/25 |
createdAt | date | When the pin was created, ISO 8601 | 25/25 |
url | link | Public permalink for the pin | 25/25 |
pins | array | The whole pin list in one cell. Only when "One row per pin" is off | always |
The right-hand column is measured, not promised: it is the fill rate across the 25 pins of one
real kitchen search captured on 2026-09-08, and the same 25 pins are the fixture the test
suite asserts against. title, description, link and domain vary per pin because a native
upload genuinely has none of them.
Deselect any column in the Input tab to drop it from every row. query, found, status,
message and scrapedAt always stay.
Price
- Pin returned: $3 per 1,000 pins
Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
You are billed per pin returned, so a run's cost is something you set, not something you discover. 1,000 pins is ~$3, whether that is 40 searches of 25 pins or 20 searches of 50. The leading Pinterest search scraper on the Store lists $3.99 per 1,000. A search that returns nothing, a blank line, and a pin your filters dropped are all free.
"Most pins to return per search" is your budget dial. At the default of 25, one search costs about $0.075.
How to use
- In the Apify Console. Open the actor page and click Start — the
queriesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~pinterest-search-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"queries":["kitchen ideas"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
- Put your searches into "Pinterest searches to run", one per line. A Pinterest search URL
pasted from the address bar works too, and its
qis read out of it. - Set "Most pins to return per search". 25 is one Pinterest page and the default; 50 is the cap and takes a second request per search.
- Leave "Try it first" on for the first run. It caps the run at 5 searches so you can see the output shape before spending on the full list.
- Turn on "Only pins that link to a website" if you are looking for source content rather than images. It typically keeps about a third of a search.
- Turn "Try it first" off and press Start to run the whole list.
Typical uses: a weekly snapshot of what is being pinned in a category, mining pin titles and descriptions for real phrasing, finding the sites behind the pins that rank for a term, or building a filterable mood board dataset for a client report.
Input
{"queries": ["kitchen ideas"]}
One search term per line, the same words you would type into Pinterest's own search box. A Pinterest search URL pasted from your browser works too. Accepted formats: kitchen ideas, minimalist living room, https://www.pinterest.com/search/pins/?q=cottagecore%20bedroom.
Sample output
One row per pin, with "One row per pin" left on:
| query | found | status | searchQuery | pinCount | truncated | pins | pinId | title | description | altText | imageUrl | link | domain | boardName | boardUrl | pinnerName | pinnerUsername | reactionCount | createdAt | url | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| kitchen ideas | true | OK | kitchen ideas | 25 | true | <all pins found (full list)> | 101049585382283341 | Explore Montauk Gin 2x8 White Ceramic Subway Wall Tile with Mixed Finish | The Montauk Gin 2x8 White Ceramic Wall Tile reimagines the subway format in durable ceramic—with a distinctively modern feel. The pure white coloring complements a wide range of palettes and design styles. Surface shading and a variety of matte and satin finishes offer artisanal touches to all applications. Get yours now. | a kitchen with wooden cabinets and white counter tops | https://i.pinimg.com/originals/bc/54/e8/bc54e89cd5e3e093314c3349401ec38e.png | https://www.tilebar.com/montauk-gin-2x8-ceramic-wall-tile-satin.html | tilebar.com | Tiles & Backsplashes | https://www.pinterest.com/TileBar/tiles-backsplashes/ | TileBar | TileBar | 51 | 2024-01-14T07:22:59.000Z | https://www.pinterest.com/pin/101049585382283341/ | 2026-09-08T17:47:25.482Z |
A real pin from a kitchen search:
| field | value |
|---|---|
pinId | 309763280644328288 |
title | Cozy Kitchen Ideas with Terracotta Tiles & Warm Wood |
altText | a stove top oven sitting inside of a kitchen next to a sink and countertop |
imageUrl | https://i.pinimg.com/originals/ad/0d/91/ad0d91719df46be4eaa9f22f773f7fdd.png |
link | null |
domain | null |
boardName | House Renovation |
pinnerName | Lauren Gibson |
pinnerUsername | laureng453 |
reactionCount | 10 |
createdAt | 2026-08-25T21:43:33.000Z |
url | https://www.pinterest.com/pin/309763280644328288/ |
That pin was uploaded straight to Pinterest, which is why link and domain are null. A pin
sourced from a website carries both, for example link: https://www.instagram.com/reel/... with
domain: instagram.com.
A search that returns nothing comes back as a single row with found: false, a status and a
message explaining why, and is never billed.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~pinterest-search-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"queries":["kitchen ideas"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~pinterest-search-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"queries":["kitchen ideas"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~pinterest-search-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"queries":["{{search}}"]}, mapping the row's search into the queries array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Pinterest Scraper API: search pins by keyword | Apify" — the agent will find and run this actor.
Tips
- Keep "Max concurrency" low. It defaults to 2 and caps at 8 on purpose. Pinterest rate limits by IP, and a burst that trips it returns nothing while a slower run gets the whole list.
- Leave the proxy on Residential. A plain request from a clean IP works, but a shared datacenter pool is the first thing a rate limiter notices, and this portfolio has been caught by exactly that before.
- Many narrow searches beat one broad one. Pinterest ranks by its own relevance model, so "small kitchen storage" and "galley kitchen" return genuinely different pins, while asking for 50 of "kitchen" mostly gets you more of the same.
- Use "Only pins that link to a website" when you want source content, and leave it off when you want the images themselves. Filtered pins are free either way.
- Sort by
reactionCountto find what resonated, but do not read it as a save count. It counts reactions only, and a lot of high performing pins have zero. imageUrlpoints at the original upload, which can be several megabytes. If you are rendering a contact sheet, swap/originals/for/736x/in the URL for a thumbnail.- Leave "Never return the same pin twice" on when you run overlapping searches in one job. It is the difference between paying once and paying three times for the same pin.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (pinterest-search-lookup) | $0.003 per pin returned, $0.00005 actor start, nothing for a search that finds nothing | One flat row per pin from a public Pinterest search: title, description, alt text, full size image, outbound link and source domain, board, pinner, reactions and creation date | Search results only. It does not read a board, a profile's full pin history, a single pin's comments, or anything behind a login, and Pinterest sends no save or repin count to a logged-out request, so none is reported. |
| fatihtahta/pinterest-scraper-search | $3.99 per 1,000 | The most used Pinterest search scraper on the Store, rated 5.00 on 3 reviews as of September 2026 | It is the incumbent in this niche and it works. This is 25% cheaper per pin, does not bill for a pin your filters dropped or a pin already returned earlier in the run, and states its per-field fill rates up front. |
| Pinterest API v5 | Free, but gated | The official source, with real analytics on pins and boards you own | If the pins you care about are your own, use it. It is OAuth-gated and scoped mostly to your own account, so it does not answer "what is everyone pinning for this term", which is what this does. |
| Doing it yourself | Your time, plus a proxy budget and the maintenance | The same fields | The search page is client rendered and carries no pin data at all, so a naive fetch returns 1 MB of nothing. Finding the resource endpoint behind it, handling its opaque bookmark pagination, deduplicating pins that repeat across pages, and knowing which fields a logged-out response genuinely omits is the work this absorbs. |
Prices and ratings for third-party tools are their published figures as of September 2026 and are not tracked here. Check the vendor before relying on the comparison.
FAQ
Am I charged per search or per pin? Per pin returned. A search that returns 12 pins bills 12. A search that returns nothing bills nothing, and neither does a pin your filters removed or a pin already returned earlier in the same run.
Why is title empty on so many rows?
Because those pins have no title. Roughly half of Pinterest search results are images a user
uploaded directly, and Pinterest stores no title for them. The description is not copied into
the title to hide the gap. Use altText, which Pinterest generates for every pin, when you need
something on every row.
Why is there no save or repin count?
Pinterest does not send one to a logged-out request. This was tested against both the default
and the detailed field set on 25 pins, and every engagement count was absent from both. Rather
than ship a column that is always empty, the actor reports reactionCount, which is real.
How many pins can I get for one search? Up to 50. Pinterest serves 25 per page and this actor fetches a second page when you ask for more. Beyond that, run more specific searches instead. They return genuinely different pins, where deeper paging on a broad term mostly returns more of the same.
Does it need a Pinterest account or a session cookie? No. It reads the same public endpoint a signed-out browser uses, and there is no input field that could accept a credential. Nothing private or follower-only is reachable.
What does BLOCKED mean?
Pinterest returned HTTP 403, 429 or 503, which means it is rate limiting this run. Lower "Max
concurrency" and make sure the proxy is set to Residential. Blocked rows are free, so a retry
costs only the actor start.
Can I search boards or people instead of pins? No. This searches pins. Board and profile search are different endpoints with a different output shape and are not covered.
Is this a live read or a stored database? Live. Every run queries Pinterest at that moment, so a pin created this morning can appear this afternoon. Nothing is cached between runs, and nothing is stored afterwards.
Can an AI agent call this directly? Yes. It is on the Apify MCP server, so an agent in Claude, Cursor or any MCP client can find and run it by name, or you can call the REST endpoint above from any script or workflow tool.
Is this GDPR-relevant?
Pins carry a public display name and username of the account that pinned them, which is personal
data in the EU sense even though it is public. Have a lawful basis before you store it, and do
not use the pinnerName and pinnerUsername columns to build a contact list. Deselect both in
"Which columns do you want?" if you only need the images and links.
Related actors
- TikTok Profile Lookup: the same flat, one row per result shape for TikTok creator profiles.
- YouTube Channel Lookup: channel title, subscriber count and video count from a handle or channel URL.
- Google News Lookup: the same query in, many rows out shape for news coverage of a topic.
- Shopify Store Lookup: once a pin's source domain turns out to be a store, this tells you what it sells.