# Vehicle Data Normalizer — Australian Inventory (`muhammadafzal/normalize-australian-vehicle-data`) Actor

Normalize user-owned Australian vehicle inventory exports from CSV, JSON, JSONL, or HTML. Returns stable records for analytics, CRM imports, price comparison, and AI agents. Does not scrape Carsales or bypass access controls. Charged $0.005 per normalized record.

- **URL**: https://apify.com/muhammadafzal/normalize-australian-vehicle-data.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Automation, AI, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 vehicle record normalizeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Vehicle Data Normalizer — Australian Inventory

Normalize vehicle inventory you already own or are licensed to process into a stable, analysis-ready Apify dataset. The Actor accepts CSV, JSON, JSON Lines, and machine-readable HTML, maps inconsistent dealer and feed headers onto one canonical vehicle schema, removes duplicates, converts mileage to kilometres, and optionally compares prices with a previous Apify dataset.

This is a data transformation Actor, not a marketplace scraper. It does not access Carsales, bypass access controls, discover inventory pages, or collect seller contact details. Carsales URLs are explicitly rejected. Use it for dealer exports, first-party feeds, licensed data, and files you are otherwise authorized to process.

### What data can the Vehicle Data Normalizer produce?

Each output item represents one vehicle. Fields stay consistent across CSV, JSON, JSONL, and HTML sources, which makes the dataset suitable for MCP agents, BI tools, CRMs, spreadsheets, and downstream Apify Actors.

| Group | Output fields |
|---|---|
| Identity | `recordId`, `listingId`, `vin`, `title` |
| Vehicle | `year`, `make`, `model`, `variant`, `condition` |
| Price | `price`, `currency`, `previousPrice`, `priceChange`, `priceChangeAmount`, `priceChangePercent` |
| Specifications | `odometerKm`, `bodyType`, `transmission`, `fuelType`, `driveType`, `colour` |
| Seller | `sellerType`, `sellerName`, `dealerLicence` |
| Location | `suburb`, `state`, `postcode`, `country` |
| Media and text | `listingUrl`, `imageUrl`, `imageUrls`, `description` |
| Provenance | `sourceLabel`, `sourceUrl`, `observedAt`, `validationWarnings` |

### When should you use it?

- Combine exports from several dealership systems into one schema.
- Prepare Australian vehicle inventory for a CRM, data warehouse, dashboard, or spreadsheet.
- Normalize inconsistent headers such as `stock_number`, `adId`, `vehicle_id`, or `sku` into `listingId`.
- Convert mileage expressed in miles into kilometres.
- Deduplicate repeated rows using listing ID, VIN, listing URL, or a conservative composite identity.
- Compare the current price with a previous dataset produced by this Actor.
- Give an AI agent compact, predictable vehicle records instead of an unknown source schema.

Do not use this Actor to scrape third-party marketplaces, defeat bot protection, access private systems, or process data without permission. It also does not parse XLSX files, PDFs, scanned images, or arbitrary visual pages without tables or vehicle JSON-LD.

### Pricing

The Actor uses predictable pay-per-event pricing and standard Apify platform usage billing.

| Event | Price |
|---|---:|
| Actor start | $0.00005 minimum, scaled by memory |
| Vehicle record normalized | $0.005 per dataset item |

The run prints its maximum record charge before processing. With the default `maxResults` value of 100, record charges are capped at **$0.50**. Ten records cost approximately **$0.05**; 1,000 records cost **$5.00**. Invalid rows skipped before output and duplicates removed before output are not charged as normalized records.

### Input

You can paste data into `inlineData`, provide up to 20 public direct-file URLs in `sourceUrls`, or use both in one run. Remote files are limited to 10 MB each. HTTP redirects are followed only when the final destination also passes URL safety validation.

```json
{
  "sourceUrls": [
    "https://dealer.example/exports/inventory.csv"
  ],
  "inlineData": "",
  "sourceFormat": "auto",
  "sourceLabel": "Sydney dealer feed",
  "defaultCurrency": "AUD",
  "maxResults": 500,
  "duplicateStrategy": "prefer-complete",
  "previousDatasetId": "",
  "responseFormat": "concise",
  "includeInvalidRecords": false
}
````

`sourceFormat: "auto"` uses the content type, file extension, and content signature. Set it explicitly when an endpoint has no extension or returns a misleading content type.

`duplicateStrategy` supports:

- `prefer-complete`: retain the row with more populated canonical fields.
- `first`: retain the first occurrence.
- `last`: retain the last occurrence.

`responseFormat: "detailed"` includes a size-capped preview of the original row in `rawSource`. Concise mode keeps `rawSource` as `null`, reducing token use for AI agents.

### Supported source structures

#### CSV

The first row must contain headers. Quoted fields, a UTF-8 BOM, empty lines, and uneven optional columns are tolerated.

```csv
stock_number,vehicle_title,model_year,manufacturer,model_name,advertised_price,odometer,state
SYD-1002,2021 Toyota Corolla Ascent Sport,2021,Toyota,Corolla,"AUD 26,689","62,817 km",NSW
```

#### JSON

Pass a top-level array, one object, or an object containing an array under `items`, `results`, `listings`, `vehicles`, `inventory`, `records`, or `data`.

```json
{
  "vehicles": [
    {
      "stockNumber": "MEL-2001",
      "make": "Hyundai",
      "model": "Tucson",
      "year": 2020,
      "price": 24990
    }
  ]
}
```

#### JSON Lines

Supply one JSON object per non-empty line. JSONL is useful for generated feeds and larger exports because every source row remains independent.

#### HTML

HTML support targets exports with actual `<table>` rows or schema.org JSON-LD describing a `Vehicle`, `Car`, or vehicle-like `Product`. The Actor intentionally does not run a browser or guess arbitrary visual card layouts.

### Output example

```json
{
  "recordId": "veh_19282b44e816584f",
  "listingId": "DEMO-001",
  "vin": null,
  "title": "2021 Toyota Corolla Ascent Sport",
  "year": 2021,
  "make": "Toyota",
  "model": "Corolla",
  "variant": "Ascent Sport",
  "condition": "used",
  "price": 26689,
  "currency": "AUD",
  "previousPrice": 27490,
  "priceChange": "decreased",
  "priceChangeAmount": -801,
  "priceChangePercent": -2.91,
  "odometerKm": 62817,
  "sellerType": "dealer",
  "state": "NSW",
  "country": "Australia",
  "sourceLabel": "Sydney dealer feed",
  "observedAt": "2026-07-13T10:30:00.000Z",
  "validationWarnings": [],
  "rawSource": null
}
```

Optional fields are emitted as `null` or empty arrays rather than disappearing. This stable shape improves output-schema inference and reduces conditional logic for API and MCP consumers.

### Price-change comparison

Set `previousDatasetId` to an accessible dataset previously produced by this Actor. Records are matched through their stable `recordId`, which derives from listing ID, VIN, listing URL, or the composite fallback identity. Matched prices are classified as `increased`, `decreased`, or `unchanged`; unmatched current records are marked `new`. If the previous dataset cannot be read, current normalization continues and the run summary reports a warning.

### Run with the Apify API

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('YOUR_USERNAME/normalize-australian-vehicle-data').call({
  sourceUrls: ['https://dealer.example/exports/inventory.json'],
  sourceLabel: 'Licensed dealer feed',
  maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('YOUR_USERNAME/normalize-australian-vehicle-data').call(run_input={
    'sourceUrls': ['https://dealer.example/exports/inventory.csv'],
    'sourceLabel': 'Licensed dealer feed',
    'maxResults': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### AI-agent and MCP routing

Recommended tool description:

> Normalize authorized Australian vehicle inventory exports from CSV, JSON, JSONL, or HTML. Use for dealer-feed cleanup, inventory analytics, CRM imports, deduplication, and price-change comparison. Do not use to scrape Carsales or other marketplaces. Returns one stable record per vehicle with identity, price, mileage, seller, location, provenance, and warnings. Charged $0.005 per record.

Apify’s hosted MCP server can expose this regular Actor through `mcp.apify.com`. Concise mode is recommended for agents because every output item remains well below typical tool-output budgets.

### Reliability and security

- Carsales and its subdomains are rejected before any request is sent.
- `localhost`, private IPv4 ranges, link-local metadata, `.local`, and `.internal` hosts are blocked to reduce SSRF risk.
- Remote files have a 30-second fetch timeout and a 10 MB hard limit.
- Source strings are parsed as data and never executed as JavaScript or shell commands.
- A failed remote file does not discard successfully parsed inline data or other files.
- The run summary is saved under the `OUTPUT` key with row, duplicate, invalid, warning, billing, and cost counts.

### FAQ

#### Does this Actor scrape Carsales.com.au?

No. It explicitly rejects Carsales URLs and does not contain marketplace-specific extraction or anti-bot code.

#### Can it process an Excel workbook?

Not directly in v1. Export the relevant worksheet as UTF-8 CSV or JSON first.

#### Why is a row missing from the output?

By default, a row needs at least one usable identity signal: listing ID, VIN, listing URL, title, make, or model. Set `includeInvalidRecords` to `true` to emit questionable rows with `validationWarnings` for auditing.

#### Does it convert currencies?

No. It normalizes the supplied or inferred currency code but does not apply exchange rates.

#### Who is responsible for data rights?

You are responsible for ensuring you own the input or have permission and a lawful basis to process it. This Actor is a transformation utility and does not grant rights to third-party data.

# Actor input Schema

## `sourceUrls` (type: `array`):

Use this when lawful vehicle inventory files are available over HTTP or HTTPS. Enter direct CSV, JSON, JSONL, or HTML file URLs such as 'https://dealer.example/inventory.csv'. Defaults to no remote files and accepts at most 20 URLs. This is not a marketplace crawler and Carsales URLs are rejected.

## `inlineData` (type: `string`):

Use this when pasting a small CSV, JSON, JSONL, or HTML export directly into the run. For example, paste '\[{"make":"Toyota","model":"Corolla","price":26900}]'. A working sample is supplied by default for health checks. This field is not JavaScript and is never executed.

## `sourceFormat` (type: `string`):

Use this when the file extension or content type is missing or misleading. Choose 'auto' to detect JSON, JSONL, CSV, or HTML from the content; for example, choose 'csv' for an extensionless CSV endpoint. Defaults to 'auto'. This setting does not transform PDFs, spreadsheets, or images.

## `sourceLabel` (type: `string`):

Use this to identify the inventory owner or export in every result. Enter a short label such as 'Sydney dealer feed'. Defaults to 'user-provided inventory' and is limited to 120 characters. This is provenance metadata, not a URL or seller name override.

## `defaultCurrency` (type: `string`):

Use this when source prices omit their ISO 4217 currency. Enter a three-letter code such as 'AUD'. Defaults to 'AUD' and is used only when no currency can be inferred. This does not convert values between currencies.

## `maxResults` (type: `integer`):

Use this to cap output size and the maximum PPE charge. Enter an integer such as 100; accepted values are 1 through 10000. Defaults to 100, making the maximum record charge $0.50. This is not a source-row limit because invalid and duplicate rows are excluded.

## `duplicateStrategy` (type: `string`):

Use this to choose which record survives when listing ID, VIN, URL, or a composite identity repeats. For example, 'prefer-complete' keeps the row with more populated fields. Defaults to 'prefer-complete'. This does not merge different vehicles that merely share the same price.

## `previousDatasetId` (type: `string`):

Use this to compare normalized prices with an earlier dataset from this actor. Enter an accessible dataset ID such as 'a1b2c3d4e5f6'. Defaults to empty, which disables price-change comparison. This is not a dataset URL and the run token must have read access.

## `responseFormat` (type: `string`):

Use this to control whether a compact copy of each source row is retained. Choose 'detailed' for debugging field mappings or 'concise' for smaller AI-agent output. Defaults to 'concise'. Both modes return the same stable normalized vehicle fields.

## `includeInvalidRecords` (type: `boolean`):

Use this when data-quality auditing requires rows that lack a usable vehicle identity. Enable it to emit schema-valid records with validation warnings; for example, a row containing only a price. Defaults to false. Invalid rows still count as normalized output when emitted.

## Actor input object example

```json
{
  "sourceUrls": [
    "https://dealer.example/inventory.csv"
  ],
  "inlineData": "make,model,year,price\nToyota,Corolla,2021,26689",
  "sourceFormat": "auto",
  "sourceLabel": "Sydney dealer feed",
  "defaultCurrency": "AUD",
  "maxResults": 100,
  "duplicateStrategy": "prefer-complete",
  "previousDatasetId": "a1b2c3d4e5f6",
  "responseFormat": "concise",
  "includeInvalidRecords": false
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset items with stable vehicle, price, mileage, seller, location, provenance, and price-change fields.

## `summary` (type: `string`):

Processing counts, warnings, billed event count, and cost estimate for this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/normalize-australian-vehicle-data").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/normalize-australian-vehicle-data").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call muhammadafzal/normalize-australian-vehicle-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=muhammadafzal/normalize-australian-vehicle-data",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vehicle Data Normalizer — Australian Inventory",
        "description": "Normalize user-owned Australian vehicle inventory exports from CSV, JSON, JSONL, or HTML. Returns stable records for analytics, CRM imports, price comparison, and AI agents. Does not scrape Carsales or bypass access controls. Charged $0.005 per normalized record.",
        "version": "1.2",
        "x-build-id": "T8Lki6bjUrfbujqZh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/muhammadafzal~normalize-australian-vehicle-data/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-muhammadafzal-normalize-australian-vehicle-data",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/muhammadafzal~normalize-australian-vehicle-data/runs": {
            "post": {
                "operationId": "runs-sync-muhammadafzal-normalize-australian-vehicle-data",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/muhammadafzal~normalize-australian-vehicle-data/run-sync": {
            "post": {
                "operationId": "run-sync-muhammadafzal-normalize-australian-vehicle-data",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sourceUrls": {
                        "title": "Source file URLs",
                        "maxItems": 20,
                        "type": "array",
                        "description": "Use this when lawful vehicle inventory files are available over HTTP or HTTPS. Enter direct CSV, JSON, JSONL, or HTML file URLs such as 'https://dealer.example/inventory.csv'. Defaults to no remote files and accepts at most 20 URLs. This is not a marketplace crawler and Carsales URLs are rejected.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "inlineData": {
                        "title": "Inline inventory data",
                        "type": "string",
                        "description": "Use this when pasting a small CSV, JSON, JSONL, or HTML export directly into the run. For example, paste '[{\"make\":\"Toyota\",\"model\":\"Corolla\",\"price\":26900}]'. A working sample is supplied by default for health checks. This field is not JavaScript and is never executed.",
                        "default": "[{\"listingId\":\"DEMO-001\",\"title\":\"2021 Toyota Corolla Ascent Sport\",\"year\":2021,\"make\":\"Toyota\",\"model\":\"Corolla\",\"variant\":\"Ascent Sport\",\"price\":26689,\"currency\":\"AUD\",\"odometerKm\":62817,\"state\":\"NSW\",\"sellerType\":\"dealer\"}]"
                    },
                    "sourceFormat": {
                        "title": "Source format",
                        "enum": [
                            "auto",
                            "csv",
                            "json",
                            "jsonl",
                            "html"
                        ],
                        "type": "string",
                        "description": "Use this when the file extension or content type is missing or misleading. Choose 'auto' to detect JSON, JSONL, CSV, or HTML from the content; for example, choose 'csv' for an extensionless CSV endpoint. Defaults to 'auto'. This setting does not transform PDFs, spreadsheets, or images.",
                        "default": "auto"
                    },
                    "sourceLabel": {
                        "title": "Source label",
                        "maxLength": 120,
                        "type": "string",
                        "description": "Use this to identify the inventory owner or export in every result. Enter a short label such as 'Sydney dealer feed'. Defaults to 'user-provided inventory' and is limited to 120 characters. This is provenance metadata, not a URL or seller name override.",
                        "default": "user-provided inventory"
                    },
                    "defaultCurrency": {
                        "title": "Default currency",
                        "pattern": "^[A-Za-z]{3}$",
                        "type": "string",
                        "description": "Use this when source prices omit their ISO 4217 currency. Enter a three-letter code such as 'AUD'. Defaults to 'AUD' and is used only when no currency can be inferred. This does not convert values between currencies.",
                        "default": "AUD"
                    },
                    "maxResults": {
                        "title": "Maximum normalized records",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Use this to cap output size and the maximum PPE charge. Enter an integer such as 100; accepted values are 1 through 10000. Defaults to 100, making the maximum record charge $0.50. This is not a source-row limit because invalid and duplicate rows are excluded.",
                        "default": 100
                    },
                    "duplicateStrategy": {
                        "title": "Duplicate handling",
                        "enum": [
                            "prefer-complete",
                            "first",
                            "last"
                        ],
                        "type": "string",
                        "description": "Use this to choose which record survives when listing ID, VIN, URL, or a composite identity repeats. For example, 'prefer-complete' keeps the row with more populated fields. Defaults to 'prefer-complete'. This does not merge different vehicles that merely share the same price.",
                        "default": "prefer-complete"
                    },
                    "previousDatasetId": {
                        "title": "Previous Apify dataset ID",
                        "type": "string",
                        "description": "Use this to compare normalized prices with an earlier dataset from this actor. Enter an accessible dataset ID such as 'a1b2c3d4e5f6'. Defaults to empty, which disables price-change comparison. This is not a dataset URL and the run token must have read access.",
                        "default": ""
                    },
                    "responseFormat": {
                        "title": "Response detail",
                        "enum": [
                            "concise",
                            "detailed"
                        ],
                        "type": "string",
                        "description": "Use this to control whether a compact copy of each source row is retained. Choose 'detailed' for debugging field mappings or 'concise' for smaller AI-agent output. Defaults to 'concise'. Both modes return the same stable normalized vehicle fields.",
                        "default": "concise"
                    },
                    "includeInvalidRecords": {
                        "title": "Include invalid rows",
                        "type": "boolean",
                        "description": "Use this when data-quality auditing requires rows that lack a usable vehicle identity. Enable it to emit schema-valid records with validation warnings; for example, a row containing only a price. Defaults to false. Invalid rows still count as normalized output when emitted.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
