WebScrapingAPI Docs
Introduction

Send a Request

Send your first WebScrapingAPI request with an API key and a target URL.

After registration, get your API key from the dashboard and include it as the api_key query parameter on every request.

Keep API keys in server-side secrets. Do not ship them in browser code, mobile apps, public repositories, logs, screenshots, or shared notebooks.

Basic scraping request

Use the /v2 endpoint for fast HTTP scraping.

curl --get "https://api.webscrapingapi.com/v2" \
  --data-urlencode "api_key=YOUR_API_KEY" \
  --data-urlencode "url=https://example.com"
const params = new URLSearchParams({
  api_key: "YOUR_API_KEY",
  url: "https://example.com",
});

const response = await fetch(`https://api.webscrapingapi.com/v2?${params}`);
const body = await response.text();

console.log(body);
import requests

response = requests.get(
    "https://api.webscrapingapi.com/v2",
    params={
        "api_key": "YOUR_API_KEY",
        "url": "https://example.com",
    },
)

print(response.text)
<?php

$query = http_build_query([
    'api_key' => 'YOUR_API_KEY',
    'url' => 'https://example.com',
]);

$response = file_get_contents('https://api.webscrapingapi.com/v2?' . $query);

echo $response;
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
)

func main() {
	params := url.Values{}
	params.Add("api_key", "YOUR_API_KEY")
	params.Add("url", "https://example.com")

	requestURL := "https://api.webscrapingapi.com/v2?" + params.Encode()

	response, err := http.Get(requestURL)
	if err != nil {
		log.Fatal(err)
	}
	defer response.Body.Close()

	body, err := io.ReadAll(response.Body)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(string(body))
}
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws Exception {
        String query = "api_key=" + URLEncoder.encode("YOUR_API_KEY", StandardCharsets.UTF_8)
            + "&url=" + URLEncoder.encode("https://example.com", StandardCharsets.UTF_8);

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.webscrapingapi.com/v2?" + query))
            .GET()
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var apiKey = Uri.EscapeDataString("YOUR_API_KEY");
        var targetUrl = Uri.EscapeDataString("https://example.com");
        var requestUrl = $"https://api.webscrapingapi.com/v2?api_key={apiKey}&url={targetUrl}";

        using var client = new HttpClient();
        var response = await client.GetStringAsync(requestUrl);

        Console.WriteLine(response);
    }
}
require 'net/http'
require 'uri'

uri = URI('https://api.webscrapingapi.com/v2')
uri.query = URI.encode_www_form(
  api_key: 'YOUR_API_KEY',
  url: 'https://example.com'
)

response = Net::HTTP.get(uri)

puts response

Browser rendering request

Use the /v1 endpoint when the target page needs browser rendering, waits, screenshots, JavaScript actions, custom headers, or cookies.

curl --get "https://api.webscrapingapi.com/v1" \
  --data-urlencode "api_key=YOUR_API_KEY" \
  --data-urlencode "url=https://example.com" \
  --data-urlencode "wait_until=domcontentloaded"
const params = new URLSearchParams({
  api_key: "YOUR_API_KEY",
  url: "https://example.com",
  wait_until: "domcontentloaded",
});

const response = await fetch(`https://api.webscrapingapi.com/v1?${params}`);
const body = await response.text();

console.log(body);
import requests

response = requests.get(
    "https://api.webscrapingapi.com/v1",
    params={
        "api_key": "YOUR_API_KEY",
        "url": "https://example.com",
        "wait_until": "domcontentloaded",
    },
)

print(response.text)
<?php

$query = http_build_query([
    'api_key' => 'YOUR_API_KEY',
    'url' => 'https://example.com',
    'wait_until' => 'domcontentloaded',
]);

$response = file_get_contents('https://api.webscrapingapi.com/v1?' . $query);

echo $response;
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
)

func main() {
	params := url.Values{}
	params.Add("api_key", "YOUR_API_KEY")
	params.Add("url", "https://example.com")
	params.Add("wait_until", "domcontentloaded")

	requestURL := "https://api.webscrapingapi.com/v1?" + params.Encode()

	response, err := http.Get(requestURL)
	if err != nil {
		log.Fatal(err)
	}
	defer response.Body.Close()

	body, err := io.ReadAll(response.Body)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(string(body))
}
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws Exception {
        String query = "api_key=" + URLEncoder.encode("YOUR_API_KEY", StandardCharsets.UTF_8)
            + "&url=" + URLEncoder.encode("https://example.com", StandardCharsets.UTF_8)
            + "&wait_until=domcontentloaded";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.webscrapingapi.com/v1?" + query))
            .GET()
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var apiKey = Uri.EscapeDataString("YOUR_API_KEY");
        var targetUrl = Uri.EscapeDataString("https://example.com");
        var requestUrl = $"https://api.webscrapingapi.com/v1?api_key={apiKey}&url={targetUrl}&wait_until=domcontentloaded";

        using var client = new HttpClient();
        var response = await client.GetStringAsync(requestUrl);

        Console.WriteLine(response);
    }
}
require 'net/http'
require 'uri'

uri = URI('https://api.webscrapingapi.com/v1')
uri.query = URI.encode_www_form(
  api_key: 'YOUR_API_KEY',
  url: 'https://example.com',
  wait_until: 'domcontentloaded'
)

response = Net::HTTP.get(uri)

puts response

Product-specific requests

SERP and commerce APIs use the same api_key parameter, but they require product-specific fields such as engine, type, or a product identifier.

curl --get "https://serpapi.webscrapingapi.com/v2" \
  --data-urlencode "api_key=YOUR_API_KEY" \
  --data-urlencode "engine=google" \
  --data-urlencode "q=coffee"
const params = new URLSearchParams({
  api_key: "YOUR_API_KEY",
  engine: "google",
  q: "coffee",
});

const response = await fetch(`https://serpapi.webscrapingapi.com/v2?${params}`);
const data = await response.json();

console.log(data);
import requests

response = requests.get(
    "https://serpapi.webscrapingapi.com/v2",
    params={
        "api_key": "YOUR_API_KEY",
        "engine": "google",
        "q": "coffee",
    },
)

print(response.json())
<?php

$query = http_build_query([
    'api_key' => 'YOUR_API_KEY',
    'engine' => 'google',
    'q' => 'coffee',
]);

$response = file_get_contents('https://serpapi.webscrapingapi.com/v2?' . $query);

echo $response;
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
)

func main() {
	params := url.Values{}
	params.Add("api_key", "YOUR_API_KEY")
	params.Add("engine", "google")
	params.Add("q", "coffee")

	requestURL := "https://serpapi.webscrapingapi.com/v2?" + params.Encode()

	response, err := http.Get(requestURL)
	if err != nil {
		log.Fatal(err)
	}
	defer response.Body.Close()

	body, err := io.ReadAll(response.Body)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(string(body))
}
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws Exception {
        String query = "api_key=" + URLEncoder.encode("YOUR_API_KEY", StandardCharsets.UTF_8)
            + "&engine=google"
            + "&q=" + URLEncoder.encode("coffee", StandardCharsets.UTF_8);

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://serpapi.webscrapingapi.com/v2?" + query))
            .GET()
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var apiKey = Uri.EscapeDataString("YOUR_API_KEY");
        var query = Uri.EscapeDataString("coffee");
        var requestUrl = $"https://serpapi.webscrapingapi.com/v2?api_key={apiKey}&engine=google&q={query}";

        using var client = new HttpClient();
        var response = await client.GetStringAsync(requestUrl);

        Console.WriteLine(response);
    }
}
require 'net/http'
require 'uri'

uri = URI('https://serpapi.webscrapingapi.com/v2')
uri.query = URI.encode_www_form(
  api_key: 'YOUR_API_KEY',
  engine: 'google',
  q: 'coffee'
)

response = Net::HTTP.get(uri)

puts response

Review the product section you are integrating for required parameters, examples, and response details.

On this page