# webscrapingapi.dev — full text for language models > webscrapingapi.dev is a free web scraping API for developers and AI agents. Send a URL and get back HTML, plain text, Markdown, JSON extracted with CSS selectors, or page metadata. Site-specific endpoints return clean JSON for sites the service already knows. When a site cannot be scraped with a plain request, users post it on the board and the maintainer builds an endpoint for it or explains why it cannot be done. Everything is free: 50,000 credits per account per day, no card. This file is the long form of https://webscrapingapi.dev/llms.txt. Machine-readable API description: https://webscrapingapi.dev/openapi.json. Human documentation: https://webscrapingapi.dev/docs. Built and run by Jaeyoung (https://webscrapingapi.dev/about). # Facts and limits - Base URL: https://api.webscrapingapi.dev - Authentication: API key in the `X-API-Key` header (also `Authorization: Bearer` or `?api_key=`). Keys start with `wsa_` and are created in the dashboard at https://app.webscrapingapi.dev. - Free quota: 50,000 credits per account per day, resets 00:00 UTC. A plain fetch costs 1 credit, a JavaScript render 5, metadata and site endpoints 1. Answers served from the shared store cost 0. - Rate limit: 60 requests per minute per key; up to 5 keys per account. - Limits: 30 s max timeout, 5 MB max body, 50 extract fields. Private and reserved network addresses are refused. - Logging: hostname, status, timing, credits and key per request, kept 30 days. Raw pages are never stored. - Refunds: RENDER_UNAVAILABLE, INTERNAL_ERROR, SITE_BLOCKED and SITE_PARSE_FAILED refund the credit. FETCH_FAILED and TIMEOUT are charged. - No CAPTCHA solving and no anti-bot bypass. Sites that cannot be reached reliably are marked "Not possible" on the board. # Generic endpoints ## GET or POST https://api.webscrapingapi.dev/v1/scrape Parameters: url (required); format = html | text | markdown | json (default html; markdown keeps headings, lists, tables, code blocks and absolute links; json requires extract); render (boolean, runs headless Chrome, 5 credits); selector (return only this element); extract (object of field → CSS selector or { selector, attr, all, html }); wait (ms after load, render only); waitFor (CSS selector to wait for, render only); timeout (ms, max 30000); headers (POST body only: user-agent, accept, accept-language, cookie, referer); raw (return the body alone). Response: { url, finalUrl, statusCode, contentType, title, rendered, html | text | markdown, data, truncated, elapsedMs, credits }. The target's own status code is in statusCode; a 404 from the target is a successful fetch. ## GET https://api.webscrapingapi.dev/v1/metadata?url= Reads the first 512 KB of the page and returns { url, finalUrl, title, description, canonical, favicon, lang, og, twitter, jsonLd, elapsedMs, credits }. og and twitter are the tags with their prefix removed; jsonLd is every application/ld+json block parsed. ## GET https://api.webscrapingapi.dev/v1/structured Public registry of site endpoints (JSON). No key needed. # Site endpoints ## Amazon product (amazon.com · 20 marketplaces) One product by ASIN as JSON: title, price, availability, rating, images, bullet points and the spec table. Note: Public product pages only. Prices are shown in the requested currency (default USD); delivery-dependent stock messages may differ from what a signed-in shopper sees. Not affiliated with Amazon. ### GET https://api.webscrapingapi.dev/v1/structured/amazon/product The product detail page as JSON. Parameters: - asin (string, required): The 10-character Amazon product id. Example: B0B44XTV71 - tld (string): Marketplace: com, co.uk, de, fr, it, es, ca, co.jp, in, com.au, com.mx, com.br, nl, ae, sa, se, pl. Default com. Example: com - currency (string): ISO 4217 code for prices, e.g. USD, EUR, JPY. Default USD. Example: USD - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 86400 seconds; 0 forces a fresh fetch. Returns data shaped like: { product: { name, brand, price, regularPrice, currency, availability, aggregateRating, mainImage, images[], features[], additionalProperties[], breadcrumbs[], sku }, extra: { asin, tld, bestSellersRank[], soldBy, shipsFrom, boughtInPastMonth, availabilityText } } Stored for 86400 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "amazon", "action": "product", "data": { "product": { "name": "CUCKOO Twin Pressure Rice Cooker, 12-Cup, White", "brand": { "name": "CUCKOO", "url": null }, "price": "339.99", "currency": "USD", "availability": "InStock", "aggregateRating": { "ratingValue": "4.4", "reviewCount": 608 }, "images": [ "https://m.media-amazon.com/images/I/…jpg" ], "features": [ "…", "…" ], "sku": "B0B44XTV71" }, "extra": { "asin": "B0B44XTV71", "tld": "com" } }, "source": "cache", "age": 412, "credits": 0 } ``` ## YouTube video (youtube.com) A video by id as JSON: title, channel, views, likes, duration, publish date, description, thumbnails and keywords. ### GET https://api.webscrapingapi.dev/v1/structured/youtube/video The watch page metadata as JSON. Parameters: - id (string, required): The 11-character video id (the v= parameter). Example: dQw4w9WgXcQ - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 3600 seconds; 0 forces a fresh fetch. Returns data shaped like: { video: { id, url, title, description, channel { id, name, url }, durationSeconds, viewCount, likeCount, publishedAt, category, thumbnails[], keywords[], isLive, familySafe } } Stored for 3600 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "youtube", "action": "video", "data": { "video": { "id": "dQw4w9WgXcQ", "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)", "channel": { "id": "UCuAXFkgsw1L7xaCfnd5JJOw", "name": "Rick Astley", "url": "http://www.youtube.com/@RickAstleyYT" }, "durationSeconds": 213, "viewCount": 1818228078, "likeCount": 19384777, "publishedAt": "2009-10-24T23:57:33-07:00", "category": "Music", "thumbnails": [ { "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg", "width": 1280, "height": 720 } ], "keywords": [ "rick astley", "Never Gonna Give You Up", … ] } }, "source": "live", "age": 0, "credits": 1 } ``` ## App Store app (apps.apple.com) An iOS app by id as JSON: name, developer, rating, price, category, screenshots and description. ### GET https://api.webscrapingapi.dev/v1/structured/appstore/app The listing page as JSON. Parameters: - id (string, required): The numeric app id (the id… part of the URL). Example: 284882215 - country (string): Storefront country code. Default us. Example: us - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 86400 seconds; 0 forces a fresh fetch. Returns data shaped like: { app: { name, url, platform: "ios", id, developer { name, url }, description, category, price, currency, free, rating { value, count }, icon, screenshots[], contentRating, osRequirement, installs: null, updatedAt, version } } Stored for 86400 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "appstore", "action": "app", "data": { "app": { "name": "Facebook", "platform": "ios", "id": "284882215", "developer": { "name": "Meta Platforms, Inc.", "url": "https://apps.apple.com/us/developer/…" }, "category": "Social Networking", "price": "0", "currency": "USD", "free": true, "rating": { "value": 4.5, "count": 28420068 }, "icon": "https://is1-ssl.mzstatic.com/image/thumb/…png", "osRequirement": "Requires iOS 15.1 or later." } }, "source": "live", "age": 0, "credits": 1 } ``` ## Google Play app (play.google.com) An Android app by package name as JSON: name, developer, rating, installs, price, category, content rating and description. ### GET https://api.webscrapingapi.dev/v1/structured/googleplay/app The listing page as JSON. Parameters: - id (string, required): The package name (the id= parameter). Example: com.spotify.music - hl (string): Language, e.g. en, ko. Default en. Example: en - gl (string): Country, e.g. US, KR. Default US. Example: US - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 86400 seconds; 0 forces a fresh fetch. Returns data shaped like: { app: { name, url, platform: "android", id, developer { name, url }, description, category, price, currency, free, rating { value, count }, icon, screenshots[], contentRating, osRequirement: null, installs, updatedAt, version } } Stored for 86400 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "googleplay", "action": "app", "data": { "app": { "name": "Spotify: Music and Podcasts", "platform": "android", "id": "com.spotify.music", "developer": { "name": "Spotify AB", "url": "https://www.spotify.com" }, "category": "MUSIC_AND_AUDIO", "price": "0", "currency": "USD", "free": true, "rating": { "value": 4.35, "count": 36339801 }, "installs": "1B+", "contentRating": "Teen", "updatedAt": "Sep 18, 2026" } }, "source": "live", "age": 0, "credits": 1 } ``` ## Hacker News (news.ycombinator.com) Front page stories and item threads as clean JSON — no HTML parsing on your side. ### GET https://api.webscrapingapi.dev/v1/structured/hackernews/front Stories on the front page, in rank order. Parameters: - page (number): Page number (1-based). Example: 1 - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 600 seconds; 0 forces a fresh fetch. Returns data shaped like: stories[] { id, rank, title, url, site, points, author, commentCount, age } Stored for 600 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "hackernews", "action": "front", "data": { "count": 30, "stories": [ { "rank": 1, "title": "Samsung is expected to more than double …", "points": 125, "commentCount": 84 }, // 29 more ] }, "source": "live", "age": 0, "credits": 1 } ``` ### GET https://api.webscrapingapi.dev/v1/structured/hackernews/item A story with its comment thread (flattened, with depth). Parameters: - id (number, required): Hacker News item id. Example: 1 - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 600 seconds; 0 forces a fresh fetch. Returns data shaped like: { id, title, url, points, author, age, comments[] { id, author, age, depth, text } } Stored for 600 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "hackernews", "action": "item", "data": { "id": 1, "title": "Y Combinator", "commentsParsed": 3, "comments": [ { "id": 15, "author": "sama", "depth": 0, "text": "…" } ] }, "source": "live", "age": 0, "credits": 1 } ``` ## Wikipedia (wikipedia.org) Article title, summary paragraphs, thumbnail and infobox as JSON, in any language edition. ### GET https://api.webscrapingapi.dev/v1/structured/wikipedia/summary Lead section of an article plus infobox key/values. Parameters: - title (string, required): Article title (spaces or underscores). Example: Web scraping - lang (string): Language edition (default en). Example: en - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 604800 seconds; 0 forces a fresh fetch. Returns data shaped like: { title, url, lang, summary, paragraphs[], thumbnail, infobox {} } Stored for 604800 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "wikipedia", "action": "summary", "data": { "title": "Web scraping", "lang": "en", "summary": "Web scraping, web harvesting, or web data extraction is data scraping …", "paragraphs": [ "…", "…", "…", "…", "…" ], "infobox": {} }, "source": "cache", "age": 3120, "credits": 0 } ``` ## GitHub (github.com) Repository facts (stars, forks, topics, license, description) scraped from the public page — no token, no API rate limit. Note: Counts come from the page, so they are as fresh as GitHub renders them. Private repositories are not reachable. The primary language is no longer in the server-rendered page, so `language` is usually null. ### GET https://api.webscrapingapi.dev/v1/structured/github/repo Public repository overview. Parameters: - owner (string, required): Owner login. Example: withastro - repo (string, required): Repository name. Example: astro - max_age (number): Accept a stored copy up to this many seconds old (credits: 0). Defaults to 3600 seconds; 0 forces a fresh fetch. Returns data shaped like: { owner, repo, url, description, homepage, stars, forks, watchers, topics[], license, defaultBranch, archived, fork, releaseCount, language (null on the current GitHub layout) } Stored for 3600 seconds by default and shared; a stored answer costs 0 credits. Example response: ```json { "site": "github", "action": "repo", "data": { "owner": "withastro", "repo": "astro", "description": "The web framework for content-driven websites.", "stars": 62720, "forks": 3798, "watchers": 221, "topics": [ "astro", "blog", "islands", … ], "license": "Other", "defaultBranch": "main", "releaseCount": 3251, "homepage": "https://astro.build" }, "source": "live", "age": 0, "credits": 1 } ``` # Errors Errors are JSON: `{ "error": { "code": "...", "message": "..." } }`. Codes and status: BAD_REQUEST 400, URL_BLOCKED 400, UNAUTHORIZED 401, FORBIDDEN 403, NOT_FOUND 404, RATE_LIMITED 429, QUOTA_EXCEEDED 429, FETCH_FAILED 502, SITE_PARSE_FAILED 502, SITE_BLOCKED 503, RENDER_UNAVAILABLE 503, TIMEOUT 504, INTERNAL_ERROR 500. # Articles ## Convert any web page to Markdown for an LLM with one request (format=markdown) URL: https://webscrapingapi.dev/blog/convert-any-web-page-to-markdown-for-llm Published: 2026-09-22 · Author: Jaeyoung · Tags: generic scrape, rag & agents Add format=markdown to /v1/scrape: headings, lists, tables, code and absolute links come back, scripts and forms do not. Made for prompts and RAG chunks. In short: - GET /v1/scrape?url=…&format=markdown returns the page body as Markdown in the markdown field. Add raw=1 to get the Markdown alone, no JSON envelope. - Headings, lists, tables, code blocks, emphasis and images survive; scripts, styles, forms and hidden elements are dropped; every link becomes absolute. - selector narrows the conversion to one element, such as article or main, which is usually the difference between a clean chunk and a page full of navigation. The cheapest way to make a model read a web page is to hand it the page as Markdown: the headings tell it what the sections are, the lists and tables keep their rows, the code stays in fences, and none of the tokens go to `