*{box-sizing:border-box;margin:0;padding:0} :root{ --bg:#fbfaff;--bg2:#f7f5fd;--surface:#ffffff;--surface-alt:#f7f5fd; --line:#e8e3f4;--line-strong:#d8d0ea; --ink:#15121f;--ink2:#615a75;--ink3:#9a93ad; --accent:#6d3df5;--accent-hover:#5220d6;--accent-ink:#ffffff; --tipbg:#fff2d6;--tipbd:#ffb020;--tipink:#7a4a00; --radius:16px;--radius-lg:22px; --font-sans:"Plus Jakarta Sans","Segoe UI",system-ui,-apple-system,sans-serif;--font-head:"Outfit","Segoe UI",system-ui,sans-serif; --font-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; } html{-webkit-text-size-adjust:100%} body{font-family:var(--font-sans);color:var(--ink);background:var(--bg);line-height:1.72;overflow-wrap:anywhere;text-rendering:optimizeLegibility} a{color:inherit;text-decoration:none} .wrap{width:100%;max-width:760px;margin:0 auto;padding:0 20px} header{background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:30} .hd{display:flex;align-items:center;justify-content:space-between;min-height:60px;gap:.75rem;flex-wrap:wrap} .logo{display:inline-flex;align-items:center;gap:.6rem;font-weight:700;font-size:1.1rem;color:var(--ink);letter-spacing:-.02em;min-height:44px} .logo .mark{width:28px;height:28px;border-radius:var(--radius);background:var(--accent);color:var(--accent-ink);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px} .hd a.back{font-size:14px;color:var(--accent);font-weight:600} .crumb{font-size:13px;color:var(--ink3);padding:20px 0 8px} .crumb a:hover{color:var(--accent)} .crumb span{margin:0 6px} main{padding-bottom:60px} h1{font-family:var(--font-head);font-size:clamp(24px,5.2vw,33px);font-weight:800;letter-spacing:-.4px;line-height:1.24;margin-top:6px;color:var(--ink)} .meta{color:var(--ink3);font-size:13px;margin-top:10px} .lede{font-size:17px;color:var(--ink2);margin-top:16px;line-height:1.65} article{margin-top:8px} article h2{font-family:var(--font-head);font-size:clamp(19px,4.2vw,23px);font-weight:800;letter-spacing:-.3px;margin:36px 0 12px;color:var(--ink)} article h3{font-family:var(--font-head);font-size:16.5px;font-weight:700;margin:22px 0 6px;color:var(--ink)} article p{font-size:15.6px;margin:12px 0;color:var(--ink2)} article ul{margin:12px 0 12px 2px;padding-left:22px} article li{font-size:15.4px;margin:9px 0;color:var(--ink2)} article b,article strong{color:var(--ink);font-weight:700} article code{background:var(--surface2);border:1px solid var(--line);border-radius:var(--radius);padding:1px 6px;font-size:13.4px;font-family:var(--font-mono);word-break:break-all;color:var(--ink)} .tip{margin:18px 0;padding:13px 16px;border-radius:var(--radius-lg);background:var(--tipbg);border:1px solid var(--tipbd);border-left:3px solid var(--tipbd);font-size:14.4px;line-height:1.66;color:var(--tipink)} .note{margin:14px 0;padding:11px 14px;border-radius:var(--radius-lg);background:var(--surface);border:1px solid var(--line);font-size:14px;color:var(--ink2)} .steps{margin:16px 0;display:grid;gap:14px} .step{display:flex;gap:14px} .step .n{flex:0 0 30px;width:30px;height:30px;border-radius:var(--radius);background:var(--accent);color:var(--accent-ink);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14.5px} .step .t{font-size:15.4px;color:var(--ink2)} .step .t b{display:block;font-size:15.6px;margin-bottom:2px;color:var(--ink)} .entry{margin:20px 0;padding:16px 18px;border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--surface)} .entry h3{margin-top:0} .cta{margin:38px 0 6px;padding:24px 20px;border-radius:var(--radius-lg);text-align:center;background:var(--surface);border:1px solid var(--line)} .cta h3{font-family:var(--font-head);font-size:18px;font-weight:800;margin:0;color:var(--ink)} .cta p{font-size:14.3px;color:var(--ink2);margin:8px 0 16px} .cta a{display:inline-block;padding:13px 28px;border-radius:var(--radius);background:var(--accent);color:var(--accent-ink);font-weight:700;font-size:14.6px} .rel{margin-top:34px;padding-top:22px;border-top:1px solid var(--line)} .rel h3{font-family:var(--font-head);font-size:16px;font-weight:800;margin:0 0 12px;color:var(--ink)} .rel a{display:block;padding:12px 15px;border:1px solid var(--line);border-radius:var(--radius-lg);font-size:14.3px;margin-bottom:9px;transition:.15s;color:var(--ink2)} .rel a:hover{border-color:var(--accent);background:var(--surface2);color:var(--ink)} .glist{display:grid;gap:12px;margin-top:20px} .glist a{display:flex;gap:14px;align-items:flex-start;padding:13px 15px;border:1px solid var(--line);border-radius:var(--radius-lg);transition:.15s;background:var(--surface)} .glist a:hover{border-color:var(--accent)} .glist .gthumb{flex:0 0 auto;width:72px;height:72px;object-fit:cover;border-radius:var(--radius)} .glist .gthumb.plain{display:flex;align-items:center;justify-content:center;font-size:22px;color:var(--ink3)} .glist .gtxt{min-width:0} .glist b{display:block;font-family:var(--font-head);font-size:16px;margin-bottom:5px;line-height:1.4;color:var(--ink)} .glist span{color:var(--ink2);font-size:14px;line-height:1.6} footer{border-top:1px solid var(--line);padding:30px 0 44px;color:var(--ink3);font-size:12.9px;text-align:center} footer a{color:var(--accent)} .cta,.rel a,.glist a,.entry{box-shadow:0 1px 2px rgba(21,18,31,.04),0 6px 18px rgba(21,18,31,.06)} @media(max-width:420px){ article p,article li{font-size:15px} .hd{min-height:56px} .cta{padding:20px 15px} }
Open PinMosaic

What PinMosaic cannot do

Checked against the running server on 2026-10-28

A Pinterest downloader usually advertises the happy path and says nothing about the rest. This page is the rest, with the actual figures from the running build, so a failure reads as a known boundary instead of a mystery — and so an automated reader can tell a wait from a dead end.

The short version

1Too fastTen link readings and thirty downloads per address per ten minutes. Separate counters.
2Too slow to useA job lives thirty minutes; the download link inside it lives fifteen.
3Too many at onceFive hundred jobs are held at once; beyond that the oldest is dropped.
4Wrong linkBoards, profiles and search pages are refused; one Pin at a time, by link.
5Nothing to savePrivate Pins, dead short links, and Pins whose video file is gone.

The thirteen limits, with the numbers

1. Ten link readings per address per ten minutes

Reading a Pin link — the step that turns a URL into a list of files — is capped at ten per client address on a fixed ten-minute window. The eleventh in the same window is refused with HTTP 429 and a retry delay equal to the time left in the window, carried in a Retry-After header so a client never has to guess. The counter is a fixed window, not a rolling average, so it resets all at once rather than trickling back.

2. Thirty downloads per address per ten minutes

Saving files is a separate counter with its own allowance: thirty per address per ten minutes. Because the two counters are independent, being blocked from reading does not block you from downloading a list you already have, and vice versa. A Pin with nine renditions therefore cannot be saved three times inside one window.

3. A job lives thirty minutes in server memory

A resolve produces a job, and that job holds the result and the download links. It exists only in server memory for thirty minutes. After that the job is swept and the answer to an old job id is an expired error rather than a stale result. A restart empties the store immediately, which the page communicates as "read the Pin again" rather than as a fault.

4. A download link expires in fifteen minutes

Each file carries its own signed link, and that signature carries an expiry fifteen minutes from the moment the result was produced. Past that the link answers HTTP 410 and says expired. The signature also binds the link to the job and to the browser session that created it, so a link pasted into another browser answers not-found rather than delivering the file.

5. Five hundred jobs exist server-wide at once

Jobs are held for everyone on the server together, with room for five hundred. Past that the oldest are dropped to make space, so under heavy load a job can disappear earlier than its thirty minutes. Nothing else changes: a dropped job answers expired, and reading the Pin again produces a fresh one.

6. Only a Pin link is accepted, never a board or a profile

The input must be one Pin. A board address, a profile address and a search address are all refused with a distinct code, because each of them looks like a valid Pinterest link while meaning "many Pins". There is no batch mode, no whole-board save and no feed listing. That boundary is deliberate rather than a missing feature.

7. Private and secret boards are unreachable

Nothing here logs in, so nothing behind a login can be read. A Pin on a secret board, a deleted Pin and a Pin from a suspended account all answer the same not-found code. There is no setting on the page that changes this, and no retry that helps.

8. A pin.it short link must actually resolve to a Pin

Short links are followed through their redirect chain and the final address decides. A valid short code lands on the Pin. An invalid or expired one lands on the Pinterest home page with HTTP 200 — no error page, just the home page — which is why this case has its own code instead of being reported as a network failure.

9. A Pin whose video file is gone answers GHOST_VIDEO, with a cover thumbnail

Pinterest keeps the Pin record after the media file is removed, and the record keeps its video flag. The result is a Pin that claims a video and has none. This tool reports that state explicitly and returns only the 474-pixel cover thumbnail — no size list, no rendition list. It is not a download failure and retrying changes nothing.

10. A Pin with neither a reachable image nor a video answers NO_MEDIA

This is the empty case: image specifications were found but every one of them measured dead, and no video variant existed either. It is distinguished from GHOST_VIDEO because the cause is different — there the video is gone, here nothing usable was ever there. Both are permanent for that Pin.

11. Measurement is bounded, so late rows carry no size

Before answering, the tool measures the first five image sizes and the first four video renditions by fetching a byte range of each. Rows beyond those counts are listed without a measured size. This is a deliberate ceiling on how long a single read may take, and it is why a long rendition list shows some sizes and not others.

12. Pinterest metadata is not trusted; sizes are measured

A declared 1080 by 1920 video has been measured at 720 by 1280, and an "originals" address has answered 403. So every size shown is read from the bytes rather than from the label, and a variant that cannot be measured is dropped instead of being offered optimistically. A size you do not see is a size that could not be confirmed.

13. Which failure codes can be retried, and which cannot

RATE_LIMITED and TIMEOUT are worth retrying. EXPIRED is worth retrying only by reading the Pin again, not by reusing the old link. INVALID_URL, UNSUPPORTED_LINK, SHORT_LINK_INVALID, PIN_NOT_FOUND, GHOST_VIDEO, NO_MEDIA, SOURCE_ERROR, NOT_FOUND and NETWORK are permanent for that request and retrying them changes nothing. All twelve are listed under each failure below, in the same words the API returns.

What each failure actually means

Ten outcomes look alike from the outside. Two of them are worth reacting to, one is worth re-reading the Pin, and the rest are permanent for that link. None of them mean the tool is broken.

1Rate limitedYou used the window allowance, here or at Pinterest. The answer carries a retry delay; waiting it out is the entire fix. RATE_LIMITED
2TimeoutPinterest did not answer in time. Worth one retry, especially for an old Pin. TIMEOUT
3ExpiredThe job or the signed link aged out, or a restart emptied the store. Read the Pin again; the old link cannot be revived. EXPIRED
4Invalid URLThe input was empty, longer than two thousand and forty-eight characters, unparseable, or pointed at a host that is not Pinterest. No retry fixes any of those. INVALID_URL
5Unsupported linkA real Pinterest address that carries no Pin id — a board, a profile or a search page. This tool reads one Pin at a time and there is no batch mode. UNSUPPORTED_LINK
6Short link invalidThe pin.it code is dead or expired and landed on the Pinterest home page instead of a Pin. The link itself is the problem, not the network. SHORT_LINK_INVALID
7Pin not foundPinterest knows the address form but has no such Pin, or the Pin was deleted or is on a secret board. Nothing here logs in, so a private Pin is indistinguishable from a missing one. PIN_NOT_FOUND
8Ghost videoThe Pin still claims a video but the file is gone. Only the 474-pixel cover thumbnail is returned. This is a fact about the Pin, not a fault in the tool. GHOST_VIDEO
9No mediaImage specifications existed but every one measured dead, and no video variant existed either. Permanent for that Pin. NO_MEDIA
10Source errorPinterest answered with something unusable — a shape that does not parse, or a page too short to contain a Pin. Usually transient, occasionally permanent for that Pin. SOURCE_ERROR

Two more codes exist and are not about a Pin at all: NOT_FOUND means the link asked for belongs to another browser session or to no job this server ever made, and NETWORK means the request never left the client or never reached us — so its answer says nothing about the Pin.

If you are automating this: the two limits answer with HTTP 429, an expired job or link answers with 410, and a refusal of the link itself answers with 400. Treating all three as "try again later" is how an automated client turns a permanent rejection into an endless retry loop that also burns the ten-per-ten-minute allowance.

What is not stored

No account, so there is no library, no history and nothing to sign back into. A resolved Pin lives in server memory for thirty minutes and is then swept. Files pass through the proxy to your browser and are not kept as a collection. There is no record of which Pins have been saved by whom, because there is no "who" in the first place.

What this tool is not

Not affiliated with Pinterest

PinMosaic is independent. It is not affiliated with, sponsored by or endorsed by Pinterest, and a refusal or a failure here says nothing about what Pinterest itself would allow.

Not a licence to republish

A public Pin is not permission to reuse someone else’s photograph or video. Public visibility and copyright are separate questions, and saving a file does not answer the second one.

Not an archiver

There is no way to point this at a board or an account and collect everything on it. One Pin at a time, by link. That boundary is the reason this tool is not an open proxy and not a bulk scraper.

See what is inside a Pin

Paste a public Pinterest Pin link and see every file behind it — each image size with its measured pixels, and each video rendition with its size where the tool measured it.

Open PinMosaic