Für Entwickler
Schnittstelle.
Drei Wege, PLAN mit einem anderen System zu verbinden: Daten lesen, Aussteller einspeisen, die Besucherkarte einbetten. Diese Seite zeigt alle drei mit lauffähigen Beispielen gegen eine echte, öffentliche Veranstaltung.
Überblick
Jede Veranstaltung in PLAN hat zwei unabhängige Adressen: eine für die Ausstellerseite (Wunschstände, Anfragen) und eine für die öffentliche Besucherkarte. Diese Schnittstelle dreht sich ausschließlich um die zweite, die Besucherkarte — Sie finden ihre Adresse im Admin unter Einstellungen → Schnittstelle, je Veranstaltung.
Lesen
Aussteller, Stände und Kategorien einer veröffentlichten Karte abrufen — öffentlich, ohne Schlüssel.
Einspeisen
Aussteller aus Ihrem eigenen System automatisch in PLAN anlegen und aktualisieren — mit einem Schlüssel.
Einbetten
Die Besucherkarte oder einen einzelnen Stand in eine eigene Seite einbinden.
Grundlagen
Alle Beispiele auf dieser Seite laufen gegen die Demo-Veranstaltung demo-hausmesse-2027 unter der Basis-Adresse https://plan.standwert.info. Ersetzen Sie sie durch die Adresse Ihrer eigenen Veranstaltung.
Alle Antworten sind application/json, nie eine HTML-Fehlerseite. Listen kommen als { "data": [...] }, die Ausstellerliste zusätzlich mit meta.count. Ein Fehler sieht immer so aus:
{ "error": { "code": "not_found", "message": "Keine veroeffentlichte Karte unter dieser Adresse." } }Bei einer vorübergehenden Störung antworten alle Lese-Routen mit 503 und dem Code unavailable. Diese Antwort wird nicht zwischengespeichert (Cache-Control: no-store, kein ETag) und enthält nie eine Teilantwort; die Meldung nennt eine kurze Kennung für Rückfragen. Ein Fremdsystem behält bei 503 seinen bisherigen Bestand und ruft später erneut ab. Eine leere Liste bedeutet nur dann „nichts vorhanden“, wenn die Antwort 200 war.
Die Lese-Routen antworten mit offenem CORS (Access-Control-Allow-Origin: *) — eine fremde Seite darf sie direkt aus dem Browser per fetch() aufrufen. Die Einspeisung (Abschnitt weiter unten) tut das bewusst nicht, dazu dort mehr.
Die Lese-Antworten sind eine Minute lang zwischenspeicherbar (Cache-Control: public, s-maxage=60) und tragen einen ETag. Ein Aufruf mit passendem If-None-Match bekommt 304 Not Modified ohne Antworttext zurück — nützlich für einen Abgleich, der oft nachschaut, aber selten etwas Neues findet.
Lesen
Fünf Adressen, alle mit GET, alle öffentlich und ohne Schlüssel — dieselben Daten, die auch die öffentliche Besucherkarte zeigt, nur als JSON statt als Seite. Nur veröffentlichte Karten antworten; alles andere (falsche Adresse, noch nicht veröffentlicht, oder eine Karte in der Zugangsart „Nur eingebettet“) liefert 404, ohne zu verraten, welcher Fall vorliegt.
Nicht enthalten: alles, was ausschließlich für den Veranstalter oder einen bewerbenden Aussteller gedacht ist — Mailadressen, Ansprechpersonen, Anfragen, Fristen. Eine Firma, deren Name auf dem Plan nicht öffentlich sichtbar sein soll (Einstellung im Admin je Aussteller), fehlt vollständig, nicht nur mit leeren Feldern.
1. Die Veranstaltung
Name, Veranstalter, Hallen und Zahl der Aussteller.
curl -s https://plan.standwert.info/api/v1/karten/demo-hausmesse-2027{
"slug": "demo-hausmesse-2027",
"name": "Demo Hausmesse 2027",
"organizer": { "name": "Werbeagentur FETZ", "logoUrl": "https://assets.standwert.info/..." },
"halls": [
{ "id": "85aee9eb-5bb1-459f-bdef-0009f567dd9b", "name": "Ausstellung", "order": 1 },
{ "id": "8f8f014e-0ee0-40dc-8ace-88dfe49cabaa", "name": "Foyer", "order": 2 }
],
"exhibitorCount": 44,
"updated": "2026-09-22T11:31:50.768Z"
}halls[].order ist die Reihenfolge, in der der Veranstalter die Hallen sortiert hat — dieselbe wie auf der Besucherkarte selbst, nicht alphabetisch. updated ist der Zeitpunkt, zu dem diese Antwort erzeugt wurde, kein echter Änderungszeitstempel — in Verbindung mit der Cache-Zeit von einer Minute ist die Aussage „so aktuell wie vor höchstens einer Minute", nicht „seitdem hat sich etwas geändert".
2. Ausstellerverzeichnis
Nur Firmen, die auf einer bestätigten oder optionierten Fläche stehen und deren Name der Veranstalter öffentlich sichtbar geschaltet hat, sortiert nach Name. Drei optionale Filter, kombinierbar:
?q=<text>?halle=<hallId>hallId aus Route 1.?kategorie=<valueId>valueId aus Route 5.curl -s "https://plan.standwert.info/api/v1/karten/demo-hausmesse-2027/aussteller?q=alpin"{
"data": [
{
"id": "bcbb54e6-9410-4257-91ea-3dfe0cd9d7b6",
"name": "Alpin Textil",
"logoUrl": "https://assets.standwert.info/demo/logos/alpin-textil-6615d458.svg",
"description": "Funktionsbekleidung aus Vorarlberger Fertigung.",
"website": "https://alpintextil.at",
"profileUrl": null,
"stand": {
"code": "N13",
"hallId": "85aee9eb-5bb1-459f-bdef-0009f567dd9b",
"hallName": "Ausstellung"
},
"categories": [
{
"id": "8fc7ab3c-0e6b-49bb-bb9c-82d309695524",
"name": "Angebot",
"order": 0,
"colorsMap": true,
"searchOnly": false,
"values": [
{ "id": "8cfe4644-a77e-4d37-9c39-5270548d6ccd", "name": "Mode", "parentId": null, "color": "#6b3f8a", "order": 11 }
]
}
]
}
],
"meta": { "count": 1 }
}categories sind die Kategorien dieser Firma (Details in Route 5) — eine Firma ohne Zuordnung liefert ein leeres Array, kein fehlendes Feld. colorsMap sagt, ob diese Kategorie die Standflächen auf der Besucherkarte einfärbt (höchstens eine je Veranstaltung). searchOnly sagt, dass diese Kategorie auf der Besucherkarte nicht als Filter angeboten wird, sondern nur über die Suche und am Ausstellerprofil zu finden ist.
profileUrl ist der Link zum Profil dieses Ausstellers in Ihrem EIGENEN Verzeichnis — null, wenn der Veranstalter keine Adresse hinterlegt hat oder diese Firma keine passende Kennung aus Ihrer Einspeisung trägt. Siehe Abschnitt „Der Rückweg" weiter unten.
3. Einzelner Aussteller
Dieselben Felder wie ein Eintrag aus Route 2, ohne data-Hülle. Die id ist die Firmen-ID aus Route 2.
curl -s https://plan.standwert.info/api/v1/karten/demo-hausmesse-2027/aussteller/bcbb54e6-9410-4257-91ea-3dfe0cd9d7b6404, wenn es diese ID nicht gibt — und ebenso, wenn es die Firma zwar gibt, ihr Name aber nicht öffentlich sichtbar ist oder sie gerade keine Fläche hat. Beide Fälle liefern dieselbe Antwort, aus demselben Grund wie bei der Veranstaltung selbst.
4. Standflächen
Alle Standflächen mit Geometrie und Zustand, wie die Besucherkarte sie zeichnet — für einen eigenen, kleinen Plan auf einer fremden Detailseite.
curl -s https://plan.standwert.info/api/v1/karten/demo-hausmesse-2027/staende{
"data": [
{
"id": "ca1355dd-440e-4611-a3c7-c6b0362b2100",
"hallId": "8f8f014e-0ee0-40dc-8ace-88dfe49cabaa",
"hallName": "Foyer",
"code": "Foyer 2",
"rowLabel": "F",
"x": 532, "y": 273, "w": 95, "h": 96, "rotation": 0,
"flaechen": [{ "x": 532, "y": 273, "w": 95, "h": 96 }],
"state": "booked",
"occupant": "Sparkasse Kremstal",
"occupantBranch": "Finanzen"
}
]
}state ist eines von free, option, booked, inactive. x/y/w/h sind Koordinaten im Koordinatensystem der Halle — diese Route liefert keinen Hallenhintergrund dazu. occupant/occupantBranch sind null, solange die Fläche frei ist oder der Name der Firma nicht öffentlich sichtbar ist. rowLabel sind die führenden Großbuchstaben der Standnummer und ist null, wenn die Nummer nicht mit einem Großbuchstaben beginnt.
Ein Stand ist immer genau ein Eintrag mit einer Standnummer und einer Belegung. Besteht seine Fläche aus mehreren getrennten Teilen, umschließen x/y/w/h alle Teile (einschließlich des Gangs dazwischen), und flaechen nennt den Rahmen jedes einzelnen Teils, den ersten zuerst. Bei einem Stand aus einer Fläche enthält flaechen genau einen Eintrag, gleich x/y/w/h.
5. Kategorien
Die Kategorien der Veranstaltung samt ihren Werten (höchstens zwei Ebenen, parentId) — dieselben, die die Besucherkarte als Filterleiste zeigt, hier als flache Liste.
curl -s https://plan.standwert.info/api/v1/karten/demo-hausmesse-2027/kategorien{
"data": [
{
"id": "8fc7ab3c-0e6b-49bb-bb9c-82d309695524",
"name": "Angebot",
"order": 0,
"colorsMap": true,
"searchOnly": false,
"values": [
{ "id": "338c7974-399c-46d2-a78a-b8860050192c", "name": "Bau", "parentId": null, "color": "#4a5560", "order": 0 },
{ "id": "8cfe4644-a77e-4d37-9c39-5270548d6ccd", "name": "Mode", "parentId": null, "color": "#6b3f8a", "order": 11 }
]
}
]
}values[].id ist der Wert, der bei Route 2 als ?kategorie= übergeben wird. color ist nur bei einfärbenden Kategorien häufig gesetzt — ein Wert ohne eigene Farbe fällt auf der Besucherkarte auf eine feste Reihe zurück, die diese Route nicht mitliefert.
Einspeisen
Die Kehrseite des Lesens: statt Daten aus PLAN zu holen, füttert Ihr System Aussteller automatisch in PLAN hinein — für eine Veranstaltung, die ihre Aussteller ohnehin schon in einer eigenen Software pflegt, damit niemand sie ein zweites Mal von Hand einträgt.
Basis-Adresse: https://plan.standwert.info/api/v1/einspeisung/<Adresse-der-Karte> — dieselbe Adresse wie beim Lesen. Anders als dort wird eine veröffentlichte Karte hier nicht verlangt: die Einspeisung funktioniert bereits während der Vorbereitung, bevor irgendetwas öffentlich ist. Drei Methoden: PUT und DELETE für einen einzelnen Aussteller, POST für eine ganze Liste.
Zugang
Jeder Aufruf braucht einen Schlüssel im Kopf Authorization. Der Veranstalter erzeugt ihn im Admin unter Einstellungen → Schnittstelle — der Klartext erscheint dort genau einmal, direkt nach dem Erstellen.
Authorization: Bearer pk_c7a3054aa9b0c54da44de727b046d9670c3fedc83e2a6db4c0294afa52711bd9Vier Fälle scheitern, bevor irgendetwas geschrieben wird:
401403404429Jeder Schlüssel gehört einer Organisation, nicht einer einzelnen Veranstaltung — er gilt für alle Veranstaltungen dieses Kontos, auch künftige. Jeder Aufruf, auch ein fehlgeschlagener, aktualisiert das Datum „Zuletzt genutzt" in der Schlüsselliste im Admin — so sehen Sie, ob eine Anbindung überhaupt noch läuft.
Anlegen und aktualisieren
Jeder Aussteller wird über eine externe Kennung Ihres Systems identifiziert — derselbe Aufruf zweimal ändert nichts. Gibt es schon einen Aussteller mit dieser Kennung, wird er aktualisiert statt verdoppelt. Felder, die bei einem Aufruf fehlen, bleiben unangetastet — ein Abgleich, der ein Logo nicht mitführt, löscht kein im Admin gepflegtes Logo. Die Kennung gilt dabei nur innerhalb Ihres eigenen Kontos — ein anderes Konto mit derselben Kennung berührt Ihre Aussteller nicht.
curl -X PUT https://plan.standwert.info/api/v1/einspeisung/<Adresse-der-Karte>/aussteller/<Ihre-Kennung> \
-H "Authorization: Bearer pk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Musterfirma GmbH",
"logoUrl": "https://ihr-system.example/logos/musterfirma.png",
"description": "Heizung, Sanitär, Photovoltaik.",
"website": "https://musterfirma.example",
"branch": "Handwerk",
"categories": ["Handwerk", "Photovoltaik"],
"standCode": "C40",
"publicOnPlan": true
}'namePflichtlogoUrldescriptionwebsitebranchcategoriesstandCodepublicOnPlanfalse bei einer neuen Firma. Fehlt das Feld bei einer bestehenden Firma, bleibt eine im Admin gesetzte Freigabe unangetastet.Antwort — 201, wenn die Firma neu angelegt wurde, sonst 200:
{
"externalId": "ext-4711",
"companyId": "76e4c07a-d97e-4582-84d4-fc8d0c050c17",
"standBooked": true,
"unknownCategories": ["Photovoltaik"]
}Kategorien, die es nicht gibt, werden nicht stillschweigend angelegt. „Handwerk" traf eine vorhandene Kategorie und wurde übernommen; „Photovoltaik" gab es nicht und kommt als Warnung in unknownCategories zurück — der Rest der Antwort ist trotzdem erfolgreich. Eine fehlende Kategorie legt der Veranstalter im Admin an (Reiter „Aussteller"), danach greift derselbe Aufruf.
Einen Aussteller nur anlegen, ohne einen Stand zu buchen: standCode einfach weglassen.
Ein Stand wird gebucht
standCode bucht — eine echte Reservierung, kein Vormerken:
freidieselbe Firmaandere Firma409stand_taken mit einer Meldung, wer den Stand hält — nichts wird verändert, auch nicht die übrigen Felder dieses Aufrufs.unbekannt404stand_not_found — Standnummer gibt es in dieser Veranstaltung nicht.Anlegen/Aktualisieren der Firma und das Buchen des Stands laufen in einer Transaktion — entweder geht alles durch, oder nichts.
PUT, POST noch DELETE verschicken eine Mail. Die Vergabeentscheidung ist in Ihrem System längst gefallen — eine „Dein Stand ist gebucht"-Mail Wochen danach würde genau die Rückfrage erzeugen, die PLAN abschaffen soll.Liste für den täglichen Abgleich
Dieselben Objekte wie bei PUT, als Liste (jedes mit eigenem externalId-Feld), höchstens 200 je Aufruf.
curl -X POST https://plan.standwert.info/api/v1/einspeisung/<Adresse-der-Karte>/aussteller \
-H "Authorization: Bearer pk_..." \
-H "Content-Type: application/json" \
-d '[
{ "externalId": "ext-4711", "name": "Musterfirma GmbH", "standCode": "C40" },
{ "externalId": "ext-4712", "name": "Zweitfirma KG", "standCode": "C41" }
]'Antwort immer 200 (die Anfrage selbst war gültig) — was je Eintrag geschah, steht in data. Ein fehlerhafter Eintrag reißt die anderen nicht mit.
{
"data": [
{ "externalId": "ext-4711", "ok": true, "companyId": "...", "standBooked": true, "unknownCategories": [] },
{ "externalId": "ext-4712", "ok": false, "error": { "code": "stand_taken", "message": "Stand \"C41\" ist bereits von \"Andere Firma\" belegt." } }
],
"meta": { "count": 2, "succeeded": 1, "failed": 1 }
}Für einen täglichen Cron-Abgleich reicht ein Aufruf mit allen aktuellen Ausstellern — dank der externen Kennung ändert ein unveränderter Datensatz nichts, nur echte Änderungen (neuer Aussteller, neue Standnummer, neues Logo) wirken sich aus:
curl -sf -X POST "https://plan.standwert.info/api/v1/einspeisung/<Adresse-der-Karte>/aussteller" \
-H "Authorization: Bearer $PLAN_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @aussteller-export.json \
| jq '.meta'
# { "count": 148, "succeeded": 146, "failed": 2 }failed mit mehr als ein paar Einträgen ist ein Signal: entweder wurden Stände doppelt vergeben, oder die Kategorienliste ist zwischen Ihrem System und PLAN auseinandergelaufen (unknownCategories in der jeweiligen Zeile zeigt, welche).
Entfernen
Nimmt eine Firma aus dieser Veranstaltung: die Buchung wird zurückgenommen und ihre Kategorienzuordnung entfernt. Die Firma selbst bleibt bestehen — sie kann auf einer anderen Veranstaltung desselben Kontos stehen, und ihre externe Kennung bleibt für einen späteren erneuten Aufruf gültig.
curl -X DELETE https://plan.standwert.info/api/v1/einspeisung/<Adresse-der-Karte>/aussteller/<Ihre-Kennung> \
-H "Authorization: Bearer pk_..."{ "externalId": "ext-4711", "companyId": "76e4c07a-d97e-4582-84d4-fc8d0c050c17", "removed": true }404, wenn diese Kennung bei Ihrer Organisation nie bekannt war.
Einbetten
Die Besucherkarte lässt sich als Ganzes einbinden (siehe Reiter Besucherkarte im Admin einer Veranstaltung), oder gezielt auf eine einzelne Standfläche zeigen — der Baustein für eine fremde Aussteller-Detailseite, die neben ihrem eigenen Text einen kleinen, lebenden Ausschnitt der Besucherkarte zeigen will.
Tieflinks
?stand=<code>?aussteller=<id>externalId).?staende=<code>,<code>,...?stand= schlägt ?aussteller= und ?staende=, wenn mehrere gesetzt sind. Groß-/Kleinschreibung der Standnummer spielt keine Rolle. Ein unbekannter Code oder eine unbekannte ID ist kein Fehler — die Karte lädt normal, mit der üblichen Startansicht.
https://plan.standwert.info/m/demo-hausmesse-2027?stand=N13Der Rückweg funktioniert genauso: hat der Veranstalter eine Adresse zu Ihrem eigenen Ausstellerverzeichnis hinterlegt, zeigt das Ausstellerprofil auf der Besucherkarte statt „Website besuchen" den Knopf „Zum digitalen Profil" — er führt direkt auf die Profilseite der Firma in Ihrem System, über deren externalId. Das stellt der Veranstalter im Admin einmal für die ganze Karte ein, nicht Sie und nicht je Aussteller — siehe profileUrl in Route 2/3 der Lese-Schnittstelle.
Ein Rahmen für einen Stand
Derselbe Tieflink, im schmalen Einbett-Rahmen ohne Kopfzeile, Suche und Filter — zusammen mit ?stand= ergibt das einen ruhigen Ausschnitt für eine fremde Detailseite.
<iframe
src="https://plan.standwert.info/m/demo-hausmesse-2027/einbetten?stand=N13&suche=0&filter=0"
style="width:100%;aspect-ratio:16/9;min-height:480px;border:0"
loading="lazy"
allow="clipboard-write; web-share"
title="Lage von Stand N13"
></iframe>Breite und Höhe des Rahmens bestimmt Ihre Seite; die Karte passt sich jeder Größe an. Eine Grenze gibt es: Merkliste und Ausstellerdetail öffnen sich innerhalb des Rahmens und werden nie höher als er. Ein reines Seitenverhältnis wie 16/9 ergibt am Telefon nur rund 200 Pixel Höhe — deshalb die Mindesthöhe im Beispiel. Den Rahmen nicht zusätzlich in einen Seitenverhältnis-Kasten setzen (etwa .ratio in Bootstrap), der hält ihn auf dem flachen Format fest.
Dieselbe Zugangsregel wie bei der Besucherkarte selbst: veröffentlicht oder mit gültigem Vorschau-Link, sonst 404 — ein Tieflink umgeht keine Schranke, die die Adresse ohnehin nicht hergibt. Läuft die Karte in der Zugangsart „Nur eingebettet“, öffnet sich dieser Rahmen nur auf einer Ihrer eingetragenen Webseiten — die eigenständige Adresse antwortet dort immer mit 404.
?kopf= ist seit dem 25.09.2026 umgedreht: die Kopfzeile (Veranstaltungsname, Ihr Logo) ist jetzt standardmäßig AUS — der Rahmen soll wie ein Teil Ihrer eigenen Seite wirken. Suche, Rundgang und Merkliste verschwinden dabei nicht: eine Lasche mit Filtersymbol rechts oben an der Zeichenfläche schiebt eine Seitenleiste mit allen dreien herein und wieder hinaus, der Plan wird dabei schmaler, nicht überdeckt. Ein bestehender Einbett-Code mit eigener Kopfzeile davor bleibt unverändert: ?kopf=1 holt das alte Aussehen zurück.
Vorschau
Standardmäßig zeigt der Rahmen die vollständige, bedienbare Karte. Mit ?vorschau=1 zeigt er stattdessen nur die Zeichenfläche selbst — randlos, ohne Bedienung, mit durchsichtigem Hintergrund, wie ein großflächiges Bild auf Ihrer Seite. Ein Klick irgendwo im Rahmen öffnet die vollständige Karte, innerhalb desselben <iframe>. Zeigt die Vorschau den Geländeplan, sind die einzelnen Hallen direkt anklickbar: ein Klick auf eine Halle öffnet die vollständige Karte gleich IN dieser Halle, ein Klick irgendwo sonst auf der Fläche weiterhin die Übersicht.
Passend dazu aspect-ratio statt einer festen Höhe: ohne Seitenleiste bestimmt allein das Seitenverhältnis des Plans, wie hoch der Rahmen wirken soll.
<iframe
src="https://plan.standwert.info/m/demo-hausmesse-2027/einbetten?vorschau=1"
loading="lazy"
style="width:100%;aspect-ratio:16 / 10;border:0"
title="Hallenplan – Ihre Veranstaltung"
></iframe>Beim Öffnen meldet die Karte zusätzlich eine Nachricht an die Gastgeberseite — falls Sie den Rahmen im selben Moment vergrößern wollen:
{ "source": "standwert-plan", "type": "karte-geoeffnet" }In der Vorschau selbst wirkt keine der übrigen Stellschrauben: sie ist ein Bild, kein Tieflink und keine übergebene Auswahl. Die Zusätze bleiben an der Adresse stehen und greifen in dem Moment, in dem der Besucher die Karte öffnet. Soll eine übergebene Auswahl schon vorher sichtbar sein — etwa die Treffer Ihrer eigenen Suche —, binden Sie den Rahmen ohne ?vorschau=1 ein.
Merken-Ereignis
Die Besucherkarte hat eine eigene Merkliste (Stern am Stand). Läuft die Karte in einem <iframe>, meldet jedes Merken/Vergessen zusätzlich eine Nachricht an die Gastgeberseite — damit kann Ihr System den Aussteller in eine eigene Merkliste eintragen, mit einer eigenen Sitzung, ohne dass PLAN dafür ein Konto oder eine Nutzerverwaltung braucht.
{
"source": "standwert-plan",
"type": "merkliste",
"action": "add",
"stand": "C40",
"hall": "Halle 1",
"exhibitor": { "id": "76e4c07a-d97e-4582-84d4-fc8d0c050c17", "name": "Musterfirma GmbH", "externalId": null }
}action ist "add" (gemerkt) oder "remove" (entfernt). stand ist nur je Halle eindeutig, nicht veranstaltungsweit — hall daneben nennt deshalb beide. Das Ereignis feuert nur bei einer tatsächlichen Handlung (Klick auf den Stern), nicht beim Laden der Karte, und nicht außerhalb eines <iframe>.
So hören Sie zu:
<iframe
id="plan"
src="https://plan.standwert.info/m/demo-hausmesse-2027/einbetten"
allow="clipboard-write; web-share"
></iframe>
<script>
window.addEventListener("message", (event) => {
// Wichtig: event.origin prüfen, bevor event.data vertraut wird -- jede Seite im Browser
// kann eine Nachricht an dieses Fenster schicken, nicht nur das eigene <iframe>.
if (event.origin !== "https://plan.standwert.info") return;
const msg = event.data;
if (!msg || msg.source !== "standwert-plan" || msg.type !== "merkliste") return;
if (msg.action === "add") {
meineMerkliste.hinzufuegen(msg.exhibitor.id, msg.stand, msg.hall);
} else {
meineMerkliste.entfernen(msg.exhibitor.id);
}
});
</script>Geteilte Merkliste auf Ihrer Seite öffnen
Ein Besucher kann seine Merkliste per Link oder QR-Code auf ein zweites Gerät übertragen. Bei einer öffentlichen Karte führt dieser Link auf die Karte selbst. Bei der Freigabe „Nur eingebettet“ führt er auf die Seite, in der die Karte eingebunden ist, ergänzt um ?merk=… — dafür braucht Ihre Seite zwei Dinge.
Erstens trägt der Rahmen referrerpolicy="no-referrer-when-downgrade". Ohne diesen Zusatz übermittelt der Browser der Karte nur Ihre Domain, nicht die Unterseite, und der Link zeigt auf Ihre Startseite. Zweitens reicht Ihre Seite den Wert aus ihrer eigenen Adresse an den Rahmen weiter; die Karte übernimmt die Einträge dann in die Merkliste des Besuchers.
<iframe
id="plan"
src="https://plan.standwert.info/m/demo-hausmesse-2027/einbetten"
referrerpolicy="no-referrer-when-downgrade"
allow="clipboard-write; web-share"
></iframe>
<script>
var merk = new URLSearchParams(location.search).get("merk");
if (merk) {
var rahmen = document.getElementById("plan");
var adresse = new URL(rahmen.src);
adresse.searchParams.set("merk", merk);
rahmen.src = adresse.toString();
}
</script>Öffnet sich die Karte bei Ihnen erst auf Knopfdruck in einem Fenster, öffnen Sie dieses Fenster zusätzlich selbst, sobald merk in der Adresse steht. Ist die Karte auf mehreren Unterseiten eingebunden, zeigt der Link auf die Unterseite, auf der der Besucher ihn erzeugt hat — das Weiterreichen gehört dann auf jede dieser Seiten.
Auswahl von außen
Filtern Sie Ihr eigenes Ausstellerverzeichnis — etwa nach Kategorie oder Suchbegriff — und wollen das Ergebnis im Hallenplan sehen? Übergeben Sie der Karte nur diese Auswahl: dieselben Aussteller bleiben kräftig, alle anderen verblassen — genau wie bei einer Suche in der Karte selbst, nur eingegeben bei Ihnen statt in der Karte. Eine zusätzliche Suche in der Karte schränkt die Auswahl weiter ein, statt sie zu ersetzen.
Beim Laden, für einen neu geöffneten Rahmen oder Tab:
https://plan.standwert.info/m/demo-hausmesse-2027?nur=1225783,998877Oder, während die Karte bereits offen ist, per Nachricht an den Rahmen — etwa wenn sich Ihr eigener Filter ändert, ohne dass die Karte neu geladen werden muss:
<iframe id="plan" src="https://plan.standwert.info/m/demo-hausmesse-2027/einbetten"></iframe>
<script>
document.getElementById("plan").contentWindow.postMessage(
{ source: "standwert-plan", type: "auswahl", aussteller: ["1225783", "998877"] },
"https://plan.standwert.info",
);
</script>aussteller ist eine Liste von Kennungen (externalId) — die Nummer, unter der ein Aussteller in PLAN geführt wird. Sie stammt aus dem System, aus dem die Ausstellerdaten kommen, und ist dieselbe Nummer, die die Lese-Schnittstelle zurückgibt und die in einem Tieflink steht. Eine leere Liste hebt die Auswahl wieder auf und zeigt wieder alle Aussteller. Eine Kennung, die es nicht gibt, wird übergangen; trifft keine einzige, bleibt die Karte unverändert und zeigt alles — statt einer leeren Karte ohne Erklärung. Läuft die Karte nicht in einem Rahmen, bleibt nur der Adress-Parameter wirksam.
Vollständiges Beispiel
Offen bleibt an einem Sende-Schnipsel meist nur eines: woher die Nummern kommen und wann sie gesendet werden. Ein tragfähiges Muster: die Kennung steht als Attribut an jedem Eintrag der Trefferliste, vor dem Senden werden die sichtbaren Einträge ausgelesen, gesendet wird nach jeder Änderung der Liste.
<!-- 1. Trefferliste der Website: jeder Eintrag traegt die Kennung des Ausstellers -->
<ul id="treffer">
<li data-aussteller="1225783">ACA GmbH …</li>
<li data-aussteller="1369652">AckerTech …</li>
</ul>
<!-- 2. Der Plan. Beim ERSTEN Laden gehen die Treffer ueber die Adresse mit (?nur=),
spaeter per Nachricht -- so ist die Karte nie kurz "alles". -->
<iframe id="plan"
src="https://plan.standwert.info/m/demo-hausmesse-2027/einbetten?nur=1225783,1369652"
></iframe>
<script>
var plan = document.getElementById("plan");
// 3. Kennungen der gerade sichtbaren Treffer.
function sichtbareNummern() {
return Array.prototype.slice
.call(document.querySelectorAll("#treffer [data-aussteller]"))
.filter(function (el) { return el.offsetParent !== null; })
.map(function (el) { return el.getAttribute("data-aussteller"); });
}
// 4. Nach jeder Aenderung der Liste senden (Suche, Filter, Nachladen).
function planAktualisieren() {
plan.contentWindow.postMessage(
{ source: "standwert-plan", type: "auswahl", aussteller: sichtbareNummern() },
"https://plan.standwert.info"
);
}
// Gibt es auf der Seite ein eigenes Ereignis dafuer, genuegt das:
// document.addEventListener("suche:fertig", planAktualisieren);
// Sonst die Liste beobachten -- das erfasst jede Aenderung, unabhaengig von ihrer Quelle:
new MutationObserver(planAktualisieren)
.observe(document.getElementById("treffer"), { childList: true, subtree: true });
</script>Zwei Hinweise dazu: Eine Nachricht an einen Rahmen, der noch lädt, geht verloren — der erste Stand gehört deshalb in die Adresse (?nur=), nicht in eine Nachricht. Und sichtbareNummern() liest den sichtbaren Zustand der Liste aus, nicht die Filterlogik dahinter: die Karte zeigt damit genau das, was auf der Seite steht, ohne dass dieselbe Regel an zwei Stellen gepflegt werden muss.