Skrivebeskyttet analytics-API
HTTP-API-et api.jonot.io/v1/* gir skrivebeskyttet tilgang til organisasjonens kølapp- og køddata — ingen admin-innlogging kreves, bare et bearer-token. Bruk det til å hente data inn i et datavarehus, et BI-verktøy, eller et eget dashbord.
Skaffe et token
Section titled “Skaffe et token”- Åpne admin.jonot.io/settings/integrations.
- Klikk fanen API tokens.
- Klikk Create token, gi det et navn (f.eks. «Power BI»), og bekreft.
- Kopier tokenet umiddelbart — det vises bare én gang og kan ikke gjenopprettes. Hvis du mister det, fjern det og opprett et nytt.
Tokener har prefikset jot_ og utløper aldri av seg selv; fjern dem fra samme fane når de ikke lenger trengs.
Autentisering
Section titled “Autentisering”Authorization: Bearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| Status | Betydning |
|---|---|
401 | Token mangler, er feilformatert, ukjent, eller fjernet. |
402 | Gyldig token, men organisasjonen har ikke API-funksjonen aktivert. |
429 | Hastighetsgrensen overskredet — se Hastighetsgrenser nedenfor. |
400 | Ugyldige spørreparametere, eller et datointervall over 90 dager. |
Endepunkter
Section titled “Endepunkter”GET /v1/queues
Section titled “GET /v1/queues”Returnerer organisasjonens steder og køer, ufiltrert og upaginert:
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" } ] } ]}Bruk de returnerte id-verdiene til å filtrere /v1/tickets og CSV-eksporten etter queueId / locationId.
GET /v1/tickets
Section titled “GET /v1/tickets”Paginert lesing av kølapper, avgrenset til organisasjonen din.
| Parameter | Påkrevd | Gjentagbar | Merknader |
|---|---|---|---|
from | ja | nei | ISO-8601, inkluderende nedre grense for createdAt. |
to | ja | nei | ISO-8601, ekskluderende øvre grense. Maks 90 dagers spenn. |
queueId | nei | ja | Gjenta parameteren for å filtrere flere køer. |
locationId | nei | ja | Gjenta parameteren for å filtrere flere steder. |
status | nei | ja | Én av WAITING, CALLED, COMPLETED, CANCELED, SKIPPED, NO_SHOW. |
cursor | nei | nei | Ugjennomsiktig verdi fra forrige sides nextCursor. |
limit | nei | nei | Standard 100, maks 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…"}Radene inneholder aldri kølappens bearer-hash eller kundeinnlagt PII (navn, notater, gruppestørrelse) — bare id-er, status, og livssyklustidsstemplene.
Paginering: når nextCursor er ikke-null, send den som cursor i neste forespørsel for å fortsette der du slapp (samme from/to/filtre). En nextCursor som er null betyr at du har nådd slutten av intervallet.
GET /v1/exports/tickets.csv
Section titled “GET /v1/exports/tickets.csv”Samme filtre som /v1/tickets (from/to påkrevd, queueId/locationId/status gjentagbare) minus cursor/limit — hele det treffende intervallet strømmes som ett CSV-svar, så det er ingen 500-rads sidegrense å omgå for et masseuttrekk.
Kolonnerekkefølgen er stabil, men les kolonner etter overskriftsnavn i stedet for fast posisjon. Overskriftsraden er alltid til stede og samsvarer nøyaktig med denne listen:
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.csvSvaret strømmes (Transfer-Encoding: chunked), slik at en eksport over 90 dager / 100 000 rader ikke trenger å bufre i minnet på noen av sidene — led den rett til en fil eller en parser.
90-dagers intervallgrense
Section titled “90-dagers intervallgrense”Hvert endepunkt som tar from/to avviser et spenn over 90 dager med 400. Hent data trinnvis (f.eks. ett kall per uke) hvis du trenger lengre historikk — kølappens livssyklustidsstempler (calledAt, completedAt, …) lar deg rekonstruere vente-/betjeningstider uten å hente de samme radene på nytt.
Hastighetsgrenser
Section titled “Hastighetsgrenser”60 forespørsler/minutt per token (ikke per IP — budsjettet følger tokenet). Hvert svar bærer:
X-RateLimit-Remaining: 42X-RateLimit-Reset: 1751328000000Et 429 bærer i tillegg Retry-After (sekunder). Vent til den perioden er over før du prøver igjen; en planlagt synkronisering hvert par minutter holder seg komfortabelt under grensen.
Python + pandas
Section titled “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())Eller les CSV-eksporten direkte — pandas håndterer det strømmede svaret transparent:
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-kobling)
Section titled “Power BI (Web-kobling)”- I Power BI Desktop: Get Data → Web.
- Velg Advanced, og bygg URL-en med datointervallet ditt, f.eks.
https://api.jonot.io/v1/exports/tickets.csv?from=2026-06-01T00:00:00Z&to=2026-07-01T00:00:00Z. - Under HTTP request header parameters, legg til et hode kalt
Authorizationmed verdienBearer jot_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. - Klikk OK — Power BI oppdager CSV-en og åpner tabellforhåndsvisningen.
- Klikk Load (eller Transform Data først hvis du vil sette kolonnetyper —
createdAt/calledAt/osv. importeres som tekst; konverter dem tilDate/Timei Power Query). - Sett en planlagt oppdatering i Power BI-tjenesten hvis du henter på en fast frekvens; hold intervallet komfortabelt under 90 dager per oppdatering.