Hesapla (toolId ile)
const url = 'https://api.mirac-ozdemir.com/v1/public/tools/0b9f3c2e-8f56-4b43-9a7c-3c1b1f5e9d10/calculate';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"inputs":{"amount":"1000","mode":"exclusive","vatRateOption":"standard"}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.mirac-ozdemir.com/v1/public/tools/0b9f3c2e-8f56-4b43-9a7c-3c1b1f5e9d10/calculate \ --header 'Content-Type: application/json' \ --data '{ "inputs": { "amount": "1000", "mode": "exclusive", "vatRateOption": "standard" } }'calculateByKey ile aynı davranış; araç UUID ile adreslenir. toolId ortama özgüdür, kalıcı entegrasyonlarda key ile hesaplamayı kullanın.
Gövde: inputs (alan adı → değer; ondalıklar ve tarihler string, enum değerleri string, boolean JSON true/false), isteğe bağlı version (tanımda okuduğunuz versionNumber; farklıysa 409 VERSION_OUTDATED) ve isteğe bağlı asOf (YYYY-MM-DD; oranların yürürlük tarihi, varsayılan bugün).
Yanıt: data.result (sonuç anahtarı → string değer), data.breakdown (biçim bilgisiyle sıralı sonuçlar), meta (kullanılan sürüm, tarih ve oranların kaynağı). Yanıtlar önbelleğe alınmaz (Cache-Control: no-store).
Hız sınırı: IP başına 60 istek / 60 sn (iki hesaplama ucu ortak sayılır).
Parameters
Bölüm başlığı “Parameters”Path Parameters
Bölüm başlığı “Path Parameters”Example
0b9f3c2e-8f56-4b43-9a7c-3c1b1f5e9d10Aracın UUID kimliği (ortama özgü).
Request Bodyrequired
Bölüm başlığı “Request Bodyrequired”object
İsteğe bağlı: tanımda okuduğunuz versionNumber. Canlı sürümden farklıysa 409 VERSION_OUTDATED.
İsteğe bağlı: oranların yürürlük tarihi (YYYY-MM-DD, varsayılan bugün, Europe/Istanbul).
Examples
KDV hariç 1000 TL, genel oran
{ "inputs": { "amount": "1000", "mode": "exclusive", "vatRateOption": "standard" }}KDV dahil 1200 TL, sürüm kontrolüyle
{ "inputs": { "amount": "1200", "mode": "inclusive", "vatRateOption": "standard" }, "version": 1}Geçmiş tarihteki oranla (asOf), %10 indirimli oran
{ "inputs": { "amount": "1000", "mode": "exclusive", "vatRateOption": "reduced10" }, "asOf": "2024-01-15"}Responses
Bölüm başlığı “Responses”Deterministik hesaplama sonucu
object
object
object
object
object
Examples
KDV hariç 1000 TL → 200 TL KDV
{ "data": { "result": { "net": "1000.00", "vat": "200.00", "gross": "1200.00" }, "breakdown": [ { "key": "net", "value": "1000.00", "format": "money", "scale": 2, "currency": "TRY" }, { "key": "vat", "value": "200.00", "format": "money", "scale": 2, "currency": "TRY" }, { "key": "gross", "value": "1200.00", "format": "money", "scale": 2, "currency": "TRY" } ] }, "meta": { "toolId": "0b9f3c2e-8f56-4b43-9a7c-3c1b1f5e9d10", "toolVersion": 1, "asOf": "2026-10-01", "engineVersion": "1.2.0", "dslVersion": 1, "rates": [ { "binding": "vatRate", "key": "tr.vat.standard", "rateId": "9c2f7a55-7a0e-4d7e-9e7a-2b8f6b1c0a11", "valueId": "1f1e0c3d-5b6a-4c7d-8e9f-0a1b2c3d4e5f", "version": 1, "value": "20", "effectiveFrom": "2023-07-10", "effectiveTo": null } ] }}KDV dahil 1200 TL → 1000 TL matrah
{ "data": { "result": { "net": "1000.00", "vat": "200.00", "gross": "1200.00" }, "breakdown": [ { "key": "net", "value": "1000.00", "format": "money", "scale": 2, "currency": "TRY" }, { "key": "vat", "value": "200.00", "format": "money", "scale": 2, "currency": "TRY" }, { "key": "gross", "value": "1200.00", "format": "money", "scale": 2, "currency": "TRY" } ] }, "meta": { "toolId": "0b9f3c2e-8f56-4b43-9a7c-3c1b1f5e9d10", "toolVersion": 1, "asOf": "2026-10-01", "engineVersion": "1.2.0", "dslVersion": 1, "rates": [ { "binding": "vatRate", "key": "tr.vat.standard", "rateId": "9c2f7a55-7a0e-4d7e-9e7a-2b8f6b1c0a11", "valueId": "1f1e0c3d-5b6a-4c7d-8e9f-0a1b2c3d4e5f", "version": 1, "value": "20", "effectiveFrom": "2023-07-10", "effectiveTo": null } ] }}2024-01-15 tarihli %10 oranla
{ "data": { "result": { "net": "1000.00", "vat": "100.00", "gross": "1100.00" }, "breakdown": [ { "key": "net", "value": "1000.00", "format": "money", "scale": 2, "currency": "TRY" }, { "key": "vat", "value": "100.00", "format": "money", "scale": 2, "currency": "TRY" }, { "key": "gross", "value": "1100.00", "format": "money", "scale": 2, "currency": "TRY" } ] }, "meta": { "toolId": "0b9f3c2e-8f56-4b43-9a7c-3c1b1f5e9d10", "toolVersion": 1, "asOf": "2024-01-15", "engineVersion": "1.2.0", "dslVersion": 1, "rates": [ { "binding": "vatRate", "key": "tr.vat.reduced-10", "rateId": "9c2f7a55-7a0e-4d7e-9e7a-2b8f6b1c0a11", "valueId": "1f1e0c3d-5b6a-4c7d-8e9f-0a1b2c3d4e5f", "version": 1, "value": "10", "effectiveFrom": "2023-07-10", "effectiveTo": null } ] }}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Penceredeki toplam istek hakkı.
Penceredeki kalan istek hakkı.
Bozuk istek: gövde geçerli JSON değil
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Examples
Gövde geçerli JSON değil
{ "error": { "code": "VALIDATION_ERROR", "message": "Malformed JSON body" }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Bulunamadı
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Examples
Araç yok veya yayında değil
{ "error": { "code": "NOT_FOUND", "message": "Tool not found" }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Sürüm çakışması (details.reason = VERSION_OUTDATED)
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Examples
Gönderilen version artık canlı değil
{ "error": { "code": "CONFLICT", "message": "The tool has been updated; reload the page", "details": { "reason": "VERSION_OUTDATED", "currentVersion": 2 } }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Gövde 16 KB sınırını aşıyor
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Examples
Gövde sınırı aşıldı
{ "error": { "code": "PAYLOAD_TOO_LARGE", "message": "Request body is too large" }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Doğrulama, hesaplama veya oran hatası
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Examples
Girdi doğrulaması (details.fields)
{ "error": { "code": "VALIDATION_ERROR", "message": "Invalid calculation input", "details": { "fields": [ { "field": "amount", "reason": "TYPE_MISMATCH", "message": "amount must be a decimal string" }, { "field": "mode", "reason": "INVALID_INPUT", "message": "mode must be one of exclusive, inclusive" } ] } }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}İstek şeması (details.issues)
{ "error": { "code": "VALIDATION_ERROR", "message": "Invalid request", "details": { "issues": [ { "path": "inputs", "message": "Invalid input: expected record, received undefined", "code": "invalid_type" } ] } }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}asOf tarihinde yürürlükte oran yok
{ "error": { "code": "RATE_UNAVAILABLE", "message": "No rate is in force for the requested date", "details": { "rates": [ "tr.vat.standard" ], "asOf": "2000-01-01" } }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Bu girdilerle hesap tanımsız
{ "error": { "code": "CALCULATION_ERROR", "message": "The calculation divides by zero for these inputs", "details": { "reason": "DIVISION_BY_ZERO" } }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Hız sınırı aşıldı; Retry-After saniye sonra tekrar deneyin
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Examples
Hız sınırı aşıldı
{ "error": { "code": "RATE_LIMITED", "message": "Too many requests, please try again later", "details": { "retryAfterSeconds": 42 } }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Tekrar denemeden önce beklenecek saniye.
Beklenmeyen sunucu hatası
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Example
{ "error": { "code": "NOT_FOUND", "message": "Tool not found" }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.
Hata
Tüm hatalarda aynı zarf. details yapısı koda göre değişir (bkz. API açıklamasındaki tablo).
object
object
Makine tarafından okunacak sabit kod; mantığınızı buna göre kurun.
İngilizce, insan tarafından okunacak açıklama; değişebilir.
fields[] (girdi hataları), issues[] (istek şeması), reason, currentVersion, retryAfterSeconds, rates, asOf.
object
X-Request-Id yanıt başlığıyla aynı değer.
Example
{ "error": { "code": "NOT_FOUND", "message": "Tool not found" }, "requestId": "5f0c6a5e-2b7e-4a7b-9a51-0d9f0c1f7e21"}Headers
Bölüm başlığı “Headers”İstek kimliği; destek taleplerinde iletin.