---
title: "AutoTrader UK API: Get Used Car Listings as JSON"
description: "Search UK used car listings by postcode, make and price with one GET call. Real BMW response, 6 endpoints, 1 credit per call, failed calls free."
url: https://perceptlayer.com/blog/autotrader-uk-api-listings-json
---

[Blog](https://perceptlayer.com/blog) / [API guides](https://perceptlayer.com/blog/category/api-guides)

# AutoTrader UK API: Get Used Car Listings as JSON

20 Aug 2026 Perceptlayer 6 min read

You can get AutoTrader UK listings as JSON without writing a scraper: call `GET /v1/autotrader-uk/search` with a UK `postcode` and an `X-API-Key` header, and you get listings with price, title, distance, images and a total result count. Each call costs 1 credit, and failed calls cost nothing. This guide shows the request, the parameters, a recorded response and the cost of paging through a whole search.

## Key takeaways

-   Reading every page of the recorded BMW search costs 2,146 credits, so filter before you page.
-   `GET /v1/autotrader-uk/search` needs only `postcode`; add `make`, `model`, price, year and mileage filters to narrow it.
-   A recorded BMW search returned `total_results` of 42,916 across `page_count` 2,146, so every response tells you how much more there is to fetch.
-   Six endpoints cover search, a single listing, facets, taxonomy, a dealer and a dealer's stock, all at 1 credit per call.
-   Failed calls return `X-Credits-Used: 0`, and the free tier gives you 1,000 credits a month to try it.

## Is there an official AutoTrader UK API?

We can't point you to one. We haven't verified what Auto Trader offers directly, so if you're a dealer managing your own adverts, ask Auto Trader about its partner options.

To read public used-car search results for a postcode, the options are writing and maintaining a scraper, or calling an API that returns the listings as JSON. This article covers the second one.

## What does the AutoTrader UK API return?

The AutoTrader UK API in the Perceptlayer catalogue has six endpoints, all `GET`, all 1 credit per call. The catalogue holds 248 websites and 1,659 endpoints in total, all returning JSON, and this is the [AutoTrader UK API](https://perceptlayer.com/apis/autotrader-uk) in the [Cars area](https://perceptlayer.com/verticals/cars).

| Endpoint | Returns | Required parameters |
| --- | --- | --- |
| `/v1/autotrader-uk/search` | [Search](https://perceptlayer.com/apis/autotrader-uk/search) results | `postcode` |
| `/v1/autotrader-uk/listing` | [One listing](https://perceptlayer.com/apis/autotrader-uk/listing) | `advert_id` |
| `/v1/autotrader-uk/facets` | [Facets](https://perceptlayer.com/apis/autotrader-uk/facets) for a search | `postcode` |
| `/v1/autotrader-uk/taxonomy` | [Taxonomy](https://perceptlayer.com/apis/autotrader-uk/taxonomy) | `postcode` |
| `/v1/autotrader-uk/dealer` | [Dealer](https://perceptlayer.com/apis/autotrader-uk/dealer) details | `retailer_id` |
| `/v1/autotrader-uk/dealer-listings` | [A dealer's listings](https://perceptlayer.com/apis/autotrader-uk/dealer-listings) | `postcode`, `retailer_id` |

A typical flow: search to find candidates, then `listing` with an `advert_id` for one advert's detail. Use `facets` to see how a search breaks down, and `dealer-listings` to read one dealer's stock.

## How do you run a used car search?

Send a `GET` to `/v1/autotrader-uk/search` with a postcode and your key. Keys start with `sk_live_` and go in the `X-API-Key` header; the [authentication docs](https://docs.perceptlayer.com/authentication) cover the query-parameter option. [Get a free API key](https://perceptlayer.com/signup) if you don't have one.

```bash
curl "https://api.perceptlayer.com/v1/autotrader-uk/search?postcode=SW1A1AA&price_search_type=total&make=BMW&sort=relevance&page=1" \
  -H "X-API-Key: $API_KEY"
```

This searches BMWs around `SW1A1AA` and sorts by relevance. `price_search_type=total` asks for the total price rather than a monthly one. Only `postcode` is required, so you can drop everything else and get an unfiltered search.

### Which parameters does the search endpoint take?

The search endpoint takes one required parameter and seventeen optional ones. Types and allowed values below are as documented; nothing else about them is documented, so check the [Search endpoint page](https://perceptlayer.com/apis/autotrader-uk/search) or try values in the playground.

| Parameter | Type | Notes |
| --- | --- | --- |
| `postcode` | string, required | Up to 8 characters |
| `price_search_type` | string | `total` or `monthly` |
| `make` | string | Up to 100 characters |
| `model` | string | Up to 100 characters |
| `body_type` | string | Up to 100 characters |
| `colour` | string | Up to 100 characters |
| `transmission` | string | Up to 100 characters |
| `seller_type` | string | `private` or `trade` |
| `fuel_type[]` | list of string | Up to 50 characters per value |
| `min_price`, `max_price` | integer |  |
| `min_year_manufactured`, `max_year_manufactured` | integer |  |
| `min_mileage`, `max_mileage` | integer |  |
| `distance` | integer |  |
| `sort` | string | `relevance`, `price_asc`, `price_desc`, `distance`, `mileage`, `year_dsc`, `year_asc`, `most_recent` |
| `page` | integer |  |

`dealer-listings` takes the same filters plus a required `retailer_id`.

## What does a search response look like?

A search response has three parts: `data.listings`, an array of adverts; `data.pagination`; and a `meta` block. This is a trimmed excerpt of a real recorded response for the BMW request above, with `…` marking what was cut.

```json
{
  "success": true,
  "data": {
    "listings": [
      {
        "advert_id": "202610227244889",
        "type": "NATURAL_LISTING",
        "title": "BMW X5",
        "sub_title": "3.0d SE Exclusive Edition Auto 4WD Euro 4 5dr",
        "price": {
          "amount": 2700,
          "currency": "GBP",
          "display": "£2,700"
        },
        "vehicle_location": "Crawley (27 miles)",
        "distance": { "value": 27, "unit": "miles" },
        "number_of_images": 16,
        "seller_type": "PRIVATE",
        "position": 1,
        "tracking_context": {
          "price": 2700,
          "make": "BMW",
          "model": "X5",
          "year": 2005,
          "condition": "used",
          "price_indicator": "NOANALYSIS"
        }
      },
      …
    ],
    "pagination": {
      "page": 1,
      "page_count": 2146,
      "total_results": 42916,
      "has_more": true
    }
  },
  "meta": {
    "duration_ms": 1129,
    "endpoint_family": "search"
  }
}
```

### What do the main fields mean?

The fields you'll use most are in the table below. Meanings are read from the recorded values, not from separate documentation.

| Field | Example | Use |
| --- | --- | --- |
| `advert_id` | `"202610227244889"` | The key for the `listing` endpoint |
| `title`, `sub_title` | `"BMW X5"`, `"3.0d SE Exclusive Edition…"` | Model name and trim line |
| `price.amount` | `2700` | Numeric price, in `price.currency` ( `GBP`) |
| `price.display` | `"£2,700"` | The formatted string |
| `distance.value`, `distance.unit` | `27`, `"miles"` | Distance from your postcode |
| `seller_type` | `"PRIVATE"` | Private or trade seller |
| `tracking_context.year` | `2005` | Year of the car |
| `tracking_context.make`, `.model` | `"BMW"`, `"X5"` | Make and model as separate fields |
| `images` | URLs containing `{resize}` | Photo URLs; the `{resize}` token is part of the returned string |
| `number_of_images` | `16` | How many photos the advert has |
| `position` | `1` | Rank within the results |

Mileage, fuel type and the like aren't in the excerpt, so this guide doesn't describe them. Run a `listing` call in the playground on the [AutoTrader UK API page](https://perceptlayer.com/apis/autotrader-uk) to see what an individual advert carries. For which fields matter when you analyse prices, see [Used Car Listing Data: Fields for Price Analysis](https://perceptlayer.com/blog/used-car-listing-data-price-analysis).

## How do you narrow a search or list what's available?

Add filters to cut a search down, or call `facets` to see how results break down before you filter. Both are the same 1 credit per call, and a narrower search means fewer pages to fetch. Here is a filtered search for automatic cars under £10,000 from trade sellers, newest first.

```bash
curl -G "https://api.perceptlayer.com/v1/autotrader-uk/search" \
  -d "postcode=SW1A1AA" \
  -d "make=BMW" \
  -d "transmission=Automatic" \
  -d "seller_type=trade" \
  -d "max_price=10000" \
  -d "sort=most_recent" \
  -H "X-API-Key: $API_KEY"
```

`transmission` is a free-text string, so check the accepted values against the facets before relying on one.

For the breakdown, `facets` takes a `facets[]` list. Allowed values include `make`, `model`, `body_type`, `colour`, `fuel_type`, `transmission`, `seller_type`, `price`, `mileage` and `year_manufactured`, among others.

```bash
curl -G "https://api.perceptlayer.com/v1/autotrader-uk/facets" \
  -d "postcode=SW1A1AA" \
  -d "facets[]=make" \
  -d "facets[]=fuel_type" \
  -H "X-API-Key: $API_KEY"
```

We haven't recorded a facets response for this article, so it doesn't quote one. The [Facets endpoint page](https://perceptlayer.com/apis/autotrader-uk/facets) has a playground. The `taxonomy` endpoint, which takes `postcode` and an optional `make`, is the place to look when you need valid make and model values.

## How do you page through all the results?

Read `data.pagination` on every response and keep going while `has_more` is `true`. In the recorded search, `page_count` was 2,146 and `total_results` 42,916, so one call returns a page of a much larger set. Each page is a separate call at 1 credit.

```python
import os
import time
import requests

URL = "https://api.perceptlayer.com/v1/autotrader-uk/search"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}
params = {"postcode": "SW1A1AA", "make": "BMW", "sort": "price_asc", "page": 1}
max_pages = 5  # cap spend while you test

listings = []
while params["page"] <= max_pages:
    resp = requests.get(URL, params=params, headers=HEADERS, timeout=30)
    if resp.status_code in (429, 503):
        time.sleep(int(resp.headers.get("Retry-After", "5")))
        continue
    resp.raise_for_status()
    data = resp.json()["data"]
    listings.extend(data["listings"])
    if not data["pagination"]["has_more"]:
        break
    params["page"] += 1

print(len(listings), "listings")
```

The `Retry-After` header carries the seconds to wait on a 429 or 503. For safer loops see [Paginate a Web Data API in Python](https://perceptlayer.com/blog/paginate-web-data-api-python), and for what a timed-out request can mean for billing, [Retry Web API Calls Without Paying Twice](https://perceptlayer.com/blog/retry-web-api-calls-without-paying-twice).

## What does it cost?

Every endpoint here costs 1 credit per successful call. A failed call costs nothing and returns `X-Credits-Used: 0`; every successful response carries `X-Credits-Used` and `X-Credits-Remaining`. The free tier gives you 1,000 credits a month after you verify an email address, with no credit card.

Worked examples, using the recorded search:

-   Reading all 2,146 pages of that BMW search once: 2,146 pages × 1 credit = 2,146 credits. That is more than the 1,000 free credits, so filter first.
-   Checking 200 adverts with `listing` after a search: 200 calls × 1 credit = 200 credits.
-   A daily 5-page search for one postcode over 30 days: 30 × 5 × 1 credit = 150 credits.

Purchased credits last 12 months, with no subscription. The [credits docs](https://docs.perceptlayer.com/credits) explain billing, and [pricing](https://perceptlayer.com/pricing) shows what credits cost. Rate limits are per account; free accounts get 1 request a second, so a page loop needs the `Retry-After` handling above. The [rate limits docs](https://docs.perceptlayer.com/rate-limits) and [errors docs](https://docs.perceptlayer.com/errors) cover the rest.

## What should you build next?

Start with one postcode and one make, store `advert_id` with `price.amount` and a timestamp on each run, and compare runs. That gives you price movement for a model without scraping anything. If you're building an agent instead, the same endpoints are callable as tools over MCP; see the [AI agents docs](https://docs.perceptlayer.com/ai-agents).

For other UK listings, see the [Rightmove API guide](https://perceptlayer.com/blog/rightmove-api-property-data). To try this call now, [get a free API key](https://perceptlayer.com/signup) and run the search in the playground on the [AutoTrader UK API page](https://perceptlayer.com/apis/autotrader-uk).

## APIs in this post

-   [AutoTrader UK **1 credit per call** · 6 endpoints](https://perceptlayer.com/apis/autotrader-uk)

## Frequently asked questions

### Does AutoTrader have a public API for listings?

We can't confirm one, and we haven't verified what Auto Trader offers directly. To read public search results as JSON without a scraper, call the `search` endpoint described in this guide.

### How much does one AutoTrader UK API call cost?

One credit for each of the six endpoints on a successful call. Failed calls cost nothing and return `X-Credits-Used: 0`. Free accounts get 1,000 credits a month, so 1,000 search pages cost 1,000 credits. The [pricing page](https://perceptlayer.com/pricing) shows what credit packs cost.

### Can I get one dealer's stock?

Yes. Call `/v1/autotrader-uk/dealer-listings` with a `postcode` and a `retailer_id`; it accepts the same filters as search, such as `make`, `max_price` and `sort`. Use `/v1/autotrader-uk/dealer` with the same `retailer_id` for the dealer's own details.

### What happens when a call fails or I hit the rate limit?

Errors return an HTTP status and a JSON body with `error.code`, `message` and `request_id`. A 429 `rate_limited` or 503 `temporarily_unavailable` response includes `Retry-After` with the seconds to wait. A bad parameter returns 422 `invalid_parameters`. See the [errors docs](https://docs.perceptlayer.com/errors).

### Is it legal to use this data?

Data is collected from publicly available sources and returned as found at the time of the call. Whether your use is allowed depends on what you do with it and on AutoTrader's terms and UK law, so check those for your case. UK copyright law has a narrow exception: [GOV.UK](https://www.gov.uk/guidance/exceptions-to-copyright) says researchers may copy material for computational analysis "if they already have the right to read the work", which doesn't cover commercial reuse. Perceptlayer can't give you legal advice.

autotrader used cars car listings uk cars api

## More from the blog

1.  [API guides](https://perceptlayer.com/blog/category/api-guides) 23 Oct 2026 Perceptlayer 7 min read
    
    ## [Cars.com API: Used Car Listings and Price Evaluations](https://perceptlayer.com/blog/cars-com-api-listings-price-evaluation)
    
    Search Cars.com listings with its six required parameters (zip, radius\_miles, stock\_type, sort, page, page\_size), then listing, dealer and price-eval calls.
    
2.  [API guides](https://perceptlayer.com/blog/category/api-guides) 7 Aug 2026 Perceptlayer 7 min read
    
    ## [AutoScout24 API: Search European Car Listings as JSON](https://perceptlayer.com/blog/autoscout24-api-car-listings-json)
    
    Search AutoScout24 listings as JSON: make\_id and price filters, a recorded BMW response, and what a monthly price sweep costs in credits.
    
3.  [API guides](https://perceptlayer.com/blog/category/api-guides) 4 Aug 2026 Perceptlayer 8 min read
    
    ## [CarGurus API: Search Used Car Listings and Dealers](https://perceptlayer.com/blog/cargurus-api-used-car-search)
    
    Get CarGurus used car listings as JSON: look up make and model IDs, run search at 1 credit a call, then pull a dealer by service\_provider\_id.
