Vehicle Data Normalizer — Australian Inventory
Pricing
from $5.00 / 1,000 vehicle record normalizeds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
6 days ago
Last modified
Categories
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.
| 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, orskuintolistingId. - 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.
{"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,stateSYD-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 osfrom apify_client import ApifyClientclient = 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().itemsprint(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.internalhosts 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
OUTPUTkey 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.