Sandbox (Testmodus)
Mit der Sandbox probieren Sie die API aus, ohne Ihre echten Daten zu berühren. Sie ist eine eigene Test-Organisation mit erfundenen Musterdaten; Test-Tokens sehen ausschließlich diese Daten — nie Ihre echten, und echte Tokens sehen nie die Sandbox. Die Trennung sichert die Datenbank, nicht nur die Anwendung.
In vier Schritten zur ersten Antwort
| Schritt | Was Sie tun |
|---|---|
| 1 | Administration → API-Zugänge → Sandbox: Sandbox anlegen (API-Zugang muss aktiv sein, auch in der Testzeit). |
| 2 | Test-Token erzeugen (Präfix m2h_test_, optional mit Scope webhooks:manage) und sofort kopieren: Es wird nur einmal angezeigt. |
| 3 | Mit dem Test-Token lesen: GET /v1/locations. Der Antwortkopf X-M2H-Sandbox: true bestätigt die Sandbox. |
| 4 | Webhook anlegen und mit POST /v1/sandbox/events ein Ereignis auslösen (siehe unten). |
So starten Sie
Unter Administration → API-Zugänge → Sandbox die Sandbox anlegen (Recht „API-Zugänge: Vollzugriff“, höchstens eine je Organisation) und ein Test-Token erzeugen. Sie gehört zum Zusatzmodul „API-Zugänge“ und ist nur nutzbar, solange der API-Zugang aktiv ist (kostenlose Testzeit oder Buchung); die Nutzung in der Testzeit ist keine Buchung und ändert keine Preise. Ohne aktiven Zugang lässt sich keine Sandbox anlegen, und eine bestehende ist gesperrt: Ein gültiges Test-Token erhält dann `403 sandbox_unavailable` mit Hinweis auf das Zusatzmodul (ein ungültiges Token weiter `401`); mit aktivem Zugang funktioniert dasselbe Token wieder.
curl -H "Authorization: Bearer m2h_test_…" https://api.manage2hero.com/v1/locationsDie Adresse ist dieselbe wie für echte Tokens. Die Sandbox erkennen Sie am Präfix m2h_test_ des Tokens und am Antwortkopf X-M2H-Sandbox: true, den jede Antwort auf ein Test-Token trägt. Test-Tokens gelten in jeder Umgebung (Produktion, Staging, Entwicklung); die Sandbox liegt jeweils in der Datenbank der Umgebung.
Was die Sandbox enthält
Eine Firma, zwei Standorte, drei Garagentypen, 20 Einheiten (zwölf vermietet, zwei reserviert, eine gesperrt, fünf frei), zwölf Mieter und zwölf laufende Verträge. Alle Namen und Adressen sind erfunden; E-Mail-Adressen enden auf @sandbox.invalid (nie zustellbar), Telefonnummern gibt es nicht (bei Interessenten steht eine Platzhalternummer).
Dazu kommen die Daten, die die Lese-Endpunkte zeigen: je Vertrag drei Monatsmieten (Konditionen, Buchungen, offene Posten; drei Mieter sind im Rückstand), 27 Zahlungseingänge mit Zuordnung zu den Mieten, drei Rechnungen (offen, bezahlt, teilbezahlt), drei Mahnungen (Stufe 1 und 2), sechs Stromzähler mit je drei Zählerständen, zwei Schadensfälle und zwei Mietermeldungen, zwei allgemeine Termine und zwei Übergaben, drei Interessenten, vier Dokumente (nur Metadaten, ohne Datei) und sechs Einträge im E-Mail-Verlauf (nur Protokollzeilen, es wird nichts gesendet). Die Bankverbindung ist eine Beispiel-IBAN aus der öffentlichen Dokumentation, keine Anbindung. Das Zurücksetzen stellt diese Daten wieder her; eine schon bestehende Sandbox zeigt sie nach dem nächsten Zurücksetzen.
Was die Sandbox nicht tut
Aus der Sandbox gehen keine E-Mails hinaus — auch nicht über das Systempostfach. Es gibt keine echten Zahlungen (die Zahlungseingänge sind erfundene Beispiele), keine Bankanbindung und keine echten Dokumente.
Webhooks in der Sandbox
Ein Test-Token darf den Scope webhooks:manage tragen. Sandbox-Webhooks laufen über denselben Zustelldienst wie echte: signierter POST, Wiederholungen, Selbstabschaltung nach sechs Fehlversuchen, Replay und Pausieren, nur https auf Port 443 an öffentliche Adressen (derselbe Schutz gegen Zugriffe auf interne Adressen). Jede Nachricht trägt "livemode": false im Körper und den Kopf X-M2H-Livemode: false (echte Ereignisse: true), damit Test- und echte Ereignisse nie verwechselt werden. Zugestellt wird nur bei aktivem API-Zugang der Organisation. Gesendet wird, wie bei echten Webhooks, nur von der Produktion; in Entwicklung und Staging bleiben die Zustellungen wartend.
Ein Ereignis lösen Sie ohne echte Buchung mit POST /v1/sandbox/events aus (Body { "type": "payment.received" }, Idempotency-Key Pflicht): Es wird für ein Musterobjekt der Sandbox eingestellt und an Ihre aktiven, den Typ abonnierenden Webhooks gesendet. Der Verlauf steht in GET /v1/webhooks/{id}/deliveries. Mit einem echten Token gibt es diesen Aufruf nicht (404).
Die Antwort nennt die Ereignis-Kennung, das gewählte Musterobjekt, an wie viele Webhooks das Ereignis ging (recipients, queued) und ob dieser Server sendet (delivery: enabled in der Produktion, not_in_this_environment in Entwicklung und Staging). Wiederholen Sie den Aufruf mit demselben Idempotency-Key, kommt dieselbe Antwort, und es wird nichts doppelt eingestellt.
{
"data": {
"event_id": "6f1d3c52-8b0e-4a67-9c21-3d5e7a90b4f8",
"event_type": "payment.received",
"object_id": "b2a4c6e8-1f3d-4b5a-8c7e-9d0f1a2b3c4d",
"recipients": 2,
"queued": 2,
"delivery": "enabled"
}
}curl -X POST https://api.manage2hero.com/v1/sandbox/events \
-H "Authorization: Bearer m2h_test_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"type":"payment.received"}'Unterschiede zu echten Daten
| Thema | Sandbox (Test-Token) | Echt (Live-Token) |
|---|---|---|
| Daten | erfundene Musterdaten einer eigenen Test-Organisation | Ihre echten Daten |
| Token-Präfix | m2h_test_ (gilt in jeder Umgebung) | m2h_live_, m2h_stg_ oder m2h_dev_ |
| Antwortkopf | X-M2H-Sandbox: true | nicht vorhanden |
| Webhook-Nachricht | livemode: false, Kopf X-M2H-Livemode: false | livemode: true, Kopf X-M2H-Livemode: true |
| E-Mails, Zahlungen, Bank | nie: es geht nichts hinaus, es gibt keine Anbindung | je nach Konfiguration |
| Zustellung der Webhooks | nur aus der Produktion, nur bei aktivem API-Zugang | nur aus der Produktion |
| Grenzen | engere Grenzen und Quoten (siehe unten) | Standardgrenzen der API |
| Lebensdauer | 30 Tage nach der letzten Nutzung, dann Löschung | unbegrenzt |
Typische Fehlerbilder
| Antwort | Bedeutung |
|---|---|
| 401 | Token ungültig, widerrufen oder abgelaufen. |
| 403 sandbox_unavailable | Das Test-Token ist gültig, aber der API-Zugang Ihrer Organisation ist nicht aktiv (Testzeit abgelaufen, nicht gebucht oder vom Betreiber gesperrt). Mit aktivem Zugang funktioniert dasselbe Token wieder. |
| 404 not_found | Der Aufruf gibt es nur für Test-Tokens (z. B. /v1/sandbox/events), oder es gibt kein passendes Musterobjekt. |
| 409 webhook_limit_reached | Es gibt schon 3 Webhooks in der Sandbox. |
| 409 idempotency_conflict | Derselbe Idempotency-Key wurde mit anderem Inhalt oder anderem Ereignistyp benutzt. |
| 422 sandbox_limit_reached | Eine Quote der Sandbox ist erreicht (Datenbestand oder simulierte Ereignisse). |
| 429 | Zu viele Aufrufe: warten Sie die Zeit im Kopf Retry-After ab. |
Grenzen und Aufbewahrung
| Grenze | Wert |
|---|---|
| Lesende Aufrufe je Test-Token | 60 je Minute |
| Schreibende Aufrufe je Test-Token | 10 je Minute |
| Alle Aufrufe je Sandbox | 300 je Minute |
| Schreibende Aufrufe je Sandbox | 500 je Tag |
| Aktive Test-Tokens je Sandbox | 5 |
| Webhooks je Sandbox | höchstens 3, sonst 409 webhook_limit_reached |
| Simulierte Ereignisse | höchstens 100 wartende und 500 in 24 Stunden je Sandbox, sonst 422 sandbox_limit_reached; Zustellungen der Sandbox werden nach 7 Tagen gelöscht |
| Datenbestand (Mieter, Interessenten, Schäden, Zählerstände, Termine, Importsätze) | zusammen höchstens 3000, sonst 422 sandbox_limit_reached |
| Importe per API | höchstens 3 offene Importe und 5 neue je Stunde und Token |
| Laufzeit eines Test-Tokens | 7, 30 oder 90 Tage |
| Lebensdauer der Sandbox | 30 Tage nach der letzten Nutzung, dann Löschung |
„Zurücksetzen“ in der Verwaltung ersetzt die Sandbox durch eine frische mit neuen Musterdaten (selbst angelegte Daten gehen verloren); Ihre aktiven Test-Tokens bleiben gültig und arbeiten danach in der neuen Sandbox. Ist die Sandbox abgelaufen, legt „Neue Sandbox anlegen“ in der Verwaltung eine frische an; die Test-Tokens der alten gelten dann nicht mehr. Der Betreiber-Not-Aus Ihrer Organisation sperrt auch die Sandbox. Anlegen und Widerrufen von Test-Tokens stehen im Aktivitätsprotokoll Ihrer Organisation.