# Otomoto Search API Documentation

Scrappa's `GET /api/otomoto/search` endpoint is the Otomoto Search API documentation page for developers who need Polish vehicle listings as structured JSON instead of building their own scraper.

## Endpoint reference for Otomoto search

Use this endpoint to search used and new cars anywhere in Poland. The request takes a `make`, an optional `model`, and optional price, year, mileage, engine-power, fuel, gearbox, body-type, location, sort and pagination filters.

## What the Otomoto search response returns

Each listing returns its full card field set: `id`, `url`, `title`, `price` (`value` + `currency`), `location` (`city` + `region`), `make`, `model`, `year`, `mileage`, `engine_power`, `engine_capacity`, `fuel`, `transmission`, `images` and `price_evaluation`. The response also carries pagination (`page`, `page_size`, `current_offset`, `total`, `has_more`, `live_snapshot`), the resolved `facets` and a `meta` block.

## How this differs from an Otomoto scraper build

Otomoto publishes no public API and serves filtered search only from server-rendered page state. This endpoint performs that translation for you, so your application never has to maintain a browser, a proxy pool or a state parser.

## Otomoto search API use cases

Dealership tools can run repeatable supply feeds for Polish cities. Market analysts can compare asking prices and availability across the whole country. Alerting tools can poll the same filtered search on a schedule and trigger on newly published listings.

For cross-portal coverage, query Otomoto beside other vehicle APIs and deduplicate by listing URL and price.

## When to pair this endpoint with the other Otomoto endpoints

Use `GET /api/otomoto/listing` with a result `id` for the full description, equipment, parameters and seller data. Use `GET /api/otomoto/dealer` with a listing's `seller.url` subdomain for the dealer profile. Use `GET /api/otomoto/taxonomy` for the make/model reference lists behind the filters.

## Related Otomoto endpoints

- `GET /api/otomoto/listing` — full detail for one listing id
- `GET /api/otomoto/dealer` — dealer profile and inventory categories
- `GET /api/otomoto/taxonomy` — make/model taxonomy and filter values

- **Documentation:** [https://scrappa.co/docs/otomoto-api/otomoto_search](https://scrappa.co/docs/otomoto-api/otomoto_search)
- **API group:** Otomoto API
- **Endpoint:** `GET https://scrappa.co/api/otomoto/search`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `make_id` | string | No | Make slug from the taxonomy endpoint, e.g. volvo. |
| `model_id` | string | No | Model slug from the taxonomy endpoint, e.g. xc-90. Requires make_id. |
| `generation` | string | No | Generation slug from the taxonomy endpoint, e.g. gen-b8-2007-2015. |
| `price_min` | integer | No | Minimum price in PLN. |
| `price_max` | integer | No | Maximum price in PLN. |
| `year_min` | integer | No | Minimum first-registration year. |
| `year_max` | integer | No | Maximum first-registration year. |
| `mileage_min` | integer | No | Minimum mileage in km. |
| `mileage_max` | integer | No | Maximum mileage in km. |
| `engine_power_max` | integer | No | Maximum engine power in KM. |
| `fuel` | array | No | Fuel type, e.g. petrol. Repeat for several values. |
| `transmission` | array | No | Gearbox, e.g. automatic. Repeat for several values. |
| `body_type` | array | No | Body type, e.g. suv. Repeat for several values. |
| `city_id` | integer | No | City id from the location filter, e.g. 17871 for Warszawa. |
| `dist` | integer | No | Radius in km around the city. |
| `sort` | string | No | Sort id from the embedded sort options, e.g. filter_float_price:desc. |
| `page` | integer | No | Page number, 1-based. Page size is fixed at 32. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/otomoto/search?make_id=volvo"
```

## Example response

```json
{
    "success": true,
    "data": {
        "listings": [
            {
                "id": "6151011578",
                "url": "https://www.otomoto.pl/osobowe/oferta/volvo-xc-60-ID6Ih16a.html",
                "title": "Volvo XC 60",
                "price": {
                    "value": 66000,
                    "currency": "PLN"
                },
                "location": {
                    "city": "Warszawa",
                    "region": "Mazowieckie"
                },
                "make": "volvo",
                "model": "xc-60",
                "year": 2019,
                "mileage": 49153,
                "fuel": "petrol",
                "transmission": "automatic",
                "images": [
                    "https://ireland.apollo.olxcdn.com/v1/files/0rxly0yq5vph1-OTOMOTOPL/image;s=640x480"
                ],
                "price_evaluation": "NONE"
            }
        ],
        "pagination": {
            "page": 1,
            "page_size": 32,
            "current_offset": 0,
            "total": 9338,
            "has_more": true,
            "live_snapshot": true
        },
        "facets": {
            "make": "volvo",
            "model": null,
            "sort": "relevance_web"
        }
    },
    "meta": {
        "endpoint_family": "search"
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
|  | Error | The make or model slug does not resolve. Not billed. |
|  | Error | Otomoto could not be reached. Not billed. |
|  | Error | The upstream service is temporarily unavailable. Please retry shortly. |

## Frequently asked questions

### How do I find a make slug?

Call the Otomoto taxonomy endpoint and use the `id` of the make you want.

### Why is my result count much larger than I expected?

An unrecognized make or model slug silently returns the whole corpus. The endpoint validates both against the taxonomy and rejects an unresolvable pair instead of billing it.

### Is a request billed when it fails?

No. Failed requests return an `error` object and are never charged.

### Are image files downloaded?

No. Only image URLs are returned, which is cheaper and lets you choose any resolution.

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
