Türkçe · English

Persentil API

Kendi sitenizde WHO, CDC ve Neyzi referanslarıyla persentil ve z skoru. Hesap, pediatrirutinleri.com persentil hesaplayıcısıyla aynıdır.

Gömülü form

Kod yazmadan: sayfanıza iki satır eklersiniz, hesaplayıcı sitenizde açılır. Anahtar gerekmez; form yalnızca onaylı alan adlarınızda çalışır.

API

Kendi arayüzünüz ve sunucunuz için: ölçümleri sunucunuzdan gönderir, JSON sonuç alırsınız. Tekli ya da bir istekte 100 ölçüme kadar.

Başvuru yap

1. Başvuru ve anahtar

  1. Pediatri Rutinleri hesabınızla giriş yapın (mobil uygulamadaki hesabınız da geçerli; yoksa ücretsiz üye olun) ve Persentil API hizmet sayfasından başvurun: kurum, web siteniz, kullanım amacınız; API için sunucu IP adresleriniz, gömülü form için alan adlarınız. Başvuru hesabınıza bağlanır, sonuç hesabınızın e-posta adresine gelir.
  2. Her başvuru yönetici tarafından incelenir ve size e-postayla dönülür. Kullanım şimdilik günlük kotayla ücretsizdir.
  3. Gömülü form onaylanırsa gömme kodu e-postayla gelir.
  4. API onaylanırsa tek kullanımlık bir bağlantı gelir (72 saat geçerli). Anahtar, bağlantıda “Anahtarı göster” düğmesine bastığınızda üretilir ve yalnızca bir kez gösterilir. Anahtar e-postayla gönderilmez, bizde de düz metin olarak saklanmaz. Kaybederseniz yenisi verilir.

2. Gömülü form

Onay e-postasındaki kodu sayfanıza ekleyin (SITE_KIMLIGI size verilen kimliktir):

<iframe src="https://pediatrirutinleri.com/api/widget/?site=SITE_KIMLIGI"
        title="Persentil hesaplayıcı" style="width:100%;min-height:720px;border:0"
        loading="lazy" referrerpolicy="strict-origin"></iframe>
<script src="https://pediatrirutinleri.com/api/widget/gomme.js" async></script>

Sitenizde Content-Security-Policy (CSP) varsa

Form görünmüyorsa büyük olasılıkla sitenizin güvenlik politikası dış çerçeveleri engelliyordur. CSP başlığınıza şunu ekleyin:

frame-src … https://pediatrirutinleri.com
script-src … https://pediatrirutinleri.com   (isteğe bağlı: yalnızca otomatik yükseklik için)

script-src eklemezseniz form yine çalışır; yalnızca gomme.js yüklenmez ve çerçeve, kodda verilen min-height ile sabit kalır. CSP'nizi değiştiremiyorsanız API ile kendi formunuzu kullanın.

3. API

POST https://pediatrirutinleri.com/api/v1/persentil.php

BaşlıkDeğer
AuthorizationBearer prk_live_… (adres satırına konmaz)
Content-Typeapplication/json
User-AgentUygulamanızın adı. User-Agent'sız istekleri sunucu koruması reddedebilir.

İstek

{
  "id": "olcum-8812",
  "ref": "who",
  "sex": 1,
  "bday": "2024-03-15",
  "tday": "2026-10-01",
  "height": 89.4,
  "measure": "h",
  "weight": 12.6,
  "hc": 47.5,
  "gaw": 34,
  "gad": 2,
  "mheight": 162,
  "dheight": 178,
  "lang": "tr"
}

Toplu: {"items": [ {…}, {…} ]} (en çok 100 ölçüm).

AlanZorunluAçıklama
refevetReferans: who, cdc, neyzi
sexevetCinsiyet: 1 = kız, 2 = erkek
bday + tdaybiriDoğum tarihi + ölçüm tarihi, YYYY-AA-GG; ikisi birlikte
agedaysya da buKronolojik yaş, gün (0–7305)
height / weight / hcen az biriBoy cm (20–250) / kilo kg (0.2–300) / baş çevresi cm (15–80)
measurehayırBoy ölçüm şekli: l = yatarak, h = ayakta. Referansın beklediğinden farklıysa boy düzeltilir (CDC 0.8 cm, WHO/Neyzi 0.7 cm). Verilmezse düzeltme yapılmaz.
gaw, gadhayırPrematüre doğum haftası 22–36 ve günü 0–6 (tamsayı). Kronolojik 24 aya kadar düzeltilmiş yaş kullanılır.
mheight, dheighthayırAnne ve baba boyu, cm; ikisi birlikte verilirse hedef boy
idhayırKendi kaydınızla eşlemek için kısa teknik kimlik: en çok 64 karakter, harf, rakam ve _ . : -. Yanıtta aynen döner.
langhayırHata iletilerinin dili: tr (varsayılan) ya da en. Verilmezse Accept-Language başlığına bakılır. Alan adları ve kodlar dilden bağımsızdır.
graphhayırtrue: büyüme eğrileri de gelir (yalnız tekli istekte, aşağıya bakın)

Sayılar JSON sayısı (89.4) ya da noktalı metin ("89.4") olabilir. Tanınmayan alanlar yok sayılır.

Yanıt

{
  "success": true,
  "result": {
    "id": "olcum-8812", "ref": "who", "sex": 1,
    "age": { "months": 29.3, "chrono": {"total_days": 930, "years": 2, "months": 6, "days": 16}, "corrected": null },
    "preterm": { "applied": false, "reason": "over_24_months", "gaw": 34, "gad": 2, "corr_days": null, "pma_days": null },
    "height": { "measured": 89.4, "used": 90.1,
                "measure_adj": {"measure": "h", "expected": "l", "diff_cm": 0.7},
                "z": 0.12, "p": 54.78, "height_age_m": 28.4, "ideal_weight": 12.9 },
    "weight": { "value": 12.6, "z": -0.05, "p": 47.9, "rel_weight": 98 },
    "hc": { "value": 47.5, "z": 0.3, "p": 61.2 },
    "bmi": { "value": 15.52, "z": …, "p": … },
    "wfh": { "z": …, "p": … },
    "target": { "cm": 163.5, "low": 156.5, "high": 170.5, "z": 0.21 }
  },
  "request_id": "9f2c…"
}
AlanAnlamı
age.monthsHesapta kullanılan yaş, ay (prematürede düzeltilmiş)
age.chrono / age.correctedKronolojik / düzeltilmiş yaş: toplam gün, yıl, ay, gün
pretermPrematüre düzeltmesi (gaw verilmediyse null). reason: over_24_months (kronolojik yaş 24 ayı geçti), invalid_gaw, invalid_gad. corr_days: düşülen gün, pma_days: postmenstrüel yaş, gün
height.measured / height.usedGönderilen boy / ölçüm şekli düzeltmesinden sonra hesaptaki boy
height.measure_adjÖlçüm şekli düzeltmesi (yoksa null): gönderilen ve referansın beklediği şekil (l/h), fark cm
z, pZ skoru ve persentil
height.height_age_m, height.ideal_weightBoy yaşı (ay) ve ideal kilo (kg)
weight.rel_weightRelatif ağırlık, %
wfhBoya göre kilo
targetHedef boy (cm) ve aralığı; z 18 yaş referansına göre

Büyüme eğrileri (isteğe bağlı)

Tekli istekte "graph": true gönderirseniz yanıta result.graphs eklenir: ölçülen ve referans aralığında kalan her ölçüm (height, weight, hc, bmi) için P3, P10, P25, P50, P75, P90, P97 eğrileri ve çocuğun noktası. Kendi grafiğinizi bununla çizebilirsiniz. Toplu istekte grafik dönmez.

"graphs": {
  "height": {
    "unit": "cm", "x_unit": "month", "x_range": [0, 23.984],
    "centiles": [3, 10, 25, 50, 75, 90, 97],
    "x": [0, 0.493, …],                       // yaş (ay)
    "p": { "3": [45.6, …], "50": [49.1, …], "97": [52.7, …], … },
    "point": [13.142, 76.0]                   // [hesaptaki yaş (ay), hesaptaki değer]
  }
}

Pencere çocuğun yaşına göre seçilir: 2 yaşa kadar 0–24 ay, 5 yaşa kadar 0–60 ay, üstünde 60–240 ay (referans tablosunun kapsadığı kadar). Prematürede düzeltilmiş yaş, boy ölçüm şekli düzeltmesinde düzeltilmiş boy kullanılır.

Örnek: PHP

$anahtar = getenv('PR_PERSENTIL_API_ANAHTARI'); // koda yazmayın
$ch = curl_init('https://pediatrirutinleri.com/api/v1/persentil.php');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 15,
    CURLOPT_USERAGENT      => 'OrnekKlinik/1.0',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $anahtar, 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode([
        'ref' => 'who', 'sex' => 2,
        'bday' => '2025-01-10', 'tday' => '2026-10-01',
        'height' => 82.0, 'weight' => 11.2,
    ]),
]);
$yanit = json_decode(curl_exec($ch), true);
$kod   = curl_getinfo($ch, CURLINFO_HTTP_CODE);

Örnek: Node.js (18+)

const yanit = await fetch('https://pediatrirutinleri.com/api/v1/persentil.php', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.PR_PERSENTIL_API_ANAHTARI}`,
    'Content-Type': 'application/json',
    'User-Agent': 'OrnekKlinik/1.0',
  },
  body: JSON.stringify({ ref: 'cdc', sex: 1, agedays: 1500, height: 101.2, weight: 15.8 }),
});
const veri = await yanit.json();

4. Ziyaretçilerin girdiği form için aracı dosya

Ölçümleri sitenizin ziyaretçileri giriyorsa, tarayıcı API'ye doğrudan bağlanamaz (anahtar sayfa kaynağında görünür ve çalınır). Akış şöyle olmalı:

Ziyaretçinin tarayıcısı  →  sizin sunucunuz (aracı dosya)  →  pediatrirutinleri.com API

Önemli: Aracı dosyanız herkese açıktır. Koruma koymazsanız biri onu döngüyle çağırıp sizin günlük kotanızı tüketebilir. En az şu üç önlemi alın: yalnızca kendi sayfanızdan gelen isteği kabul edin, ziyaretçi başına sınır koyun, yalnızca tek ölçüme izin verin. Formunuz herkese açıksa CAPTCHA da eklemenizi öneririz.

Örnek aracı dosya (PHP, APCu ile; APCu yoksa sınırı veritabanı ya da Redis ile tutun):

<?php
// https://sizin-siteniz.com/persentil-hesapla.php
const SITE_KOKENI = 'https://sizin-siteniz.com';
const DAKIKA_SINIRI = 20; // ziyaretçi IP'si başına

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); exit; }

// 1) Yalnızca kendi sayfanızdan
if (($_SERVER['HTTP_ORIGIN'] ?? '') !== SITE_KOKENI) { http_response_code(403); exit; }

// 2) Ziyaretçi başına dakikalık sınır
$sayac = 'prp_' . hash('sha256', $_SERVER['REMOTE_ADDR']);
apcu_add($sayac, 0, 60);
if (apcu_inc($sayac) > DAKIKA_SINIRI) { http_response_code(429); exit; }

// 3) Yalnızca tek ölçüm ve bilinen alanlar (toplu "items" geçmez)
$girdi  = json_decode(file_get_contents('php://input', false, null, 0, 4096), true);
$izinli = ['ref', 'sex', 'bday', 'tday', 'agedays', 'height', 'weight', 'hc',
           'measure', 'gaw', 'gad', 'mheight', 'dheight', 'lang'];
$olcum  = is_array($girdi) ? array_intersect_key($girdi, array_flip($izinli)) : [];

// 4) API'ye sunucunuzdan, anahtar ortam değişkeninden
$ch = curl_init('https://pediatrirutinleri.com/api/v1/persentil.php');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 15,
    CURLOPT_USERAGENT      => 'SizinSiteniz/1.0',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('PR_PERSENTIL_API_ANAHTARI'),
                               'Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode($olcum ?: new stdClass()),
]);
$yanit = curl_exec($ch);
$kod   = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($yanit === false || $kod >= 500) {
    http_response_code(502);
    echo json_encode(['success' => false, 'error' => ['code' => 'server_error', 'message' => 'Hesap şu an yapılamıyor.']]);
    exit;
}
http_response_code($kod);
echo $yanit; // API yanıtı olduğu gibi

Sayfanızdaki JavaScript bu dosyaya fetch('/persentil-hesapla.php', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(olcum)}) ile istek gönderir. Kod yazmak istemiyorsanız gömülü formu kullanın.

5. Hatalar ve sınırlar

{ "success": false, "error": { "code": "invalid_input", "message": "…", "field": "height" }, "request_id": "…" }

code ve field dilden bağımsızdır, programınızda bunlara göre davranın; message lang diline göre Türkçe ya da İngilizcedir.

HTTPcodeNe yapmalı
400invalid_input, invalid_body, too_many_itemsGirdiyi düzeltin; field hangi alan olduğunu söyler.
401unauthorizedAnahtar yok, hatalı ya da iptal edilmiş.
403ip_not_allowed, https_requiredİzinli IP'den, HTTPS ile çağırın.
405 / 413 / 415method_not_allowed / body_too_large / unsupported_media_typeYalnızca POST / gövde en çok 64 KB / Content-Type: application/json
429rate_limited, quota_exceededRetry-After başlığına uyun; kota İstanbul saatiyle gece yarısı yenilenir.
5xxserver_errorBir süre sonra tekrar deneyin.

IP başına genel sınır aşıldığında 429 gövdesi {"success": false, "error": "…"} biçimindedir; HTTP koduna göre davranın.

Yanıt başlıkları: X-RateLimit-Limit, X-RateLimit-Remaining (dakikalık istek), X-Quota-Limit, X-Quota-Remaining (günlük ölçüm), X-Request-Id (destek isterken bildirin).

6. Güvenlik ve kişisel veri

Sonuçlar klinik karar desteği içindir; tanı ve tedavi kararı hekime aittir.

Pediatri Rutinleri · Gizlilik · Kullanım koşulları