Nearcharger is an electric vehicle marketplace in Slovakia and Czechia. This document explains how to send us your vehicle inventory as a feed and what data we provide to help you. You do not need to read all of it: pick what you are working on.
What the feed must contain, what it looks like and what to check before sending.
A1 to A3 I am mapping to your catalogStable IDs for vehicles, brands, equipment and value lists.
A6 I am checking what was importedStatus and reason for every vehicle you sent.
A5 I am downloading my listingsA feed of your published listings for checks or synchronisation.
How onboarding works
- Map to our catalogOptional but the most reliable: store our vehicle IDs and value list slugs (A1 to A3).
- Build the feedFollowing part 1. Validate it with the schema and compare it with the examples (section 9).
- Send us the URLWe set up the download, map your own structure if needed, and hand over your token.
- Check the resultThe reconciliation feed shows for every vehicle whether it is published and, if not, why (A6).
Part 1 Your feed for Nearcharger What you send us: structure, fields, examples and checks
1. Before you start
We do not filter out hybrids, plug-in hybrids or hydrogen vehicles automatically: a feed in this format has no fuel field, so every vehicle in it would be published. If your export also contains other powertrains, send us a separate feed with electric vehicles only, or tell us during onboarding which of your fields carries the fuel type and we will filter on it.
Your own field names are fine. If you use the names from this document, the mapping already exists and we connect your feed the day we receive its URL. If you have your own structure, we map your field names and values during onboarding. What matters is that the data is in the feed.
Technical data comes from our catalog. Once a vehicle is matched to an entry in our catalog (based on ev-database.org), we fill in the technical data it is missing. A vehicle that is not in the catalog shows only the data from your feed.
2. Technical requirements
| Parameter | Requirement |
|---|---|
| Format | JSON (preferred) or XML, encoded in UTF-8 |
| Structure | A list of vehicles: JSON {"vehicles": [ ... ]}, XML <feed><vehicle>... |
| Access | A URL that we download. HTTPS recommended, HTTP accepted. Optionally protected with Basic Auth or a Bearer token. |
| How often we download | Once a day (default), or by agreement twice a day or hourly. The URL should always return the current state. |
| Size | At most 500 vehicles and 64 MB per feed, response within 60 seconds. Split a larger inventory into several feeds, for example by branch. |
3. Feed fields
Only three things are a hard requirement for the import: an identifier, the vehicle identity and a price. Other fields never block a listing, but without them it lacks something. Click a section to see the details.
| Group | Fields | Section |
|---|---|---|
| Required | id brand + model or catalog_id price | 3.1 |
| Needed | photos status variant mileage_km year_of_production vat_deductible currency | 3.2 |
| Technical data | catalog_id vin engine battery_kwh wltp_range_km power_kw body_type drive seats | 4 |
| Registration and warranty | registration_year registration_month manufacture_month battery_warranty_km | 5.1 |
| Battery | soh soh_certificate_url soh_measurement_date | 5.2 |
| Appearance and leasing | color_exterior metallic continuation_of_leasing | 5.3 |
| Location and contact | branch address gps_lat gps_lng contact_phone contact_email | 5.4 |
| Listing content | title description condition state doors equipment equipment_unmapped price_without_vat | 5.5 |
3.1 Required: without these fields no listing is created
| Field | Type | Description | Example |
|---|---|---|---|
id |
string | A stable identifier of the vehicle in your system, used to find the vehicle on every run. Any format works, but it must never change. A changed id is a new vehicle to us: with the same VIN we reject it as a duplicate and hide the original listing, without a VIN a second listing is created. Either way the listing loses its history. |
"0300172062" |
brand |
string | Brand. Together with model it forms the vehicle identity; catalog_id can replace both. |
"Škoda" |
model |
string | Model, ideally without the version (that belongs in variant). |
"Enyaq" |
price |
number | Price including VAT, a number only, greater than zero. | 21900 |
If you map your vehicles to our catalog (A2), send a catalog_id field with the catalog entry's id. It is the most reliable match: the record is accepted even without names and is matched to exactly that entry. If you also send names, we use them to build the title. A catalog_id that is not in the catalog is ignored and we match by name instead.
3.2 Needed: without these the listing lacks something
We would rather publish an incomplete listing than none, so a missing field is never reported as an error. Each field says what the listing loses.
| Field | Type | What happens if you leave it out | Example |
|---|---|---|---|
photos[] |
array of URLs | The listing has no image. The first photo is the main one. We take up to 30 photos and recommend at least 10. | ["https://.../1.jpg"] |
status |
string | The vehicle is treated as available. Values: active or available (for sale), reserved (shown as available for now), sold, hidden (withdrawn). With sold and hidden we hide the listing right away and keep it as history. Any other value counts as available, so never mark a sold car as, say, inactive. |
"active" |
variant |
string | We find the catalog version far less often and the listing waits for manual matching, without catalog data until then. If you do not separate model and version, send them together in model. |
"iV 60" |
mileage_km |
integer | The listing does not appear in the mileage filter. Send 0 for a new vehicle. |
55279 |
year_of_production |
integer | The listing does not appear in the year filter. Year of manufacture, not registration. | 2021 |
vat_deductible |
boolean | The listing does not show VAT deduction and we cannot compute the net price. | true |
currency |
string | We derive the currency from the feed's market (SK EUR, CZ CZK). Send it anyway: it is the only way we catch prices in the other market's currency (such a record is rejected). |
"EUR" |
3.3 Checks: what happens on an error
We would rather drop a bad value than lose the whole vehicle. A record is rejected only in the first six cases; the reconciliation feed then shows it as error with a code (A6.2).
| Field | What we check | On failure |
|---|---|---|
id | Present. | Not imported (validation) |
| vehicle identity | brand and model, or a valid catalog_id. | Not imported (validation) |
price | Greater than 0. | Not imported (validation) |
currency | Not the other market's currency. An unknown currency passes. | Not imported (validation) |
vin | The same VIN is not already on Nearcharger under another record. | Not imported (duplicate_vin) |
| number of vehicles | At most 500 per feed and no more than your programme holds. | Vehicles at the end of the feed are not imported (limit_exceeded) |
vin | 17 characters without the letters I, O and Q. | VIN dropped |
year_of_production, registration_year | From 2010 to next year. | Year dropped |
manufacture_month, registration_month | 1 to 12. | Month dropped |
mileage_km | 0 or more. | Mileage dropped |
seats, doors | Seats 2 to 8, doors 2 to 5. | Value dropped |
gps_lat, gps_lng | Both present, not 0/0, a point in Central Europe. | We locate the vehicle from its address (5.4) |
| yes / no fields | true/false, 1/0, yes/no. | Value dropped |
| value list fields | condition, state, equipment, body_type, drive, color_exterior: a slug from A3 or a value mapped during onboarding. | Value dropped and flagged for us; once we add the translation, the next run fills it in |
status | One of the values in 3.2. | Vehicle treated as available |
photos[] | Public image URLs, at most 30. | A photo we cannot download is skipped (A6.3) |
4. Technical data
Our catalog has most of this data. It still helps us match the vehicle to the catalog, and for a vehicle outside the catalog it is the only source. Data about the specific vehicle (capacity, range, power, seats) takes precedence over the catalog; for body type and drivetrain the catalog wins and your value is a fallback.
| Field | Type | Description | If you leave it out |
|---|---|---|---|
catalog_id | integer | Catalog entry ID (A2), replaces brand and model (3.1). | We match by name. |
vin | string (17) | The VIN tells us that someone else already offers the same car, and helps us find your existing listings when you switch to a feed. | Duplicates go undetected. |
engine | string | Powertrain designation, for example "iV 60 (RWD)". Used only when variant is missing. | Nothing, if you send variant. |
battery_kwh | number | Gross battery capacity in kWh. | From the catalog, once matched. |
wltp_range_km | integer | WLTP range in km. | From the catalog, once matched. |
power_kw | number | Power in kW. | From the catalog, once matched. |
body_type | string | Body type, a slug from the body_type group (suv, hatchback, sedan, station-estate...). | From the catalog; your value applies only when the catalog has none. |
drive | string | Drivetrain, a slug from the drivetrain group: front, rear, awd. FWD, RWD, AWD and 4WD are accepted too. | From the catalog; your value applies only when the catalog has none. |
seats | integer | Number of seats (2 to 8). | From the catalog, which may be wrong for versions built with 5 or 7 seats. |
5. Vehicle details
The catalog does not have this data because it belongs to the individual vehicle. For a used car it makes a big difference to buyer trust.
5.1 Registration and battery warranty
We calculate the remaining battery warranty ourselves: from the first registration we count down the warranty years of the matched catalog version. So we do not need the warranty end date, only the registration year and month.
| Field | Type | Description | Example |
|---|---|---|---|
registration_year | integer | Year of first registration. | 2021 |
registration_month | integer | Month of first registration (1 to 12). Without it we cannot compute the remaining warranty in years. | 5 |
manufacture_month | integer | Month of manufacture (1 to 12). The year of manufacture is year_of_production. | 3 |
battery_warranty_km | integer | Battery warranty mileage limit, when it differs from the catalog for this vehicle. | 160000 |
5.2 Battery state of health (SoH)
For a used electric car, SoH is one of the most important figures. If you have a certificate for the measurement, send its link and we attach it to the listing.
| Field | Type | Description | Example |
|---|---|---|---|
soh | number | Battery state of health in percent (0 to 100), decimals are fine. | 94.5 |
soh_certificate_url | URL | Link to the measurement certificate (PDF or image, for example Aviloo or Moba). | "https://.../soh.pdf" |
soh_measurement_date | date | Measurement date (YYYY-MM-DD). We store it but do not show it on the listing yet. | "2026-08-15" |
5.3 Appearance and leasing
| Field | Type | Description | Example |
|---|---|---|---|
color_exterior | string | Body colour: a slug from the color group, or its Slovak, Czech or English name (black, Čierna, Černá, Black). Send metallic paint separately, not in the colour name. | "black" |
metallic | boolean | Metallic paint. | true |
continuation_of_leasing | boolean | The buyer can take over the leasing. | false |
5.4 Location and branch contact
More than one branch? Send each vehicle's city, coordinates and contact. Otherwise every vehicle gets the address and number from your partner profile and buyers call the wrong branch.
| Field | Type | Description | Example |
|---|---|---|---|
branch | string | City where the vehicle is (a field named location works too). Shown as the city, so no company name here. | "Bratislava" |
address | string | Full address. We use it to locate the vehicle when coordinates are missing. | "Pestovateľská 5, Bratislava" |
gps_lat, gps_lng | number | Coordinates. Without a location the listing does not appear in distance search; a location derived from the address may be imprecise. Do not send a placeholder such as 0. | 48.1486, 17.1077 |
contact_phone | string | Phone of the branch. Without it we use the phone from your profile. | "+421 900 123 456" |
contact_email | string | Branch email, where listing enquiries go. Without it we use the email from your profile. | "ba@yourdomain.sk" |
5.5 Listing content
| Field | Type | Description | Example |
|---|---|---|---|
title | string | Listing title as plain text (HTML tags are stripped). When missing, we build it from brand, model and version, for example Škoda Enyaq iV 60. Whenever the vehicle changes, we set it from the feed. | "Škoda Enyaq iV 60, first owner" |
description | string | Free text. We keep <br>, <p>, <strong>, <b>, <em>, <i>, <ul>, <ol>, <li>, <h3> and <h4>; other tags, attributes and links are removed. Plain text with line breaks works too. | "First owner..." |
condition | string | A slug from the ad_listing_type group: new, used or used-demo-car (demo is accepted too). | "used" |
state[] | array | Vehicle state flags, slugs from the listing_state group, for example first-owner, service-book, imported-vehicle, crashed. | ["first-owner"] |
doors | integer | Number of doors (2 to 5). The catalog does not have it, so we show it only from your feed. | 5 |
equipment[] | array | Equipment as slugs from /equipment, one item per element. We map your own names during onboarding. | ["heat-pump"] |
equipment_unmapped[] | array | Equipment you could not match to our list, as text. We review it and map it or add it; the next run then shows it on the listing. | ["CD player"] |
price_without_vat | number | Optional: with vat_deductible: true we compute the net price from the market's VAT rate. We use your value only as a check (warning price_net_equals_gross, A6.3). | 17805 |
6. Examples
A full JSON record with every field. The same vehicle in XML is below; downloadable example feeds are in section 9.
{
"feed_version": "1.0",
"generated_at": "2026-09-23T04:00:00Z",
"vehicles": [
{
"id": "SK-2021-0457",
"brand": "Škoda",
"model": "Enyaq",
"price": 21900,
"photos": [
"https://partner.sk/img/0457/1.jpg",
"https://partner.sk/img/0457/2.jpg"
],
"status": "active",
"variant": "iV 60",
"mileage_km": 55279,
"year_of_production": 2021,
"vat_deductible": true,
"currency": "EUR",
"catalog_id": 14914,
"vin": "TMBJB7NY2NF022916",
"engine": "iV 60 (RWD)",
"battery_kwh": 62,
"wltp_range_km": 413,
"power_kw": 132,
"body_type": "suv",
"drive": "rear",
"seats": 5,
"registration_year": 2021,
"registration_month": 5,
"manufacture_month": 3,
"battery_warranty_km": 160000,
"soh": 94,
"soh_certificate_url": "https://partner.sk/cert/0457-soh.pdf",
"soh_measurement_date": "2026-08-15",
"color_exterior": "white",
"metallic": true,
"continuation_of_leasing": false,
"branch": "Bratislava",
"address": "Pestovateľská 5, Bratislava",
"gps_lat": 48.1486,
"gps_lng": 17.1077,
"contact_phone": "+421 900 123 456",
"contact_email": "bratislava@partner.sk",
"title": "Škoda Enyaq iV 60, heat pump, first owner",
"description": "Vehicle in perfect condition, first owner.",
"condition": "used",
"state": ["first-owner", "service-book"],
"doors": 5,
"equipment": ["heat-pump", "navigation", "adaptive-cruise-control", "panoramic-roof"],
"equipment_unmapped": ["side airbags"],
"price_without_vat": 17805
}
]
}
XML - the same vehicle with every field
<?xml version="1.0" encoding="UTF-8"?>
<feed>
<vehicle>
<!-- 3.1 REQUIRED -->
<id>SK-2021-0457</id>
<brand>Škoda</brand>
<model>Enyaq</model>
<price>21900</price>
<!-- 3.2 NEEDED -->
<photos>
<photo>https://partner.sk/img/0457/1.jpg</photo>
<photo>https://partner.sk/img/0457/2.jpg</photo>
</photos>
<status>active</status>
<variant>iV 60</variant>
<mileage_km>55279</mileage_km>
<year_of_production>2021</year_of_production>
<vat_deductible>1</vat_deductible>
<currency>EUR</currency>
<!-- 4 TECHNICAL DATA -->
<catalog_id>14914</catalog_id>
<vin>TMBJB7NY2NF022916</vin>
<engine>iV 60 (RWD)</engine>
<battery_kwh>62</battery_kwh>
<wltp_range_km>413</wltp_range_km>
<power_kw>132</power_kw>
<body_type>suv</body_type>
<drive>rear</drive>
<seats>5</seats>
<!-- 5.1 REGISTRATION AND WARRANTY -->
<registration_year>2021</registration_year>
<registration_month>5</registration_month>
<manufacture_month>3</manufacture_month>
<battery_warranty_km>160000</battery_warranty_km>
<!-- 5.2 BATTERY -->
<soh>94</soh>
<soh_certificate_url>https://partner.sk/cert/0457-soh.pdf</soh_certificate_url>
<soh_measurement_date>2026-08-15</soh_measurement_date>
<!-- 5.3 APPEARANCE AND LEASING -->
<color_exterior>white</color_exterior>
<metallic>1</metallic>
<continuation_of_leasing>0</continuation_of_leasing>
<!-- 5.4 LOCATION AND CONTACT -->
<branch>Bratislava</branch>
<address>Pestovateľská 5, Bratislava</address>
<gps_lat>48.1486</gps_lat>
<gps_lng>17.1077</gps_lng>
<contact_phone>+421 900 123 456</contact_phone>
<contact_email>bratislava@partner.sk</contact_email>
<!-- 5.5 LISTING CONTENT -->
<title>Škoda Enyaq iV 60, heat pump, first owner</title>
<description><![CDATA[Vehicle in perfect condition, first owner.]]></description>
<condition>used</condition>
<state>
<item>first-owner</item>
<item>service-book</item>
</state>
<doors>5</doors>
<equipment>
<item>heat-pump</item>
<item>navigation</item>
<item>adaptive-cruise-control</item>
<item>panoramic-roof</item>
</equipment>
<equipment_unmapped>
<item>side airbags</item>
</equipment_unmapped>
<price_without_vat>17805</price_without_vat>
</vehicle>
</feed>
XML - recommended minimum
<?xml version="1.0" encoding="UTF-8"?>
<feed>
<vehicle>
<id>SK-2021-0457</id>
<brand>Škoda</brand>
<model>Enyaq</model>
<price>21900</price>
<photos>
<photo>https://partner.sk/img/0457/1.jpg</photo>
<photo>https://partner.sk/img/0457/2.jpg</photo>
</photos>
<status>active</status>
<variant>iV 60</variant>
<mileage_km>55279</mileage_km>
<year_of_production>2021</year_of_production>
<vat_deductible>1</vat_deductible>
<currency>EUR</currency>
</vehicle>
</feed>
7. Checklist before sending
Without these a vehicle is not imported
- The feed is at a URL, in JSON or XML, encoded in UTF-8
- Every vehicle has a stable
idthat never changes - Every vehicle has
brandandmodel, orcatalog_id - Every vehicle has a price including VAT above zero, in its market's currency
- The feed has at most 500 vehicles
Without these the listing is wrong or incomplete
- The feed contains electric vehicles only
- Sold vehicles have
status: sold, or are left out of the feed - Every vehicle has at least one public photo and the main one comes first
variant,mileage_km,year_of_productionandvat_deductibleare filled in- Value list fields use slugs from the master data and unmatched equipment is in
equipment_unmapped
8. FAQ
Can we send hybrids or combustion cars too?
No. Nearcharger is for fully electric vehicles only and we do not filter others out automatically (section 1). Send a separate feed with electric vehicles only, or tell us which of your fields carries the fuel type and we will filter on it. Do not send fuel or transmission fields for electric vehicles.
What happens when we sell a vehicle?
Set status to sold or leave the vehicle out of the feed; we hide the listing on the next run. If one run would hide an unusually large share of your vehicles at once (more than 5 and more than 10 %), we treat it as a probable feed error: that run hides nothing and our team is alerted. The vehicles stay published until we resolve it.
How do we withdraw all vehicles from Nearcharger at once?
Send an empty list in JSON: {"vehicles": []}. The first empty run does not hide anything (an empty file is often a mistake); the reconciliation feed shows skipped and the time the listings will be hidden. If the feed is still empty after about 20 hours, we hide them. An XML feed without vehicles is always treated as an outage, so in XML withdraw vehicles through status.
How do we find out which vehicles were imported and why some were not?
From the reconciliation feed (A6): one row for every vehicle you sent, with our listing ID, URL, status and, for rejected ones, the reason. It is live, so you can check it right after a run.
What if we do not have some of the technical data?
Once the vehicle is matched to the catalog, we fill it in from there. A vehicle outside the catalog shows only the data from your feed, so for less common models please send it.
We have more than 500 vehicles.
Split your inventory into several feeds, for example by branch or brand. We connect each one separately.
Do you load photos from our server on every page view?
No. We download them during import and serve them from our own storage. The URLs must be reachable at import time and free of hotlink protection. We tell photos apart by URL, so publish an edited photo under a new URL.
Can we change the feed structure after launch?
Yes, but let us know at least 7 days in advance. Otherwise the import may fail and your listings stay out of date.
9. Downloads
| File | Purpose |
|---|---|
JSON Schema (draft 2020-12) to validate a JSON feed, for example with ajv. | |
XSD to validate an XML feed, for example xmllint --schema listing-template.xsd feed.xml. | |
| Example feed for the Slovak market (EUR), 5 vehicles including a record with the minimum fields. | |
| Example feed for the Czech market (CZK), 3 vehicles including a sold one. |
Together the two examples contain every field from part 1 and pass our import without a warning. The schemas check structure and types; what the import actually rejects is in 3.3.
Part 2 Our data for you (API) Catalog and value lists for mapping, your listings feed and the reconciliation feed
A1. Master data: overview and formats
Master data is a public export of our catalog and value lists: brands, models, versions per production year, equipment, colours and more, each with a stable ID and slug. Store them as your mapping key and send our values in the feed instead of free text. No token is needed.
GET https://nearcharger.sk/wp-json/nearcharger/v1/master-data
| Endpoint | Content |
|---|---|
/master-data | Index: schema_version and a list of feeds with URL, formats and generation time |
/master-data/catalog | Vehicle catalog (A2), paginated, filters ?brand= and ?year= |
/master-data/brands | Brands and their models with IDs, slugs and aliases (A3) |
/master-data/equipment | Equipment in categories (A3) |
/master-data/enums | Other value lists: drivetrain, body type, segment, charge port, listing status, market, EV type, listing type, vehicle state, colours, seats, doors (A3) |
- Format:
?format=json(default) or?format=xml, or the headerAccept: application/xml. Format, filters and pagination can be combined, for example?brand=mini&year=2024&format=xml. - Pagination (
/catalog, A5, A6):?page=and?per_page=, 100 by default, at most 500 items per page. - Envelope: paginated responses carry
schema_version,generated_at,page,total_pages,total_itemsanditems./brands,/equipmentand/enumsreturn everything at once, with justschema_version,generated_atanditems.
{
"schema_version": 1,
"generated_at": "2026-09-23T03:30:04+00:00",
"page": 1,
"total_pages": 3,
"total_items": 1101,
"items": [ ... ]
}
A2. Vehicle catalog (/catalog)
A catalog entry is one version in one production year, so a version built over several years has several entries. The mapping key is id; it never changes and you send it in the feed as catalog_id.
{
"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": "type-2",
"ev_type": "bev",
"price_eur": 34990,
"range_wltp": 310,
"battery_kwh": 42.5,
"battery_kwh_usable": 40.7,
"power_kw": 135,
"power_hp": 184,
"battery_warranty_years": 8,
"battery_warranty_km": 160000,
"seats": 5,
"detail_url": "https://nearcharger.sk/..."
}
versionisnullfor models with a single version; the identity is thenmake + model + year. Battery warranty isnullwhen the manufacturer does not state it.battery_kwhis gross capacity (the same way we accept it in the feed),battery_kwh_usablethe usable capacity.body_type,segment,drivetrain,charge_portandev_typeare slugs from/enums.seatsis the catalog seat count. The same version is built with 5 or 7 seats, so send the actual count in your feed; your value takes precedence.
Filters: ?brand= takes a brand or model slug or ID exactly as in /brands (for example mini, 125, aceman or 704), ?year= a production year. Filters apply together and total_items reflects the filtered result. An unknown slug returns an empty list.
GET https://nearcharger.sk/wp-json/nearcharger/v1/master-data/catalog?brand=mini&year=2024
A3. Value lists (/brands, /equipment, /enums)
A value list item has a stable id, an English slug and names in three languages (cz is Czech). Send the slug in your feed: it is the same in every language.
{
"id": 87,
"slug": "heat-pump",
"names": { "en": "Heat Pump", "sk": "Tepelné čerpadlo", "cz": "Tepelné čerpadlo" }
}
| Endpoint | Content |
|---|---|
/brands | Brands with their models. They have a single name instead of names because they are proper names: { "id": 125, "slug": "mini", "name": "Mini", "aliases": [...], "models": [...] }. aliases are other spellings of the same brand or model (for example vw), including those our import learned from partner feeds (lower case, no diacritics). Treat them as equal to name when mapping. |
/equipment | Equipment categories, each with id, slug, names and a list of items. |
/enums | An object keyed by value list: drivetrain, body_type, segment, charge_port, listing_status, market, ev_type, ad_listing_type (new, used, used-demo-car), listing_state (first-owner, service-book, ...) and color. seats and doors are plain number lists: [2 ... 8] and [2, 3, 4, 5]. |
If this document and an endpoint disagree on a value, the endpoint wins.
A4. Stability, updates and limits
- IDs and slugs never change and are never reused, so you can store them as permanent keys.
- Fields and value list items are only ever added, never renamed or removed. Ignore unknown fields.
- Every response carries
schema_version(currently1). We would announce an incompatible change in advance and keep the old version available for a transition period.
- Updates: master data and the listings feed are generated once a night, around 03:30 UTC. One pull a day is enough, ideally after 04:00 UTC.
- Caching: responses carry
ETagandLast-Modified. Send theETagback inIf-None-Matchand an unchanged response returns304 Not Modifiedwithout a body. - Limits per IP address: 60 requests per minute across all master data endpoints, 30 per minute across the listings and reconciliation feeds. Above the limit you get
429.
A5. Your listings feed (token)
A private feed of your published listings, for example to check what is online or to sync into your system. It is protected by the token you receive at onboarding. Hidden listings are not in it; the reconciliation feed (A6) covers those. Formats and pagination as in A1.
GET https://nearcharger.sk/wp-json/nearcharger/v1/partner/{id}/listings?key={token}
It is our internal format (the import accepts it back too), so the field names differ from the feed you send us: make, version, year, car_version_id, price as a price object, range_wltp, drivetrain, color, metallization, images, location and contact. Here id is our listing ID; your id is source_id.
| Field | Meaning |
|---|---|
id, url | Our listing ID and its public page. |
source_id | Your id from the feed, the same key as in the reconciliation feed. null for a listing entered manually. |
status | active, reserved or sold. |
updated_at | When the nightly build last detected a change to the listing (UTC). It is not a filter: download everything and compare the time per id. If every listing gets a new time at once, simply process them all again. |
car_version_id, car_version_slug | The matched catalog entry, null until matched. |
soh, battery_kwh, range_wltp, power_kw | Values of the specific vehicle, not the catalog nominal. |
images | main is the main photo, gallery the others; the main photo is not repeated in the gallery. |
contact | Branch phone and email from the listing page. name and address are usually null. |
Value list fields (color, condition, state, equipment, body_type, drivetrain, ev_type, market) contain slugs from A3; empty fields are null. The response carries Cache-Control: private, no-store, but a conditional request with If-None-Match still works and the token is verified before any 304.
Example listings feed item
{
"id": 58153,
"source_id": "BMWSK-000123",
"url": "https://nearcharger.sk/inzerat/...",
"title": "Mini Aceman E, 2024",
"description": "Vehicle in perfect condition, first owner, service book.",
"status": "active",
"market": "sk",
"updated_at": "2026-09-22T03:30:11+00:00",
"car_version_id": 15498,
"car_version_slug": "mini-aceman-e-2190",
"make": "Mini",
"model": "Aceman",
"version": "E",
"year": 2024,
"manufacture_month": 1,
"registration_year": 2024,
"registration_month": 3,
"price": { "amount": 34990, "currency": "EUR", "vat_deductible": true },
"mileage_km": 12000,
"soh": 95.9,
"soh_certificate_url": "https://nearcharger.sk/wp-content/uploads/soh-certificate.pdf",
"soh_measurement_date": "2026-08-14",
"battery_kwh": 42.5,
"range_wltp": 310,
"battery_warranty_years": 8,
"battery_warranty_km": 160000,
"power_kw": 135,
"body_type": "suv",
"drivetrain": "front",
"ev_type": "bev",
"seats": 5,
"color": "black",
"doors": 5,
"metallization": true,
"continuation_of_leasing": false,
"vin": "WMW21GF0XR2V15498",
"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", "address": "Tuhovská 5, 831 07 Bratislava" },
"contact": { "phone": "+421 900 123 456", "email": "sales@yourdomain.sk", "name": null, "address": null }
}
A6. Reconciliation feed: what happened to each vehicle (token)
One row for every vehicle you sent us, keyed on your id: our listing ID, URL, status and, for a vehicle that stayed out, the reason. It is not a nightly snapshot but the state right after the latest import run, so checking it once after each run is enough.
GET https://nearcharger.sk/wp-json/nearcharger/v1/partner/{id}/reconciliation?key={token}
Same token, formats and pagination as the listings feed. In XML the root is <reconciliation>, rows are <items><item> and feeds <feeds><feed>. Caching works only through a content ETag (no Last-Modified). Until your feed is set up, the payload is empty (items: [], generated_at: null).
Example reconciliation feed response
{
"schema_version": 1,
"generated_at": "2026-09-23T04:05:12Z",
"partner_id": 29540,
"feeds": [
{
"feed_id": 12,
"name": "MINI Slovakia",
"market": "sk",
"is_active": true,
"last_sync_at": "2026-09-23T04:00:00Z",
"last_sync_status": "ok",
"last_sync_message": "",
"listings": { "live": 3, "sold": 1, "orphaned": 0, "error": 1, "over_cap": 0 }
}
],
"summary": { "error": 1, "sold": 1, "unmatched": 1, "published": 2 },
"page": 1,
"total_pages": 1,
"total_items": 5,
"items": [
{
"source_id": "MINI-SK-000101",
"vin": "WMW11DJ0XP2R00101",
"status": "published",
"our_post_id": 58153,
"url": "https://nearcharger.sk/inzerat/mini-cooper-se-2024/",
"error_code": "",
"error_message": "",
"photos_sent": 12,
"photos_imported": 12,
"warnings": [],
"car_version_id": 15344,
"match_method": "catalog_id",
"match_score": 1,
"adopted_at": null,
"sold_at": null,
"orphaned_at": null,
"last_seen_in_feed": "2026-09-23T04:00:41Z",
"last_changed": "2026-09-21T04:00:37Z",
"last_synced": "2026-09-23T04:00:41Z"
},
{
"source_id": "MINI-SK-000105",
"vin": "WMW11DJ0XP2R00105",
"status": "error",
"our_post_id": null,
"url": null,
"error_code": "validation",
"error_message": "missing_required: price.amount",
"photos_sent": null,
"photos_imported": null,
"warnings": [],
"car_version_id": null,
"match_method": "none",
"match_score": null,
"adopted_at": null,
"sold_at": null,
"orphaned_at": null,
"last_seen_in_feed": "2026-09-23T04:00:41Z",
"last_changed": null,
"last_synced": "2026-09-23T04:00:41Z"
}
]
}
A6.1 Statuses
Exactly one status per row; the first that applies wins (top to bottom).
| Status | Meaning | What to do |
|---|---|---|
error | The record was not imported, or its listing was hidden because the record stopped being importable. | Fix it using error_code and error_message (A6.2). We retry on the next run in which your feed changed. |
over_cap | The listing exists and we keep it updated, but it is not visible because all places in your programme are taken. | It is published automatically once a place frees up. A new vehicle with no free place gets error with limit_exceeded instead. |
sold | You sent status: sold. The listing is hidden and kept as history. | Nothing. If you send the vehicle as available again, it is republished. |
orphaned | The vehicle disappeared from your feed or has status: hidden. The listing is hidden, not deleted. | Nothing, if it was sold. Once the vehicle is back in the feed, it is republished. |
adopted | We linked the record to a listing you had on Nearcharger before the feed. Reported for the run in which it happened. | Nothing. From now on the feed manages that listing. |
unmatched | The listing is live but not matched to the catalog, so it only has the data from your feed. | Send catalog_id or a more precise variant. Our team works on matching too. |
updated | The listing is live and the latest run updated it. | Nothing. |
published | The listing is live and unchanged. | Nothing. |
A6.2 Error codes
| error_code | Meaning |
|---|---|
validation | Something from 3.1 is missing (id, vehicle identity, price) or the price is in the other market's currency. The message names the field. |
duplicate_vin | A vehicle with the same VIN is already on Nearcharger: under another id in your feed, from another feed or from another seller. The message gives that id, or the title and ID of the existing listing. |
limit_exceeded | The vehicle did not fit into the feed limit (at most 500) or your programme. We import in feed order, so the vehicles at the end stay out. |
import_failed | A technical failure on our side. We see it too. |
unmapped_value | A required field has a value we cannot translate. It does not happen for ordinary fields: an unknown value is simply dropped (3.3). |
A6.3 Warnings
A warning never changes the status; it only tells you what the listing is missing.
| warning | Meaning | What to do |
|---|---|---|
photos_unavailable | Not a single photo could be downloaded. | Check that the URLs are public, without login or hotlink protection. We retry when the set of photos changes. |
photos_incomplete | Some photos failed even on the third attempt (photos above 30 do not count). | Compare photos_sent with photos_imported. |
price_net_equals_gross | With VAT deduction, price and price_without_vat are equal. We show price as the price including VAT. | Send price including VAT; you can leave price_without_vat out. |
A6.4 Row fields and feed status
| Field | Meaning |
|---|---|
source_id | Your id from the feed, the row key. |
vin | The VIN after our normalisation (upper case, no spaces), empty if you did not send one. |
our_post_id, url | Our listing ID and URL, null until the listing exists. |
error_code, error_message | For error: the code (A6.2) and a short technical text naming the field or the conflicting listing. |
photos_sent, photos_imported | How many photos you sent and how many the listing shows. photos_imported is null while photos are still downloading; for a record that was never imported both are null. |
warnings | Codes from A6.3, an empty list when there is nothing to report. |
car_version_id, match_method, match_score | Catalog matching. match_method: catalog_id (you sent it), exact (by name and data), manual (by a rule confirmed by our team), adopted (adopted listing), fuzzy (we have a candidate, not yet confirmed) or none (no similar vehicle found). match_score is the confidence from 0 to 1. |
adopted_at, sold_at, orphaned_at | When the row entered that status; sold_at and orphaned_at only while it is in it. |
last_seen_in_feed, last_changed, last_synced | When we last saw the record in your feed, when its content changed and when the row was written (UTC). |
summary | Row counts per status, non-zero only. |
feeds[] | The state of each of your feeds, see below. |
Some things stop a run before the first vehicle is written, so no row carries them. You see them in feeds[].last_sync_status, and last_sync_message gives the reason:
failed: the feed could not be downloaded or read, or it has no vehicle list. We treat it as an outage and hide nothing.skipped: your account is not yet switched to feed management, the subscription is cancelled, your programme has no free place for the feed, your listing credit does not cover the vehicles the run would publish (live ones count too), or the feed arrived empty.unchanged: the feed is identical to the previous run, nothing was rewritten.ok: the run went through. Vehicles are processed in batches, so rows may keep filling in for a few minutes.
listings gives counts per status. If over_cap stays above zero, you are sending more vehicles than your programme holds.