DEVekspertiz.app

Test Hattı Ölçümleri endpoint'i

Test hattı cihazı üreticileri (Mates vb.) için yazma endpoint'i. Cihazın okuduğu fren / süspansiyon / yanal kayma / dinamometre değerleri buraya gönderilir; plaka eşleşmesi sağlanırsa değerler ilgili ekspertiz raporunun Test Hattı Kontrolleri formuna otomatik işlenir.

POST /api/v1/partner/test-line/measurements

Gerekli scope: test-line:write

node scripts/sign.node.mjs POST /api/v1/partner/test-line/measurements "$(cat olcum.json)"

İşleyiş

  1. branch_code (bayi kodu, örn. YVZ-SB-01) ölçümün hangi firma + bayiye ait olduğunu belirler. Kod yalnız partner'ın erişim izni olan firmaların bayileri arasında aranır — izin dışı kodlar 404 döner. Bayi kodları devreye alma sırasında ekspertiz.app tarafından paylaşılır (bkz. 09 · Test hattı cihaz entegrasyonu).
  2. Ölçüm paketi ham haliyle kaydedilir — veri hiçbir durumda kaybolmaz.
  3. Plaka, o bayide açık (yazım aşamasında, son 24 saatte açılmış) bir raporla eşleşirse değerler rapora anında işlenir → status: "applied".
  4. Eşleşme yoksa ölçüm havuzda bekler → status: "pending". Eksper aynı plakaya rapor açtığında Test Hattı sayfasında "Cihazdan ölçüm geldi" bandı görünür ve tek tıkla uygulanır. Yani ölçümün rapordan önce gönderilmesi sorun değildir — doğal akış budur.

İstek gövdesi

{
  "branch_code": "YVZ-SB-01",
  "plate": "06 ABC 123",
  "measured_at": "2026-06-10T14:05:00+03:00",
  "external_id": "MATES-OLCUM-90002",
  "device_serial": "MTS-2026-001234",
  "measurements": {
    "DYNO_MEASURED_HP": 118,
    "SUSP_FRONT_LEFT": 78,
    "SUSP_FRONT_RIGHT": 76,
    "SUSP_REAR_LEFT": 71,
    "SUSP_REAR_RIGHT": 74,
    "BRAKE_FRONT_LEFT": 2.4,
    "BRAKE_FRONT_RIGHT": 2.6,
    "BRAKE_REAR_LEFT": 1.4,
    "BRAKE_REAR_RIGHT": 1.5,
    "HANDBRAKE_LEFT": 1.4,
    "HANDBRAKE_RIGHT": 1.5,
    "SLIP_FRONT": -2,
    "SLIP_REAR": 3
  }
}
AlanTipZorunluAçıklama
branch_codestringBayi kodu (kurulumda istasyon yazılımına bir kez yazılır). Büyük/küçük harf duyarsız
platestringTürk plakası. Boşluklu/boşluksuz, büyük/küçük harf fark etmez — sunucu normalize eder ("06 abc 123""06ABC123")
measured_atRFC3339Ölçüm zamanı, saat dilimi offset'li (örn. +03:00). Verilmezse sunucu saati kullanılır. Gelecek tarih reddedilir
external_idstring (≤120)Sizin tarafınızdaki ölçüm ID'si — idempotency anahtarı. Şiddetle önerilir: ağ hatasında aynı external_id ile güvenle tekrar gönderebilirsiniz, çift kayıt oluşmaz
device_serialstring (≤120)Cihaz seri numarası — yalnız iz sürme amaçlı saklanır, yönlendirmede kullanılmaz
measurementsobjectNokta kodu → sayısal değer. En az 1, en çok 50 anahtar. Değerler ondalıklı olabilir (2.4), ondalık ayracı nokta

Ölçüm nokta kodları

KodÖlçümBirim
DYNO_FACTORY_HPDinamometre — fabrika gücüHP
DYNO_MEASURED_HPDinamometre — ölçülen güçHP
SUSP_FRONT_LEFTSüspansiyon verimi — ön sol% (EuSAMA)
SUSP_FRONT_RIGHTSüspansiyon verimi — ön sağ% (EuSAMA)
SUSP_REAR_LEFTSüspansiyon verimi — arka sol% (EuSAMA)
SUSP_REAR_RIGHTSüspansiyon verimi — arka sağ% (EuSAMA)
BRAKE_FRONT_LEFTFren kuvveti — ön solkN
BRAKE_FRONT_RIGHTFren kuvveti — ön sağkN
BRAKE_REAR_LEFTFren kuvveti — arka solkN
BRAKE_REAR_RIGHTFren kuvveti — arka sağkN
HANDBRAKE_LEFTEl freni — solkN
HANDBRAKE_RIGHTEl freni — sağkN
SLIP_FRONTYanal kayma — önm/km (± işaretli)
SLIP_REARYanal kayma — arkam/km (± işaretli)

Notlar:

  • Tüm kodları göndermek zorunda değilsiniz — cihazınız hangi testleri yaptıysa onları gönderin. Eksik kalanları eksper elle tamamlar.
  • DYNO_RATIO (güç oranı %) göndermenize gerek yok; DYNO_MEASURED_HP geldiyse ve aracın fabrika gücü sistemde kayıtlıysa oran otomatik hesaplanır.
  • Rapor şablonunda karşılığı olmayan kodlar hata üretmez; yanıtta skipped_points içinde unknown_point olarak raporlanır.
  • Her değer için durum etiketi (İyi / Sınırda / Limit Dışı) firma bazlı eşik ayarlarına göre sunucu tarafından otomatik atanır — cihazın durum göndermesine gerek yok.

Yanıtlar

201 — yeni ölçüm kabul edildi, rapora otomatik işlendi:

{
  "data": {
    "measurement_id": "cmq7z70o300044whonwmykeap",
    "status": "applied",
    "plate": "61KEJ7501",
    "inspection_id": "cmq7z418f00044wf8bsp8t3i7",
    "applied_points": ["BRAKE_FRONT_LEFT", "BRAKE_FRONT_RIGHT", "..."],
    "idempotent_replay": false
  }
}

201 — yeni ölçüm kabul edildi, açık rapor yok (havuzda bekliyor):

{
  "data": {
    "measurement_id": "cmq7z7srx00074who6kx96q3c",
    "status": "pending",
    "plate": "06ZZD7777",
    "inspection_id": null,
    "applied_points": [],
    "idempotent_replay": false
  }
}

200 — aynı external_id daha önce işlenmişti (idempotent tekrar):

{
  "data": {
    "measurement_id": "cmq7z70o300044whonwmykeap",
    "status": "applied",
    "plate": "61KEJ7501",
    "inspection_id": "cmq7z418f00044wf8bsp8t3i7",
    "idempotent_replay": true
  }
}
AlanAçıklama
measurement_idPlatformdaki ölçüm kaydı ID'si — destek taleplerinde referans verin
statusapplied = rapora işlendi · pending = plaka eşleşmesi bekliyor · discarded = eksper yok saydı (yalnız replay yanıtında görülür)
inspection_idİşlendiği raporun ID'si (pending'de null)
applied_pointsRapora yazılan nokta kodları
skipped_pointsYazılamayan kodlar + sebep (unknown_point, no_status) — yalnız varsa döner
idempotent_replaytrue ise bu external_id daha önce işlenmişti; yeni kayıt açılmadı

Hata kodları

HTTPerror.codeSebep
400invalid_requestGövde JSON değil, alan eksik/hatalı, plaka geçersiz, measured_at gelecekte, ölçüm anahtarı formatı bozuk, bayi kodu birden fazla bayiye eşleşiyor
401missing_signature_headers / invalid_key / invalid_signature / expired_timestamp / replay_detectedİmzalama sorunları — bkz. 01 · Kimlik doğrulama
403scope_requiredAnahtarda test-line:write scope'u yok
404not_foundBayi kodu bulunamadı, bayi pasif veya partner'ınızın o firmaya erişim izni yok
413payload_too_largeGövde > 1 MB
429rate_limited / ip_rate_limitedHız sınırı — Retry-After header'ına uyun

Tüm hata yanıtları standart zarf kullanır:

{ "error": { "code": "not_found", "message": "Resource not found.", "request_id": "req_FX4G57YTBF3F4BEP" } }

request_id'yi loglayın — destek taleplerinde bizimle paylaşın.