Salt Okunur Analitik API'si
api.jonot.io/v1/* HTTP API’si, kuruluşunuzun sıra numarası ve sıra verilerine salt okunur erişim sağlar — admin girişi gerekmez, yalnızca bir Bearer belirteci yeterlidir. Verileri bir veri ambarına, bir BI aracına veya özel bir gösterge paneline aktarmak için kullanın.
Belirteç alma
Bölüm başlığı “Belirteç alma”- admin.jonot.io/settings/integrations adresini açın.
- API belirteçleri sekmesine tıklayın.
- Belirteç oluştur’a tıklayın, bir ad verin (ör. “Power BI”) ve onaylayın.
- Belirteci hemen kopyalayın — yalnızca bir kez gösterilir ve tekrar alınamaz. Kaybederseniz iptal edip yenisini oluşturun.
Belirteçler jot_ önekini taşır ve kendiliğinden süresi dolmaz; artık gerek kalmadığında aynı sekmeden iptal edin.
Kimlik doğrulama
Bölüm başlığı “Kimlik doğrulama”Authorization: Bearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| Durum | Anlamı |
|---|---|
401 | Belirteç eksik, hatalı biçimlendirilmiş, bilinmiyor veya iptal edilmiş. |
402 | Belirteç geçerli, ancak kuruluşta API özelliği etkin değil. |
429 | Hız sınırı aşıldı — aşağıdaki Hız sınırları bölümüne bakın. |
400 | Geçersiz sorgu parametreleri veya 90 günü aşan bir tarih aralığı. |
Uç noktalar
Bölüm başlığı “Uç noktalar”GET /v1/queues
Bölüm başlığı “GET /v1/queues”Kuruluşunuzun konumlarını ve sıralarını, filtrelenmemiş ve sayfalanmamış şekilde döndürür:
curl https://api.jonot.io/v1/queues \ -H "Authorization: Bearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"{ "locations": [ { "id": "loc_…", "name": "Downtown", "slug": "downtown", "queues": [ { "id": "q_…", "name": "Main Queue", "slug": "main-queue", "status": "ACTIVE" } ] } ]}/v1/tickets ve CSV dışa aktarımını queueId / locationId ile filtrelemek için döndürülen id değerlerini kullanın.
GET /v1/tickets
Bölüm başlığı “GET /v1/tickets”Kuruluşunuzla sınırlı, sayfalanmış sıra numarası okuma.
| Parametre | Zorunlu | Tekrarlanabilir | Notlar |
|---|---|---|---|
from | evet | hayır | ISO-8601, createdAt üzerinde dahil edilen alt sınır. |
to | evet | hayır | ISO-8601, hariç tutulan üst sınır. En fazla 90 günlük aralık. |
queueId | hayır | evet | Birden fazla sırayı filtrelemek için parametreyi tekrarlayın. |
locationId | hayır | evet | Birden fazla konumu filtrelemek için parametreyi tekrarlayın. |
status | hayır | evet | WAITING, CALLED, COMPLETED, CANCELED, SKIPPED, NO_SHOW değerlerinden biri. |
cursor | hayır | hayır | Önceki sayfanın nextCursor değerinden gelen opak bir değer. |
limit | hayır | hayır | Varsayılan 100, en fazla 500. |
curl "https://api.jonot.io/v1/tickets?from=2026-06-01T00:00:00Z&to=2026-06-08T00:00:00Z&status=COMPLETED" \ -H "Authorization: Bearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"{ "items": [ { "id": "tkt_…", "number": 42, "queueId": "q_…", "locationId": "loc_…", "status": "COMPLETED", "createdAt": "2026-06-01T09:14:02.000Z", "calledAt": "2026-06-01T09:20:11.000Z", "completedAt": "2026-06-01T09:24:47.000Z", "cancelledAt": null, "skippedAt": null, "noShowAt": null, "calledByDeviceSessionId": "dev_…" } ], "nextCursor": "eyJjcmVhdGVkQXQi…"}Satırlar, sıra numarasının taşıyıcı hash değerini veya müşteri tarafından girilen herhangi bir kişisel veriyi (ad, not, grup büyüklüğü) hiçbir zaman içermez — yalnızca kimlikler, durum ve yaşam döngüsü zaman damgaları bulunur.
Sayfalama: nextCursor null değilse, kaldığınız yerden devam etmek için bir sonraki istekte cursor olarak geçirin (aynı from/to/filtreler). nextCursor değerinin null olması, aralığın sonuna ulaştığınız anlamına gelir.
GET /v1/exports/tickets.csv
Bölüm başlığı “GET /v1/exports/tickets.csv”/v1/tickets ile aynı filtreler (from/to zorunlu, queueId/locationId/status tekrarlanabilir) ancak cursor/limit hariç — eşleşen tüm aralık tek bir CSV yanıtı olarak akar, bu yüzden toplu bir çekim için aşılması gereken 500 satırlık bir sayfa sınırı yoktur.
Sütun sırası sabittir, ancak sütunları sabit konuma göre değil başlık adına göre ayrıştırın. Başlık satırı her zaman mevcuttur ve tam olarak bu listeyle eşleşir:
id,number,queueId,locationId,status,createdAt,calledAt,completedAt,cancelledAt,skippedAt,noShowAt,calledByDeviceSessionIdcurl "https://api.jonot.io/v1/exports/tickets.csv?from=2026-06-01T00:00:00Z&to=2026-07-01T00:00:00Z" \ -H "Authorization: Bearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -o tickets.csvYanıt akış halinde gelir (Transfer-Encoding: chunked), bu yüzden 90 günlük/100 bin satırlık bir dışa aktarımın her iki uçta da bellekte arabelleğe alınması gerekmez — doğrudan bir dosyaya veya ayrıştırıcıya yönlendirin.
90 günlük aralık sınırı
Bölüm başlığı “90 günlük aralık sınırı”from/to alan her uç nokta, 90 günü aşan bir aralığı 400 ile reddeder. Daha uzun bir geçmişe ihtiyacınız varsa veriyi aşamalı olarak çekin (ör. haftada bir çağrı) — sıra numarası yaşam döngüsü zaman damgaları (calledAt, completedAt, …), aynı satırları iki kez çekmeden bekleme/hizmet sürelerini yeniden oluşturmanızı sağlar.
Hız sınırları
Bölüm başlığı “Hız sınırları”Belirteç başına dakikada 60 istek (IP başına değil — kota belirteçle birlikte taşınır). Her yanıt şunları içerir:
X-RateLimit-Remaining: 42X-RateLimit-Reset: 1751328000000Bir 429 yanıtı ayrıca Retry-After (saniye) değerini de içerir. Bu süre dolana kadar bekleyip tekrar deneyin; birkaç dakikada bir zamanlanmış bir senkronizasyon rahatlıkla sınırın altında kalır.
Python + pandas
Bölüm başlığı “Python + pandas”import requestsimport pandas as pd
TOKEN = "jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"BASE = "https://api.jonot.io/v1"HEADERS = {"Authorization": f"Bearer {TOKEN}"}
def fetch_tickets(frm: str, to: str) -> pd.DataFrame: rows = [] cursor = None while True: params = {"from": frm, "to": to, "limit": 500} if cursor: params["cursor"] = cursor res = requests.get(f"{BASE}/tickets", headers=HEADERS, params=params, timeout=30) res.raise_for_status() body = res.json() rows.extend(body["items"]) cursor = body["nextCursor"] if not cursor: break return pd.DataFrame(rows)
df = fetch_tickets("2026-06-01T00:00:00Z", "2026-07-01T00:00:00Z")df["waitSeconds"] = ( pd.to_datetime(df["calledAt"]) - pd.to_datetime(df["createdAt"])).dt.total_seconds()print(df.groupby("queueId")["waitSeconds"].mean())Ya da CSV dışa aktarımını doğrudan okuyun — pandas, akış halindeki yanıtı şeffaf bir şekilde işler:
df = pd.read_csv( f"{BASE}/exports/tickets.csv?from=2026-06-01T00:00:00Z&to=2026-07-01T00:00:00Z", storage_options={"Authorization": f"Bearer {TOKEN}"},)Power BI (Web bağlayıcı)
Bölüm başlığı “Power BI (Web bağlayıcı)”- Power BI Desktop’ta: Get Data → Web.
- Advanced’i seçin ve URL’yi tarih aralığınızla oluşturun, ör.
https://api.jonot.io/v1/exports/tickets.csv?from=2026-06-01T00:00:00Z&to=2026-07-01T00:00:00Z. - HTTP request header parameters altında,
Bearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdeğerine sahipAuthorizationadlı bir başlık ekleyin. - OK’e tıklayın — Power BI, CSV’yi algılar ve Table Preview’ı açar.
- Load’a tıklayın (sütun türlerini ayarlamak isterseniz önce Transform Data’ya tıklayın —
createdAt/calledAtgibi alanlar metin olarak içe aktarılır; bunları Power Query’deDate/Time’a dönüştürün). - Belirli bir düzenle veri çekiyorsanız Power BI hizmetinde zamanlanmış bir yenileme ayarlayın; her yenilemede aralığı rahatlıkla 90 günün altında tutun.