Pinterest Search API. Pins matching your search.
Pins matching a keyword, with pictures and pinners. We handle the proxies, blocks and platform changes.
Pinterest Search API at a glance
Returns the pins Pinterest's search shows for a keyword, a page at a time, in Pinterest's order. Each pin has its pictures or video, title and description, the link it saves, its board, the pinner with their follower count, reactions, when it was saved and the interests Pinterest files it under.
GET /v1/pinterest/search_pins
- 1 credit per page, $0.75–$1.97 per 1,000 pages
- 22 typed fields null when unknown
- 25 pins per page, Pinterest's own relevance order for the query
queryis all it needs, e.g.nail art
Send one request. Get up to 25 pins back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtapquery = nail artconst params = new URLSearchParams({
query: "nail art",
});
const res = await fetch(`https://socialtap.dev/v1/pinterest/search_pins?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, page, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/pinterest/search_pins",
params={"query": "nail art"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/pinterest/search_pins")
uri.query = URI.encode_www_form('query' => 'nail art')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'query' => 'nail art',
]);
$ch = curl_init('https://socialtap.dev/v1/pinterest/search_pins?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("query", "nail art")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/pinterest/search_pins?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Page json.RawMessage `json:"page"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl -G 'https://socialtap.dev/v1/pinterest/search_pins' \
--data-urlencode 'query=nail art' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": [
{
"approximate_fields": [],
"author": {
"avatar_url": "https://i.pinimg.com/280x280_RS/ed/94/cd/ed94cd596ae3162a29a215670b26b7dd.jpg",
"display_name": "Depop",
"id": "189292127996348775",
"is_verified": false,
"url": "https://www.pinterest.com/depop/",
"username": "depop"
},
"coauthors": [],
"duration_ms": null,
"hashtags": [
"acrylicnails",
"swirls",
"chrome"
],
"id": "e1_AfqPShx1XVZpv_ISZ-VS4878xEn4fB0nwdJscpsd6xSthGtJwlWe9Q",
"is_nsfw": null,
"is_pinned": null,
"is_sponsored": null,
"language": null,
"media": [
{
"alt_text": "Multi-colored ombré swirl acrylic nails with silver chrome swirl embellishment rainbow #acrylicnails #swirls #chrome #custom #presson\n\nEach set is handmade by me with love! ♡\nPrice is for ONE complete set of press-on nails.\n\nSize:\n• XS\n• S\n• M\n• L\n• XL\n♡ Please double-check your …",
"duration_ms": null,
"expires_at": null,
"height": 1280,
"thumbnail_url": "https://i.pinimg.com/originals/08/9c/1e/089c1eaf1df17e01c50616fc9d47bae2.jpg",
"type": "image",
"url": "https://i.pinimg.com/originals/08/9c/1e/089c1eaf1df17e01c50616fc9d47bae2.jpg",
"width": 1280
}
],
"mentions": [],
"metrics": {
"comment_count": null,
"like_count": 14,
"quote_count": null,
"repost_count": null,
"save_count": null,
"share_count": null,
"view_count": null
},
"platform": "pinterest",
"platform_specific": {
"pinterest": {
"author_follower_count": 161666,
"board": {
"id": "189292059277314742",
"title": "Products",
"url": "https://www.pinterest.com/depop/_products/"
},
"caption_languages": [],
"domain": "depop.com",
"dominant_color": "#baa6a2",
"interests": [
"Silvar Nails",
"Squigly Nails",
"Nail Art Studs"
],
"is_ad": false,
"is_author_verified_merchant": true,
"is_repin": null,
"link_url": "https://www.depop.com/products/nailsbyvicj-multi-colored-ombre-swirl-acrylic-nails-57e2/?pla_feed=US",
"original_pinner": null,
"repin_count": null,
"rich_type": "product"
}
},
"platform_type": "pin",
"published_at": "2026-10-16T01:29:18Z",
"text": "Multi-colored ombré swirl acrylic nails with silver chrome swirl embellishment rainbow #acrylicnails #swirls #chrome #custom #presson\n\nEach set is handmade by me with love! ♡\nPrice is for ONE complete set of press-on nails.\n\nSize:\n• XS\n• S\n• M\n• L\n• XL\n♡ Please double-check your …",
"thumbnail_url": "https://i.pinimg.com/originals/08/9c/1e/089c1eaf1df17e01c50616fc9d47bae2.jpg",
"title": "Depop Unisex Nails",
"type": "image",
"unknown_fields": [],
"url": "https://www.pinterest.com/pin/e1_AfqPShx1XVZpv_ISZ-VS4878xEn4fB0nwdJscpsd6xSthGtJwlWe9Q/"
},
{
"approximate_fields": [],
"author": {
"avatar_url": "https://i.pinimg.com/280x280_RS/7f/d2/07/7fd207a1929860fd93ec684eb717a4b4.jpg",
"display_name": "Walmart",
"id": "112027246889273637",
"is_verified": true,
"url": "https://www.pinterest.com/walmart/",
"username": "walmart"
},
"coauthors": [],
"duration_ms": null,
"hashtags": [],
"id": "e1_AfqPShzcXsfR3xPWrd6Muo58KSPWrQm1k9fyQsnJjD8aUqzpTeRGCw",
"is_nsfw": null,
"is_pinned": null,
"is_sponsored": null,
"language": null,
"media": [
{
"alt_text": "Elevate your nail game with our 24 Pieces Navy Blue and Yellow Polka Dot Star Press on Nails Set. This trendy nail art collection features a perfect blend of chic navy blue and playful yellow polka dots, complemented by star accents, making it ideal for any occasion. Whether you'…",
"duration_ms": null,
"expires_at": null,
"height": 1200,
"thumbnail_url": "https://i.pinimg.com/originals/2d/e6/38/2de638c7f0f6c5c1a8c23fe31d6f0eba.jpg",
"type": "image",
"url": "https://i.pinimg.com/originals/2d/e6/38/2de638c7f0f6c5c1a8c23fe31d6f0eba.jpg",
"width": 1200
}
],
"mentions": [],
"metrics": {
"comment_count": null,
"like_count": 2,
"quote_count": null,
"repost_count": null,
"save_count": null,
"share_count": null,
"view_count": null
},
"platform": "pinterest",
"platform_specific": {
"pinterest": {
"author_follower_count": 2307882,
"board": {
"id": "112027178170042638",
"title": "Products",
"url": "https://www.pinterest.com/walmart/_products/"
},
"caption_languages": [],
"domain": "walmart.com",
"dominant_color": "#79594d",
"interests": [
"Nail Eesigns",
"Gel X Nail Designs Almond Short",
"Trending Summer Nails Short Square"
],
"is_ad": false,
"is_author_verified_merchant": true,
"is_repin": null,
"link_url": "https://www.walmart.com/ip/24-Pieces-Navy-Blue-and-Yellow-Polka-Dot-Star-Press-on-Nails-Set-Trendy-Nail-Art-for-Every-Occasion/20563271063?wmlspartner=wlpa&selectedSellerId=103119446",
"original_pinner": null,
"repin_count": null,
"rich_type": "product"
}
},
"platform_type": "pin",
"published_at": "2026-09-13T06:37:36Z",
"text": "Elevate your nail game with our 24 Pieces Navy Blue and Yellow Polka Dot Star Press on Nails Set. This trendy nail art collection features a perfect blend of chic navy blue and playful yellow polka dots, complemented by star accents, making it ideal for any occasion. Whether you'…",
"thumbnail_url": "https://i.pinimg.com/originals/2d/e6/38/2de638c7f0f6c5c1a8c23fe31d6f0eba.jpg",
"title": "24 Pieces Navy Blue and Yellow Polka Dot Star Press on Nails Set - Trendy Nail Art for Every Occasion",
"type": "image",
"unknown_fields": [],
"url": "https://www.pinterest.com/pin/e1_AfqPShzcXsfR3xPWrd6Muo58KSPWrQm1k9fyQsnJjD8aUqzpTeRGCw/"
},
{
"approximate_fields": [],
"author": {
"avatar_url": "https://i.pinimg.com/280x280_RS/d1/84/c8/d184c8624cb409c8f6e4fcf8baf91cd2.jpg",
"display_name": "Etsy",
"id": "155304024558534660",
"is_verified": true,
"url": "https://www.pinterest.com/etsy/",
"username": "etsy"
},
"coauthors": [],
"duration_ms": null,
"hashtags": [],
"id": "e1_AfqPShz7mhLYU-JOyXGGq4evbbMsKODcOgIj3LayXlAsznsy2SC3Mw",
"is_nsfw": null,
"is_pinned": null,
"is_sponsored": null,
"language": null,
"media": [
{
"alt_text": "Welcome to my shop! ✨ I'm so glad you're here--hope you find a style that speaks to you. 🛠️ I use only high-quality materials to create press-on nails that are sturdy, long-lasting, and made to be trusted. 💅 Wear them: 1-2 days with adhesive tabs (included with your set) 2-3 week…",
"duration_ms": null,
"expires_at": null,
"height": 1800,
"thumbnail_url": "https://i.pinimg.com/originals/33/96/33/339633ec3d5d602aa4c2ec35f08d308e.jpg",
"type": "image",
"url": "https://i.pinimg.com/originals/33/96/33/339633ec3d5d602aa4c2ec35f08d308e.jpg",
"width": 1350
}
],
"mentions": [],
"metrics": {
"comment_count": null,
"like_count": 2129,
"quote_count": null,
"repost_count": null,
"save_count": null,
"share_count": null,
"view_count": null
},
"platform": "pinterest",
"platform_specific": {
"pinterest": {
"author_follower_count": 11240119,
"board": {
"id": "155303955839369647",
"title": "Products",
"url": "https://www.pinterest.com/etsy/_products/"
},
"caption_languages": [],
"domain": "etsy.com",
"dominant_color": "#593727",
"interests": [
"Light Briwn Nails",
"Leapard Nails",
"Summer And Fall Nails"
],
"is_ad": false,
"is_author_verified_merchant": true,
"is_repin": null,
"link_url": "https://www.etsy.com/listing/4507489889/leopard-print-press-on-nails-with-white",
"original_pinner": null,
"repin_count": null,
"rich_type": "product"
}
},
"platform_type": "pin",
"published_at": "2026-07-17T20:11:24Z",
"text": "Welcome to my shop! ✨ I'm so glad you're here--hope you find a style that speaks to you. 🛠️ I use only high-quality materials to create press-on nails that are sturdy, long-lasting, and made to be trusted. 💅 Wear them: 1-2 days with adhesive tabs (included with your set) 2-3 week…",
"thumbnail_url": "https://i.pinimg.com/originals/33/96/33/339633ec3d5d602aa4c2ec35f08d308e.jpg",
"title": "Leopard Print Press on Nails with White Floral Art, Brown Spots and Gold Accent, Trendy Animal Print Fake Nails, Reusable",
"type": "image",
"unknown_fields": [],
"url": "https://www.pinterest.com/pin/e1_AfqPShz7mhLYU-JOyXGGq4evbbMsKODcOgIj3LayXlAsznsy2SC3Mw/"
}
],
"page": {
"has_more": true,
"next_cursor": "c1.EXAMPLE_CURSOR",
"next_cursor_expires_at": "2026-10-26T12:00:00Z",
"end_reason": null
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "pinterest",
"source": "api",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 0,
"fetched_at": "2026-10-25T12:00:00Z",
"input": null,
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.pinterest.searchPins.list({ query: "nail art" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "query=" + encode("nail art");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/pinterest/search_pins?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"query=" + Uri.EscapeDataString("nail art"));
var res = await http.GetAsync("https://socialtap.dev/v1/pinterest/search_pins?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/pinterest/search_pins")
.query(&[("query", "nail art")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/pinterest/search_pinsLong arrays and strings are shortened here. Real responses are complete.Docs One schema on 21 platforms.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Pinterest doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
What to search for, in any language, as you would type it in Pinterest's search box: words, a phrase, emoji.
Write one parser
Pinterest, TikTok, Instagram and 18 more platforms answer in these fields, so the code that reads one reads them all.
platformstring- Platform ID (tiktok, youtube, …).
idstring- Platform-native post ID (string; Instagram shortcode, Reddit with its t3_ prefix).
urlstring- Canonical post URL.
typestring- Normalized content shape. New values may be added; treat unknown values as other.
platform_typestring- The platform's own product label, lowercase (reel, short, story, live, tweet, …).
titlestring- Headline (YouTube title, Reddit title); null on caption-only platforms.
textstring- Caption, description or body as plain text.
languagestring- BCP-47 language of text, when the platform states it.
Live data from 33 platforms.
What teams build with the Pinterest Search API.
Find pins and trends for a product idea
Collect pictures for a mood board or dataset
See which sites and shops rank for a keyword
Track who pins about your brand
Good to know before you build.
- Pinterest names the pins of a logged-out search by an encrypted ID (e1_…) that its pin page doesn't open without an account, so the Pinterest Pin API can't take it. Everything else about the pin is in the result: its pictures, link, pinner, board and reactions. The same pin can carry its number instead on endpoints Pinterest serves numbers on, such as an account's pins, so the two IDs don't match across endpoints.
- Pinterest's search shows no comment count, saves or repins: metrics.comment_count, metrics.save_count and platform_specific.pinterest.repin_count are null. The Pinterest Pin API has them for a pin you have by number.
- An idea pin's text is often only on its own page: such a pin has a null text here.
- Pinterest corrects a misspelled search and answers for the correction, as its search box does.
- Some searches answer an empty page with an items_omitted warning quoting the notice Pinterest shows instead of pins: a help notice for searches about self-harm, its community guidelines for adult topics.
1 credit per page. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful page | Per 1,000 pages |
|---|---|---|
Platform API api | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Pinterest Search API.
More in the API reference.
Can I search Pinterest without an account?
Why can't I open a result's pin by its ID?
How much does the Pinterest Search API cost?
How do I get the next page?
Try it with your own search.
Type it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints