Checkout API
Mit der Checkout API lösen Sie einen vollständigen CheckYout-Check-out aus Ihrem eigenen System aus — genau so, als hätte der Gast den QR-Code an der Tür gescannt. Der Aufruf startet die WhatsApp-Benachrichtigung an die Reinigungskraft, sendet E-Mail- und Webhook-Benachrichtigungen, fährt die Heizung in den Sparmodus (tado°, Netatmo, Vaillant, Nest), schaltet Lichter aus (Hue) und steuert Shelly-Geräte.
Wann nutzen?
Verwenden Sie diesen Endpoint, wenn Ihr System (z. B. Resavio, Smoobu Check-out, ein eigenes PMS) bereits erkennt, wann ein Gast die Unterkunft verlässt — etwa durch einen Online-Check-out, eine bezahlte Schlussrechnung oder einen manuellen Trigger durch den Gastgeber. Anstatt zusätzlich den QR-Code scannen zu lassen, übernimmt CheckYout direkt alle nachgelagerten Aktionen.
Unterschied zur Notify API
/api/v1/notify sendet nur eine WhatsApp-Nachricht an eine angegebene Telefonnummer. /api/v1/checkout startet den vollständigen Check-out-Workflow mit allen konfigurierten Benachrichtigungen und Smart-Home-Aktionen.
Endpoint
/api/v1/checkoutRequest
| Header | Wert | Pflicht |
|---|---|---|
Content-Type | application/json | Ja |
X-API-Key | Ihr API-Key | Ja |
Request-Body
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
resavio_property_id | string | Eines davon | Property-ID aus Resavio. Muss zuvor im CheckYout-Dashboard pro Unterkunft hinterlegt werden. |
external_property_id | string | Eines davon | Alias für resavio_property_id — für andere Partner-Integrationen. |
device_id | string | Eines davon | Direkte Geräte-ID, falls bekannt. Schneller, aber weniger flexibel. |
source | string | Nein | Quelle des Signals: resavio oder partner. Default: resavio, wenn resavio_property_id gesetzt — sonst partner. |
Property-Mapping
Damit CheckYout weiß, welches Gerät zu welcher Resavio-Property gehört, muss der Gastgeber im CheckYout-Dashboard pro Unterkunft die Resavio-Property-ID unter Einstellungen → Resavio Property-ID hinterlegen. Anschließend genügt der Aufruf mit resavio_property_id.
Response
Erfolgsantwort (200)
{
"success": true,
"eventId": "8a4b1c2d-3e4f-5a6b-7c8d-9e0f1a2b3c4d",
"notified": true,
"device_id": "ZNKKPJZV",
"property_name": "Chalet Rösi"
}Falls innerhalb der letzten 60 Sekunden bereits ein Check-out für dasselbe Gerät ausgelöst wurde, antwortet die API mit "eventId": "rate-limited" und "reason": "rate_limited" — das ist kein Fehler, nur ein Schutz vor Doppelauslösung.
Fehlerantworten
| Status | Ursache | Beispiel |
|---|---|---|
400 | Kein Identifier angegeben | {"error": "Provide one of: device_id, resavio_property_id, external_property_id"} |
401 | Ungültiger oder fehlender API-Key | {"error": "Invalid or missing API key"} |
404 | Gerät nicht gefunden oder gehört nicht zum Account | {"error": "Device not found or does not belong to your account"} |
429 | Zu viele Requests pro Minute (30/min/IP) | {"error": "Too many requests"} |
Code-Beispiele
curl -X POST https://checkyout.app/api/v1/checkout \
-H "Content-Type: application/json" \
-H "X-API-Key: cyo_IhrApiKey" \
-d '{
"resavio_property_id": "abc-123"
}'const response = await fetch('https://checkyout.app/api/v1/checkout', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.CHECKYOUT_API_KEY,
},
body: JSON.stringify({
resavio_property_id: 'abc-123',
}),
});
const data = await response.json();
console.log('Check-out ausgelöst:', data.eventId);import requests
import os
response = requests.post(
"https://checkyout.app/api/v1/checkout",
headers={
"Content-Type": "application/json",
"X-API-Key": os.environ["CHECKYOUT_API_KEY"],
},
json={"resavio_property_id": "abc-123"},
)
response.raise_for_status()
data = response.json()
print(f"Check-out ausgelöst: {data['eventId']}")<?php
$ch = curl_init('https://checkyout.app/api/v1/checkout');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . getenv('CHECKYOUT_API_KEY'),
],
CURLOPT_POSTFIELDS => json_encode([
'resavio_property_id' => 'abc-123',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;Verhalten
Idempotenz und Rate-Limiting
Pro Gerät wird maximal ein Check-out-Event pro Minute akzeptiert. Mehrfach-Aufrufe innerhalb dieser Zeit liefern die gleiche Antwortstruktur, lösen aber keine doppelten Benachrichtigungen aus.
Smart Home und PMS
Wenn ein PMS verbunden ist, wird vor dem Heizungs-Setback geprüft, ob am selben Tag eine neue Anreise geplant ist. Falls ja, bleibt die Heizung an.
Webhook-Quellen
Wenn Sie ausgehende Partner-Webhooks abonniert haben, enthält das Payload-Feld source den Wert "resavio" oder "partner" — so können Sie unterscheiden, ob der Check-out per QR-Scan oder über Ihre Integration ausgelöst wurde.
Verwandt: Notify API · Webhooks · Events