tv2t 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. - 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) · phrase · fuzzymetin |
| channel | Kanal kimliği; birden çoksa virgülle ayırın. Boşsa tüm kanallar.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 $TV2T_TOKEN" \ "https://tv2t.asveas.com/api/v1/search?q=enflasyon&from=2026-10-09T00:00:00%2B03:00&limit=20"
import os, requests r = requests.get( "https://tv2t.asveas.com/api/v1/search", params={"q": "enflasyon", "from": "2026-10-09T00:00:00+03:00", "limit": 20}, headers={"Authorization": f"Bearer {os.environ['TV2T_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://tv2t.asveas.com/api/v1/search"); url.searchParams.set("q", "enflasyon"); url.searchParams.set("from", "2026-10-09T00:00:00+03:00"); const res = await fetch(url, { headers: { Authorization: `Bearer ${TV2T_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": "… bir sene önce ana param 1 milyonun enflasyonuna geldi ama o fonun varlığı 2 milyon ediyor …",
"matches": [
{ "keyword": "enflasyon", "text": "enflasyonuna",
"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ü. |
| 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 “enflasyon”, geçen “enflasyonuna”). |
| matches[].kind | exact veya fuzzy (benzer yazımla bulunan). |
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 $TV2T_TOKEN" \ "https://tv2t.asveas.com/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://tv2t.asveas.com/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ı mode=word ile aynı.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.
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. |
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ı. |
| 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.