Jede Bibliothek gehört zu einer bestimmten API-Version. Aktuell veröffentlicht: 2026-07-01.
JavaScript / TypeScript
verfügbarTypen werden aus der veröffentlichten API-Beschreibung erzeugt.
Passend zu API 2026-07-01
npm install @ryh/api
Version 1.0.0
Kotlin
in VorbereitungFür Android-Anbindungen.
Passend zu API 2026-07-01
Swift
in VorbereitungFür iOS-Anbindungen.
Passend zu API 2026-07-01
Python
in VorbereitungFür Automatisierungen und Auswertungen.
Passend zu API 2026-07-01
Java
in VorbereitungFür bestehende Betriebssysteme im Haus.
Passend zu API 2026-07-01
C#
in VorbereitungFür Kassensysteme auf Windows.
Passend zu API 2026-07-01
Dieselben Abläufe in sechs Sprachen – direkt übernehmbar.
Erreichbarkeit prüfen
GET /api/public/v1Der erste Aufruf einer Anbindung: Version und Fähigkeiten der Schnittstelle abfragen. Ohne Anmeldung möglich.
curl -X GET "https://api.ryh.de/api/public/v1" \
-H "Authorization: Bearer $RYH_ACCESS_TOKEN" \
-H "Ryh-Version: 2026-07-01"Connectoren auflisten
GET /api/public/v1/connectorsAlle verfügbaren Connectoren, optional nach Fähigkeit gefiltert.
curl -X GET "https://api.ryh.de/api/public/v1/connectors?capability=orders.read" \
-H "Authorization: Bearer $RYH_ACCESS_TOKEN" \
-H "Ryh-Version: 2026-07-01"Verbindung anlegen
POST /api/public/v1/connectionsVerändernde Aufrufe brauchen einen Vorgangsschlüssel. Derselbe Schlüssel liefert dieselbe Antwort – auch nach einem Abbruch.
curl -X POST "https://api.ryh.de/api/public/v1/connections" \
-H "Authorization: Bearer $RYH_ACCESS_TOKEN" \
-H "Ryh-Version: 2026-07-01" \
-H "Idempotency-Key: idem_2026_07_31_0001" \
-H "Content-Type: application/json" \
-d '{"connectorId":"con_pos_demo","restaurantId":"res_demo_mitte","capabilities":["orders.read","menu.read"]}'Webhook-Empfänger anlegen
POST /api/public/v1/webhooksDer Signaturschlüssel wird genau einmal ausgegeben. Bitte sofort sicher ablegen.
curl -X POST "https://api.ryh.de/api/public/v1/webhooks" \
-H "Authorization: Bearer $RYH_ACCESS_TOKEN" \
-H "Ryh-Version: 2026-07-01" \
-H "Idempotency-Key: idem_2026_07_31_0001" \
-H "Content-Type: application/json" \
-d '{"url":"https://partner.example.com/ryh/webhook","events":["order.created","order.paid"]}'Prüfprotokoll lesen
GET /api/public/v1/audit-logNachvollziehbare Änderungen des eigenen Betriebs inklusive Unversehrtheitsnachweis.
curl -X GET "https://api.ryh.de/api/public/v1/audit-log?limit=50" \
-H "Authorization: Bearer $RYH_ACCESS_TOKEN" \
-H "Ryh-Version: 2026-07-01"Signatur immer über den unveränderten Text der Anfrage berechnen.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyRyhSignature(rawBody: string, header: string, secret: string): boolean {
// Header-Format: t=<unix-sekunden>,v1=<hex-signatur>
const parts = Object.fromEntries(header.split(",").map((entry) => entry.split("=")));
const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
const a = Buffer.from(expected);
const b = Buffer.from(parts.v1 ?? "");
if (a.length !== b.length) return false;
// Zeitfenster von fünf Minuten gegen Wiedereinspielung
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
return timingSafeEqual(a, b);
}Nur bei Überlast und Störungen erneut versuchen.
const RETRYABLE = new Set(["rate_limited", "internal"]);
export async function callWithRetry<T>(run: () => Promise<T>, attempts = 4): Promise<T> {
let lastError: unknown;
for (let attempt = 0; attempt < attempts; attempt += 1) {
try {
return await run();
} catch (error) {
lastError = error;
const code = (error as { code?: string }).code ?? "";
if (!RETRYABLE.has(code)) throw error;
// Wartezeit verdoppeln, mit kleiner Streuung gegen Lastspitzen
const wait = 2 ** attempt * 500 + Math.random() * 250;
await new Promise((resolve) => setTimeout(resolve, wait));
}
}
throw lastError;
}