⚙️ For developers

DPP API

Your product data already lives in your ERP, PIM or battery management system. Use the API to create and update passports without manual entry, and send serial numbers and battery status automatically.

Base URL: https://www.qrnot.com/api/dpp/v1

OpenAPI spec (import into Postman / Swagger) ↗

1. Key

Create a key in the panel under Company → API keys (company owner only). The key is shown once; send it in the header of every request. Keys can be read-only or read + write, and can be revoked at any time.

Authorization: Bearer qrn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Rules

  • Everything you write is saved to the draft first. The public passport changes only when you call /publish; every publish is stored as a new version.
  • Battery status (state of health, cycles, charge) is the exception: no publish needed, it shows on the passport immediately.
  • Every write is recorded in your company audit log as “api:<key name>”.
  • Limits: 1200 requests per hour per key, at most 2000 serial numbers per request. Your plan’s product limit applies to the API too.
  • Send your ERP product code as externalId and repeating the same request never creates a duplicate.
  • Errors are always { "error": { "code", "message", "details" } }; choose the message language with the x-dpp-lang header (tr, en, de, fr, es, nl, ar, ru).

2. Endpoints

GET/meCompany, plan limits and key permissions (connection test)
GET/productsList products (?status=draft|published|archived)
POST/productsNew product draft (with externalId: create or update)
GET/products/{id}Full product (draft state)
PATCH/products/{id}Partial update; fields you omit are kept
POST/products/{id}/publishPublish the draft as a new version
GET/products/{id}/itemsSerial numbers (?q=&limit=&offset=)
POST/products/{id}/itemsAdd serial numbers: a list or a range
PUT/products/{id}/itemsBattery: bulk update many batteries’ status
PATCH/products/{id}/items/{serial}Battery: one battery’s status
GET/products/external/{externalId}Read by ERP code
PUT/products/external/{externalId}Create or update by ERP code

3. Examples

Create or update by ERP code

curl -X PUT https://www.qrnot.com/api/dpp/v1/products/external/VB-48-15AH \
  -H "Authorization: Bearer qrn_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "defaultLang": "en",
    "texts": { "en": { "name": "E-bike battery 48V 15Ah" } },
    "data": {
      "brand": "Volta", "model": "VB-48", "category": "battery",
      "gtin": "08691234567892", "countryOfOrigin": "TR",
      "sector": { "batteryCategory": "lmt", "chemistry": "Li-ion LFP" }
    }
  }'

Publish

curl -X POST https://www.qrnot.com/api/dpp/v1/products/{id}/publish \
  -H "Authorization: Bearer qrn_live_…"

Add serial numbers (one passport each)

curl -X POST https://www.qrnot.com/api/dpp/v1/products/{id}/items \
  -H "Authorization: Bearer qrn_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "serials": [
        { "serial": "VB-000101", "batch": "L2026-10", "productionDate": "2026-10-20" },
        { "serial": "VB-000102", "batch": "L2026-10", "productionDate": "2026-10-20" }
      ] }'

Update one battery’s status

curl -X PATCH https://www.qrnot.com/api/dpp/v1/products/{id}/items/VB-000101 \
  -H "Authorization: Bearer qrn_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "stateOfHealthPct": 97, "cycles": 120, "stateOfChargePct": 80 }'

4. Sector fields

Fields go into data.sector; the module is chosen by product category. If a “required” field is missing, publish returns 400 and lists what is missing in error.details.

Battery category: battery

KeyFieldTypeSource
batteryCategoryBattery categoryrequiredev | lmt | industrial | sli | portableMd. 77(1), Ek VI-A
chemistryBattery chemistryrequiredstringEk VI-A, Ek XIII 1(b)
manufacturingPlacePlace of manufacture (facility)requiredstringEk VI-A
ratedEnergyKwhRated energynumber (kWh)Md. 77(1)
hazardousSubstancesHazardous substances (other than Hg, Cd, Pb)requiredstringEk VI-A, Ek XIII 1(b)
criticalRawMaterialsCritical raw materials (> 0.1%)[cobalt | lithium | nickel | natural_graphite | manganese | other]Ek VI-A, Ek XIII 1(b)
extinguishingAgentUsable extinguishing agentrequiredstringEk VI-A
ratedCapacityAhRated capacityrequirednumber (Ah)Ek XIII 1(g)
voltageMinMinimum voltagenumber (V)Ek XIII 1(h)
voltageNominalNominal voltagerequirednumber (V)Ek XIII 1(h)
voltageMaxMaximum voltagenumber (V)Ek XIII 1(h)
voltageTempRangeTemperature range for voltage valuesstringEk XIII 1(h)
powerOriginalWOriginal power capabilityrequirednumber (W)Ek XIII 1(i)
powerLimitsTempPower limits and temperature rangestringEk XIII 1(i)
expectedLifetimeCyclesExpected lifetimerequirednumber (cycles)Ek XIII 1(j)
lifetimeTestRefLifetime test referencestringEk XIII 1(j)
capacityThresholdPctCapacity threshold for exhaustionnumber (%)Ek XIII 1(k)
storageTempMinMinimum temperature when not in usenumber (°C)Ek XIII 1(l)
storageTempMaxMaximum temperature when not in usenumber (°C)Ek XIII 1(l)
calendarWarrantyYearsCommercial warranty for calendar lifenumber (years)Ek XIII 1(m)
rteInitialPctInitial round-trip energy efficiencynumber (%)Ek XIII 1(n)
rteAt50PctEfficiency at 50% of cycle lifenumber (%)Ek XIII 1(n)
resistanceCellMohmInternal cell resistancenumber (mΩ)Ek XIII 1(o)
resistancePackMohmInternal pack resistancenumber (mΩ)Ek XIII 1(o)
cycleLifeCRateC-rate of cycle-life testnumber (C)Ek XIII 1(p)
carbonFootprintPerKwhCarbon footprint (life cycle)number (kg CO₂e/kWh)Md. 7, Ek XIII 1(c)
carbonClassCarbon footprint performance classA | B | C | D | EMd. 7(2)
carbonStudyUrlPublic version of the carbon footprint studystringMd. 7(1)
dueDiligenceReportSupply-chain due diligence reportstringMd. 52(3), Ek XIII 1(d)
recycledCobaltPctRecycled cobalt sharenumber (%)Md. 8, Ek XIII 1(e)
recycledLithiumPctRecycled lithium sharenumber (%)Md. 8, Ek XIII 1(e)
recycledNickelPctRecycled nickel sharenumber (%)Md. 8, Ek XIII 1(e)
recycledLeadPctRecycled lead sharenumber (%)Md. 8, Ek XIII 1(e)
renewableContentPctRenewable content sharenumber (%)Ek XIII 1(f)
markingsLabels and markings[ce | separate_collection | cd | pb | capacity]Md. 13, Ek XIII 1(q)
docReferenceEU declaration of conformity referencerequiredstringMd. 18, Ek XIII 1(r)
wasteInfoInformation on preventing and managing waste batteriesrequiredstringMd. 60(1), Ek XIII 1(s)
detailedCompositionDetailed composition (cathode, anode, electrolyte)stringEk XIII 2(a)
sparePartsSpare part numbers and supplier contactsstringEk XIII 2(b)
dismantlingDismantling information (diagrams, sequence, fasteners, tools, warnings, cell layout)stringEk XIII 2(c)
safetyMeasuresSafety measuresstringEk XIII 2(d)

Textile and footwear category: textile | footwear

KeyFieldTypeSource
productTypeProduct typestring—
sizeRangeSize rangestring—
animalOriginContains non-textile parts of animal originno | yes1007/2011 md. 12
countrySpinningSpinningstring—
countryWeavingWeaving / knittingstring—
countryDyeingDyeing, printing and finishingstring—
countryAssemblyMaking-up (sewing)string—
careWashWashingw95 | w60 | w40 | w30 | hand | nowashISO 3758
careBleachBleachingbleach_any | bleach_oxygen | bleach_noISO 3758
careDryDryingtumble_normal | tumble_low | tumble_no | line | flatISO 3758
careIronIroningiron_high | iron_medium | iron_low | iron_noISO 3758
careProfessionalProfessional cleaningprof_p | prof_f | prof_w | prof_noISO 3758
pillingGradePilling grade (1–5)numberISO 12945
colourFastnessWashColour fastness to washing (1–5)numberISO 105-C06
colourFastnessLightColour fastness to light (1–8)numberISO 105-B02
dimensionalChangePctDimensional change after washingnumber (%)ISO 5077
washCyclesTestedWash cycles testednumber—
recyclabilityRecyclabilitymono | mostly_mono | blend—
recyclingDisruptorsRecycling disruptors (elastane, coatings, metal trims)string—
removableTrimsTrims easily removableyes | no | na—
microfibreReleaseMicrofibre releasenumber (mg/kg)—
reachConformComplies with REACH Annex XVII restrictionsyes | noREACH Ek XVII
chemicalCertificationsChemical certifications (OEKO-TEX, ZDHC…)string—

Furniture category: furniture

KeyFieldTypeSource
furnitureTypeFurniture typestring—
useEnvironmentUse environmentindoor | outdoor | both—
maxLoadKgMaximum loadnumber (kg)—
componentMaterialsMaterials by componentstring—
woodSpeciesWood speciesstring—
woodOriginCountry of wood harveststring—
woodCertificationForest certificationstringFSC / PEFC
upholsteryUpholstery fabric compositionstring—
foamTypeFoam / filling typestring—
formaldehydeClassFormaldehyde emission classe05 | e1 | e2 | naEN 717-1 / EN 16516
flameRetardantsFlame retardantsnone | present—
flameRetardantDetailsFlame retardant detailsstring—
vocInfoVolatile organic compounds (VOC)string—
testedStandardsDurability / safety standards testedstringEN 16139, EN 12520, EN 1730…
disassemblyDisassemblytool_free | standard_tools | special_tools | not_designed—
fastenersFastenersstring—
sparePartsListSpare parts liststring—
recyclabilityInfoEnd of life and recyclingstring—
packagingPackaging materialsstring—
eudrReferenceEUDR due diligence statement referencestringEUDR 2023/1115 md. 4

Battery status fields (per serial number)

KeyFieldTypeSource
statusBattery statusoriginal | repurposed | reused | remanufactured | wasteEk XIII 4
stateOfHealthPctState of health (SoH)number (%)Md. 14, Ek XIII 4
remainingCapacityAhRemaining capacitynumber (Ah)Ek VII, Ek XIII 4
cyclesCharge-discharge cyclesnumber (cycles)Ek XIII 4
stateOfChargePctState of charge (SoC)number (%)Ek XIII 4
negativeEventsNegative events (accidents etc.)stringEk XIII 4
operatingConditionsOperating conditions (temperature history)stringEk XIII 4

Note: the API does not submit to the EU central DPP registry; the technical details of that registry have not been published yet.