REST-API
Mit der Kunden-API pflegen Sie Standorte direkt aus Ihrer Warenwirtschaft, Ihrem CRM oder Ihrem Shop. Dazu gibt es öffentliche Endpunkte, die jede veröffentlichte Karte hat.
Voraussetzungen
- Die Kunden-API und API-Keys gibt es ab dem Tarif Starter (siehe Preise). In anderen Tarifen antwortet die API mit
403underror: "plan_limit". - Den Key legen Sie in der App unter API & Webhooks → API-Key erstellen an. Dafür brauchen Sie das Recht, die API zu verwalten (z. B. Inhaber und Administratoren).
- Der Key wird nur einmal angezeigt. Wir speichern ihn nur als Hash. Behandeln Sie ihn wie ein Passwort und widerrufen Sie ihn, wenn Sie ihn nicht mehr brauchen.
Auf derselben Seite der App finden Sie eine fertige Postman-Sammlung und eine OpenAPI-Datei zum Herunterladen.
Anmeldung
Basis-Adresse: https://app.my-store-locator.com/api/v1/ext
Schicken Sie den Key im Header Authorization (oder alternativ in X-Api-Key):
curl https://app.my-store-locator.com/api/v1/ext/me \
-H "Authorization: Bearer msl_live_IHR-KEY"{ "ok": true, "key": "Warenwirtschaft", "scopes": ["locations:read", "locations:write"] }Die API ist für Server-zu-Server-Aufrufe gedacht. Sie sendet keine CORS-Header - aus dem Browser einer Website heraus funktioniert sie nicht, und der Key gehört auch nicht in den Code einer Website.
Berechtigungen
Beim Anlegen wählen Sie, was der Key darf:
| Berechtigung | erlaubt |
|---|---|
locations:read | Standorte, Kategorien und Status lesen |
locations:write | Standorte lesen, anlegen, ändern und archivieren |
maps:read | Karten auflisten |
leads:read | Anfragen lesen |
Fehlt die Berechtigung, kommt 403 mit error: "scope".
Endpunkte
| Methode | Pfad | Berechtigung | Zweck |
|---|---|---|---|
| GET | /me | jeder Key | Verbindung testen: Name und Berechtigungen des Keys |
| GET | /locations | locations:read | Standorte suchen und blättern |
| GET | /locations/{id} | locations:read | einen Standort lesen |
| POST | /locations | locations:write | Standort anlegen |
| PATCH | /locations/{id} | locations:write | nur die gesendeten Felder ändern |
| DELETE | /locations/{id} | locations:write | Standort archivieren (wie „Löschen“ in der App) |
| GET | /categories | locations:read | Kategorien mit id, name, color |
| GET | /statuses | locations:read | Status mit id, name, color, onMap |
| GET | /maps | maps:read | Karten mit id, name, token, published, theme und Anzahl locations |
| GET | /leads | leads:read | Anfragen, neueste zuerst |
Standorte abrufen
curl "https://app.my-store-locator.com/api/v1/ext/locations?city=Frankfurt&limit=50" \
-H "Authorization: Bearer msl_live_IHR-KEY"| Parameter | Wirkung |
|---|---|
q | Text in Name, Ort oder Straße |
city | Ort (ohne Unterschied von Groß- und Kleinschreibung) |
zip | Postleitzahl, beginnt mit |
country | Ländercode, z. B. DE |
status | ID eines Status (aus /statuses) |
categoryId | ID einer Kategorie (aus /categories) |
updatedSince | nur Standorte, die seit diesem Zeitpunkt geändert wurden (ISO 8601) |
sort | id (Standard), created oder updated; ein - davor sortiert absteigend, z. B. -updated |
limit, offset | blättern; limit 1 bis 500, Standard 100 |
include=photo | Foto mitliefern (kann groß sein) |
Ohne sort ist die Antwort nach id sortiert:
{
"data": [
{
"id": 1003,
"name": "Filiale Frankfurt Mitte",
"street": "Zeil 10",
"zip": "60313",
"city": "Frankfurt am Main",
"state": "Hessen",
"country": "DE",
"lat": 50.1144,
"lon": 8.6843,
"phone": "069 123456",
"email": "frankfurt@example.com",
"website": "https://example.com/frankfurt",
"manager": "",
"description": "",
"timezone": "Europe/Berlin",
"hours": { "mo": ["09:00", "18:00"], "sa": ["10:00", "14:00"], "su": null },
"specialDays": [{ "date": "2026-12-24", "open": "09:00", "close": "13:00", "label": "Heiligabend" }],
"services": ["Parkplatz"],
"tags": ["Neu"],
"custom": {},
"categoryId": 12,
"status": "st_active_7",
"created": "2026-10-20T08:12:00.000Z",
"updated": "2026-10-24T15:40:00.000Z"
}
],
"total": 1,
"limit": 50,
"offset": 0
}Für einen regelmäßigen Abgleich merken Sie sich den Zeitpunkt des letzten Laufs und fragen beim nächsten Mal mit updatedSince nur die Änderungen ab.
Standort anlegen und ändern
curl -X POST https://app.my-store-locator.com/api/v1/ext/locations \
-H "Authorization: Bearer msl_live_IHR-KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Filiale Köln", "street": "Hohe Str. 1", "zip": "50667", "city": "Köln", "country": "DE",
"hours": { "mo": ["09:00", "13:00", "14:00", "18:00"] } }'- Pflicht:
nameundcity(oderzip).countryist ohne AngabeDE. - Koordinaten: Ohne
latundlonsucht unser Kartenserver die Adresse selbst heraus. - Karten: Der neue Standort kommt wie in der App auf alle veröffentlichten Karten. Mit
"maps": [4, 7]legen Sie die Karten selbst fest. - Status: Ohne
statusgilt der erste Status Ihrer Liste. - Antwort:
201mit dem neuen Standort.
Weitere Felder: categoryId, status, state, phone, email, website, manager, description, timezone, hours, specialDays, services, tags, custom, photo.
hours: Tagemobissu, je eine Liste mit bis zu vier UhrzeitenHH:MM(Öffnen, Schließen, bei Mittagspause noch einmal Öffnen, Schließen) odernullfür geschlossen.specialDays: Liste mitdate(JJJJ-MM-TT),open,close, optionalopen2,close2undlabel.services,tags: Listen mit Texten.custom: Werte Ihrer eigenen Felder, Schlüssel = ID des Feldes. Unbekannte Felder werden ignoriert.photo: eine https-Adresse; wir laden das Bild und speichern es selbst, damit die Karte keine fremden Server aufruft.
PATCH /locations/{id} ändert nur die Felder, die Sie schicken. DELETE /locations/{id} archiviert den Standort wie „Löschen“ in der App und antwortet mit { "id": 1003, "deleted": true }.
Schreibende Aufrufe laufen durch dieselben Prüfungen wie die App: Tarifgrenzen, Pflichtfelder, gültige Werte. Im Protokoll des Kontos stehen sie als „API-Key …“ mit dem Namen des Keys.
Limits und Fehler
- 600 Aufrufe pro Minute und Key. Darüber:
429mitRetry-After. - Antworten werden nicht zwischengespeichert (
Cache-Control: no-store).
| Status | error | Bedeutung |
|---|---|---|
| 400 | invalid u. a. | Pflichtfeld fehlt oder Wert ungültig - die message nennt den Grund |
| 401 | unauthorized | Key fehlt, ist falsch oder widerrufen |
| 403 | scope | Key hat die nötige Berechtigung nicht |
| 403 | plan_limit | API nicht im Tarif oder Tarifgrenze erreicht |
| 404 | not_found | Standort nicht gefunden |
| 429 | - | zu viele Aufrufe |
Die message ist deutsch. Mit dem Header X-MSL-Lang: en kommen die meisten Meldungen auf Englisch.
Öffentliche Endpunkte einer Karte
Diese Endpunkte braucht die Karte selbst. Sie funktionieren ohne Key, nur für veröffentlichte Karten aktiver Konten, und sind pro IP-Adresse begrenzt. Der Token ist derselbe wie im Einbettungscode.
| Methode | Pfad | Zweck |
|---|---|---|
| GET | /api/v1/public/maps/{token} | Karte mit Einstellungen, sichtbaren Standorten, Kategorien, Status, öffentlichen eigenen Feldern und Firmendaten (120 pro Minute) |
| POST | /api/v1/public/maps/{token}/leads | Anfrage aus dem Kontaktformular senden: name und email Pflicht, dazu locationId, phone, type, message (ab Tarif Pro, 10 pro Minute) |
Auch diese Endpunkte senden keine CORS-Header. Jeder Abruf der Karte zählt in Ihrer Statistik als Kartenaufruf. Wenn Sie Kartendaten regelmäßig in ein eigenes System übernehmen möchten, nehmen Sie besser die Kunden-API.
Webhooks per API
Plattformen wie Zapier, Make und n8n legen Webhooks selbst an und entfernen sie wieder. Der API-Key braucht dafür die Berechtigung webhooks:write.
| Methode | Pfad | Zweck |
|---|---|---|
POST | /webhooks | Webhook anlegen: url (öffentliche https-Adresse), events (Liste), optional name, format (json, slack, discord) |
GET | /webhooks | Webhooks auflisten, die mit diesem Key angelegt wurden |
DELETE | /webhooks/{id} | Webhook entfernen |
Mögliche Ereignisse: location.created, location.updated, location.deleted, map.published, lead.created, import.finished. Die Antwort auf POST enthält einmalig das secret zum Prüfen der Signatur. Details unter Webhooks.
OpenAPI-Datei
Die vollständige Beschreibung der API liegt öffentlich unter https://app.my-store-locator.com/api/v1/ext/openapi.json (Deutsch mit ?lang=de). Sie lässt sich direkt in Postman, Swagger UI oder die Importfunktion vieler Plattformen laden.
Probieren Sie es mit Ihren eigenen Standorten aus.
Konto anlegen, Standorte importieren, Karte einbinden. Der Free-Plan bleibt kostenlos - Pro können Sie 14 Tage testen.