Event-API für Veranstalter

Alle Veranstaltungen deines ditix.shop als JSON — mit Terminen, Bildern in mehreren Größen, Beschreibung, Ort und Links. Damit baust du Eventlisten und Detailseiten komplett im eigenen Design. Kein Schlüssel, kein Login: die Daten sind dieselben, die dein öffentlicher Shop zeigt.

EventlisteGET https://ditix.tools/api/shop-events?shop=DEIN-SHOP
Beispiel ansehen →
Eventliste mit Details…?shop=DEIN-SHOP&details=1
Beispiel ansehen →
Ein Event…?shop=DEIN-SHOP&event=CODE
Beispiel ansehen →

Aufruf

DEIN-SHOP ist die Subdomain deines Shops: bei https://koblenzer-oktoberfest.ditix.shop also koblenzer-oktoberfest. Die Antwort ist JSON (UTF-8), CORS ist offen — der Abruf funktioniert direkt aus dem Browser (JavaScript) oder serverseitig (PHP, WordPress, Node, …).

ParameterBedeutung
shopPflicht. Subdomain, Host oder volle URL des Shops.
details=1Ergänzt je Event Beschreibung, Vorschautext, Einlass, Adresse, Künstler, Kategorie, Galerie, Videos, Links. Etwas langsamer beim ersten Abruf (danach gecacht).
event=CODEGenau ein Event (Code aus der Event-URL …/event/CODE oder die id), immer mit Details. Antwort enthält event statt events.
canceled=0Abgesagte Events ausblenden (Standard: enthalten, erkennbar an canceled: true).

Es werden nur veröffentlichte Events, die noch nicht beendet sind, geliefert — sortiert nach Beginn. Preise und Verfügbarkeiten sind nicht enthalten; dafür führt url auf die Eventseite im Shop, wo der Kauf stattfindet.

Antwort

{
  "shop": "koblenzer-oktoberfest",
  "shopUrl": "https://koblenzer-oktoberfest.ditix.shop",
  "organizer": { "name": "…", "alias": "12. Koblenzer Oktoberfest", "accentColor": "#1A40BF",
                 "logo": { "small": "…webp", "medium": "…webp", "original": "…" },
                 "email": "…", "city": "…", "website": null, "facebook": "…", "instagram": "…" },
  "total": 11,
  "events": [ { … siehe Felder … } ],
  "fetchedAt": "2026-09-08T09:12:44.000Z"
}

Felder je Event (immer enthalten)

FeldInhalt
id, codeEindeutige ID bzw. der kurze Code aus der Event-URL.
nameTitel der Veranstaltung.
urlEventseite im Shop (Ticketkauf). shopUrl = Startseite des Shops.
state, canceledACTIVE oder CANCELED; canceled als Boolean.
start, endBeginn/Ende als Unix-Zeit in Millisekunden (UTC).
startLocal, endLocalFertig formatiert in deutscher Zeit: iso (z. B. 2026-09-11T17:00:00+02:00), date (11.09.2026), time (17:00), weekday (Freitag), weekdayShort (Fr), day, month, year, monthName, monthShort, dayKey (2026-09-11).
isMultiDaytrue bei mehrtägigen Events (z. B. Dauerkarte).
hideDatestrue, wenn der Veranstalter das Datum im Shop ausblendet — dann kein Termin anzeigen.
locationName des Veranstaltungsorts.
image, imageSmallTitelbild als WebP, 1200 px bzw. 480 px breit.
imageSetAlle Varianten des Titelbilds: thumb (320), small (480), medium (1200), large (2048) als WebP, jpeg (1200, für alte Browser/Mails), square (600×600 Ausschnitt), original (unbearbeitet), pattern (URL-Muster mit {breite} für jede gewünschte Breite bis 4000 px) sowie width/height des Originals.

Zusätzlich mit details=1 oder event=CODE

FeldInhalt
descriptionBeschreibung als HTML — bereinigt auf Absätze, Fett/Kursiv, Listen, Überschriften und Links. Kann direkt in die Seite eingesetzt werden.
descriptionTextDieselbe Beschreibung als reiner Text (ohne HTML).
teaserVorschautext, max. 200 Zeichen, an Wortgrenze gekürzt.
admission, admissionLocalEinlass, falls abweichend vom Beginn gepflegt (sonst null). Format wie startLocal.
addressAdresse als eine Zeile, z. B. Hans-Böckler-Straße 1, 56070 Koblenz.
locationDetailname, street, houseNr, zip, city, showMap, mapsUrl (Google-Maps-Link).
category, tagsKategorie (Text) und Schlagwörter (Liste).
performersKünstler/Acts als Liste von Namen.
linkswebsite, facebook, instagram, tiktok, youtube (jeweils URL oder null).
galleryWeitere Bilder, jedes im Format von imageSet. images = dieselben Bilder nur als 1200-px-WebP-URLs.
videosListe mit url, provider (youtube/vimeo/null), id, embedUrl (datenschutzfreundlicher Einbettungslink) und thumbnail.

Beispiele

JavaScript (Browser)

const res = await fetch("https://ditix.tools/api/shop-events?shop=DEIN-SHOP&details=1");
const { events } = await res.json();

document.querySelector("#events").innerHTML = events.map(e => `
  <article>
    <img src="${e.imageSet.small}" srcset="${e.imageSet.small} 480w, ${e.imageSet.medium} 1200w" sizes="(max-width: 600px) 100vw, 400px" alt="">
    <h3>${e.name}</h3>
    <p>${e.hideDates ? "Termin siehe Shop" : `${e.startLocal.weekdayShort}, ${e.startLocal.date} · ${e.startLocal.time} Uhr`} · ${e.location ?? ""}</p>
    <p>${e.teaser ?? ""}</p>
    <a href="${e.url}">Tickets</a>
  </article>`).join("");

PHP (z. B. WordPress-Template)

<?php
$json = file_get_contents("https://ditix.tools/api/shop-events?shop=DEIN-SHOP&details=1");
$data = json_decode($json, true);
foreach ($data["events"] as $e) {
  echo "<article>";
  echo "<img src='" . htmlspecialchars($e["imageSet"]["small"]) . "' alt=''>";
  echo "<h3>" . htmlspecialchars($e["name"]) . "</h3>";
  if (!$e["hideDates"]) echo "<p>" . $e["startLocal"]["weekdayShort"] . ", " . $e["startLocal"]["date"] . " · " . $e["startLocal"]["time"] . " Uhr</p>";
  echo "<div>" . $e["description"] . "</div>";   // bereits bereinigtes HTML
  echo "<a href='" . htmlspecialchars($e["url"]) . "'>Tickets</a>";
  echo "</article>";
}

Detailseite für ein Event

GET https://ditix.tools/api/shop-events?shop=DEIN-SHOP&event=vp0y6ogolawelp2b
→ { "shop": "…", "organizer": { … }, "event": { … alle Felder inkl. Details … } }

Caching und Fairness

Die Antworten werden ca. 5 Minuten gecacht (Details 15 Minuten); Änderungen im Shop erscheinen also mit kurzer Verzögerung. Bitte auf eurer Seite ebenfalls cachen (z. B. serverseitig alle paar Minuten abrufen) statt bei jedem Seitenaufruf live anzufragen. Bild-URLs dürfen direkt eingebunden werden — sie liegen auf dem ditix-Bild-CDN und werden dort skaliert.

Fehler

StatusBedeutung
400shop fehlt oder ist ungültig.
404Shop unbekannt bzw. Event nicht gefunden (oder nicht mehr im Vorverkauf).
502ditix vorübergehend nicht erreichbar — bitte später erneut versuchen, gecachte Daten weiterverwenden.

Fehlerantworten sind JSON mit einem Feld error.

Fertiges Widget statt eigener Umsetzung?

Wer keine eigene Darstellung bauen möchte, nutzt das Event-Widget: Liste, Details mit Vorschautext und Layer, Karten, Monatskalender oder Textliste — mit Farben und Suchleiste, per Snippet eingebunden.