curl --request POST \
--url https://api.aisa.one/apis/v1/dataforseo/serp/screenshot \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"task_id": "<string>",
"browser_preset": "<string>",
"browser_screen_width": 123,
"browser_screen_height": 123,
"browser_screen_scale_factor": 123,
"page": 123
}
]
'import requests
url = "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot"
payload = [
{
"task_id": "<string>",
"browser_preset": "<string>",
"browser_screen_width": 123,
"browser_screen_height": 123,
"browser_screen_scale_factor": 123,
"page": 123
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
task_id: '<string>',
browser_preset: '<string>',
browser_screen_width: 123,
browser_screen_height: 123,
browser_screen_scale_factor: 123,
page: 123
}
])
};
fetch('https://api.aisa.one/apis/v1/dataforseo/serp/screenshot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'task_id' => '<string>',
'browser_preset' => '<string>',
'browser_screen_width' => 123,
'browser_screen_height' => 123,
'browser_screen_scale_factor' => 123,
'page' => 123
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot"
payload := strings.NewReader("[\n {\n \"task_id\": \"<string>\",\n \"browser_preset\": \"<string>\",\n \"browser_screen_width\": 123,\n \"browser_screen_height\": 123,\n \"browser_screen_scale_factor\": 123,\n \"page\": 123\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/dataforseo/serp/screenshot")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"task_id\": \"<string>\",\n \"browser_preset\": \"<string>\",\n \"browser_screen_width\": 123,\n \"browser_screen_height\": 123,\n \"browser_screen_scale_factor\": 123,\n \"page\": 123\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/dataforseo/serp/screenshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"task_id\": \"<string>\",\n \"browser_preset\": \"<string>\",\n \"browser_screen_width\": 123,\n \"browser_screen_height\": 123,\n \"browser_screen_scale_factor\": 123,\n \"page\": 123\n }\n]"
response = http.request(request)
puts response.read_body{
"version": "<string>",
"status_code": 123,
"status_message": "<string>",
"time": "<string>",
"cost": 123,
"tasks": [
"<string>"
],
"tasks[].id": "<string>",
"tasks[].status_code": 123,
"tasks[].status_message": "<string>",
"tasks[].result_count": 123,
"tasks[].path": [
"<string>"
],
"tasks[].data": {},
"tasks[].result": [
"<string>"
],
"tasks[].result[].items_count": 123,
"tasks[].result[].items": [
"<string>"
],
"tasks[].result[].items[].image": "<string>"
}SERP API Page Screenshot
Returns a rendered screenshot of a search result page on Google.
curl --request POST \
--url https://api.aisa.one/apis/v1/dataforseo/serp/screenshot \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"task_id": "<string>",
"browser_preset": "<string>",
"browser_screen_width": 123,
"browser_screen_height": 123,
"browser_screen_scale_factor": 123,
"page": 123
}
]
'import requests
url = "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot"
payload = [
{
"task_id": "<string>",
"browser_preset": "<string>",
"browser_screen_width": 123,
"browser_screen_height": 123,
"browser_screen_scale_factor": 123,
"page": 123
}
]
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
task_id: '<string>',
browser_preset: '<string>',
browser_screen_width: 123,
browser_screen_height: 123,
browser_screen_scale_factor: 123,
page: 123
}
])
};
fetch('https://api.aisa.one/apis/v1/dataforseo/serp/screenshot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'task_id' => '<string>',
'browser_preset' => '<string>',
'browser_screen_width' => 123,
'browser_screen_height' => 123,
'browser_screen_scale_factor' => 123,
'page' => 123
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot"
payload := strings.NewReader("[\n {\n \"task_id\": \"<string>\",\n \"browser_preset\": \"<string>\",\n \"browser_screen_width\": 123,\n \"browser_screen_height\": 123,\n \"browser_screen_scale_factor\": 123,\n \"page\": 123\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/dataforseo/serp/screenshot")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"task_id\": \"<string>\",\n \"browser_preset\": \"<string>\",\n \"browser_screen_width\": 123,\n \"browser_screen_height\": 123,\n \"browser_screen_scale_factor\": 123,\n \"page\": 123\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/dataforseo/serp/screenshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"task_id\": \"<string>\",\n \"browser_preset\": \"<string>\",\n \"browser_screen_width\": 123,\n \"browser_screen_height\": 123,\n \"browser_screen_scale_factor\": 123,\n \"page\": 123\n }\n]"
response = http.request(request)
puts response.read_body{
"version": "<string>",
"status_code": 123,
"status_message": "<string>",
"time": "<string>",
"cost": 123,
"tasks": [
"<string>"
],
"tasks[].id": "<string>",
"tasks[].status_code": 123,
"tasks[].status_message": "<string>",
"tasks[].result_count": 123,
"tasks[].path": [
"<string>"
],
"tasks[].data": {},
"tasks[].result": [
"<string>"
],
"tasks[].result[].items_count": 123,
"tasks[].result[].items": [
"<string>"
],
"tasks[].result[].items[].image": "<string>"
}keyword, type, se_domain, location_code, language_code, check_url, datetime, spell, refinement_chips, item_types, items_count and items. Wrapped in DataForSEO’s envelope: data in tasks[0].result, outcome in tasks[0].status_code - a rejected request still returns HTTP 200.
Example
curl -X POST "https://api.aisa.one/apis/v1/dataforseo/serp/screenshot" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '[{"task_id": "...", "browser_preset": "...", "browser_screen_width": "..."}]'
// Copy this whole block into Claude Code, Codex, Cursor or any coding agent.
// It carries everything needed to connect, authorize and run this example —
// no key to paste, one click of Allow in the browser.
{
"operation_id": "post_dataforseo_serp_screenshot",
"arguments": {},
"max_price_usd": 0.05
}
// ── for the agent ─────────────────────────────────────────────────────────
// Register the AIsa MCP server, then call its `use` tool with the JSON above.
// name aisa
// endpoint https://mcp.aisa.one/mcp
// transport streamable-http
// auth OAuth. The server publishes RFC 9728 metadata, so open a
// browser and the user clicks Allow once — nothing to paste.
// If AISA_API_KEY is set, send it as a bearer header instead.
// Use your own MCP mechanism, not a hand-edited config file:
// Codex codex mcp add aisa --url https://mcp.aisa.one/mcp
// Claude Code claude mcp add --transport http -s user aisa https://mcp.aisa.one/mcp
// Cursor / VS Code a "url" entry for https://mcp.aisa.one/mcp in the MCP config
// The server lists five tools over https://mcp.aisa.one/servers worth of APIs:
// search, get_details, use, batch_use, list_categories. search and
// get_details are free; use is billed per call and max_price_usd refuses
// anything above the cap before spending. This operation's full contract —
// every argument, the response shape, the price and the pitfalls — is at
// https://aisa.one/docs/api-reference/dataforseo/post_dataforseo-serp-screenshot.md
// Then run the call and show me the result.
https://mcp.aisa.one/mcp — Claude
Code, Codex, Cursor, VS Code and the rest. Authorization is OAuth: the client
opens a browser, you click Allow once, and there is no key to paste. The
commands per client, and what each call costs, are on
aisa.one/mcp.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
task identifier required field unique identifier of the associated task in the UUID format you will be able to use it within 7 days to request the results of the task at any time
browser resolution preset optional field browser preset associated with a certain device type can take the following values: desktop, tablet, mobile Note: by default, browser preset corresponds to the device type specified in the POST request
width of the browser resolution optional field can be specified in the following range: 240-9999 default value for desktop: 1920 default value for mobile: 390 default value for table: 1024
height of the browser resolution optional field can be specified in the following range: 240-9999 default value for desktop: 1080 default value for mobile: 844 default value for table: 1366
browser scale factor optional field can be specified in the following range: 0.5-3 default value for desktop: 1 default value for mobile: 3 default value for table: 2
number of SERP pages optional field if depth in the corresponding Task POST request exceeds 10 results (or 1 SERP page), specify the number of SERP pages to screenshot; default value: 1
Response
Successful operation
The current version of the API
general status code you can find the full list of the response codes here
general informational message you can find the full list of general informational messages here
total execution time, seconds
total tasks cost, USD
Array of tasks
task identifier unique task identifier in our system in the UUID format
status code of the task generated by DataForSEO, can be within the following range: 10000-60000 you can find the full list of the response codes here
informational message of the task you can find the full list of general informational messages here
Number of elements in the result array
URL path
contains the same parameters that you specified in the POST request
Array of results
Number of items in the results array
Items array
screenshot of the requested page URL of the page screenshot on the DataForSEO storage note: the page screenshot saved on the DataForSEO storage only remains accessible for one day after making the request