Resmi KAP akışı
KAP'ın kendi bildirimleri, birebir: tüm bildirim tipleri, her alan KAP'ın (Kamuyu Aydınlatma Platformu) yayımladığı haliyle. Yapay zeka yok; yeniden yazma, çeviri ya da özetleme yok.
Bu bildirimlerin yayımlandıkça size itilmesini mi istiyorsunuz? KAP WS akışına bakın →
Bu, haber tabanlı KAP akışından (/v1/kap; news_id ile, yapay zeka özet bloğu taşır) farklı bir kaynaktır — bkz. KAP haber akışı. Kimlikler birbirine taşınmaz: burada disclosure_index kullanın.
Uç noktalar
/v1/kap-feed uç noktaları resmi KAP veri yayınını sunar: tüm bildirim tipleri (FR, ODA, DG, DUY, CA, FON). KAP her bildirimi ardışık ve boşluksuz bir disclosure_index ile numaralar; liste, detay, içerik ve WebSocket akışı için sabit anahtar budur. Kapsam: kap (KAP haber akışıyla aynı kapsam); her çağrı diğer REST çağrıları gibi ölçülür.
| Uç nokta | Kapsam | Açıklama |
|---|---|---|
| GET/v1/kap-feed/disclosures?symbol=&symbols=&companyId=&type=&class=&reason=&from=&to=&order=&cursor=&limit= | kap | Bildirim listesi: filtreler, tüm akışta tarih aralığı, tek çağrıda birden çok sembol, order=asc|desc, imleçle sayfalama |
| GET/v1/kap-feed/disclosures/{index} | kap | Tek bildirim: KAP üst verileri, ekler, FR kalemleri, has_body / body_format |
| GET/v1/kap-feed/disclosures/{index}/body?format=fields|kap|html | kap | Bildirim içeriği, KAP'ın sunduğu haliyle: düz alan listesi, KAP'ın ham yapısı ya da KAP'ın HTML belgesi olarak |
| GET/v1/kap-feed/financials/{symbol}?basis=&unit=&as_of=&consolidation=&year=&period=&cursor=&limit= | kap | KAP XBRL'den mali tablolar, üç bazda (as_reported, tufe_adjusted, yiufe_adjusted) |
| GET/v1/kap-feed/companies/{symbol} | kap | KAP şirket künyesi: kimlik, sektör, sermaye, fiili dolaşımdaki pay, ortaklar, pay grupları, yönetim kurulu ve yöneticiler |
| WS/v1/kap-feed/stream | kap | Aynı bildirimler yayımlandıkça WebSocket üzerinden — KAP WS sayfasına bakın |
Bildirimleri listeleyin
GET /v1/kap-feed/disclosures, gönderdiğiniz tüm filtrelerle (VE) eşleşen bildirimleri döner; varsayılan olarak en yeni önce. Her sayfa items, count ve next_cursor taşır.
| Alan | Tür | Notlar |
|---|---|---|
| symbol | string | Tek bir KAP kodu ya da BIST sembolü; öneksiz ya da bist:/fund: kimliği olarak (THYAO, bist:THYAO, fund:UPG). KAP'ın başka bir kodla bildirim yaptığı sembol o şirketin bildirimlerini okur (VAKBN → TVB). |
| symbols | string (CSV, ≤ 20) | Virgülle ayrılmış birden çok kod: symbols=THYAO,ASELS (1 ile 20 arası, her biri symbol gibi yazılır). Sonuçlar yayım zamanına göre tek listede birleşir, her bildirim bir kez. symbol ile birlikte kullanılamaz (400). Hatalı biçimli bir kod, o kodu adlandıran bir 400'dür; biçimi doğru ama KAP'ta olmayan bir kod sonuca bir şey eklemez. |
| companyId | string | KAP şirket kimliği. |
| type | FR | ODA | DG | DUY | CA | FON | FR · ODA · DG · DUY · CA · FON (ÖDA ve DKB de kabul edilir). |
| class | string | Sunulduğu haliyle KAP bildirim sınıfı. |
| reason | NEW | UPD | CORR | CANC | NEW · UPD · CORR · CANC. |
| from | date | datetime | Yayım zamanı için dahil alt sınır. Tarih (2026-09-15) Türkiye saatiyle tüm günü ifade eder; ofsetsiz tarih-saat Türkiye saati (UTC+3) olarak okunur. Yanıtlardaki published_at UTC'dir. |
| to | date | datetime | Dahil üst sınır, aynı biçimler. from, to'dan sonraysa 400. |
| order | desc | asc | desc (varsayılan, en yeni önce) ya da asc (en eski önce). Her filtre birleşimiyle çalışır. |
| cursor | string | Önceki sayfanın next_cursor değeri. |
| limit | integer | 1–100, varsayılan 25. |
from ve/veya to tek başına çalışır; symbol, symbols, companyId ya da type gerekmez: from=2026-10-01&to=2026-10-03 o aralıkta yayımlanan tüm bildirimleri, tüm tiplerde döner ve doğrudan sayfalar — boş sayfalar arasında dolaşma yok. Hiç tarih ya da filtre vermezseniz en son bildirimleri alırsınız.
next_cursor null olana kadar izleyin: eşleşen her bildirimi tam bir kez, istediğiniz sırayla alırsınız. Bir sayfa limit'ten az öğe — hatta sıfır — içerirken next_cursor yine dolu olabilir; bu son değildir. Yalnızca next_cursor: null bitti demektir. Her imleçle aynı filtreleri ve aynı order değerini gönderin: farklı bir sorguyla (farklı order dahil) kullanılan imleç 400'dür.
Örnek — iki şirketin 1 Ekim'den bu yana tüm özel durum açıklamaları, en eski önce
curl -G -H "X-API-Key: $PORTGATE_KEY" \
"https://api.theportfoy.com/portgate/v1/kap-feed/disclosures" \
--data-urlencode "symbols=THYAO,ASELS" \
--data-urlencode "type=ODA" \
--data-urlencode "from=2026-10-01" \
--data-urlencode "order=asc" \
--data-urlencode "limit=100"
# next page: repeat the same query and add
# --data-urlencode "cursor=<next_cursor>"
# stop when next_cursor is nullTek bildirim
GET /v1/kap-feed/disclosures/{index} tek bir bildirimi döner: liste alanları, ekler (kısa ömürlü imzalı indirme bağlantıları) ve finansal raporlarda (FR) dönem bağlamlarıyla ayrıştırılmış tüm XBRL kalemleri. İki alan içeriğin olup olmadığını söyler:
| Alan | Tür | Notlar |
|---|---|---|
| has_body | boolean | Bildirim içeriği saklanmışsa ve GET …/body onu dönecekse true. |
| body_format | flatData | presentation | html | null | KAP'ın içeriği hangi biçimde gönderdiği: flatData (olay formları, ör. pay geri alımları), presentation (şablon formlar), html (işlenmiş HTML belgesi; KAP yapısal form göndermediğinde) ya da içerik yoksa null. |
curl -H "X-API-Key: $PORTGATE_KEY" \
"https://api.theportfoy.com/portgate/v1/kap-feed/disclosures/1671665"{
"disclosure_index": 1671665,
"type": "CA",
"reason": "UPD",
"related_index": 1671010,
"published_at": "2026-10-03T09:56:03Z",
"symbols": ["PCILT"],
"subject": {"tr": "Payların Geri Alınmasına İlişkin Bildirim",
"en": "Notification Regarding Share Buy-Back"},
"link": "https://www.kap.org.tr/Bildirim/1671665",
"attachments": [],
"has_body": true,
"body_format": "flatData",
...
}Bildirim içeriği
GET /v1/kap-feed/disclosures/{index}/body bildirimin içeriğini — KAP'ın yayımladığı her form alanını ve tablo satırını — format= ile seçilen üç biçimden birinde döner. İçerik listede ve WebSocket karesinde yer almaz; ihtiyaç duyduğunuzda bildirim başına alın.
PortGate içerikte tür dönüşümü, çeviri, özetleme ya da yeniden yazma yapmaz. Tarihler, sayılar ve bayraklar KAP'ın yayımladığı metinler olarak gelir ("30.136", "0.08450", "true"); ayrıştırmayı siz yapın. Birim etikettedir, ör. Sermayeye Oranı (%) — oradaki "0.08450" yüzde 0,0845 demektir. Serbest metin alanları (Ek Açıklamalar gibi) HTML içerebilir; olduğu gibi korunur.
| Alan | Tür | Notlar |
|---|---|---|
| format=fields | default | Varsayılan. İçerik düz bir alan listesine açılır: {key, label: {tr, en}, value: {tr, en}, group?, row?}. key, KAP'ın kendi alan adıdır. Tablo satırları group (tablonun adı) ve row (sabit, 0'dan başlayan satır numarası) taşır. KAP yalnızca bir dil verdiyse tr ya da en null olabilir; dilden bağımsız bir değer ikisinde de görünür. |
| format=kap | raw | KAP'ın ham içeriği, birebir: {disclosure_index, format, source_format, file_type, body}. KAP'ın kendi yapısını istediğinizde ya da fields_status unsupported olduğunda kullanın. |
| format=html | html only | Yalnızca içeriği HTML belgesi olan bildirimler için (body_format: html): {disclosure_index, format, html: {tr, en}}, KAP'ın belgesi metin olarak. Diğer içeriklerde, kullanılabilir biçimleri listeleyen bir 400'dür. |
Örnek — PCILT pay geri alımı (1671665 numaralı bildirim), format=fields
Önce formun üst düzey alanları gelir (burada yönetim kurulu karar tarihi), ardından işlem tablosu: group detailsList, her işlem için bir satır. 0. satır 2026-09-15 tarihli işlemdir.
curl -H "X-API-Key: $PORTGATE_KEY" \
"https://api.theportfoy.com/portgate/v1/kap-feed/disclosures/1671665/body?format=fields"{
"disclosure_index": 1671665,
"format": "fields",
"source_format": "flatData",
"fields_status": "ok",
"fields": [
{"key": "boardDecisionDate",
"label": {"tr": "Yönetim Kurulu Karar Tarihi", "en": "Board Decision Date"},
"value": {"tr": "2026-09-14", "en": "2026-09-14"}},
...
{"key": "transactionDate", "group": "detailsList", "row": 0,
"label": {"tr": "İşlem Tarihi", "en": "Transaction Date"},
"value": {"tr": "2026-09-15", "en": "2026-09-15"}},
{"key": "nominalValueOfSharesSubjectToTransaction", "group": "detailsList", "row": 0,
"label": {"tr": "İşleme Konu Payların Nominal Tutarı (TL)",
"en": "Nominal Value of Shares Subject to Transaction (TRY)"},
"value": {"tr": "100000", "en": "100000"}},
{"key": "ratioToCapital", "group": "detailsList", "row": 0,
"label": {"tr": "Sermayeye Oranı (%)", "en": "Ratio To Capital (%)"},
"value": {"tr": "0.08450", "en": "0.08450"}},
{"key": "transactionPrice", "group": "detailsList", "row": 0,
"label": {"tr": "İşlem Fiyatı (TL/Adet)", "en": "Transaction Price (TRY / Unit)"},
"value": {"tr": "30.136", "en": "30.136"}},
...
]
}{
"disclosure_index": 1671665,
"format": "kap",
"source_format": "flatData",
"file_type": "data",
"body": [ ... KAP's flatData, exactly as KAP sent it ... ]
}{
"disclosure_index": ...,
"format": "html",
"html": {"tr": "<!DOCTYPE html>...", "en": null}
}fields_status
| Alan | Tür | Notlar |
|---|---|---|
| ok | fields_status | İçerik açıldı; fields onu taşır. |
| unavailable | fields_status | İçerik bir HTML belgesidir, açılacak yapı yoktur: fields []. format=html kullanın. |
| unsupported | fields_status | KAP, PortGate'in henüz açmadığı bir yapı kullanmış: fields []. İstek yine başarılıdır; format=kap içeriği döner. |
FR bildirimlerinde içerik XBRL tablolarıdır. Bunlar detayın kendisiyle (facts, contexts) ve /v1/kap-feed/financials/{symbol} üzerinden gelir; bu yüzden FR bildirimlerinde normalde has_body: false olur ve /body 404 döner.
Hatalar
| Alan | Tür | Notlar |
|---|---|---|
| 400 | status | HTML olmayan bir içerik için format=html (mesaj kullanılabilir biçimleri listeler). |
| 404 | status | Bu numarada bildirim yok ya da bildirimin saklanmış içeriği yok (bir FR bildirimi — detaydaki facts'i kullanın — ya da içeriği mevcut olmayan bir bildirim). Hatanın detail alanı hangisi olduğunu söyler. |
| 502 | status | Saklanan içerik okunamadı. Yeniden denemeyle düzelmez — disclosure_index ile destek ekibine bildirin. |
| 503 | status | İçerik deposu geçici olarak kullanılamıyor — geri çekilmeyle yeniden deneyin. |
Hatalar standart RFC 7807 problem gövdesini kullanır; bkz. Hatalar ve hız limitleri.
Mali tablolar ve şirket künyesi
GET /v1/kap-feed/financials/{symbol} XBRL tablolarını dönem dönem sunar; dönem başına bir bildirim, en yeni önce. GET /v1/kap-feed/companies/{symbol} KAP şirket künyesini sunar. İkisi de öneksiz ya da bist: kimliği olarak bir BIST sembolü veya KAP kodu alır. Etkileşimli API referansı tüm parametreleri ve alanları listeler.
| Alan | Tür | Notlar |
|---|---|---|
| basis | as_reported | tufe_adjusted | yiufe_adjusted | as_reported (varsayılan): her değer bildirildiği haliyle. tufe_adjusted / yiufe_adjusted: PortGate TL tutarlarını TÜFE ya da Yİ-ÜFE endeksiyle hedef ayın satın alma gücüne taşır — bildirilen rakamlar üzerinde düz aritmetik, yapay zeka yok. TMS-29 uygulamayan şirketler (ör. bankalar, sigortacılar) düzeltilmeden, tms29_applied: false işaretiyle döner. |
| unit | one | thousand | million | one (tam TL, varsayılan) · thousand · million. Hisse başı tutarlar ve parasal olmayan kalemler hiçbir zaman ölçeklenmez. |
| as_of | YYYY-MM | Yalnızca düzeltilmiş bazlarda: hedef ay, YYYY-MM, çeyrek sonu ayları (03/06/09/12). Varsayılan: endeks değeri yayımlanmış en son çeyrek sonu ayı. |
| consolidation | consolidated | solo | CS | NC | consolidated (varsayılan; yalnızca solo bildirilmişse solo) · solo (yalnızca konsolide bildirilmişse konsolide) · CS / NC (yalnızca o). |
| year · period | string | Bildirildiği haliyle mali yıl ve KAP'ın dönem etiketi, ör. 2025 ve Yıllık ya da 6 Aylık. |
| limit | integer | Sayfa başına dönem (bildirim) sayısı: 1–12, varsayılan 4. Devamı için next_cursor'ı izleyin. |
curl -H "X-API-Key: $PORTGATE_KEY" \
"https://api.theportfoy.com/portgate/v1/kap-feed/financials/ASELS?limit=4"
curl -H "X-API-Key: $PORTGATE_KEY" \
"https://api.theportfoy.com/portgate/v1/kap-feed/financials/ASELS?basis=tufe_adjusted&unit=million&limit=4"
curl -H "X-API-Key: $PORTGATE_KEY" \
"https://api.theportfoy.com/portgate/v1/kap-feed/companies/THYAO"Geçmiş kapsamı
Finansal raporlar (FR) Ocak 2020'ye kadar uzanır. Diğer bildirim tiplerinin geçmişi yükleniyor ve son 12 ayı kapsayacak; yükleme bitene kadar bu tiplerde eski tarih aralıkları KAP'ta yayımlanandan daha az bildirim dönebilir.
Eski /v1/kap/… yolları (kullanımdan kaldırılıyor)
Resmi akış önceden /v1/kap/ altındaydı. Bu yollar aynı davranışla çalışmaya devam eder, ancak /v1/kap-feed/… lehine kullanımdan kaldırılmaktadır (deprecated) — uygun olduğunuzda geçiş yapın:
GET /v1/kap/disclosures → GET /v1/kap-feed/disclosures
GET /v1/kap/disclosures/{index} → GET /v1/kap-feed/disclosures/{index}
GET /v1/kap/financials/{symbol} → GET /v1/kap-feed/financials/{symbol}
GET /v1/kap/companies/{symbol} → GET /v1/kap-feed/companies/{symbol}
WS /v1/kap/stream → WS /v1/kap-feed/streamEski yollardaki REST yanıtları Deprecation: true ve yeni yolu gösteren bir Link başlığı (rel="successor-version") taşır. Haber tabanlı /v1/kap ve /v1/kap/{news_id} (KAP haber akışı) bundan etkilenmez.
