# Car Listing Condition Grader (`rainminer/car-listing-condition-grader`) Actor

Turn a used-car listing URL into a graded condition report. Reads the listing's own photos and returns an A–E grade, a 0–100 score, and visible damage panel by panel — dents, scratches, rust, cracks — plus interior wear and tyre condition. For auction buyers and dealers triaging listings at scale.

- **URL**: https://apify.com/rainminer/car-listing-condition-grader.md
- **Developed by:** [rainminer](https://apify.com/rainminer) (community)
- **Categories:** E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 vehicle gradeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Car Listing Condition Grader do?

**Car Listing Condition Grader** turns a **used-car listing URL** into a **graded vehicle condition report**. Paste an [AutoScout24](https://www.autoscout24.de/) listing or search URL and the Actor pulls the listing's own photos, inspects them with AI vision, and returns a **condition grade (A–E)**, a **0–100 condition score**, and a **panel-by-panel list of visible damage** — dents, scratches, rust, cracks, missing parts — alongside interior wear, tyre condition, and photo-quality warnings.

Most vehicle damage tools require you to already have the photos. This one starts from the live listing: **listing URL in, graded vehicle out.**

> **Important — this is an AI estimate from photographs, not a mechanical inspection.**
> The Actor can only judge what is visible in the seller's own photos. It cannot detect engine, gearbox, electrical, structural or underbody problems, accident history, odometer fraud, or anything a seller chose not to photograph. Output is **non-deterministic**: the same listing can score slightly differently across runs. Use it to **triage and rank listings at scale**, then inspect the shortlist properly. Never treat a grade as a substitute for a professional inspection or a purchase decision on its own.

### Why grade car listings automatically?

- **Auction and wholesale buying** — Triage hundreds of lots before bidding and filter out the wrecks instead of opening every listing by hand.
- **Dealer sourcing** — Rank trade-in and remarketing inventory by visible condition before you send a buyer to look.
- **Listing quality control** — Spot stock photos, missing interior shots and watermarked galleries across your own inventory.
- **Price-versus-condition analysis** — Join condition grades to price and mileage to find underpriced clean cars and overpriced rough ones.
- **Damage datasets** — Build structured, labelled damage records for analytics or model training.

### How to use Car Listing Condition Grader

1. Open the Actor in Apify Console.
2. Add one or more **AutoScout24 search or listing URLs** under **Start URLs**. Search pages are expanded into individual cars automatically.
3. Set **Max vehicles per start URL** and **Max photos per vehicle**.
4. Run the Actor and download results from the **Dataset** tab.

No listing page? Put photo URLs straight into **Direct photo URLs** instead — see below.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | Array | — | AutoScout24 detail URLs (`/angebote/…`) or search URLs (`/lst/…`). Country domains `.de`, `.at`, `.it`, `.nl`, `.fr`, `.be`, `.es`, `.lu` are supported. |
| `maxItems` | Integer | `5` | Maximum graded vehicles per start URL. |
| `maxPhotosPerVehicle` | Integer | `8` | Maximum photos analyzed per car (1–20). |
| `imageUrls` | Array of strings | — | Optional. Direct photo URLs for a single vehicle — see **Direct photo mode**. |
| `proxyConfiguration` | Object | no proxy | Optional proxy settings. |

```json
{
  "startUrls": [
    { "url": "https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&sort=standard" }
  ],
  "maxItems": 5,
  "maxPhotosPerVehicle": 8,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Direct photo mode

Grade a car whose listing lives on a portal this Actor does not support, or whose photos you already store yourself:

```json
{
  "imageUrls": [
    "https://example.com/car/front.jpg",
    "https://example.com/car/rear.jpg",
    "https://example.com/car/interior.jpg"
  ],
  "maxPhotosPerVehicle": 8
}
```

All URLs in `imageUrls` are treated as photos of the **same vehicle** and produce **one** graded row, with `listingUrl` and the vehicle specification fields set to `null`.

### Output

One row per vehicle. Download as **JSON, CSV, Excel, or HTML**.

```json
{
  "listingId": "58d557c5-253d-44e4-921b-8e75f33246f0",
  "listingUrl": "https://www.autoscout24.de/angebote/volkswagen-sonstige-golf-v-us-modell-...",
  "title": "Volkswagen Sonstige Golf V US Modell Verkaufe gegen Gebot",
  "make": "Volkswagen",
  "model": "Sonstige",
  "year": 2007,
  "price": 1,
  "currency": "EUR",
  "mileage": 225000,
  "imageUrl": "https://prod.pictures.autoscout24.net/listing-images/58d557c5-..._66543e8b-....jpg/1280x960.webp",
  "imageUrls": ["https://prod.pictures.autoscout24.net/listing-images/..."],
  "photosAnalyzed": 6,
  "conditionGrade": "D",
  "conditionScore": 50,
  "damages": [
    { "panel": "sill-left", "type": "rust", "severity": "moderate", "confidence": 1 },
    { "panel": "sill-right", "type": "rust", "severity": "moderate", "confidence": 1 }
  ],
  "interiorWear": null,
  "tyreCondition": "good",
  "photoFlags": ["interior-missing", "dirty-vehicle"],
  "summary": "The vehicle exhibits significant, visible corrosion along both the left and right side sills; interior photos are missing.",
  "scrapedAt": "2026-08-01T07:41:12.903Z"
}
```

| Field | Description |
|---|---|
| `listingId` | Listing identifier on the source portal — `null` in direct photo mode |
| `listingUrl` | Canonical listing URL — `null` in direct photo mode |
| `title` | Vehicle title built from make, model and trim |
| `make` / `model` | Manufacturer and model group |
| `year` | Year of first registration |
| `price` / `currency` | Asking price as a number, and its ISO currency code |
| `mileage` | Odometer reading in kilometres |
| `imageUrl` | Primary listing photo (absolute URL) — `null` when the listing has no photos |
| `imageUrls` | Full photo gallery in listing order |
| `photosAnalyzed` | How many photos were sent to AI vision for this car |
| `conditionGrade` | `A`–`E`, derived from `conditionScore` so the two never disagree |
| `conditionScore` | Visible condition from `0` to `100` |
| `damages` | Visible defects: `panel`, `type`, `severity` (`minor`/`moderate`/`severe`), `confidence` (`0`–`1`) |
| `interiorWear` | `excellent`/`good`/`fair`/`poor`, or `null` when no interior photo is clear enough to judge |
| `tyreCondition` | `excellent`/`good`/`fair`/`poor`, or `null` when the tyres are not clearly visible |
| `photoFlags` | Reasons the grade may be limited (see below) |
| `summary` | One-sentence assessment of the visible condition |
| `scrapedAt` | ISO timestamp of the grading |

#### Grade scale

| Grade | Score | Meaning |
|---|---|---|
| **A** | 90–100 | Showroom condition, no visible defects |
| **B** | 75–89 | Good — light wear only, or photos too limited to certify perfection |
| **C** | 55–74 | Average — several visible cosmetic defects |
| **D** | 35–54 | Poor — significant damage, corrosion or a cracked panel |
| **E** | 0–34 | Wrecked, crash-damaged or a repair project |

Listings with no usable photos are still saved, with `conditionGrade` and `conditionScore` set to `null` and `photoFlags` containing `no-photos`.

#### Photo flags

`photoFlags` tells you **how much to trust the grade**. A clean car photographed from three distant angles is not the same evidence as one photographed close up from twelve.

`stock-photo` · `low-resolution` · `plate-obscured` · `interior-missing` · `exterior-incomplete` · `wheels-not-visible` · `heavy-editing` · `poor-lighting` · `dirty-vehicle` · `obstructed-view` · `watermarked` · `non-vehicle-photo` · `detail-too-limited` · `no-photos`

### Pricing

Pay-per-event — see the Store pricing tab for current rates.

| Event | When charged |
|---|---|
| `listing-scraped` | Once per listing page read, including listings that turn out to have no usable photos |
| `photo-analyzed` | Once per photo sent to AI vision, capped by `maxPhotosPerVehicle` |
| `vehicle-graded` | Once per graded vehicle written to the dataset |

**Budgeting tip:** `photo-analyzed` dominates the bill — a run at `maxPhotosPerVehicle: 8` costs about four times as much per car as one at `2`. But photo count drives result quality too. At **2 photos** a car is usually only graded on one or two exterior angles, so `damages` comes back empty and `interiorWear` and `tyreCondition` come back `null` on most listings — enough to spot an obvious wreck, not enough to rank clean cars against each other. Use **6–8 photos** when you need kerb rash, panel defects and interior wear. All photos of one car are sent in a **single** AI call regardless of the setting.

### Notes and limitations

- **Photos only.** Mechanical condition, service history, accident records and hidden rust are invisible to this Actor.
- **The seller controls the evidence.** Sellers photograph the good side. Missing angles are reported through `photoFlags`, not guessed at.
- **Non-deterministic output.** Grades can shift by a few points between runs on the same listing. Rank and filter on the grade; do not treat the score as an exact measurement.
- **Public data only.** The Actor reads publicly visible listing pages. It never logs in to any account.
- **Listings expire.** Used-car listings are removed quickly; refresh your start URLs for repeat runs.

### Image Credit

Image credit: [autoscout24.de](https://www.autoscout24.de/)

# Actor input Schema

## `startUrls` (type: `array`):

AutoScout24 detail URLs (https://www.autoscout24.de/angebote/...) or search URLs (https://www.autoscout24.de/lst/...). Country domains such as .de, .at, .it, .nl, .fr, .be, .es and .lu are supported.

## `maxItems` (type: `integer`):

Maximum number of graded vehicles to output per start URL. Each vehicle costs one listing-scraped event plus the photo-analyzed events for its photos.

## `maxPhotosPerVehicle` (type: `integer`):

Maximum number of photos analyzed per vehicle. Photos are sampled evenly across the gallery so exterior, interior and wheel shots are all covered. All photos of one car are analyzed together in a single AI call.

## `imageUrls` (type: `array`):

Direct https URLs to photos of a single vehicle. Use this when your car is on a portal this Actor does not support, or when you already store the photos yourself.

## `proxyConfiguration` (type: `object`):

Select proxies to be used by the Actor.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&damaged_listing=exclude&powertype=kw&sort=standard&ustate=N%2CU"
    }
  ],
  "maxItems": 5,
  "maxPhotosPerVehicle": 8,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&damaged_listing=exclude&powertype=kw&sort=standard&ustate=N%2CU"
        }
    ],
    "maxItems": 5,
    "maxPhotosPerVehicle": 8
};

// Run the Actor and wait for it to finish
const run = await client.actor("rainminer/car-listing-condition-grader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&damaged_listing=exclude&powertype=kw&sort=standard&ustate=N%2CU" }],
    "maxItems": 5,
    "maxPhotosPerVehicle": 8,
}

# Run the Actor and wait for it to finish
run = client.actor("rainminer/car-listing-condition-grader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&damaged_listing=exclude&powertype=kw&sort=standard&ustate=N%2CU"
    }
  ],
  "maxItems": 5,
  "maxPhotosPerVehicle": 8
}' |
apify call rainminer/car-listing-condition-grader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rainminer/car-listing-condition-grader"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/az8rtmHGqWDlugQ5u/builds/JQN4xYwxAlEWrxfZv/openapi.json
