Sylvatica.

Back to Library

Scrape Pinterest

js 1/26/2026
6
const axios = require('axios');

async function pinterest(query) {
  try {
    const url = `https://id.pinterest.com/resource/BaseSearchResource/get/?source_url=/search/pins/?q=${query}&rs=rs&data=${encodeURIComponent(JSON.stringify({
      options: {
        query: query,
        rs: "rs",
        scope: "pins",
        redux_normalize_feed: true,
        source_url: `/search/pins/?q=${encodeURIComponent(query)}&rs=rs`
      },
      context: {}
    }))}`;

    const res = await axios.get(url, {
      headers: {
        "accept": "application/json, text/javascript, */*; q=0.01",
        "x-pinterest-appstate": "active",
        "x-pinterest-pws-handler": "www/search/[scope].js",
        "x-requested-with": "XMLHttpRequest",
        "user-agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36",
        "referer": "https://id.pinterest.com/",
        "accept-language": "id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7"
      }
    });

    if (res.status !== 200) {
      return { error: `Pinterest error ${res.status} ${res.statusText}` };
    }

    let json;
    try {
      json = res.data;
    } catch (err) {
      return { error: "Invalid JSON response: " + err.message };
    }

    const results = json.resource_response?.data?.results || [];
    if (results.length === 0) return { error: "No results" };

    const formatted = results.map(pin => ({
      id: pin.id,
      title: pin.seo_alt_text || "No Title",
      image: pin.images?.["474x"]?.url || pin.images?.["236x"]?.url || null,
      board: pin.board?.name || "-",
      username: pin.pinner?.username || "-",
      source: `https://id.pinterest.com/pin/${pin.id}/`
    }));

    return { query, count: formatted.length, results: formatted };
  } catch (e) {
    return { error: e.message };
  }
}

module.exports = { pinterest };