Televizyon.app Arşiv API
Türk TV kanallarının 7/24 kaydedilen dökümlerinde arama yapın: bir kelimenin hangi kanalda, yayında saat kaçta geçtiğini milisaniye hassasiyetinde öğrenin, bir kanalın belirli bir aralıktaki dökümünü alın, bir konunun gün içindeki yoğunluğunu görün.
Yayındaki tam saat
Her kelimenin yayında söylendiği an kaydedilir. Arama sonucu, eşleşen kelimenin saatini verir.
Türkçe'ye uygun arama
“muhalefet” araması muhalefetin, muhalefete… biçimlerini de bulur. Yanlış yazımlar için benzer arama vardır.
Hızlı ve sayfalı
Dizinli tam metin arama; imleçli sayfalama ile büyük aralıklarda da hızlı yanıt.
Kimlik doğrulama
Tüm uç noktalar bir API token'ı ister. Token'ı her istekte Authorization başlığında gönderin:
Authorization: Bearer tv2t_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Token'lar tv2t_ ile başlar ve oluşturulduklarında yalnızca bir kez gösterilir. İptal edilen
token anında geçersiz olur. Token'ı adres satırına (URL) koymayın; yalnızca başlıkta gönderin.
docker compose exec web python -m app.admin token create "isim"
komutuyla oluşturur; token list ile listeler, token revoke <id> ile iptal eder.Zaman, sayfalama, sınırlar
Zaman biçimi
Tüm zamanlar ISO 8601'dir. Yanıtlar UTC döner (+00:00). Sorgularda saat dilimi belirtebilirsiniz;
Türkiye saati için +03:00 kullanın. URL içinde + işareti %2B olarak yazılmalıdır:
from=2026-10-09T09:00:00%2B03:00&to=2026-10-09T12:00:00%2B03:00
Sayfalama
Liste döndüren uç noktalar next_cursor verir. Sonraki sayfa için aynı isteği cursor=<next_cursor>
ekleyerek tekrarlayın. next_cursor değeri null ise başka sonuç yoktur. İmleçli sayfalama, sayfa
numarasıyla sayfalamadan farklı olarak, derin sayfalarda da yavaşlamaz.
İstek sınırı
Token başına saniyede 20 istek (anlık 60'a kadar). Aşılırsa 429 döner; kısa bir süre bekleyip tekrar deneyin.
Arama nasıl çalışır
- Büyük-küçük harf ve noktalama önemsizdir. Türkçe harfler doğru işlenir (İ/i, I/ı).
- 5 ve daha uzun kelimeler ekleri yakalar:
istanbul→ İstanbul'da, İstanbul'un, İstanbullu… - Daha kısa kelimeler tam eşleşir (kesmeli ekler dahil):
rize→ Rize, Rize'de; ama “rizeli” değil. - Birden çok kelime (
mode=word): hepsi aynı segmentte geçmeli, sıra önemsiz. - Yakın (
mode=near): kelimeler aynı kanalda 60 sn içinde geçmeli (farklı cümlelerde olabilir):başarı ödül. - Operatörler (
wordvenear):festival VEYA konser(ya daOR,|) biri yeter ·konser -yağmur(ya daDEĞİL,NOT) geçmesin ·"iyi haberler"tırnak içi yan yana. Yalnızca-kelimeile arama yapılamaz. - Konuşmacı:
konuşan:ad başarı(ad: panelde tanıtılan kişi) yalnızca o kişinin kendi sesiyle söylediği cümleler (ses tanıma; kişiler yönetim panelinde tanıtılır, bkz. /speakers). Tek başınakonuşan:adkişinin son konuşmalarını listeler. Ad, kayıtlı adın bir parçası olabilir; boşluklu ad tırnakla:konuşan:"ad soyad".kişi:da olur. - Yan yana ifade (
mode=phrase): kelimeler bu sırayla, art arda geçmeli: “merkez bankası”. - Benzer yazım (
mode=fuzzy): konuşma tanıma bazen kelimeyi yanlış yazar (“kpss” → “kfss”). Bu mod benzer yazılışları da bulur; sonuçlar daha geniştir, gözden geçirerek kullanın.
Bir segment, genellikle 2–15 saniyelik bir konuşma cümlesidir; arama sonuçları segment segment döner.
Arama
| Parametre | Açıklama |
|---|---|
| qzorunlu | Aranacak kelime veya kelimeler.metin |
| mode | word (varsayılan) · near · phrase · fuzzymetin |
| channel | Kanal kimliği; birden çoksa virgülle ayırın. Boşsa tüm kanallar.metin |
| speaker | Konuşmacı adı (ya da bir parçası); q içinde konuşan:ad ile aynı.metin |
| from, to | Zaman aralığı (ISO 8601). Verilmezse tüm arşiv.tarih-saat |
| limit | Sayfa başına sonuç, 1–200. Varsayılan 50.tam sayı |
| cursor | Önceki yanıttaki next_cursor.metin |
curl -H "Authorization: Bearer $TELEVIZYON_TOKEN" \ "https://televizyon.app/api/v1/search?q=festival&from=2026-10-09T00:00:00%2B03:00&limit=20"
import os, requests r = requests.get( "https://televizyon.app/api/v1/search", params={"q": "festival", "from": "2026-10-09T00:00:00+03:00", "limit": 20}, headers={"Authorization": f"Bearer {os.environ['TELEVIZYON_TOKEN']}"}, timeout=30, ) for seg in r.json()["results"]: for m in seg["matches"]: print(m["at"], seg["channel"]["name"], m["text"])
const url = new URL("https://televizyon.app/api/v1/search"); url.searchParams.set("q", "festival"); url.searchParams.set("from", "2026-10-09T00:00:00+03:00"); const res = await fetch(url, { headers: { Authorization: `Bearer ${TELEVIZYON_TOKEN}` } }); const { results, next_cursor } = await res.json(); results.forEach(s => s.matches.forEach(m => console.log(m.at, s.channel.name, m.text)));
{
"results": [
{
"id": 3919,
"channel": { "id": "ce5c463456", "name": "Bloomberg HT" },
"started_at": "2026-10-09T14:10:23.511287+00:00",
"ended_at": "2026-10-09T14:10:38.751287+00:00",
"lang": "tr",
"engine": "whisper",
"text": "… bu yıl festivale geçen yıldan çok daha fazla ziyaretçi geldi, biletler günler önce tükendi …",
"speaker": null,
"matches": [
{ "keyword": "festival", "text": "festivale",
"at": "2026-10-09T14:10:30.951287+00:00", "kind": "exact" }
]
}
],
"next_cursor": "MTc5MTU1NDkzMi40OTIxMTg6MzI0NQ=="
}Sonuç alanları
| Alan | Açıklama |
|---|---|
| id | Segment kimliği (/segments/{id} ile kelime kelime alınabilir). |
| channel | Kanal kimliği ve adı. |
| started_at, ended_at | Segmentin yayındaki başlangıç ve bitiş anı. |
| lang | Konuşmanın dili (tr, en, ar, kmr = Kurmanci…). |
| engine | Metni üreten model: whisper veya omni (Kürtçe/Zazaca). |
| text | Segmentin dökümü. |
| speaker | Ses tanımayla bulunan konuşmacı {"id", "name", "pct"} (pct ≈ eşleşme olasılığı, %) ya da tanınmadıysa null. /transcripts ve /segments yanıtlarında da var. |
| matches[].at | Eşleşen kelimenin yayında söylendiği an. “Saat kaçta geçti?” sorusunun cevabı. |
| matches[].text | Dökümde geçen biçim (ör. aranan “festival”, geçen “festivale”). |
| matches[].kind | exact veya fuzzy (benzer yazımla bulunan). |
| programme | Eşleşmenin söylendiği anda yayında olan program (yayın akışından): title, start,
stop, category. Kanalın akışı bilinmiyorsa null. |
| video | Bu an için görüntü arşivi var mı (true/false); varsa /video
ile izlenebilir. /transcripts ve /segments yanıtlarında da var. |
Döküm
| Parametre | Açıklama |
|---|---|
| channelzorunlu | Kanal kimliği (/channels).metin |
| from, to | Zaman aralığı. from verilmezse son 1 saat.tarih-saat |
| include_words | true ise her kelime yayındaki anıyla döner.mantıksal |
| limit | 1–1000. Varsayılan 200.tam sayı |
| cursor | Önceki yanıttaki next_cursor.metin |
curl -H "Authorization: Bearer $TELEVIZYON_TOKEN" \ "https://televizyon.app/api/v1/transcripts?channel=ce5c463456&from=2026-10-09T17:00:00%2B03:00&to=2026-10-09T18:00:00%2B03:00"
# Bir saatlik dökümün tamamı (sayfa sayfa) params = {"channel": "ce5c463456", "from": "2026-10-09T17:00:00+03:00", "to": "2026-10-09T18:00:00+03:00", "limit": 1000} segments = [] while True: page = requests.get("https://televizyon.app/api/v1/transcripts", params=params, headers=H).json() segments += page["results"] if not page["next_cursor"]: break params["cursor"] = page["next_cursor"]
include_words=true ile her segmentte ek olarak:
"words": [ { "w": "sandıkta", "at": "2026-10-09T09:32:48.535+00:00" }, { "w": "da", "at": "2026-10-09T09:32:49.955+00:00" }, … ]
Zaman çizelgesi
| Parametre | Açıklama |
|---|---|
| qzorunlu | Kelime(ler); arama kuralları ve operatörler /search ile aynı. Yalnızca konuşan:ad: kişinin saat saat kaç cümle konuştuğu.metin |
| mode | word (varsayılan, aynı segmentte) · near (aynı kanalda 60 sn içinde)metin |
| bucket | minute · hour (varsayılan) · day. Dakikada en fazla 2 günlük aralık.metin |
| channel | Kanal kimliği/kimlikleri (virgülle).metin |
| from, to | Varsayılan: son 24 saat.tarih-saat |
{
"bucket": "hour",
"from": "2026-10-08T14:13:57+00:00", "to": "2026-10-09T14:13:57+00:00",
"series": [
{ "channel": { "id": "d50469f334", "name": "CNBC-e" }, "at": "2026-10-09T14:00:00+00:00", "count": 4 },
{ "channel": { "id": "422fffa5f6", "name": "Ekoturk" }, "at": "2026-10-09T14:00:00+00:00", "count": 2 },
{ "channel": { "id": "ce5c463456", "name": "Bloomberg HT" }, "at": "2026-10-09T14:00:00+00:00", "count": 1 }
]
}Tek segment
Arama sonucundaki id ile çağrılır; yanıt arama sonucu alanlarına ek olarak
words içerir. Bulunamazsa 404.
Ses
Yalnızca konuşma içeren bölümler saklanır (müzik ve sessizlik yok) ve 30 gün tutulur. Bir arama
sonucundaki eşleşmenin at değerinin birkaç saniye öncesinden istemek, kelimenin söylendiği anı verir.
| Parametre | Açıklama |
|---|---|
| channelzorunlu | Kanal kimliği.metin |
| from, tozorunlu | Aralık; en fazla 600 sn.tarih-saat |
| format | ogg (Opus, varsayılan) · m4a (AAC; Safari/iOS için).metin |
Yanıt bir ses dosyasıdır. X-Clip-Start başlığı dosyanın ilk örneğinin yayın saatini verir; aralıkta kesinti
varsa ses ilk kesintide biter. Ses yoksa 404.
curl -H "Authorization: Bearer $TOKEN" -D - -o an.ogg \ "https://televizyon.app/api/v1/audio?channel=c651476ffd&from=2026-10-09T21:30:00%2B03:00&to=2026-10-09T21:31:00%2B03:00"
Görüntü
Görüntü yalnızca görüntü arşivindeki kanallar için vardır; hangi kanalın hangi aralıkta görüntüsü olduğu
/channels yanıtındaki video alanında, tek tek sonuçlar için video: true ile görülür.
Görüntü dökümle sesten hizalanır: from/to döküm ve /audio ile aynı saattir.
| Parametre | Açıklama |
|---|---|
| channelzorunlu | Kanal kimliği.metin |
| from, tozorunlu | Aralık; en fazla 600 sn.tarih-saat |
Yanıt 360p H.264/AAC bir MP4 dosyasıdır (10 dk ≈ 25–30 MB). Kesit istek anında üretilir (10 dk ≈ 30 sn);
aynı anda en çok 2 kesit üretilir, diğerleri sırada bekler. X-Clip-Start başlığı ilk karenin
yayın saatini verir; aralıkta görüntü kesintisi varsa kesit ilk kesintide biter. Görüntü yoksa 404.
curl -H "Authorization: Bearer $TOKEN" -D - -o an.mp4 \ "https://televizyon.app/api/v1/video?channel=c651476ffd&from=2026-10-09T21:30:00%2B03:00&to=2026-10-09T21:31:00%2B03:00"
Kanallar
{
"id": "04908db814", "name": "24 TV", "logo": "https://i.imgur.com/8FO41es.png",
"group": "News", "lang": "tr", "stream_status": "ok", "archived": true,
"archive": { "state": "ok", "engine": "whisper", "lang": "tr", "lag_s": 11.6,
"queue_s": 0.0, "last_text_at": "2026-10-09T14:13:48.841+00:00", "error": null }
}| Alan | Açıklama |
|---|---|
| stream_status | Yayın linki durumu: ok · down · checking. |
| archived | Kanal 7/24 arşivleniyor mu. Arama yalnızca arşivlenen kanalların kayıtlarını kapsar. |
| archive.state | ok çalışıyor · down yayın koptu, yeniden deneniyor · stopped arşivden çıkarıldı. |
| archive.lag_s | Yayında söylenen ile veritabanına düşen arasındaki süre (saniye). |
| archive.queue_s | Çözülmeyi bekleyen ses (saniye). Sürekli büyüyorsa sunucu yetişemiyor demektir. |
| archive.last_text_at | Bu kanaldan en son metin yazılan an. |
| video | Görüntü arşivinin ilk ve son anı {"from", "to"} ya da görüntü yoksa null. Aralığın
içinde kesinti olabilir; tek bir anın görüntüsü olup olmadığını sonuçlardaki video alanı söyler. |
Konuşmacılar
Her cümlenin ses izi çıkarılır ve yönetim panelinde tanıtılan kişilerin örnekleriyle karşılaştırılır. Tanınan
kişi sonuçlarda speaker alanında döner; aramada konuşan:ad ya da speaker= ile süzülür.
Ses izlerinin kendisi API'den verilmez. Çok kısa (2 sn altı), müzikli ya da üst üste konuşmalı cümlelerde tanıma zayıflar;
tercüme edilen konuşmalarda duyulan ses tercümanınkidir.
[
{ "id": 1, "name": "Ad Soyad", "segments": 4210, "last_heard_at": "2026-10-14T11:29:12+00:00" }
]Hata kodları
Hatalar {"detail": "açıklama"} biçiminde döner.
| Kod | Anlamı |
|---|---|
| 400 | Geçersiz parametre (ör. boş q, bozuk cursor, dakika aralığı 2 günü aşıyor). |
| 401 | Token yok, geçersiz veya iptal edilmiş. |
| 404 | Segment bulunamadı; istenen aralıkta ses ya da görüntü yok. |
| 422 | Parametre türü yanlış (ör. tarih biçimi). |
| 429 | İstek sınırı aşıldı (saniyede 20). |
Veri hakkında
- Gecikme: bir konuşma, yayında söylendikten genellikle 10–60 saniye sonra aranabilir hale gelir.
- Saat doğruluğu: zamanlar yayının kendi saat bilgisinden alınır. Yayın sunucusunun saati yanlışsa canlı yayın ucuna göre düzeltilir; bu bilgiyi vermeyen birkaç yayında saat birkaç saniye sapabilir.
- Dökümler otomatik konuşma tanımadır; özel isim ve kısaltmalarda yazım hataları olabilir. Kritik aramalarda
mode=fuzzyile birlikte deneyin. - Müzik, reklam ve sessizlik kaydedilmez; konuşma tanımanın bu anlarda uydurduğu kalıplar filtrelenir.
- Kürtçe ve Zazaca kanallar ayrı bir modelle çevrilir (
engine: "omni"); bu kanallarda kelime zamanları ±1–2 sn hassasiyettedir.
Uç noktaları tarayıcıdan denemek için Swagger arayüzü: sağ üstteki Authorize düğmesine token'ı girin.