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.
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, …).
| Parameter | Bedeutung |
|---|---|
shop | Pflicht. Subdomain, Host oder volle URL des Shops. |
details=1 | Ergänzt je Event Beschreibung, Vorschautext, Einlass, Adresse, Künstler, Kategorie, Galerie, Videos, Links. Etwas langsamer beim ersten Abruf (danach gecacht). |
event=CODE | Genau ein Event (Code aus der Event-URL …/event/CODE oder die id), immer mit Details. Antwort enthält event statt events. |
canceled=0 | Abgesagte 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.
{
"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"
}
| Feld | Inhalt |
|---|---|
id, code | Eindeutige ID bzw. der kurze Code aus der Event-URL. |
name | Titel der Veranstaltung. |
url | Eventseite im Shop (Ticketkauf). shopUrl = Startseite des Shops. |
state, canceled | ACTIVE oder CANCELED; canceled als Boolean. |
start, end | Beginn/Ende als Unix-Zeit in Millisekunden (UTC). |
startLocal, endLocal | Fertig 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). |
isMultiDay | true bei mehrtägigen Events (z. B. Dauerkarte). |
hideDates | true, wenn der Veranstalter das Datum im Shop ausblendet — dann kein Termin anzeigen. |
location | Name des Veranstaltungsorts. |
image, imageSmall | Titelbild als WebP, 1200 px bzw. 480 px breit. |
imageSet | Alle 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. |
details=1 oder event=CODE| Feld | Inhalt |
|---|---|
description | Beschreibung als HTML — bereinigt auf Absätze, Fett/Kursiv, Listen, Überschriften und Links. Kann direkt in die Seite eingesetzt werden. |
descriptionText | Dieselbe Beschreibung als reiner Text (ohne HTML). |
teaser | Vorschautext, max. 200 Zeichen, an Wortgrenze gekürzt. |
admission, admissionLocal | Einlass, falls abweichend vom Beginn gepflegt (sonst null). Format wie startLocal. |
address | Adresse als eine Zeile, z. B. Hans-Böckler-Straße 1, 56070 Koblenz. |
locationDetail | name, street, houseNr, zip, city, showMap, mapsUrl (Google-Maps-Link). |
category, tags | Kategorie (Text) und Schlagwörter (Liste). |
performers | Künstler/Acts als Liste von Namen. |
links | website, facebook, instagram, tiktok, youtube (jeweils URL oder null). |
gallery | Weitere Bilder, jedes im Format von imageSet. images = dieselben Bilder nur als 1200-px-WebP-URLs. |
videos | Liste mit url, provider (youtube/vimeo/null), id, embedUrl (datenschutzfreundlicher Einbettungslink) und thumbnail. |
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
$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>";
}
GET https://ditix.tools/api/shop-events?shop=DEIN-SHOP&event=vp0y6ogolawelp2b
→ { "shop": "…", "organizer": { … }, "event": { … alle Felder inkl. Details … } }
| Status | Bedeutung |
|---|---|
400 | shop fehlt oder ist ungültig. |
404 | Shop unbekannt bzw. Event nicht gefunden (oder nicht mehr im Vorverkauf). |
502 | ditix vorübergehend nicht erreichbar — bitte später erneut versuchen, gecachte Daten weiterverwenden. |
Fehlerantworten sind JSON mit einem Feld error.
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.