Skip to content

In March you published 400 product pins. Now it’s September, and someone asks which of them still send people to the store. Pinterest’s API can’t answer that. Its analytics endpoints reject any start_date more than 90 days back, so as far as your code is concerned, March is gone.

Pinterest’s own dashboard goes further back, if a person does the looking. It shows all-time totals and performance over time. Its top pins and top boards stop at six months, though, and a reporting script can’t query a dashboard.

PinBridge now keeps its own copy. Every night it saves the daily numbers for each connected account and for every pin it published, and it keeps those days after Pinterest’s API stops returning them. The pins you publish this autumn will still have numbers next spring. PinBridge also knows how each pin was published, and Pinterest has no view of that at all.

Where Pinterest’s numbers stop

Pinterest API (v5) Pinterest dashboard PinBridge
Account totals and trends Last 90 days All time Every day it has collected
Top pins Last 90 days Last 6 months Any stored range, up to 366 days per request
Pins that failed to publish Not visible Not visible Status, error code, reason
Who published a pin, and how Not visible Not visible Activity log per pin

The 90-day limit is in Pinterest’s API reference. Any tool that reads analytics live from Pinterest has the same horizon, whatever its charts look like. If nobody saves a day within those 90 days, the API won’t give it back.

What PinBridge collects, and when

A job runs at 03:30 UTC every night. For each connected account it saves the account’s daily impressions, engagements, saves, pin clicks and outbound clicks. That covers the whole account, including pins published outside PinBridge. It also saves daily impressions, saves, pin clicks, outbound clicks, comments and reactions for every pin PinBridge published to that account.

The first run backfills the 90 days Pinterest still serves. After that, each run fetches the last week again, because Pinterest revises recent days after the fact. A day Pinterest still marks PROCESSING never overwrites a finished READY day. Collection runs in the background and doesn’t count against your workspace’s Pinterest read limit.

Read a pin past the 90-day window

The analytics endpoints you may already use, GET /v1/pins/{id}/analytics and GET /v1/pinterest/accounts/{id}/analytics, now read stored history by default. Ask for a range that starts before Pinterest’s window, and PinBridge answers from its copy instead of rejecting the range:

curl "https://api.pinbridge.io/v1/pins/$PIN_ID/analytics?start_date=2026-01-01&end_date=2026-09-24" \
  -H "x-api-key: $PINBRIDGE_API_KEY"
{
  "pin_id": "8f0c2b1e-…",
  "pinterest_pin_id": "1109644795740935410",
  "start_date": "2026-01-01",
  "end_date": "2026-09-24",
  "provider_mode": "pinterest",
  "source": "stored",
  "history_start": "2026-06-27",
  "data_as_of": "2026-09-24T03:41:12Z",
  "totals": {"impression": 18240, "save": 312, "pin_click": 944, "outbound_click": 287},
  "daily": [
    {"date": "2026-06-27", "data_status": "READY",
     "metrics": {"impression": 204, "save": 3, "pin_click": 11, "outbound_click": 4}}
  ]
}

Three fields tell you what you’re looking at. source says whether the answer came from PinBridge’s copy (stored) or from Pinterest just now (live). history_start is the earliest day PinBridge holds for the account. Here it’s in June, because collection started this week and backfilled 90 days, so the January part of the range comes back empty rather than invented. data_as_of is when the account was last collected.

You can override the default with the source parameter. auto uses the stored copy when it covers the range and asks Pinterest otherwise. stored never calls Pinterest. live always does, and keeps Pinterest’s 90-day limit.

Rank what you published

Two workspace-level endpoints read only stored history and never call Pinterest.

GET /v1/analytics/pins ranks your published pins by one metric over a range: impression, save, pin_click, outbound_click, total_comments or total_reactions. Pinterest’s top pins stop at six months. This range can be any stretch of stored history up to 366 days.

GET /v1/analytics/overview sums account metrics across all your connected accounts, or just one. It returns a daily series plus the totals for the period right before it, so a month-over-month comparison is one request. It also reports each account’s collection status, so you notice when an account has stopped reporting.

Publishing analytics: the half Pinterest can’t see

Pinterest only knows about pins that exist on Pinterest. A pin that failed at 02:00 because a board lost write access never shows up in its analytics. PinBridge keeps a record of every pin it tried to publish: when it was created, when it went live, its status, and for failures an error code and message. The activity log adds who created it, whether that was a dashboard user or a named API key.

So you can report both halves together. Here’s August for one workspace: what happened to every pin, and which ones earned clicks.

import os
from collections import Counter

import requests

API = "https://api.pinbridge.io"
H = {"x-api-key": os.environ["PINBRIDGE_API_KEY"]}

# 1. Every pin created in August, whatever happened to it
pins, offset = [], 0
while True:
    page = requests.get(f"{API}/v1/pins", headers=H, params={
        "since": "2026-08-01T00:00:00Z", "until": "2026-09-01T00:00:00Z",
        "limit": 200, "offset": offset,
    }).json()
    pins += page
    if len(page) < 200:
        break
    offset += 200

print(Counter(p["status"] for p in pins))
# Counter({'published': 311, 'failed': 9})
print(Counter(p["error_code"] for p in pins if p["status"] == "failed"))
# Counter({'board_access_denied': 7, 'token_expired': 2})

# 2. The pins that earned the most outbound clicks since August 1
top = requests.get(f"{API}/v1/analytics/pins", headers=H, params={
    "start_date": "2026-08-01", "end_date": "2026-09-24",
    "sort_by": "outbound_click", "limit": 10,
}).json()
for item in top["items"]:
    print(item["totals"]["outbound_click"], item["title"], item["published_at"])

The first half is publishing analytics: your success rate, and why the failures happened (seven of nine failing with the same board error is a pattern worth fixing). The second half is performance. Pinterest can only give you the second, and only for 90 days.

Or ask your agent

If you’ve connected the PinBridge MCP server to Claude, ChatGPT or another MCP client, you can skip the script. The agent calls get_account_analytics, get_pin_analytics, list_pins and list_activity_logs itself and does the comparing for you. Questions like these work:

  • “How did the shop account do in September compared with August? Impressions, saves and outbound clicks.”
  • “Of the pins we published last week, which three got the most outbound clicks? Did any fail, and why?”
  • “The Tuesday pins to the Recipes board failed. What happened, and is the board still publishable?”

The model does the analysis. PinBridge supplies the numbers and the publish record, limited to what the agent’s API key is allowed to see. The MCP setup guide takes a few minutes.

What to know before you rely on it

History starts at your first collection. PinBridge can’t recover what Pinterest has already dropped, so an account connected today gets 90 days of backfill and then grows one day per night. The earlier an account is connected, the longer its history.

Pin-level history covers pins PinBridge published. Account totals include everything on the account, but per-pin numbers exist only for pins that went through PinBridge.

The numbers are daily, not live. They update overnight, and Pinterest keeps revising the most recent days. Check data_as_of, or trigger a collection yourself with POST /v1/analytics/accounts/{id}/collect, which you can call once every 15 minutes per account.

Idle accounts pause. The nightly job never refreshes a Pinterest token on its own, on purpose (we explained why in why Pinterest integrations die quietly after two months). An account nobody uses stops collecting when its token expires. Publish with it or run a collection and the missed days are filled in, as long as the gap is shorter than 90 days.

Sandbox projects don’t collect. Their analytics are simulated.

The same stored history powers the Analytics section of the PinBridge dashboard, where you can pick 6- and 12-month ranges. Every day an account isn’t connected is a day Pinterest will eventually drop, so start free and connect yours.

Leave a Reply

Your email address will not be published. Required fields are marked *

Skip the token plumbing

PinBridge is a hosted Pinterest publishing API. Connect an account once and we handle the refresh loop, the locking and the reconnect prompt.