Force a Facebook Open Graph Cache Refresh
You can force a Facebook Open Graph cache refresh, because Facebook — alone among the major platforms — exposes a programmatic way to ask. Either use the Sharing Debugger's Scrape Again button for a single link, or call the Graph API's scrape endpoint with an app access token. There is no way to force WhatsApp, LinkedIn or X: they publish no such API, for anyone.
The thing that trips everyone up
Meta caches a link preview keyed on the page URL, and stores its own copy of the image. It does not re-read your page to notice that og:image now points somewhere else.
So this workflow fails, and it is the one most people try:
Change the cover → the
og:imageURL is new → assume Facebook will pick it up → it does not.
A new image URL busts the image CDN. It does nothing to Meta's page-keyed cache. To move Facebook you must tell Meta that the page changed.
| Cache | Keyed on | Cleared by |
|---|---|---|
| Your page cache / CDN | the page URL | purging it |
| Meta's link-preview cache | the page URL | the scrape endpoint or the Sharing Debugger |
| Meta's copy of the image | the image URL | a new image URL |
| Your image CDN | the image URL | a new image URL |
Option 1 — the Sharing Debugger (one page, manual)
Open developers.facebook.com/tools/debug, paste the page URL, and press Scrape Again. Meta refetches the page and rebuilds its cached preview.
It is also the best free validator you have, because it reports what Meta actually found rather than what you hoped was there: missing or duplicated og:image, unreachable images, unsupported formats. Two things it will not do: it cannot touch WhatsApp (separate cache, in the recipient's app), and it is not a catalogue tool — it is one URL at a time, rate-limited, with a human in front of it.
Option 2 — the Graph API (this is what a plugin calls)
The programmatic equivalent used by FastOG is a POST to the Graph API with scrape=true:
curl -X POST \
"https://graph.facebook.com/v21.0/?id=$(python3 -c 'import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=""))' 'https://your-store.com/product/example')&scrape=true&access_token=${APP_ID}|${APP_SECRET}"
Four details that matter:
idis the page URL, not the image URL. Meta keys its cache on the page, so pinging the image address refreshes nothing.- A token is required — Meta has required one on this endpoint since October 2017. An app access token in the form
{app_id}|{app_secret}is enough, and it needs no user login, which is exactly what makes the call possible from a background job. - Graph API versions move. FastOG pins a tested Graph API version; check Meta's current documentation and changelog before pinning a version in your own code.
- Treat it as best-effort. Meta rate-limits scrape calls, and a refusal means only that Facebook refreshes on its own schedule instead of immediately — the tags on your page are already correct.
Because it is rate-limited, do not fire it inline on every save of a large catalogue. Queue it, and de-duplicate by URL so repeated saves of the same unchanged product do not spend rate limit.
Option 3 — a plugin that does it for you
Plugins marketed as an "Open Graph cache refresh" fall into two groups, and only one of them can fix Facebook:
| Mechanism | What it clears | Fixes a stale Facebook preview? |
|---|---|---|
Appends a changing query string to the image URL (?v=timestamp) |
your image CDN | No — Meta's cache is keyed on the page |
| Calls the scrape endpoint for the page URL | Meta's preview cache | Yes |
Before installing one, find out which it is. A timestamp parameter is a real fix for a stale image and a non-fix for a stale Facebook card.
FastOG for WooCommerce does the second one, and you configure nothing. The plugin registers WooCommerce's native product webhooks, so saving a product dispatches a Meta re-scrape for that product's permalink — queued, de-duplicated within a short window, and best-effort by design so a refusal never fails the save. It applies to product pages (product.created / product.updated); category and blog edits are not covered.
The image side is handled separately, and differently from every competitor: because a FastOG cover URL contains the values that produced it, editing the price or the photo mints a new cover URL. Meta cannot re-serve a picture whose address no longer exists.
Where Facebook is not enough
| Platform | Can you force a refresh? | What actually happens |
|---|---|---|
Yes — debugger or scrape=true |
Requests a re-scrape; propagation time varies | |
| No | Preview is cached in the recipient's app; no API exists | |
| No documented programmatic API | Re-reads on its own schedule; no public timing guarantee is made here | |
| X / Twitter | No documented programmatic API | Re-reads on its own schedule; no public timing guarantee is made here |
| Slack, Discord | No | Short-lived caches that clear themselves in minutes to hours |
If a preview is stale on WhatsApp, the answer is not a Facebook tool — it is getting the store side right so the next read is correct.
When it still shows the old image after a successful scrape
Work down this list, in order:
- Is the page still serving the old tag?
curl -s https://your-store.com/product/example | grep -i 'og:image'— a cached HTML page with a staleog:imagedefeats the scrape entirely. Purge the page cache. - Does the page print more than one
og:image? If two plugins each emit one, the crawler takes the first it reads. Count them. - Is the image reachable, and not blocked?
curl -I <image-url>should return200with an imageContent-Type. Social crawlers honourrobots.txt, so an image on aDisallow:path fails in a way that reads like a corrupt file — andcurlwill never reproduce it, becausecurlignoresrobots.txt. - Did the image URL actually change? If it did not, the content did not change either — check that the price/photo edit reached the source the card is drawn from.
- Check the debugger again. If it now reports the new image and Facebook still shows the old card, you are looking at Facebook's own propagation, not your tags.
FAQ
Is there an official API to clear Facebook's Open Graph cache?
FastOG uses the scrape endpoint (POST https://graph.facebook.com/{version}/?id={page-url}&scrape=true&access_token={token}). Meta documents the Sharing Debugger and programmatic crawl flow; the exact endpoint shape and Graph API version can change, so verify them against Meta's current documentation before implementing it yourself.
Does the Sharing Debugger need an app or a token?
No. It is a public tool and it works for any public URL. What it cannot do is run on a schedule or cover a catalogue.
Will re-scraping cost me a FastOG render?
Usually not. A cover URL is content-derived, so if the content did not change the URL did not either, and the fetch is a cache hit that costs no render. If the price changed, the URL changed — that is one new render, and it is the render you wanted.
Does re-scraping Facebook fix my WhatsApp preview?
No. They are separate caches. Facebook's debugger is still worth using as a validator — it fetches the page the same way WhatsApp will and reports what it found — but it cannot refresh WhatsApp.
How long does Facebook keep a preview if I never ping it?
Meta documents a standard re-scrape period of about 24 hours, but the exact propagation time can vary. That is why the debugger and the programmatic crawl path exist.
Do I have to ping every product after a catalogue import?
That is what the queue is for. Sending one request per product inline will hit Meta's rate limit and slow the merchant's request; queued and de-duplicated, a catalogue sweep drains harmlessly.
What if Meta refuses the request?
Nothing breaks. A refused or rate-limited ping means Facebook refreshes on its own schedule rather than immediately — the tags on the page are already correct, which is why the call is best-effort rather than a hard dependency.
Related
Try it free — no signup required
Preview and test dynamic OG images in seconds.
Open the Free OG Image Tester