Veranstalter-API
Hol deine Events, Bestellungen und Teilnehmer in dein eigenes System; prüfe den Einlass mit deinem eigenen Drehkreuz oder Scanner.
Basis-URL: https://tixvio.com/api/v1/ext
Authentifizierung
Jede Anfrage trägt einen API-Schlüssel im Header Authorization: Bearer txk_…. Der Kontoinhaber erstellt Schlüssel im Panel auf der Seite Entwickler; ein Schlüssel wird nur einmal angezeigt, Tixvio speichert nur seinen Hash.
Ein Schlüssel gehört zu einem Veranstalter und sieht nur dessen eigene Events. Eine Tixvio-Pro-Sitzung funktioniert an diesen Endpunkten nicht, und ein API-Schlüssel funktioniert nicht an Panel- oder Pro-Endpunkten.
Gültigkeit: 30, 90 oder 365 Tage oder unbefristet. Höchstens 10 Schlüssel können gleichzeitig aktiv sein. Widerrufe ungenutzte Schlüssel; der Widerruf gilt sofort.
curl https://tixvio.com/api/v1/ext/events?status=upcoming \
-H "Authorization: Bearer txk_…"Berechtigungen
Wähle beim Erstellen nur die nötigen Berechtigungen. Eine Anfrage an einen Endpunkt ohne passende Berechtigung erhält 403 insufficient_scope.
| Berechtigung | Bedeutung |
|---|---|
events:read | Eventliste und -details: Tickettypen, Preis, Kontingent, verkauft, Einlasszahlen. |
orders:read | Bezahlte und erstattete Bestellungen: Name und E-Mail der Käufer, Betrag, Rabatt, Gutschein, Positionen. |
attendees:read | Tickets und Einlasscodes: Name, Typ, Status, Bestellcode, Einlasszeit. |
checkin | Einlass: Offline-Einlassliste (mit QR-Schlüsseln), Check-in-Abgleich und Online-QR-Prüfung. |
Limits und Seiten
- 120 Anfragen pro Minute und Schlüssel; darüber gibt es 429 rate_limited mit Retry-After: 60.
- Listen kommen in Seiten zu 100 Zeilen: ?page=1, 2, … Ist more in der Antwort true, gibt es eine weitere Seite.
- Bestellungen und Teilnehmer akzeptieren ?since=<ISO-Datum> und liefern nur, was sich danach geändert hat (Zahlung, Erstattung, neues Ticket, Einlass); speichere beim Abgleich den Zeitpunkt deines letzten Laufs.
- Beträge sind Ganzzahlen in der kleinsten Einheit (25000 = 250,00); die Währung steht im Feld currency. Zeiten sind ISO 8601 (UTC).
Endpunkte
Alle Pfade liegen unter der Basis-URL. Antworten sind JSON und werden nie zwischengespeichert.
| Methode | Pfad | Berechtigung | Bedeutung |
|---|---|---|---|
| GET | /me | — | Name, Präfix, Berechtigungen und Ablauf des Schlüssels sowie der Veranstalter. |
| GET | /events | events:read | Events. ?status=upcoming (Standard) | past | all. |
| GET | /events/{id} | events:read | Ein Event: Tickettypen, verkauft, Kapazität, Einlasszahlen. |
| GET | /events/{id}/orders | orders:read | Bestellungen (Erstverkauf; Wiederverkauf ausgenommen). ?since, ?page. |
| GET | /events/{id}/attendees | attendees:read | Tickets / Einlasscodes (verkauft, Gäste, Kombitickets). ?since, ?page. |
| GET | /events/{id}/door | checkin | Offline-Einlassliste: je Ticket Code, Status, Name, Typ, Scan-Zeitfenster und QR-Schlüssel. Nur während der Einlasszeit (12 Stunden vor Beginn → Ende; ohne Ende Beginn + 12 Stunden), höchstens 3-mal pro 2 Minuten; jeder Abruf wird protokolliert. |
| POST | /events/{id}/checkins | checkin | Check-in-Abgleich: { items: [{ code, at, mode }] } (bis zu 500). Wer zuerst einlässt, gewinnt; hat ein anderes Gerät oder ein anderer Schlüssel das Ticket schon eingelassen, kommt ALREADY. |
| POST | /scan | checkin | Online-QR-Prüfung: { eventId, payload } → OK, USED, INVALID, EXPIRED, WRONG_EVENT, OUT_OF_WINDOW, REFUNDED, LISTED, CANCELLED. |
{
"events": [{
"id": "clx…", "slug": "gece-…", "title": "…",
"status": "PUBLISHED", "startsAt": "2026-11-21T19:00:00.000Z",
"currency": "TRY", "sold": 412, "capacity": 600,
"ticketTypes": [{ "id": "clt…", "name": "Genel", "price": 45000, "quantity": 500, "sold": 380 }]
}],
"page": 1, "more": false
}POST https://tixvio.com/api/v1/ext/events/{id}/checkins
{ "items": [{ "code": "K7Q2…", "at": "2026-11-21T22:14:05Z", "mode": "scan" }] }Fehlercodes
Fehlerantworten haben die Form { "error": "<code>" }.
| Code | HTTP | Bedeutung |
|---|---|---|
invalid_key | 401 | Der Schlüssel fehlt, ist unbekannt, widerrufen oder abgelaufen, oder das Veranstalterkonto ist nicht freigegeben. |
insufficient_scope | 403 | Dem Schlüssel fehlt die Berechtigung dieses Endpunkts (scope in der Antwort). |
not_found | 404 | Das Event existiert nicht oder gehört nicht diesem Veranstalter. |
door_window | 403 | Die Einlassliste gibt es nur während der Einlasszeit (opensAt, closesAt in der Antwort). |
invalid_since | 400 | since ist kein gültiges ISO-Datum. |
empty | 400 | Der Body enthält keine Check-ins und keinen QR-Inhalt. |
rate_limited | 429 | Limit überschritten; warte Retry-After Sekunden. |
Offline-QR-Prüfung (TX2)
Der QR-Code eines Tixvio-Tickets ändert sich alle 30 Sekunden; ein Screenshot wird schnell ungültig. Format: TX2.<Ticketcode>.<Fenster>.<Signatur>.
Fenster = floor(Unix-Millisekunden / 30000). Signatur = die ersten 16 Zeichen des base64url-Textes von HMAC-SHA256(Schlüssel, Ticketcode + "." + Fenster). Schlüssel ist das Feld key der Zeile in der Einlassliste (als Text, UTF-8).
Weil Geräteuhren abweichen können, werden ±2 Fenster (etwa ±1 Minute) akzeptiert. Eine Zeile mit leerem key (eingelassen, erstattet, im Wiederverkauf) darf nicht eingelassen werden. Das Feld win ist das Scan-Zeitfenster [Beginn, Ende]; außerhalb gilt OUT_OF_WINDOW.
Sende offline erfasste Einlässe an den Endpunkt checkins, sobald du online bist, damit Tixvio Pro und andere Eingänge dasselbe Ticket nicht zweimal einlassen.
// Node.js · list = GET /events/{id}/door
import crypto from 'node:crypto';
const rows = new Map(list.tickets.map((t) => [t.code, t]));
function verify(payload, now = Date.now()) {
const [ver, code, w, sig] = String(payload).split('.');
const row = rows.get(code);
if (ver !== 'TX2' || !row || !row.key) return false;
const win = Math.floor(now / 30000);
if (Math.abs(Number(w) - win) > 2) return false; // EXPIRED
const expected = crypto.createHmac('sha256', row.key)
.update(`${code}.${w}`).digest('base64url').slice(0, 16);
return expected === sig; // + row.win [from, to]
}Einlasscode-CSV
Wird pro Event im Panel auf der Seite Entwickler heruntergeladen (Inhaber und Manager). Spalten: Code, Name, Typ, Status, Bestellung, eingelassen. UTF-8 (BOM) mit ; als Trennzeichen, damit Excel sie korrekt öffnet; Zellen, die mit Formelzeichen beginnen, werden entschärft.
Import statischer Barcodes
Statische Barcodes, die anderswo verkauft wurden, lassen sich noch nicht in den Tixvio-Einlass importieren: Ein statischer Code kann als Screenshot weitergegeben werden und hebelt den Schutz des dynamischen QR-Codes aus. Wenn du das brauchst, schreib uns im Live-Support.