Technical documentation for integrating an EV listing feed with the Nearcharger platform.
Fields are split into required, recommended and optional. Your feed only needs to contain the required fields - we fill in the rest from our catalog.
Before you send us your feed, you need to know what to map it to. The Master Data API is a public export of our catalog and lookup tables: the list of brands, models, variants (including production years), equipment, colors and other values, together with their stable IDs. Store our IDs in your system as mapping keys and send IDs in your feed instead of free text - this eliminates ambiguous matching.
The entry point is the discovery index - a single URL that returns the list of all available feeds, their version and the time they were last generated:
GET https://nearcharger.sk/wp-json/nearcharger/v1/master-data
| Endpoint | Contents |
|---|---|
/master-data | Discovery index - list of feeds, schema_version, URLs, generated_at |
/master-data/catalog | Vehicle catalog (variant + production year = 1 item), paginated, filters ?brand= and ?year= |
/master-data/brands | Brand → model tree with stable IDs and slugs |
/master-data/equipment | Equipment - categories + items |
/master-data/enums | Other lookup tables: drivetrain, body type, segment, charge port, listing status, market, listing type, vehicle state, colors, seats, doors |
?format=json (default) or ?format=xml. We also accept the Accept: application/xml header./catalog and the partner feed): ?page= and ?per_page=, maximum 500 items per page.{
"schema_version": 1,
"generated_at": "2026-07-07T03:30:00+02:00",
"page": 1,
"total_pages": 3,
"total_items": 1101,
"items": [ ... ]
}
Each catalog item is a specific variant in a specific production year. A variant produced across several years therefore has multiple items - each with its own id. The mapping key is id (stable, never changes).
{
"id": 15498,
"slug": "mini-aceman-e-2190",
"make": "Mini",
"model": "Aceman",
"version": "E",
"year": 2024,
"parent_model_slug": "mini-aceman",
"brand_id": 125,
"model_id": 704,
"body_type": "suv",
"segment": "jb-small",
"drivetrain": "front",
"charge_port": "ccs",
"price_eur": 34990,
"range_wltp": 310,
"battery_kwh": 42.5,
"power_kw": 135,
"power_hp": 184,
"battery_warranty_years": 8,
"battery_warranty_km": 160000,
"detail_url": "https://nearcharger.sk/..."
}
The version field can be null - some models exist in a single version only (the base model is the variant). In that case the item's identity is make + model + year. Likewise, battery_warranty_years / battery_warranty_km are null when the manufacturer does not publish a warranty.
?brand=mini - slug or numeric ID of a brand or model (from /brands)?year=2024 - a specific production yearEach lookup item has a stable id, an English slug and names in three languages:
{
"id": 87,
"slug": "heat-pump",
"names": { "en": "Heat Pump", "sk": "Tepelné čerpadlo", "cz": "Tepelné čerpadlo" }
}
/brands - brand → model tree. Brands and models are proper names (identical in every language), so instead of the names object they carry a single name field: { "id": 125, "slug": "mini", "name": "Mini", ... }. The aliases field is reserved for alternative spellings (e.g. VW vs. Volkswagen); it is empty in the current version./equipment - equipment grouped into categories (each category has items)./enums - drivetrain (drivetrain), body type (body_type), segment, charge port (charge_port), listing status (listing_status), market (market), EV type (ev_type), listing type (ad_listing_type: new / used / demo vehicle), vehicle state (listing_state: e.g. first-owner, service-book, imported-vehicle, crashed) + canonical color, seats and doors values.You can rely on master data long-term. We guarantee:
schema_version. Any breaking change (a new schema_version) will be announced in advance, and the old version will remain available during a transition period.ETag and Last-Modified. Send If-None-Match - if the content has not changed, you get a 304 Not Modified with no body and save bandwidth.For every partner we can generate a private feed of their published listings on Nearcharger - for example to check what is currently online, or to sync back into your own system. The feed is protected by a static token handed over during onboarding:
GET https://nearcharger.sk/wp-json/nearcharger/v1/partner/{id}/listings?key={token}
Without a valid token the API returns 401. The feed contains only the public listing data (no contact details) and uses the same vehicle structure as your inbound feed:
{
"id": 15498,
"url": "https://nearcharger.sk/inzerat/...",
"title": "Mini Aceman E, 2024",
"status": "active",
"car_version_id": 9876,
"car_version_slug": "mini-aceman-e-2190",
"make": "Mini",
"model": "Aceman",
"version": "E",
"year": 2024,
"price": { "amount": 34990, "currency": "EUR", "vat_deductible": true },
"mileage_km": 12000,
"color": "black",
"vin": "...",
"condition": "used",
"state": ["first-owner", "service-book"],
"equipment": ["heat-pump", "matrix-led"],
"images": { "main": "https://...", "gallery": ["https://...", "https://..."] },
"location": { "lat": 48.1, "lng": 17.1, "city": "Bratislava" }
}
car_version_id is the ID from /catalog - the link to master data. color, condition, state and equipment contain canonical slugs from /enums and /equipment. Pagination and formats work the same as for master data (section A1).
Hybrid vehicles (HEV), plug-in hybrids (PHEV) and hydrogen-powered vehicles are ignored in the current version. Please send us fully electric vehicles only. You therefore do not need to include a "fuel type" field - we assume BEV.
We source vehicle technical data (battery capacity, range, power, body type, etc.) from ev-database.org, which provides up-to-date information on most old and new EV models. Occasionally a specific vehicle may be missing from the catalog (especially less common models, special editions or very old vehicles). In that case we fill in the data from your feed - which is why the recommended fields in section 4 matter.
You do not have to strictly follow the exact field names used in this document. During onboarding we walk through your feed and map your own field names to our structure. What matters is that the data itself is present in some form. Example: your price field can be called price, cena, cena_s_dph or cash_selling_price - we will map it.
| Parameter | Requirement |
|---|---|
| Format | XML (preferred) or JSON |
| Encoding | UTF-8 |
| Availability | Public HTTPS URL, or protected with Basic Auth / Bearer Token |
| Update frequency | At least once a day, ideally 2-4 times a day |
| Structure | Flat - each vehicle as a separate element / object in an array |
| Vehicle type | BEV only - fully electric vehicles |
| Feed size | Recommended limit of 500 vehicles per feed. For larger volumes, contact us in advance. |
If even a single required field is missing, we skip the record and flag it as not imported. Pay attention to every item below.
| # | Field | Type | Description | Example |
|---|---|---|---|---|
| 1 | id |
string | Stable unique identifier of the vehicle in the partner system. Must not change during the lifetime of the listing. | "0300172062" |
| 2 | brand |
string | Vehicle brand | "Škoda" |
| 3 | model |
string | Vehicle model, ideally without the variant (the variant is a separate field below). | "Model Y" |
| 4 | variant |
string | Specific version / trim level. Example split: brand Tesla · model Model Y · variant Long Range AWD. If your system does not distinguish model and variant, send them together in the model field and omit this one. |
"Long Range AWD" |
| 5 | year_of_production |
integer (YYYY) | Production year of the vehicle. For new cars this equals the registration year; for used cars it may differ. | 2023 |
| 6 | price |
integer | Vehicle price including VAT (digits only, no spaces) | 536000 |
| 7 | currency |
string (ISO 4217) | Price currency | "EUR" or "CZK" |
| 8 | vat_deductible |
boolean (0/1) | Whether VAT is deductible | 1 |
| 9 | mileage_km |
integer | Odometer reading in km. 0 for new vehicles. |
55279 |
| 10 | status |
string | Current status. Accepted values: active, available, reserved, sold. |
"active" |
| 11 | photos[] |
array of URLs | At least 1 photo. Public HTTPS URLs. We recommend 10+ photos for better conversion. | ["https://.../1.jpg", "https://.../2.jpg"] |
id must not contain spaces or special characters (allowed: A-Z, a-z, 0-9, dash, underscore)price must be > 0year_of_production must be between 2010 and the current year + 1mileage_km must be ≥ 0photos[] must contain at least 1 reachable HTTPS URL (not HTTP, no hotlink blocking)If you map your vehicles to our catalog (part A, the /master-data/catalog endpoint), additionally include a catalog_id field with the catalog item ID in your feed. The brand, model and variant fields then serve only as a cross-check and the match is unambiguous - no text-based name comparison.
We treat the first photo in the list as the main one (shown in overviews and listing cards). If your system distinguishes a main photo from the gallery, either send the main photo first or mark it with the <photo main="1"> attribute - we accept both.
These fields are not technically required, because we have most of them in the EV Database catalog. Providing them, however, helps us match your vehicle to our catalog correctly and covers the cases where the vehicle is missing from the catalog.
| Field | Type | Why we want it | If you don't provide it |
|---|---|---|---|
vin |
string (17) | The most precise identifier + uniqueness across feeds (dedup) | We fall back to model + variant matching |
engine / powertrain |
string | Factory powertrain / motorization designation (not just battery capacity). Narrows down the exact catalog version, e.g. "Long Range Dual Motor" or "iV 60". | We try to derive it from model and variant |
battery_kwh |
integer/float | Battery capacity in kWh | From the EV Database catalog |
wltp_range_km |
integer | Range per the WLTP cycle | From the EV Database catalog |
power_kw |
integer | Power in kW | From the EV Database catalog |
body_type |
string | Body type (SUV, Hatchback, Sedan, Coupe, Liftback, Combi, MPV, Pickup) |
From the EV Database catalog |
drive |
string | Drivetrain type (FWD, RWD, AWD, 4WD) |
From the EV Database catalog |
seats |
integer | Number of seats | From the EV Database catalog, but it may not always match (the same version can come with 5 or 7 seats), so it is worth providing as well |
We do not have these values in the catalog - they are specific to the individual vehicle. If you have them, send them - they increase the credibility of the listing (especially for used vehicles).
We calculate the battery warranty automatically from the first registration date (typically 8 years or 160,000 km, depending on the manufacturer). So instead of an exact warranty end date, all we need is the registration year and month. We do not need the day.
| Field | Type | Description | Example |
|---|---|---|---|
registration_year |
integer (YYYY) | Year of the vehicle's first registration | 2021 |
registration_month |
integer (1-12) | Month of first registration (needed for a precise warranty calculation) | 5 (= May) |
battery_warranty |
boolean (0/1) | Whether the vehicle has a valid battery warranty | 1 |
battery_warranty_km |
integer | Maximum km covered by the battery warranty (if it differs from the manufacturer default) | 160000 |
If you have a certificate for the SoH measurement (PDF, image), send a link - it significantly increases buyer trust.
| Field | Type | Description | Example |
|---|---|---|---|
soh |
integer (0-100) | Battery State of Health in % (current capacity vs. new) | 94 |
soh_certificate_url |
URL | Link to a PDF / image of the SoH measurement certificate (Aviloo, Moba, manufacturer, etc.) | "https://.../soh-cert.pdf" |
soh_measurement_date |
date (YYYY-MM-DD) | Date the SoH was measured (optional but useful) | "2024-11-15" |
| Field | Type | Description | Example |
|---|---|---|---|
color_exterior |
string | Body color (as text). Ideally a canonical slug from /master-data/enums (e.g. black, pearl-white) - we map free text during onboarding. |
"black metallic" |
color_interior |
string | Interior color / material | "black leather" |
metallic |
boolean (0/1) | Metallic paint | 1 |
| Field | Type | Description | Example |
|---|---|---|---|
branch / location |
string | City / branch where the vehicle is located | "Bratislava" |
address |
string | Full address (optional) | "Pestovateľská 5, Bratislava" |
gps_lat |
float | GPS coordinates - latitude | 48.1486 |
gps_lng |
float | GPS coordinates - longitude | 17.1077 |
Without gps_lat / gps_lng the listing will not appear in location and distance based filtering. If you do not provide coordinates, we attempt to derive them by geocoding the address or city - which is not always accurate. You get the best results by sending the coordinates directly.
| Field | Type | Description | Example |
|---|---|---|---|
price_without_vat |
integer | Price excluding VAT | 442975 |
original_price |
integer | Original price before discount (if the vehicle is discounted) | 580000 |
| Field | Type | Description | Example |
|---|---|---|---|
doors |
integer | Number of doors. We do not have this in the catalog, so it is displayed only if you provide it. | 5 |
description |
string (text) | Free-text vehicle description (may contain HTML break tags) | "Vehicle in certified condition..." |
equipment[] |
array of strings | List of equipment. One item = one entry. Ideally send our slugs from /master-data/equipment (e.g. heat-pump) - we map your own names during onboarding. |
["navigation", "cruise control", "leather seats"] |
condition |
string | We need to know whether the car is new, used or a demo vehicle: new, used, demo |
"used" |
state[] |
array of strings | Vehicle state flags (multiple allowed). Ideally send our slugs from /master-data/enums (listing_state group): e.g. first-owner, service-book, imported-vehicle, crashed - we map free text during onboarding. |
["first-owner", "service-book"] |
<?xml version="1.0" encoding="UTF-8"?>
<feed>
<vehicle>
<id>VIN123456789</id>
<brand>Škoda</brand>
<model>Enyaq</model>
<variant>iV 60</variant>
<year_of_production>2023</year_of_production>
<price>536000</price>
<currency>CZK</currency>
<vat_deductible>1</vat_deductible>
<mileage_km>55279</mileage_km>
<status>active</status>
<photos>
<photo>https://partner.sk/img/123/1.jpg</photo>
<photo>https://partner.sk/img/123/2.jpg</photo>
</photos>
</vehicle>
</feed>
<?xml version="1.0" encoding="UTF-8"?>
<feed>
<vehicle>
<!-- REQUIRED -->
<id>VIN123456789</id>
<brand>Škoda</brand>
<model>Enyaq</model>
<variant>iV 60</variant>
<year_of_production>2023</year_of_production>
<price>536000</price>
<currency>CZK</currency>
<vat_deductible>1</vat_deductible>
<mileage_km>55279</mileage_km>
<status>active</status>
<photos>
<photo>https://partner.sk/img/123/1.jpg</photo>
<photo>https://partner.sk/img/123/2.jpg</photo>
</photos>
<!-- RECOMMENDED (from the catalog) -->
<vin>TMBJB7NY2NF022916</vin>
<engine>iV 60 (RWD)</engine>
<battery_kwh>62</battery_kwh>
<wltp_range_km>412</wltp_range_km>
<power_kw>132</power_kw>
<body_type>SUV</body_type>
<drive>RWD</drive>
<seats>5</seats>
<!-- REGISTRATION + BATTERY WARRANTY -->
<registration_year>2021</registration_year>
<registration_month>5</registration_month>
<battery_warranty>1</battery_warranty>
<battery_warranty_km>160000</battery_warranty_km>
<!-- SOH -->
<soh>94</soh>
<soh_certificate_url>https://partner.sk/cert/123-soh.pdf</soh_certificate_url>
<soh_measurement_date>2024-11-15</soh_measurement_date>
<!-- APPEARANCE -->
<color_exterior>white</color_exterior>
<color_interior>black leather</color_interior>
<metallic>1</metallic>
<!-- LOCATION -->
<branch>Bratislava</branch>
<gps_lat>48.1486</gps_lat>
<gps_lng>17.1077</gps_lng>
<!-- PRICING -->
<price_without_vat>442975</price_without_vat>
<!-- ADDITIONAL -->
<doors>5</doors>
<description><![CDATA[Vehicle in perfect condition, first owner.]]></description>
<condition>used</condition>
<state>
<item>first-owner</item>
<item>service-book</item>
</state>
<equipment>
<item>heat pump</item>
<item>navigation</item>
<item>adaptive cruise control</item>
<item>panoramic roof</item>
</equipment>
</vehicle>
</feed>
{
"feed_version": "1.0",
"generated_at": "2024-12-15T08:00:00Z",
"vehicles": [
{
"id": "VIN123456789",
"brand": "Škoda",
"model": "Enyaq",
"variant": "iV 60",
"year_of_production": 2023,
"price": 536000,
"currency": "CZK",
"vat_deductible": true,
"mileage_km": 55279,
"status": "active",
"photos": [
"https://partner.sk/img/123/1.jpg",
"https://partner.sk/img/123/2.jpg"
],
"vin": "TMBJB7NY2NF022916",
"engine": "iV 60 (RWD)",
"battery_kwh": 62,
"wltp_range_km": 412,
"power_kw": 132,
"body_type": "SUV",
"drive": "RWD",
"seats": 5,
"registration_year": 2021,
"registration_month": 5,
"battery_warranty": true,
"battery_warranty_km": 160000,
"soh": 94,
"soh_certificate_url": "https://partner.sk/cert/123-soh.pdf",
"soh_measurement_date": "2024-11-15",
"color_exterior": "white",
"color_interior": "black leather",
"metallic": true,
"branch": "Bratislava",
"gps_lat": 48.1486,
"gps_lng": 17.1077,
"price_without_vat": 442975,
"doors": 5,
"description": "Vehicle in perfect condition, first owner.",
"condition": "used",
"state": ["first-owner", "service-book"],
"equipment": [
"heat pump",
"navigation",
"adaptive cruise control",
"panoramic roof"
]
}
]
}
idstatus field contains one of: active / sold / reserved / availableyear_of_production field is filled in (production year)Can we also send vehicle types other than BEV (e.g. hybrids)?
We currently support fully electric vehicles (BEV) only. If your feed contains other types, you can leave them in - we ignore them. Or send us a separate EV-only feed.
What if we don't have some of the recommended fields?
No problem - we fill those fields in from the EV Database catalog based on brand + model + variant. The more data you provide, the more precise the matching and the higher the chance we identify the vehicle correctly.
What happens if our vehicle is not in EV Database?
In that case we rely exclusively on the data from your feed. The recommended fields (battery_kwh, wltp_range_km, power_kw, body_type, drive) then become critical - without them we cannot display complete technical information. For less common models, be sure to include them.
Do we have to use your exact field names?
No. Our integration supports mapping your own field names to our structure. During onboarding we walk through your feed and set up the mapping. What matters is that the data itself is present in some form.
How often are changes imported?
Once a day by default. On request we can set up more frequent imports (2-4 times a day) or real-time webhooks.
What happens when we sell a vehicle?
Simply remove it from the feed or set its status to sold. We reflect it automatically within 48 hours (a grace period that protects against accidental feed outages).
Can we send vehicles from multiple branches in a single feed?
Yes. Use the branch / location field to distinguish branches.
What is the maximum feed size you can handle?
The currently recommended limit is up to 500 vehicles per feed. For higher volumes (over 500), please contact us in advance - we will either agree on a split into multiple feed files (e.g. by branch or model), or set up a dedicated batch import. This limit reflects what we can handle reliably without risking outages.
Do you host the photos yourself, or pull them from our servers on every page view?
We download them to our side (Cloudflare R2) and serve them from our own CDN. You only need to make sure the photo URLs are reachable at import time and that the photos do not have hotlink protection enabled.
Can we change the feed structure after implementation?
Yes, but please notify us at least 7 days before the change. Otherwise the import may fail and your listings would be left with stale data.
Why do you need the registration year and month separately?
We calculate the battery warranty automatically from the first registration date. So instead of an exact warranty end date (which varies across manufacturers), we only need the registration year and month. From these we compute the exact warranty end date ourselves, following the given manufacturer's rules.
Why don't you need a fuel type / transmission type field?
We currently support BEV (battery-electric) vehicles only, which always have an electric motor and an automatic transmission. You therefore do not need to provide these fields - we add the values automatically.
For self-service feed validation before submission, we provide machine-readable definitions of the listing template (part B):
| File | Description |
|---|---|
JSON Schema (draft 2020-12) for the JSON feed - validate your feed with e.g. ajv or an online validator |
|
XSD schema for the XML feed - validate with xmllint --schema or any XML tool |
The schemas validate the structure and types of both required and optional fields. They do not enforce exact field names - as noted in section 1, we map your own field names during onboarding. Using the schema names, however, makes the integration fastest.