> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.airtop.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.airtop.ai/_mcp/server.

# Query a page with pagination

POST https://api.airtop.ai/api/v1/sessions/{sessionId}/windows/{windowId}/paginated-extraction
Content-Type: application/json

Submit a prompt that queries the content of a specific browser window and paginates through pages to return a list of results.

Reference: https://docs.airtop.ai/api-reference/airtop-api/windows/paginated-extraction

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `sessionId` (string, required) — The session id for the window.
- `windowId` (string, required) — The Airtop window id of the browser window.

### Body (application/json)

This endpoint expects an object.

- `prompt` (string, required) — A prompt providing the Airtop AI model with additional direction or constraints about the page and the details you want to extract from the page.
- `clientRequestId` (string, optional)
- `configuration` (PaginatedExtractionConfig, optional) — Request configuration
- `costThresholdCredits` (long, optional) — A credit threshold that, once exceeded, will cause the operation to be cancelled. Note that this is *not* a hard limit, but a threshold that is checked periodically during the course of fulfilling the request. A default threshold is used if not specified, but you can use this option to increase or decrease as needed. Set to 0 to disable this feature entirely (not recommended).
- `timeThresholdSeconds` (long, optional) — A time threshold in seconds that, once exceeded, will cause the operation to be cancelled. Note that this is *not* a hard limit, but a threshold that is checked periodically during the course of fulfilling the request. A default threshold is used if not specified, but you can use this option to increase or decrease as needed. Set to 0 to disable this feature entirely (not recommended). This setting does not extend the maximum session duration provided at the time of session creation.

## Response

### 201

Created

- `data` (AiResponseEnvelope, required)
- `meta` (ExternalSessionAiResponseMetadata, required)
- `errors` (list of Issue, optional)
- `warnings` (list of Issue, optional)

## Types

### PaginatedExtractionConfig

- `experimental` (PaginatedExtractionExperimentalConfig, optional) — Experimental configuration options. These may be subject to change and are not guaranteed to be stable across versions.
- `interactionMode` (string, optional, default: auto) — The mode to use for interaction. If set to 'auto', Airtop AI will automatically choose the most cost-effective interaction mode. If set to 'accurate', the request might be slower, but more likely to be accurate. Whereas, 'cost-efficient' will be cheaper and speed things up, but may reduce accuracy.
- `outputSchema` (string, optional) — JSON schema defining the structure of the output. If not provided, the format of the output might vary.
- `paginationMode` (string, optional, default: auto) — The mode to use for pagination. If set to 'auto', Airtop AI will automatically look for pagination links first and then attempt infinite scrolling to load more content. If set to 'paginated', Airtop AI will follow pagination links to load more content. If set to 'infinite-scroll', Airtop AI will scroll the page to load more content.
- `scrape` (ScrapeConfig, optional) — Optional configuration to customize and tweak how the web page is scraped.

### AiResponseEnvelope

- `modelResponse` (string, required)

### ExternalSessionAiResponseMetadata

- `status` (enum, required) — Outcome of the operation.
  - Allowed values: `success`, `partial`, `failure`
- `usage` (ExternalSessionAiResponseMetadataUsage, required)
- `clientProvided` (ClientProvidedResponseMetadata, optional)
- `requestId` (string, optional)
- `screenshots` (list of ScreenshotMetadata, optional) — Array containing any requested screenshots from the operation.

### Issue

- `message` (string, required) — Message describing the issue.
- `code` (string, optional) — Issue code.
- `details` (map from string to any, optional) — Any associated details.
- `reason` (string, optional) — Underlying reason for the issue.

### PaginatedExtractionExperimentalConfig

- `scrollWithin` (string, optional) — A natural language description of the scrollable area on the web page. This identifies the container or region that should be scrolled to access pagination controls. If missing, the entire page will be scrolled. You can also describe a visible reference point inside the container.

### ScrapeConfig

- `optimizeUrls` (string, optional, default: auto) — URL optimization helps improve performance during model analysis, but limits the model's ability to analyze internal details of URLs (such as individual URL parameters). This setting does not affect the ability to extract URLs or links from web pages -- those will work regardless of how this option is set. However, if you need to analyze URLs themselves and are not getting satisfactory results, try setting this option to 'disabled'. If set to 'auto', Airtop AI will automatically determine whether to apply URL optimization. If 'enabled', URLs will always be optimized to improve performance. If 'disabled', URLs will not be optimized.

### ExternalSessionAiResponseMetadataUsage

- `credits` (long, required) — The credit usage for this request
- `id` (string, required) — The id of the request

### ClientProvidedResponseMetadata

- `clientRequestId` (string, optional)

### ScreenshotMetadata

- `dataUrl` (string, optional) — Base64 encoded data URL of screenshot image data
- `fileId` (string, optional) — Unique identifier for the uploaded file
- `fileName` (string, optional) — Name of the screenshot file
- `format` (enum, optional) — Format of the screenshot data
  - Allowed values: `base64`, `url`
- `scrollPosition` (ScreenshotScrollPosition, optional) — Scroll position where the screenshot was taken
- `signedDownloadUrl` (string, optional) — Signed URL for downloading the screenshot (when format is 'url')
- `urlExpiry` (string, optional) — Expiration time for the signed URL in ISO format
- `viewportDimensions` (ScreenshotViewportDimensions, optional) — Viewport dimensions of the screenshot

### ScreenshotScrollPosition

- `left` (long, required) — Horizontal scroll position in pixels
- `top` (long, required) — Vertical scroll position in pixels

### ScreenshotViewportDimensions

- `height` (long, required) — Height of the viewport in pixels
- `width` (long, required) — Width of the viewport in pixels

## Examples

**Request**

```json
{
  "prompt": "This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list."
}
```

**Response**

```json
{
  "data": {
    "modelResponse": "modelResponse"
  },
  "meta": {
    "status": "success",
    "usage": {
      "credits": 1000000,
      "id": "id"
    },
    "clientProvided": {
      "clientRequestId": "clientRequestId"
    },
    "requestId": "requestId",
    "screenshots": [
      {}
    ]
  },
  "errors": [
    {
      "message": "message",
      "code": "code",
      "details": {
        "key": "value"
      },
      "reason": "reason"
    }
  ],
  "warnings": [
    {
      "message": "message",
      "code": "code",
      "details": {
        "key": "value"
      },
      "reason": "reason"
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction"

payload = { "prompt": "This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list." }
headers = {
    "Authorization": "Bearer <apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```typescript
import { AirtopClient } from "@airtop/sdk";

const client = new AirtopClient({ apiKey: "YOUR_API_KEY" });
await client.windows.paginatedExtraction("6aac6f73-bd89-4a76-ab32-5a6c422e8b0b", "0334da2a-91b0-42c5-6156-76a5eba87430", {
    prompt: "This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list."
});

```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction"

	payload := strings.NewReader("{\n  \"prompt\": \"This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list.\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"prompt\": \"This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list.\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction")
  .header("Authorization", "Bearer <apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"prompt\": \"This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list.\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction', [
  'body' => '{
  "prompt": "This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list."
}',
  'headers' => [
    'Authorization' => 'Bearer <apiKey>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"prompt\": \"This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list.\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <apiKey>",
  "Content-Type": "application/json"
]
let parameters = ["prompt": "This site contains a list of results about <provide details about the list>. Navigate through 3 pages of results and return the title and <provide details about the data you want to extract> about each result in this list."] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.airtop.ai/api/v1/sessions/6aac6f73-bd89-4a76-ab32-5a6c422e8b0b/windows/0334da2a-91b0-42c5-6156-76a5eba87430/paginated-extraction")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```