OpenGraph & Link Preview Scraper avatar

OpenGraph & Link Preview Scraper

Pricing

from $0.01 / 1,000 results

Go to Apify Store
OpenGraph & Link Preview Scraper

OpenGraph & Link Preview Scraper

Give it any list of URLs and get back the link-preview metadata each page exposes — OpenGraph and Twitter Card tags, title, description, preview image, favicon, canonical URL, site name and type — as clean JSON. Perfect for building rich link previews. No login required.

Pricing

from $0.01 / 1,000 results

Rating

0.0

(0)

Developer

Assia Fadli

Assia Fadli

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Give it any list of URLs and get back the link-preview metadata each page exposes — the same tags Slack, Discord, iMessage, WhatsApp and Twitter read when they render a rich preview card.

For every URL the actor fetches the page, reads its <head>, and returns one flat JSON row with the OpenGraph and Twitter Card tags, the title, description, preview image, favicon, canonical URL, site name and more. There is nothing to configure — no API key and no login.

Features

  • Reads OpenGraph (og:*) tags first, then falls back to standard <meta> and Twitter Card (twitter:*) equivalents.
  • Follows redirects and reports the final URL it landed on.
  • Resolves relative image, favicon and canonical URLs to absolute URLs.
  • Fetches pages concurrently in small batches to stay fast and polite.
  • Uses a realistic browser fingerprint (via got-scraping) so pages that block plain HTTP clients still resolve.
  • Skips gracefully over unreachable pages — they are recorded with an error field so a single bad URL never stops the run.

Input

FieldTypeDefaultDescription
urlsarrayThe page URLs to extract link-preview metadata from.
maxItemsinteger100Maximum number of URLs to scrape.

Example input

{
"urls": ["https://github.com", "https://www.bbc.com/news"],
"maxItems": 100
}

Output

Each dataset record looks like this:

{
"url": "https://github.com",
"finalUrl": "https://github.com/",
"title": "GitHub · Build and ship software on a single, collaborative platform",
"description": "Join the world's most widely adopted, AI-powered developer platform…",
"image": "https://github.githubassets.com/assets/campaign-social.png",
"siteName": "GitHub",
"type": "object",
"locale": "en",
"twitterCard": "summary_large_image",
"twitterSite": "@github",
"canonicalUrl": "https://github.com/",
"favicon": "https://github.com/favicon.ico",
"themeColor": "#1e2327"
}
FieldDescription
urlThe URL exactly as requested.
finalUrlThe URL after following any redirects.
titleog:title, else the <title> text, else twitter:title.
descriptionog:description, else <meta name="description">, else twitter:description.
imageog:image (else twitter:image), resolved to an absolute URL.
siteNameog:site_name.
typeog:type (e.g. website, article).
localeog:locale.
twitterCardtwitter:card.
twitterSitetwitter:site.
canonicalUrl<link rel="canonical">, resolved absolute.
faviconBest <link rel="icon">, resolved absolute (falls back to <origin>/favicon.ico).
themeColor<meta name="theme-color">.

Every metadata field is nullable — most pages only expose a subset of these tags.

If a URL can't be fetched (e.g. it times out or returns a non-2xx status), the row is { "url": "<url>", "error": "<message>" } instead.

Pricing

This actor uses the pay-per-event model: you are charged once per link that is successfully fetched and parsed (the link-scraped event). URLs that fail to fetch produce an error row and are never charged.

License

MIT © Assia Fadli