Bibliotheken

Jede Bibliothek gehört zu einer bestimmten API-Version. Aktuell veröffentlicht: 2026-07-01.

Übersicht

JavaScript / TypeScript

verfügbar

Typen werden aus der veröffentlichten API-Beschreibung erzeugt.

Passend zu API 2026-07-01

npm install @ryh/api

Version 1.0.0

Kotlin

in Vorbereitung

Für Android-Anbindungen.

Passend zu API 2026-07-01

Swift

in Vorbereitung

Für iOS-Anbindungen.

Passend zu API 2026-07-01

Python

in Vorbereitung

Für Automatisierungen und Auswertungen.

Passend zu API 2026-07-01

Java

in Vorbereitung

Für bestehende Betriebssysteme im Haus.

Passend zu API 2026-07-01

C#

in Vorbereitung

Für Kassensysteme auf Windows.

Passend zu API 2026-07-01

Codebeispiele

Dieselben Abläufe in sechs Sprachen – direkt übernehmbar.

Erreichbarkeit prüfen

GET /api/public/v1

Der erste Aufruf einer Anbindung: Version und Fähigkeiten der Schnittstelle abfragen. Ohne Anmeldung möglich.

cURL
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/connectors

Alle verfügbaren Connectoren, optional nach Fähigkeit gefiltert.

cURL
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/connections

Verändernde Aufrufe brauchen einen Vorgangsschlüssel. Derselbe Schlüssel liefert dieselbe Antwort – auch nach einem Abbruch.

cURL
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/webhooks

Der Signaturschlüssel wird genau einmal ausgegeben. Bitte sofort sicher ablegen.

cURL
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-log

Nachvollziehbare Änderungen des eigenen Betriebs inklusive Unversehrtheitsnachweis.

cURL
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"

Webhooks prüfen

Signatur immer über den unveränderten Text der Anfrage berechnen.

TypeScript
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);
}

Fehler abfangen

Nur bei Überlast und Störungen erneut versuchen.

TypeScript
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;
}
Bibliotheken in Vorbereitung haben noch keine Installationsanleitung. Bis dahin funktioniert jeder gewöhnliche HTTP-Client.