SerpApi already has APIs for retrieving search results from Google, Bing, and other popular search engines, as well as APIs for fetching data from platforms like Amazon, Google Maps, and the Apple App Store. That's not always enough information for your application or AI agent, though. What if it needs to see the full page linked from a search result, check prices on other online stores, or fetch posts from niche web forums?

We're excited to announce the Extract API, a new engine for fetching any public web page as structured JSON or Markdown. It can parse the page's metadata, links, embedded media, lists, forms, tables, and other elements. The Extract API can also return the complete text of a given page, in either plain or Markdown format, and crawl any linked pages.

Parse page contents and metadata

To get started, all you need is a free SerpApi account and your API key. Then you can request information about a page, using extract as the engine and your page as the url parameter:

https://serpapi.com/search.json?engine=extract&url=https://wiki.archlinux.org/title/NVIDIA

In the response, you get a page_information object with the title, language, and other basic information:

"page_information": {
  "title": "NVIDIA - ArchWiki",
  "url": "https://wiki.archlinux.org/title/NVIDIA",
  "final_url": "https://wiki.archlinux.org/title/NVIDIA",
  "language": "en",
  "charset": "UTF-8",
  "content_size": 112079,
  "content_length": 30100,
  "word_count": 4098
}

There's a list of all headings in the page, too:

"headings": [
  {
    "position": 1,
    "level": 2,
    "title": "Contents"
  },
  {
    "position": 2,
    "level": 1,
    "title": "NVIDIA"
  },
  {
    "position": 3,
    "level": 2,
    "title": "Installation"
  },
  ...
]

You also get the anchor text and URL for every inline link, including the API endpoints to search that page with another API request:

"inline_links": [
  {
    "position": 1,
    "link": "https://archlinux.org/",
    "displayed_link": "archlinux.org",
    "internal": false,
    "serpapi_extract_link": "http://serpapi.com/search.json?device=desktop&engine=extract&url=https%3A%2F%2Farchlinux.org%2F"
  },
  {
    "position": 2,
    "title": "Packages",
    "link": "https://archlinux.org/packages/",
    "displayed_link": "archlinux.org",
    "internal": false,
    "serpapi_extract_link": "http://serpapi.com/search.json?device=desktop&engine=extract&url=https%3A%2F%2Farchlinux.org%2Fpackages%2F"
  },
  {
    "position": 3,
    "title": "Forums",
    "link": "https://bbs.archlinux.org/",
    "displayed_link": "bbs.archlinux.org",
    "internal": false,
    "serpapi_extract_link": "http://serpapi.com/search.json?device=desktop&engine=extract&url=https%3A%2F%2Fbbs.archlinux.org%2F"
  },
  ...
]

There's also a list of every embedded image, video, or audio file:

"inline_images": [
  {
    "position": 1,
    "source": "https://wiki.archlinux.org/images/4/4e/View-refresh-red.svg",
    "width": 48,
    "height": 48
  },
  {
    "position": 2,
    "source": "https://wiki.archlinux.org/images/4/4e/View-refresh-red.svg",
    "width": 48,
    "height": 48
  },
  {
    "position": 3,
    "source": "https://wiki.archlinux.org/images/4/4e/View-refresh-red.svg",
    "width": 48,
    "height": 48
  },
  ...
]

The response includes every table in the parsed page as well:

"tables": [
  {
    "position": 1,
    "headers": [
      "GPU family",
      "Driver",
      "Status"
    ],
    "rows": [
      [
        "GPU family",
        "Driver",
        "Status"
      ],
      [
        "Blackwell (GBXXX) and newer",
        "nvidia-open for linux nvidia-open-lts for linux-lts nvidia-open-dkms for any kernel(s)",
        "Recommended by upstream Current, supported1"
      ],
      [
        "Ada Lovelace (NV190/ADXXX)Ampere (NV170/GAXXX)Turing (NV160/TUXXX)",
        "nvidia-open for linux (possible crashes on Ampere-equipped laptops2) nvidia-open-lts for linux-lts nvidia-open-dkms for any kernel(s) or nvidia-580xx-dkmsAUR (proprietary)",
        "Supported"
      ],
      [
        "Volta (NV140/GV100)Pascal (NV130/GPXXX)Maxwell (NV110/GMXXX)",
        "nvidia-580xx-dkmsAUR",
        "Legacy, supported"
      ],
      [
        "Kepler (NVE0/GKXXX)",
        "nvidia-470xx-dkmsAUR",
        "Legacy, unsupported3,4"
      ],
      [
        "Fermi (NVC0/GF1XX)",
        "nvidia-390xx-dkmsAUR"
      ],
      [
        "Tesla (NV50/G80-90-GT2XX)",
        "nvidia-340xx-dkmsAUR"
      ],
      [
        "Curie (NV40/G70) and older",
        "No longer packaged"
      ]
    ]
  },
]

Finally, the response can also include each text section and web form, and all of the page's text. A version of the page rendered as Markdown is also available when you set include_markdown to true. Keep in mind, that's a separate option from retrieving the full API response in Markdown format.

For more details and all the supported settings, check out the Extract API documentation. You can also test it out in the Playground.

The all-in-one web search solution

If you combine the Extract API with SerpApi's existing web search engines, your application, automation, or AI agent can perform web searches and view the pages behind each result. They aren't limited to the contents of the result's title or snippet, the Knowledge Graph card, or the AI Overview.

The best part is that all engines at SerpApi use the same account system, libraries and integrations, and search credits. You don't need to combine two or more separate services to get the job done. If you request a URL that already has a supported engine in SerpApi, like a YouTube video or Amazon product, the response will automatically use that engine's API.

Graph showing how the Extract API routes request to a dedicated engine, if available

Let's say you're doing search engine optimization (SEO) research, and you want to check the general structure for each page ranking at the top of a certain keyword. Here's how you could use SerpApi's JavaScript library in a Node.js project to fetch the top five results, and then display each page's title and complete list of section headings:

import { getJson } from 'serpapi';

let googleSettings = {
  engine: "google_light",
  api_key: YOUR_KEY_GOES_HERE,
  q: "best bluetooth headphones 2026",
  hl: "en",
  gl: "us"
}

let extractSettings = {
  engine: "extract",
  api_key: YOUR_KEY_GOES_HERE
}

let search = await getJson(googleSettings);

for (let result of search.organic_results) {
  extractSettings.url = result.link;
  let page = await getJson(extractSettings);
  // Check if the page couldn't be parsed
  if (page.error) {
    console.log(`\n${result.title}\n[ ${result.link} ]\n======\nError: ${page.error}`);
    continue;
  }
  // Show information for this page
  const title = page?.page_information?.title || page?.title;
  const url = page?.page_information?.final_url || page?.title;
  console.log(`\n${title}\n[ ${url} ]\n======`);
  if (page?.headings) {
    for (let heading of page?.headings) {
      console.log(" ".repeat(heading.level - 1) + heading.title);
    }
  } else {
    console.log("No headings detected.")
  }
}

The output for that script might look like this:

Best Noise Cancelling Headphones 2026 (50+ Tested!)
[ https://recordingnow.com/blog/best-noise-cancelling-headphones/ ]
======
Best Noise Cancelling Headphones 2026 (50+ Tested!)
  This article will cover the following categories:
 Best Comfort: Bose QuietComfort Ultra 2nd Gen
 Best for Movies / TV / Gaming: Sony 1000X THE COLLEXION
  Runner Up #1: Sony WH-1000XM6
  Runner Up #2: AirPods Max 2
 Best Headphones for Bass: Sennheiser Momentum 5
  See our Full Sennheiser Momentum 5 Review on YouTube below
  Runner Up #1: Sennheiser Momentum 4
  Runner Up #2: Nothing Headphone 1
  Runner Up #3: Skullcandy Crusher ANC 2

The 6 Best Headphones of 2026 - RTINGS.com
[ https://www.rtings.com/headphones/reviews/best/headphones ]
======
 Video: The Real Reason TVs Are So Cheap Now
 Best Headphones
 Best Noise Cancelling Headphones
 Best Wireless Earbuds
 Best Noise Cancelling Earbuds

2026 Best Headphones! πŸ‘‘ (Overall Winners) β€” Aaron x Loud and Wireless
[ https://www.loudnwireless.com/blog/2026-best-headphones-overall-winners ]
======
2026 Best Headphones! πŸ‘‘ (Overall Winners)
  Sony WH-1000XM6
  Bose QC Ultra Headphones Gen 2

You could also save the entire contents of each page, either as the original HTML code, with output=html, or as a plain text string, using text_content.full in the JSON response. If you set include_markdown to true in your API request, you can also get the page converted to Markdown.

By combining the Extract API with our engines for Google, Bing, DuckDuckGo, Yahoo, and other search providers, you can solve problems that require browsing the web, instead of just searching the web.

Crawl entire domains

The Extract API can also be used to crawl entire websites, making it an excellent tool for web archival, e-commerce, competitive analysis, and much more. The Map Mode gives you a list of all discovered URLs for a domain, which you can then use with the regular page extraction, or use with Crawl Mode to automatically fetch all connected pages in one request.

You might want an automation that checks the prices for all products on a store, or all products in a certain category. This example will use the Wi-Fi products on UniFi's online store.

First, you can use SerpApi JavaScript library to generate a URL map of all products from that category page, and filter out the results that aren't product pages:

// import { getJson } from 'serpapi';

let search = await getJson({
  engine: "extract",
  api_key: YOUR_KEY_GOES_HERE,
  url: "https://store.ui.com/us/en/category/all-wifi",
  mode: "map",
  max_pages: 50
});
let productUrls = [];
for (let result of search.urls) {
  if (result.url.includes("/products/")) {
    productUrls.push(result.url);
  }
}

Next, you can send an Extract API request for each product URL. This website includes product information in a JSON-LD object, which the Extract API includes as json_ld in the result. This will read the JSON-LD objects for each page, including the variations of each product, and display its information:

for (let product of productUrls) {
  let thisPage = await getJson({
    engine: "extract",
    api_key: YOUR_KEY_GOES_HERE,
    url: product
  })
  // Get all product options if there are multiple variants
  const productOptions = thisPage?.json_ld?.[0]?.hasVariant || thisPage?.json_ld || [];
  // Display each product's name and price
  for (let option of productOptions) {
    console.log(`${option.name} - $${option?.offers?.priceSpecification?.price}\n======\n${option?.description}\n`);
  }
}

The script would output something like this:

UniFi Express 7 / US Version / 2-Pack - $379
======
Mesh-scalable, super-compact 10G Cloud Gateway with integrated 6 GHz WiFi 7. Plug-and-play Whole-Home WiFi with true 10G Multi-Link Operation, intelligent placement guidance, and effortless mesh expansion with additional nodes.

UniFi Express 7 / US Version / Single Unit - $199
======
Mesh-scalable, super-compact 10G Cloud Gateway with integrated 6 GHz WiFi 7. Plug-and-play Whole-Home WiFi with true 10G Multi-Link Operation, intelligent placement guidance, and effortless mesh expansion with additional nodes.

Access Point E7 - $499
======
Enterprise-grade indoor access point with 10-stream WiFi 7 performance, a 10 GbE uplink, and a redundant GbE port for high availability.

The exact method of extracting prices will depend on the store, and how the Extract API is able to parse its contents. In some cases, you might be able to parse the price from the text output of the main page or category page, or with the Price Offers normalized output.

Perfect for agents

SerpApi's MCP server, CLI application, regular GET requests, and other official integrations already give AI agents the ability to search the web and read the results. With the Extract API, they can also fetch the actual pages behind each result, giving them even more context to accomplish tasks and answer questions.

The Extract API provides a response in JSON format by default, but you can switch it to Markdown output, just like all of our other engine APIs. The output contains all the same important information, but with reduced token usage.

## Page Information

- Title: NVIDIA - ArchWiki
- Url: https://wiki.archlinux.org/title/NVIDIA
- Final Url: https://wiki.archlinux.org/title/NVIDIA
- Language: en
- Charset: UTF-8
- Content Size: 112077
- Content Length: 30100
- Word Count: 4098

...

## Inline Links

| Position | Internal | Title | Rel |
| --- | --- | --- | --- |
| 1 | false | [](https://archlinux.org/) |  |
| 2 | false | [Packages](https://archlinux.org/packages/) |  |
| 3 | false | [Forums](https://bbs.archlinux.org/) |  |
| 4 | true | [Wiki](https://wiki.archlinux.org/) |  |
...

The possibilities are endless, especially when using the Extract API in conjunction with the other APIs provided by SerpApi.

Try it today

The Extract API is now available for all SerpApi users. You can create an account to receive 250 free search credits each month, which can be used with any of our engine APIs.

For more information about the Extract API, check out the full documentation, and try it out in our Playground environment.