Vehicle Data Normalizer — Australian Inventory avatar

Vehicle Data Normalizer — Australian Inventory

Pricing

from $5.00 / 1,000 vehicle record normalizeds

Go to Apify Store
Vehicle Data Normalizer — Australian Inventory

Vehicle Data Normalizer — Australian Inventory

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.

Pricing

from $5.00 / 1,000 vehicle record normalizeds

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

6 days ago

Last modified

Share

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.

GroupOutput fields
IdentityrecordId, listingId, vin, title
Vehicleyear, make, model, variant, condition
Priceprice, currency, previousPrice, priceChange, priceChangeAmount, priceChangePercent
SpecificationsodometerKm, bodyType, transmission, fuelType, driveType, colour
SellersellerType, sellerName, dealerLicence
Locationsuburb, state, postcode, country
Media and textlistingUrl, imageUrl, imageUrls, description
ProvenancesourceLabel, 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.

EventPrice
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.

{
"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.

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.

{
"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

{
"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

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

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.