DE
Für Veranstalter
Für Veranstalter

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.

BerechtigungBedeutung
events:readEventliste und -details: Tickettypen, Preis, Kontingent, verkauft, Einlasszahlen.
orders:readBezahlte und erstattete Bestellungen: Name und E-Mail der Käufer, Betrag, Rabatt, Gutschein, Positionen.
attendees:readTickets und Einlasscodes: Name, Typ, Status, Bestellcode, Einlasszeit.
checkinEinlass: 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.

MethodePfadBerechtigungBedeutung
GET/me—Name, Präfix, Berechtigungen und Ablauf des Schlüssels sowie der Veranstalter.
GET/eventsevents:readEvents. ?status=upcoming (Standard) | past | all.
GET/events/{id}events:readEin Event: Tickettypen, verkauft, Kapazität, Einlasszahlen.
GET/events/{id}/ordersorders:readBestellungen (Erstverkauf; Wiederverkauf ausgenommen). ?since, ?page.
GET/events/{id}/attendeesattendees:readTickets / Einlasscodes (verkauft, Gäste, Kombitickets). ?since, ?page.
GET/events/{id}/doorcheckinOffline-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}/checkinscheckinCheck-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/scancheckinOnline-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>" }.

CodeHTTPBedeutung
invalid_key401Der Schlüssel fehlt, ist unbekannt, widerrufen oder abgelaufen, oder das Veranstalterkonto ist nicht freigegeben.
insufficient_scope403Dem Schlüssel fehlt die Berechtigung dieses Endpunkts (scope in der Antwort).
not_found404Das Event existiert nicht oder gehört nicht diesem Veranstalter.
door_window403Die Einlassliste gibt es nur während der Einlasszeit (opensAt, closesAt in der Antwort).
invalid_since400since ist kein gültiges ISO-Datum.
empty400Der Body enthält keine Check-ins und keinen QR-Inhalt.
rate_limited429Limit ü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.