# Quickstart

This guide shows how to make your first Search API request and get structured
organic results back.

## Prerequisites

You need a [Zyte API key](https://app.zyte.com/o/zyte-api/api-access).

## Basic request

Send a `POST` request to `https://api.zyte.com/v1/search` with `domain`
and `query`. Use `include` to control what you get back.

### curl

input.json
```json
{
    "domain": "search.engine.com",
    "query": "web scraping tools",
    "include": ["organic"]
}
```

```shell
curl \
    --user YOUR_ZYTE_API_KEY: \
    --header 'Content-Type: application/json' \
    --data @input.json \
    --compressed \
    https://api.zyte.com/v1/search \
    | jq .organicResults
```

### Python client

```python
import requests

api_response = requests.post(
    "https://api.zyte.com/v1/search",
    auth=("YOUR_ZYTE_API_KEY", ""),
    json={
        "domain": "search.engine.com",
        "query": "web scraping tools",
        "include": ["organic"],
    },
)
organic_results = api_response.json()["organicResults"]
print(organic_results)
```

The response contains a structured `organicResults` array:

```json
{
    "status": "success",
    "url": "https://www.example-engine.com/search?q=web+scraping+tools",
    "fetchedAt": "2026-05-11T09:36:57Z",
    "meta": {
        "requestedAt": "2026-05-11T09:36:39Z"
    },
    "organicResults": [
        {
            "rank": 1,
            "title": "Zyte - Web Scraping API",
            "url": "https://www.zyte.com/",
            "snippet": "The leading web scraping platform...",
            "displayedUrl": "zyte.com"
        }
    ]
}
```

## Getting raw HTML

Use `include: ["html"]` to get the raw rendered HTML instead of parsed
results. You can also request both at once:

```shell
curl \
    --user YOUR_ZYTE_API_KEY: \
    --header 'Content-Type: application/json' \
    --data '{
        "domain": "search.engine.com",
        "query": "web scraping tools",
        "include": ["html", "organic"]
    }' \
    https://api.zyte.com/v1/search
```

## More results

Set `maxResults` to get up to 100 results in a single call. The platform
fetches multiple pages automatically and returns them in one
`organicResults` array:

### curl

input.json
```json
{
    "domain": "search.engine.com",
    "query": "web scraping tools",
    "include": ["organic"],
    "maxResults": 100
}
```

```shell
curl \
    --user YOUR_ZYTE_API_KEY: \
    --header 'Content-Type: application/json' \
    --data @input.json \
    --compressed \
    https://api.zyte.com/v1/search \
    | jq .organicResults
```

### Python client

```python
api_response = requests.post(
    "https://api.zyte.com/v1/search",
    auth=("YOUR_ZYTE_API_KEY", ""),
    json={
        "domain": "search.engine.com",
        "query": "web scraping tools",
        "include": ["organic"],
        "maxResults": 100,
    },
)
organic_results = api_response.json()["organicResults"]
```

## Geo-targeting

Pass `queryParameters` to target a specific country and language:

### curl

input.json
```json
{
    "domain": "search.engine.com",
    "query": "web scraping tools",
    "include": ["organic"],
    "queryParameters": {
        "style": "engineSpecific",
        "gl": "us",
        "hl": "en"
    }
}
```

```shell
curl \
    --user YOUR_ZYTE_API_KEY: \
    --header 'Content-Type: application/json' \
    --data @input.json \
    --compressed \
    https://api.zyte.com/v1/search \
    | jq .organicResults
```

### Python client

```python
api_response = requests.post(
    "https://api.zyte.com/v1/search",
    auth=("YOUR_ZYTE_API_KEY", ""),
    json={
        "domain": "search.engine.com",
        "query": "web scraping tools",
        "include": ["organic"],
        "queryParameters": {
            "style": "engineSpecific",
            "gl": "us",
            "hl": "en",
        },
    },
)
organic_results = api_response.json()["organicResults"]
```

For city-level targeting, add a `uule` value. The value must be in a format
supported by the target search engine.

## AI Overview

Add `"aiOverview"` to `include` to trigger full browser rendering. The
AI Overview block will be present in the raw `html` field:

### curl

input.json
```json
{
    "domain": "search.engine.com",
    "query": "web scraping tools",
    "include": ["aiOverview", "organic", "html"]
}
```

```shell
curl \
    --user YOUR_ZYTE_API_KEY: \
    --header 'Content-Type: application/json' \
    --data @input.json \
    --compressed \
    https://api.zyte.com/v1/search
```

### Python client

```python
api_response = requests.post(
    "https://api.zyte.com/v1/search",
    auth=("YOUR_ZYTE_API_KEY", ""),
    json={
        "domain": "search.engine.com",
        "query": "web scraping tools",
        "include": ["aiOverview", "organic", "html"],
    },
)
data = api_response.json()
organic_results = data["organicResults"]
html = data["html"]  # parse AI Overview from here
```

> [!NOTE]
> Parsed `aiOverview` extraction is coming in a future release. For now,
> the AI Overview block is available in the raw `html` field.

## Next steps

- [Request parameters](request.md) — full parameter reference
- [Response schema](response.md) — response field details
- [Geo-targeting](geo.md) — geo-targeting by country, language, and domain
