Title: Get page metadata and Open Graph in Python — code
Open Graph Title: Get page metadata and Open Graph in Python — code
X Title: Get page metadata and Open Graph in Python — code
Description: Read a page's title, description and Open Graph image in Python: sync, async with a webhook, and error handling. Tested code.
Open Graph Description: Read a page's title, description and Open Graph image in Python: sync, async with a webhook, and error handling. Tested code.
X Description: Read a page's title, description and Open Graph image in Python: sync, async with a webhook, and error handling. Tested code.
Mail addresses
contact@urlpipe.dev
Opengraph URL: https://urlpipe.dev/code/python/page-metadata
Domain: urlpipe.dev
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://urlpipe.dev/#organization","name":"URLpipe","url":"https://urlpipe.dev","logo":"https://urlpipe.dev/icon.png","sameAs":["https://github.com/URLpipe"],"founder":{"@type":"Person","name":"Roger Campos","url":"https://rogercampos.com"}},{"@type":"WebSite","@id":"https://urlpipe.dev/#website","url":"https://urlpipe.dev","name":"URLpipe","publisher":{"@id":"https://urlpipe.dev/#organization"}}]}
{"@context":"https://schema.org","@graph":[{"@type":"TechArticle","@id":"https://urlpipe.dev/code/python/page-metadata#article","headline":"Get page metadata and Open Graph in Python — code","description":"Read a page's title, description and Open Graph image in Python: sync, async with a webhook, and error handling. Tested code.","url":"https://urlpipe.dev/code/python/page-metadata","mainEntityOfPage":"https://urlpipe.dev/code/python/page-metadata","datePublished":"2026-09-24","dateModified":"2026-09-24","author":{"@type":"Person","name":"Roger Campos","url":"https://rogercampos.com"},"publisher":{"@id":"https://urlpipe.dev/#organization"},"image":"https://urlpipe.dev/og-image.png"},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Which fields does /meta return?","acceptedAnswer":{"@type":"Answer","text":"title, description, site_name, type, language, locale, authors, published_at, modified_at, image, video, favicon_url, icons, logo_url, feeds, keywords, canonical_url, robots, alternates and more, plus the raw open_graph and twitter tags. Every key is always there; a value the page doesn't declare is null or an empty list."}},{"@type":"Question","name":"How much does it cost?","acceptedAnswer":{"@type":"Answer","text":"1 credit per page, the same as /html: the page's own declarations are read without a model. A result reused within max_age is free."}},{"@type":"Question","name":"Do I need an SDK to call URLpipe from Python?","acceptedAnswer":{"@type":"Answer","text":"No SDK is needed: requests is the only dependency, because the API is one POST per job. If you'd rather use one, the official client installs with pip install urlpipe and adds retries that never bill twice, typed errors and webhook verification."}}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://urlpipe.dev/"},{"@type":"ListItem","position":2,"name":"Code recipes","item":"https://urlpipe.dev/code"},{"@type":"ListItem","position":3,"name":"Python","item":"https://urlpipe.dev/code/python"},{"@type":"ListItem","position":4,"name":"Get a page's metadata and Open Graph tags in Python","item":"https://urlpipe.dev/code/python/page-metadata"}]},{"@type":"HowTo","name":"Get a page's metadata and Open Graph tags in Python","description":"To read a page's title, description, Open Graph image and other metadata in Python, POST its URL to https://urlpipe.dev/meta with sync set to true and parse the JSON with res.json(). It answers with the same keys for every page — null where the page declares nothing — for 1 credit, the same as a page fetch.","url":"https://urlpipe.dev/code/python/page-metadata","tool":[{"@type":"HowToTool","name":"Python 3.9+"}],"step":[{"@type":"HowToStep","name":"Before you start","text":"One dependency, requests. Put your API key in the environment so it never lands in the file.","url":"https://urlpipe.dev/code/python/page-metadata#setup"},{"@type":"HowToStep","name":"Print the title, description and main image","text":""sync": True holds the connection open until the result is ready and answers with it. Pass timeout= every time: requests has no default, and a page that never finishes loading would otherwise hang your process. res.json() gives a dict; any field can be None, hence the or "none".","url":"https://urlpipe.dev/code/python/page-metadata#sync"},{"@type":"HowToStep","name":"The async variant: a token, a webhook and a poll","text":"Leave out sync and the answer is a token, straight away. for … else is the idiom for "ran out of attempts": the else runs only when the loop never hit break.","url":"https://urlpipe.dev/code/python/page-metadata#async"},{"@type":"HowToStep","name":"Handle errors and retries","text":"raise_for_status() is fine for a script; a service wants to tell the failures apart. Check the status before calling res.json() — an error from a proxy in front of the API may not be JSON. sys.exit(message) prints to stderr and exits 1.","url":"https://urlpipe.dev/code/python/page-metadata#errors"}]}]}
| view-transition | same-origin |
| csrf-param | authenticity_token |
| csrf-token | 2G9kgJ62Oy_LujvASAZc-MhEXkdKiWJB7HW86Sl71bhPKqof-i43ZUI2tmYNHtoz4I7yTJ26dBwh4-eft9IbQA |
| csp-nonce | 4f900c833860442d24da008ddcb5cc98 |
| og:type | website |
| og:site_name | URLpipe |
| og:locale | en_US |
| og:image | https://urlpipe.dev/og-image.png |
| og:image:width | 1200 |
| og:image:height | 630 |
| og:image:alt | URLpipe — URL in. Clean data out. |
| twitter:card | summary_large_image |
| twitter:image | https://urlpipe.dev/og-image.png |
| twitter:image:alt | URLpipe — URL in. Clean data out. |
| theme-color | #3b82f6 |
Links:
Viewport: width=device-width,initial-scale=1