SFOLN

Catalogue / Web toolkit for agents

URL Metadata & Open Graph Extractor

sfoln/url-metadata · Developer tools, SEO tools, Automation

Extract metadata from any list of URLs: title, meta description, canonical, language, favicon, Open Graph and Twitter Card tags, JSON-LD types, feeds, H1, word and link counts. One fast HTTP fetch per URL, no browser. $1 per 1,000 URLs; failed and missing pages are free.

About

What it does

URL Metadata & Open Graph Extractor turns a list of URLs into clean, structured page metadata: title, meta description, canonical URL, language, favicon, Open Graph and Twitter Card tags, JSON-LD schema types, publish/modify dates, author, robots and generator tags, the first H1, a visible word count, internal/external link counts and RSS/Atom feed links. Built for link previews, SEO audits, content inventories, lead enrichment and AI agents that need to know what a page is about without rendering it.

Price

Price per delivered record

EventPricePer 1,000Charged for
URL metadata record
url-metadata
$0.001$1 / 1,000Charged once per URL whose page was fetched and analysed (status ok). Missing pages (404/410), dead domains, blocked or invalid URLs and failed fetches are not charged.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~url-metadata/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://apify.com","https://blog.apify.com"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/url-metadata"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~url-metadata/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Get the title, description, Open Graph image and canonical URL of https://apify.com and https://blog.apify.com for a link preview.

Input

Input fields

Paste URLs (one per line). Each URL produces one dataset record with page metadata and a `status` field.

FieldTypeDefaultMeaning
urls *arrayrequiredURLs
Pages to analyse, one per line. `https://` is added when the scheme is missing. Duplicates are removed. Objects with a `url` key are accepted too. Accounts on the Apify free plan can process up to 10 URLs per run.
maxUrlsinteger1000Max URLs
Safety cap on how many URLs are processed in this run. Range 1–100000.
timeoutSecsinteger10Fetch timeout (seconds)
Maximum time to wait for one page (redirects included). Slow pages are retried once. Range 3–30.
concurrencyinteger5Concurrency
How many pages are fetched in parallel. Range 1–10.
includeRawbooleanfalseInclude fetch details
Attach low-level fetch details (detected charset) under `raw`.
Example input
{
  "urls": [
    "https://apify.com",
    "https://blog.apify.com"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The URL as given in the input.
urlstringURL
Normalized requested URL. e.g. "https://apify.com/"
finalUrlstring | nullFinal URL
URL after redirects.
redirectedboolean | nullRedirected
True when the request was redirected.
statusCodeinteger | nullHTTP status
Final HTTP status code. e.g. 200
contentTypestring | nullContent type
Content-Type response header.
titlestring | nullTitle
<title> text.
descriptionstring | nullMeta description
<meta name=description> content.
canonicalstring | nullCanonical URL
Absolute <link rel=canonical> URL.
languagestring | nullLanguage
<html lang>, Content-Language meta/header or og:locale.
faviconstring | nullFavicon
Absolute icon URL (falls back to /favicon.ico).
ogTitlestring | nullog:title
ogDescriptionstring | nullog:description
ogImagestring | nullog:image
Absolute image URL.
ogTypestring | nullog:type
ogSiteNamestring | nullog:site_name
ogUrlstring | nullog:url
ogLocalestring | nullog:locale
twitterCardstring | nulltwitter:card
twitterTitlestring | nulltwitter:title
twitterDescriptionstring | nulltwitter:description
twitterImagestring | nulltwitter:image
twitterSitestring | nulltwitter:site
twitterCreatorstring | nulltwitter:creator
jsonLdTypesarrayJSON-LD types
Distinct schema.org @type values found in JSON-LD blocks (incl. @graph).
publishedTimestring | nullPublished
article:published_time or equivalent (as written on the page).
modifiedTimestring | nullModified
article:modified_time / og:updated_time or equivalent.
authorstring | nullAuthor
robotsstring | nullRobots meta
xRobotsTagstring | nullX-Robots-Tag header
generatorstring | nullGenerator
CMS / site generator meta.
keywordsstring | nullMeta keywords
themeColorstring | nullTheme color
h1string | nullFirst H1
h1CountintegerH1 count
wordCountintegerWord count
Visible-text word estimate.
linksInternalintegerInternal links
Distinct same-host link targets.
linksExternalintegerExternal links
Distinct other-host link targets.
feedsarrayFeeds
RSS / Atom / JSON Feed links: { url, type, title }.
pageBytesinteger | nullBytes analysed
truncatedboolean | nullTruncated
True when the page exceeded 1 MB.
responseTimeMsinteger | nullResponse time (ms)
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
sourcestringSource
Data source (selfhosted = fetched by this Actor).
fetchedAtstringFetched at
ISO timestamp.
Example record
{
  "input": "https://apify.com",
  "url": "https://apify.com/",
  "finalUrl": "https://apify.com/",
  "redirected": false,
  "statusCode": 200,
  "contentType": "text/html; charset=utf-8",
  "title": "Apify: Full-stack web scraping and data extraction platform",
  "description": "Cloud platform for web scraping, browser automation, AI agents, and data for AI...",
  "canonical": "https://apify.com/",
  "language": "en",
  "favicon": "https://apify.com/favicon.ico",
  "ogTitle": "Apify: Full-stack web scraping and data extraction platform",
  "ogDescription": "Cloud platform for web scraping...",
  "ogImage": "https://apify.com/og-image.png",
  "ogType": "website",
  "ogSiteName": "Apify",
  "twitterCard": "summary_large_image",
  "twitterSite": "@apify",
  "jsonLdTypes": [
    "Organization",
    "WebSite"
  ],
  "publishedTime": null,
  "modifiedTime": null,
  "author": null,
  "robots": "index, follow",
  "generator": null,
  "h1": "Build reliable web scrapers. Fast.",
  "h1Count": 1,
  "wordCount": 1432,
  "linksInternal": 118,
  "linksExternal": 21,
  "feeds": [],
  "pageBytes": 412339,
  "truncated": false,
  "responseTimeMs": 312,
  "status": "ok",
  "charged": true,
  "chargedEvent": "url-metadata",
  "source": "selfhosted",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents