Link Preview API — OpenGraph & Metadata Unfurl Tool avatar

Link Preview API — OpenGraph & Metadata Unfurl Tool

Pricing

from $0.69 / 1,000 links

Go to Apify Store
Link Preview API — OpenGraph & Metadata Unfurl Tool

Link Preview API — OpenGraph & Metadata Unfurl Tool

High-volume OpenGraph, Twitter Card, and JSON-LD unfurl API. Extract title, description, image, canonical URL, favicon, feeds, hreflang, and schema.org data from any list of URLs.

Pricing

from $0.69 / 1,000 links

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Link Preview API unfurls any list of URLs into structured OpenGraph, Twitter Card, and JSON-LD metadata — the same data chat apps, feed readers, and CMSs use to render a rich link card — without running a browser.

Send up to 50 URLs at a time in parallel and get title, description, image, canonical URL, favicon, RSS/Atom feeds, hreflang alternates, and schema.org/JSON-LD data back per URL — with automatic retries and diagnostic records for anything unreachable.

Copy to your AI assistant

Use the Apify Actor "parsebird/link-preview-api" (Link Preview API) to unfurl OpenGraph/Twitter Card/JSON-LD metadata from a list of URLs. Call it with the ApifyClient: `from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/link-preview-api").call(run_input={"urls": ["github.com", "https://stripe.com"], "maxConcurrency": 10, "includeJsonLd": True})`. Key inputs: urls (array of URL strings or {"url": "..."} objects — a missing scheme is upgraded to HTTPS), maxItems (0 = process every URL), maxConcurrency (1-50, default 10), requestTimeoutSecs (3-120, default 20), maxRetries (0-3, default 1, retries timeouts/429/5xx), includeJsonLd (boolean, default true), includeRawTags (boolean, default false, dumps every meta tag into metaTags). Output is one JSON object per URL with url, finalUrl, ok, status, contentType, responseTimeMs, attempts, title, description, image, siteName, type, canonical, favicon, appleTouchIcon, manifestUrl, feedUrl/feeds, hreflang, language, charset, author, publisher, publishedTime/modifiedTime, robots, themeColor, twitterCard, openGraph, twitter, schemaTypes, jsonLd, and error (set when ok is false). Full API spec: https://apify.com/parsebird/link-preview-api/api. Get an API token at https://console.apify.com/account/integrations.

Link Preview API fetches each URL you give it and parses the response for every standard metadata signal a browser or bot would use to build a link preview — no headless Chrome, no rendering JavaScript, just the server-rendered <head> that OpenGraph/Twitter Card/JSON-LD were designed to be read from.

  • 🔗 Accepts plain URL strings or {"url": "..."} objects, and auto-upgrades a missing scheme (github.comhttps://github.com)
  • ⚡ Up to 50 concurrent requests, with per-URL timeout and automatic retries on timeouts, HTTP 429, and temporary 5xx errors
  • 🏷️ Extracts OpenGraph (openGraph) and Twitter Card (twitter) properties, title, description, image, site name, and canonical URL
  • 🧩 Parses JSON-LD blocks and detects schema.org types (Article, Organization, Product, and more)
  • 🌐 Also pulls favicon, apple-touch-icon, web manifest, RSS/Atom feed links, and hreflang language alternates
  • 🩺 Non-2xx responses, timeouts, and unreachable hosts come back as clean ok: false diagnostic records with an error message — and are not charged
  • 📊 Runs on the Apify platform: schedule recurring runs, trigger via API or webhook, and export results as JSON, CSV, Excel, or HTML

What data can you extract per URL?

FieldDescription
ok / status / errorWhether the fetch succeeded, the HTTP status, and the failure reason if not
title / description / imageThe link-preview essentials (OpenGraph first, falling back to standard meta tags)
siteName / type / canonicalog:site_name, og:type, and the canonical URL
favicon / appleTouchIcon / manifestUrlIcon and web app manifest links
feedUrl / feeds / hreflangRSS/Atom feed links and language alternates
author / publisher / publishedTime / modifiedTimeArticle metadata, from meta tags or JSON-LD
openGraph / twitterEvery og:* / twitter:* property found, as a flat object
schemaTypes / jsonLdDetected schema.org @type values and the raw parsed JSON-LD blocks
responseTimeMs / attemptsFetch latency and how many attempts it took
  1. Open Link Preview API in the Apify Console and click Try for free.
  2. Paste your urls — one per line, or as an array via the API.
  3. Optionally set maxConcurrency, requestTimeoutSecs, maxRetries, includeJsonLd, or includeRawTags.
  4. Click Start. There's no per-URL rate limiting beyond what you configure — the run has no fixed timeout.
  5. Download results as JSON, CSV, or Excel from the Storage tab, or pull them via the Dataset API.

Link Preview API uses pay-per-event pricing — you pay only for URLs successfully unfurled (ok: true). Diagnostic records for unreachable, timed-out, or non-success URLs are never charged.

PlanPrice per link previewPrice per 1,000
Free$0.00099$0.99
Bronze$0.00089$0.89
Silver$0.00079$0.79
Gold$0.00069$0.69

Example: unfurling 10,000 URLs with a 95% success rate costs about $9.41 on the Free plan (9,500 billable previews). New Apify accounts include free platform usage credit that covers testing this Actor.

Input / Output

{
"urls": ["github.com", "https://stripe.com", "https://www.apify.com"],
"maxConcurrency": 10,
"requestTimeoutSecs": 20,
"maxRetries": 1,
"includeJsonLd": true,
"includeRawTags": false
}

Output — one JSON object per URL:

{
"url": "https://stripe.com",
"finalUrl": "https://stripe.com/en-my",
"ok": true,
"status": 200,
"contentType": "text/html; charset=utf-8",
"responseTimeMs": 404,
"attempts": 1,
"title": "Stripe | Financial Infrastructure to Grow Your Revenue",
"description": "Stripe is a financial services platform that helps all types of businesses accept payments, build flexible billing models and manage money movement.",
"image": "https://images.stripeassets.com/fzn2n1nzq965/XtX984S1GJVsVOXFC7kMu/01988281e867728dfb09aa7793a6e3b9/Stripe.jpg",
"type": "website",
"canonical": "https://stripe.com/en-my",
"schemaTypes": ["Organization", "WebSite"],
"twitterCard": "summary_large_image"
}

Results can be downloaded as JSON, CSV, Excel, or HTML from the Storage tab, or fetched via the Apify API.

Python

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/link-preview-api").call(run_input={
"urls": ["github.com", "https://stripe.com", "https://www.apify.com"],
"maxConcurrency": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["url"], item["ok"], item.get("title"))

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/link-preview-api').call({
urls: ['github.com', 'https://stripe.com', 'https://www.apify.com'],
maxConcurrency: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Use cases

  • Chat/forum link cards — generate the title/description/image for a rich link preview when a user pastes a URL.
  • Content audits — run includeRawTags: true across a site's URL list to spot missing or malformed meta tags.
  • SEO monitoring — track title, description, and schemaTypes for competitor pages over time.
  • Feed discovery — bulk-resolve feedUrl/feeds for a list of blogs or news sites.
  • Link validation — feed in a list of outbound links and use ok/status/error to find dead links at scale.

Yes. Link Preview API only reads the same publicly served <head> metadata — OpenGraph, Twitter Card, and JSON-LD tags — that every browser, chat app, and search engine already fetches to render a link preview. You're responsible for complying with each target site's terms of service and applicable data protection laws for your specific use case. See Apify's blog post on the legality of web scraping for more detail.

FAQ

Why did some URLs come back with ok: false? A non-2xx HTTP response, a timeout, a DNS failure, or a site actively blocking automated requests all produce a clean ok: false record with an error message and, when available, a status code — instead of failing the whole run. These records are not charged.

Does this render JavaScript? No. Link Preview API reads the server-rendered HTML directly, which is exactly what OpenGraph, Twitter Card, and JSON-LD tags are designed for — they exist specifically so bots and crawlers don't need to run JavaScript. A small number of sites that inject all metadata client-side via JS will return incomplete results.

Can a site block this Actor? Some sites apply bot-detection to any non-browser traffic and may return a 403 or CAPTCHA challenge regardless of the request headers used. These come back as ok: false diagnostic records rather than crashing the run.

What counts as a billable event? Only URLs that return ok: true — i.e., were successfully fetched and parsed. Diagnostic failures are free.

Can I get every raw meta tag, not just the normalized fields? Yes — set includeRawTags: true to get a metaTags array with every <meta> tag's name/property and content.

Can I schedule recurring runs? Yes. Use Apify's built-in Scheduler to re-check a URL list daily, weekly, or at any interval, and trigger downstream automations via webhooks.

Can I access this via API instead of the Console? Yes — every input field is available through the Apify API, with client libraries for Python, JavaScript/Node.js, and more.

Found a bug or missing field? Please open an issue on the Actor's Issues tab — feedback is reviewed regularly and helps prioritize fixes.