Pinterest URL Save Count API. Send a web page link.
Exact Pinterest saves of any web page's link. We handle the proxies, blocks and platform changes.
Pinterest URL Save Count API at a glance
Returns how many times a web page was saved to Pinterest, from the page's link. The count is exact, the number Pinterest's own Save button shows, for any page: an article, a recipe, a product, a video on another platform. A link no one saved, or a page that doesn't exist, counts zero.
GET /v1/pinterest/web_page
- 1 credit per request, $0.75–$1.97 per 1,000 requests
- 5 typed fields null when unknown
urlis all it needs, e.g.https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/- 100 credits free when you sign up, no card, so you can build before you spend
Send one request. Get 5 fields 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 socialtapurl = https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/const params = new URLSearchParams({
url: "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/",
});
const res = await fetch(`https://socialtap.dev/v1/pinterest/web_page?${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, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/pinterest/web_page",
params={"url": "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/"},
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, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/pinterest/web_page")
uri.query = URI.encode_www_form('url' => 'https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/')
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([
'url' => 'https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/',
]);
$ch = curl_init('https://socialtap.dev/v1/pinterest/web_page?' . $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("url", "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/pinterest/web_page?"+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"`
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/web_page' \
--data-urlencode 'url=https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": {
"approximate_fields": [],
"metrics": {
"share_count": 35111
},
"platform": "pinterest",
"platform_specific": {},
"unknown_fields": [],
"url": "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/"
},
"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": {
"kind": "web",
"id": null,
"url": "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/"
},
"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.webPage.get({ url: "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/" });
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 = "url=" + encode("https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/pinterest/web_page?" + 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("&",
"url=" + Uri.EscapeDataString("https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/"));
var res = await http.GetAsync("https://socialtap.dev/v1/pinterest/web_page?" + 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/web_page")
.query(&[("url", "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/")])
.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/web_pageDocs What you send and what comes back.
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
Any web page's link, exactly as people save it: an article, a recipe, a product page, another platform's video.
What comes back
How many times a web page's link was shared or saved on a platform, for any page on or off it.
platformstring- Platform that counted the page's link.
urlstring- The web page's link, exactly as sent (not normalized): platforms that count the exact string (Pinterest) count https://example.com and https://example.com/ apart.
metricsobject- Counts at fetch time; null = the platform did not say, 0 = it counts none.
approximate_fieldsstring[]- JSON paths of values rounded by the platform (Facebook's "57K": metrics.share_count). [] when all exact.
unknown_fieldsstring[]- JSON paths of lists whose [] means unknown rather than none; a web page has no lists, so always [].
Live data from 33 platforms.
What teams build with the Pinterest URL Save Count API.
Measure how a blog post spreads on Pinterest
Rank recipes or products by Pinterest saves
Track a campaign landing page's saves over time
Compare competitors' pages by Pinterest reach
Good to know before you build.
- Pinterest counts the exact link: http and https, with or without www, a trailing slash, a query string or a #fragment each have their own count, so send the link as people share it, or each form and add them up.
- A count of zero means no one saved that exact link. Pinterest doesn't open the page, so a page that doesn't exist also counts zero.
- Send an international domain in its xn-- form (https://xn--r8jz45g.jp/): Pinterest refuses the Unicode form, and so does this endpoint.
- One link per request. For many links at once, send them as a batch job.
1 credit per request. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful request | Per 1,000 requests |
|---|---|---|
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 URL Save Count API.
More in the API reference.
Is this the share count Pinterest's Save button shows?
Does it take links to pages off Pinterest?
How much does the Pinterest URL Save Count API cost?
Try it on a link you already have.
Paste it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints