Nearcharger · For partners

Feed specification for partners

How to send us your electric vehicle inventory, and the data we provide to help you do it.

Version 3.0 Updated September 2026 Electric vehicles only (BEV) Slovenská verzia

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.

How onboarding works

  1. Map to our catalogOptional but the most reliable: store our vehicle IDs and value list slugs (A1 to A3).
  2. Build the feedFollowing part 1. Validate it with the schema and compare it with the examples (section 9).
  3. Send us the URLWe set up the download, map your own structure if needed, and hand over your token.
  4. 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

Send fully electric vehicles (BEV) only

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

ParameterRequirement
FormatJSON (preferred) or XML, encoded in UTF-8
StructureA list of vehicles: JSON {"vehicles": [ ... ]}, XML <feed><vehicle>...
AccessA URL that we download. HTTPS recommended, HTTP accepted. Optionally protected with Basic Auth or a Bearer token.
How often we downloadOnce a day (default), or by agreement twice a day or hourly. The URL should always return the current state.
SizeAt 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.

GroupFieldsSection
Requiredid brand + model or catalog_id price3.1
Neededphotos status variant mileage_km year_of_production vat_deductible currency3.2
Technical datacatalog_id vin engine battery_kwh wltp_range_km power_kw body_type drive seats4
Registration and warrantyregistration_year registration_month manufacture_month battery_warranty_km5.1
Batterysoh soh_certificate_url soh_measurement_date5.2
Appearance and leasingcolor_exterior metallic continuation_of_leasing5.3
Location and contactbranch address gps_lat gps_lng contact_phone contact_email5.4
Listing contenttitle description condition state doors equipment equipment_unmapped price_without_vat5.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
catalog_id replaces brand and model

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
idPresent.Not imported (validation)
vehicle identitybrand and model, or a valid catalog_id.Not imported (validation)
priceGreater than 0.Not imported (validation)
currencyNot the other market's currency. An unknown currency passes.Not imported (validation)
vinThe same VIN is not already on Nearcharger under another record.Not imported (duplicate_vin)
number of vehiclesAt most 500 per feed and no more than your programme holds.Vehicles at the end of the feed are not imported (limit_exceeded)
vin17 characters without the letters I, O and Q.VIN dropped
year_of_production, registration_yearFrom 2010 to next year.Year dropped
manufacture_month, registration_month1 to 12.Month dropped
mileage_km0 or more.Mileage dropped
seats, doorsSeats 2 to 8, doors 2 to 5.Value dropped
gps_lat, gps_lngBoth present, not 0/0, a point in Central Europe.We locate the vehicle from its address (5.4)
yes / no fieldstrue/false, 1/0, yes/no.Value dropped
value list fieldscondition, 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
statusOne 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_idintegerCatalog entry ID (A2), replaces brand and model (3.1).We match by name.
vinstring (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.
enginestringPowertrain designation, for example "iV 60 (RWD)". Used only when variant is missing.Nothing, if you send variant.
battery_kwhnumberGross battery capacity in kWh.From the catalog, once matched.
wltp_range_kmintegerWLTP range in km.From the catalog, once matched.
power_kwnumberPower in kW.From the catalog, once matched.
body_typestringBody 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.
drivestringDrivetrain, 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.
seatsintegerNumber 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.

FieldTypeDescriptionExample
registration_yearintegerYear of first registration.2021
registration_monthintegerMonth of first registration (1 to 12). Without it we cannot compute the remaining warranty in years.5
manufacture_monthintegerMonth of manufacture (1 to 12). The year of manufacture is year_of_production.3
battery_warranty_kmintegerBattery 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.

FieldTypeDescriptionExample
sohnumberBattery state of health in percent (0 to 100), decimals are fine.94.5
soh_certificate_urlURLLink to the measurement certificate (PDF or image, for example Aviloo or Moba)."https://.../soh.pdf"
soh_measurement_datedateMeasurement date (YYYY-MM-DD). We store it but do not show it on the listing yet."2026-08-15"

5.3 Appearance and leasing

FieldTypeDescriptionExample
color_exteriorstringBody 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"
metallicbooleanMetallic paint.true
continuation_of_leasingbooleanThe 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.

FieldTypeDescriptionExample
branchstringCity where the vehicle is (a field named location works too). Shown as the city, so no company name here."Bratislava"
addressstringFull address. We use it to locate the vehicle when coordinates are missing."Pestovateľská 5, Bratislava"
gps_lat, gps_lngnumberCoordinates. 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_phonestringPhone of the branch. Without it we use the phone from your profile."+421 900 123 456"
contact_emailstringBranch email, where listing enquiries go. Without it we use the email from your profile."ba@yourdomain.sk"

5.5 Listing content

FieldTypeDescriptionExample
titlestringListing 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"
descriptionstringFree 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..."
conditionstringA slug from the ad_listing_type group: new, used or used-demo-car (demo is accepted too)."used"
state[]arrayVehicle state flags, slugs from the listing_state group, for example first-owner, service-book, imported-vehicle, crashed.["first-owner"]
doorsintegerNumber of doors (2 to 5). The catalog does not have it, so we show it only from your feed.5
equipment[]arrayEquipment as slugs from /equipment, one item per element. We map your own names during onboarding.["heat-pump"]
equipment_unmapped[]arrayEquipment 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_vatnumberOptional: 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 id that never changes
  • Every vehicle has brand and model, or catalog_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_production and vat_deductible are 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

FilePurpose
listing-template.schema.jsonJSON Schema (draft 2020-12) to validate a JSON feed, for example with ajv.
listing-template.xsdXSD to validate an XML feed, for example xmllint --schema listing-template.xsd feed.xml.
example-feed-sk.jsonExample feed for the Slovak market (EUR), 5 vehicles including a record with the minimum fields.
example-feed-cz.jsonExample 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
EndpointContent
/master-dataIndex: schema_version and a list of feeds with URL, formats and generation time
/master-data/catalogVehicle catalog (A2), paginated, filters ?brand= and ?year=
/master-data/brandsBrands and their models with IDs, slugs and aliases (A3)
/master-data/equipmentEquipment in categories (A3)
/master-data/enumsOther value lists: drivetrain, body type, segment, charge port, listing status, market, EV type, listing type, vehicle state, colours, seats, doors (A3)
{
  "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/..."
}

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" }
}
EndpointContent
/brandsBrands 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.
/equipmentEquipment categories, each with id, slug, names and a list of items.
/enumsAn 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

What you can rely on
  • 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 (currently 1). We would announce an incompatible change in advance and keep the old version available for a transition period.

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}
This feed does not use the part 1 format

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.

FieldMeaning
id, urlOur listing ID and its public page.
source_idYour id from the feed, the same key as in the reconciliation feed. null for a listing entered manually.
statusactive, reserved or sold.
updated_atWhen 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_slugThe matched catalog entry, null until matched.
soh, battery_kwh, range_wltp, power_kwValues of the specific vehicle, not the catalog nominal.
imagesmain is the main photo, gallery the others; the main photo is not repeated in the gallery.
contactBranch 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).

StatusMeaningWhat to do
errorThe 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_capThe 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.
soldYou sent status: sold. The listing is hidden and kept as history.Nothing. If you send the vehicle as available again, it is republished.
orphanedThe 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.
adoptedWe 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.
unmatchedThe 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.
updatedThe listing is live and the latest run updated it.Nothing.
publishedThe listing is live and unchanged.Nothing.

A6.2 Error codes

error_codeMeaning
validationSomething 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_vinA 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_exceededThe 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_failedA technical failure on our side. We see it too.
unmapped_valueA 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.

warningMeaningWhat to do
photos_unavailableNot 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_incompleteSome photos failed even on the third attempt (photos above 30 do not count).Compare photos_sent with photos_imported.
price_net_equals_grossWith 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

FieldMeaning
source_idYour id from the feed, the row key.
vinThe VIN after our normalisation (upper case, no spaces), empty if you did not send one.
our_post_id, urlOur listing ID and URL, null until the listing exists.
error_code, error_messageFor error: the code (A6.2) and a short technical text naming the field or the conflicting listing.
photos_sent, photos_importedHow 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.
warningsCodes from A6.3, an empty list when there is nothing to report.
car_version_id, match_method, match_scoreCatalog 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_atWhen the row entered that status; sold_at and orphaned_at only while it is in it.
last_seen_in_feed, last_changed, last_syncedWhen we last saw the record in your feed, when its content changed and when the row was written (UTC).
summaryRow counts per status, non-zero only.
feeds[]The state of each of your feeds, see below.
When a whole run did not happen

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.