Die fünf Endpunkte
Kostenloser Scan einer Seite
POST https://inkluso.eu/api/scan/free
Kostenlos · Limit 5 Aufrufe pro Stunde und IP · nur die Startseite
Prüft die angegebene Adresse gegen WCAG 2.1 AA und ordnet die Befunde dem Gesetz zu, das über das Feld lang gewählt wird. Der schwerwiegendste Verstoß kommt vollständig samt Rechtsverweis zurück; alle übrigen erscheinen in locked_violations nur mit Schweregrad und Anzahl.
- Ein Aufruf dauert rund 30 Sekunden: Der Server startet einen echten Browser und rendert die Seite. Setzen Sie ein Client-Timeout von mindestens 60 Sekunden.
- Die Adresse muss auf einen öffentlichen Host zeigen. Ein fehlendes Schema wird zu https:// ergänzt, interne und lokale Adressen werden mit 422 abgelehnt.
- Das Feld scan_status ist die Selbstdiagnose des Scans. "bot_challenge" bedeutet, dass die WAF der Zielseite den Scanner blockiert hat, das ist kein gutes Ergebnis, sondern gar keines.
- Fehler: 422 (ungültige Adresse oder nichts Scanbares), 429 (Limit), 503 (Scanner ausgelastet), 504 (Scan über der 300-Sekunden-Obergrenze).
curl -sS -X POST https://inkluso.eu/api/scan/free \
-H 'Content-Type: application/json' \
--max-time 90 \
-d '{"url": "https://example.cz", "lang": "de"}'
Entwurf einer Erklärung zur Barrierefreiheit
POST https://inkluso.eu/api/statement/draft
Kostenlos · Limit 20 Aufrufe pro Minute und IP · nichts wird gespeichert
Erstellt aus Ihren Angaben einen Entwurf der Erklärung zur Barrierefreiheit. Dabei läuft kein Scan, nichts wird gespeichert, keine E-Mail versendet und kein Konto angelegt. Die Antwort hat zwei Felder: statement (strukturiertes Objekt) und text (dasselbe Dokument als Klartext für ein CMS).
- conformance_status darf nur "partial", "none" oder "not_assessed" sein. "full" ist bewusst unzulässig: Vollständige Konformität lässt sich nicht selbst erklären, nur messen.
- known_issues nimmt höchstens 20 Einträge mit je höchstens 300 Zeichen; längere Eingaben werden gekürzt, nicht abgelehnt.
- Die Erklärung ist eine Selbsterklärung der Organisation. Inkluso prüft keine der Angaben nach, und der Text sagt das ausdrücklich.
- Fehler: 422 (ungültige Adresse, leerer Organisationsname, unzulässiger conformance_status, fehlerhafte E-Mail), 429 (Limit).
curl -sS -X POST https://inkluso.eu/api/statement/draft \
-H 'Content-Type: application/json' \
-d '{"organisation": "Vzor s.r.o.",
"url": "https://example.cz",
"lang": "de",
"conformance_status": "partial",
"known_issues": ["Two PDFs published before 2024 are not tagged."]}'
Bestellstatus
GET https://inkluso.eu/api/orders/{ref}
Kostenlos · Limit 30 Aufrufe pro Stunde und IP · jede Antwort trägt X-Robots-Tag: noindex
Löst eine Bestellreferenz zum Erfüllungsstand auf und nach Abschluss zur Adresse des Reports. Die Referenz entsteht beim Anlegen der Bestellung und ist nicht der Report-Token, den gibt es bis zum Abschluss der Erfüllung nicht.
- 404 {"detail": "Order not found"}: diese Referenz existiert nicht; hören Sie auf zu fragen.
- 202 {"status": "pending"}: die Bestellung existiert, die Erfüllung läuft noch.
- 200 {"status": "fulfilled", "report_url": "/api/reports/{token}"}: fertig.
- Die Erfüllung umfasst einen Scan der ganzen Website und die PDF-Erzeugung, rechnen Sie in Minuten. Bei 30 Aufrufen pro Stunde liegt die praktische Obergrenze bei einer Abfrage alle zwei Minuten; eine Abfrage alle fünf Minuten ist ein sicheres Muster.
curl -sS -i https://inkluso.eu/api/orders/9f2c1d7a8b6e4f0c
HTTP/2 202
x-robots-tag: noindex
{"status": "pending"}
Audit kaufen oder Monitoring starten
POST https://inkluso.eu/api/billing/checkout
Kostenpflichtig · Limit 10 Aufrufe pro Minute und IP
Erstellt eine Stripe-Checkout-Sitzung und liefert deren Adresse zurück. Die eigentliche Zahlung läuft über Stripe, nicht hier: Kartendaten werden diesem Endpunkt nie übermittelt. Das Feld tier wählt das Produkt: scan_report ist das einmalige Audit (ab EUR 149 bzw. dem Gegenwert in einer anderen Währung); monitor / monitor_annual ist das wiederkehrende Monitoring-Abonnement, monatlich oder jährlich; agency ist vertriebsgeführt (der dahinterliegende Preis ist nur ein Richtwert, nicht der beworbene Preis, Agenturen sollten stattdessen den vertriebsgeführten Weg nutzen); shoptet_audit ist das einmalige Audit für Shoptet-Onlineshops (EUR 99 / 2 490 Kč / 449 zł; Abrechnungswährung folgt lang).
- consent muss true sein. Das ist eine rechtliche Voraussetzung, keine Formalität: Die gekaufte Stufe ist digitaler Inhalt/Dienst, der sofort geliefert wird, daher muss der Käufer der sofortigen Leistungserbringung ausdrücklich zustimmen und damit auf das 14-tägige EU-Widerrufsrecht verzichten. false oder ein fehlendes Feld liefert 422, es entsteht keine Bestellung. Setzen Sie true nie stellvertretend für einen Menschen, ohne dessen tatsächliche Zustimmung.
- Die Währung richtet sich nach lang: cs wird in CZK abgerechnet, pl in PLN, alle anderen Sprachen (de, en) in EUR. Das ist keine Umrechnung eines Betrags, jede Währung hat ihre eigene Preisliste. Einzige Quelle der Wahrheit ist price_for_tier() in backend.billing.stripe.
- Ein optionaler Idempotency-Key-Header: generieren Sie selbst einen frischen, eindeutigen Wert für JEDEN Kaufvorgang (z. B. eine UUID v4). Der Schlüssel ist an Ihre genaue Anfrage gebunden (E-Mail, URL, Tarif, Sprache): eine Wiederholung mit DERSELBEN Anfrage binnen 24 Stunden liefert DENSELBEN order_ref, checkout_url, amount und currency zurück; derselbe Schlüssel mit ANDEREN Angaben liefert 422. Ein Schlüssel, der während der Verarbeitung erneut verwendet wird, liefert 503, bitte kurz erneut versuchen. Kopieren Sie einen Schlüssel niemals aus der Dokumentation oder einer anderen Anfrage.
- Fehler: 422 (consent nicht true, ungültige Adresse oder fehlendes/fehlerhaftes Feld), 429 (Limit), 503 (Idempotency-Key wird gerade verarbeitet, oder der Zahlungsanbieter ist vorübergehend falsch konfiguriert), 500 (Zahlungssystem nicht verfügbar).
curl -sS -X POST https://inkluso.eu/api/billing/checkout \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: ' \
-d '{"email": "buyer@example.cz", "tier": "scan_report",
"url": "https://example.cz", "lang": "de", "consent": true}'
Fragen Sie danach GET /api/orders/{order_ref} von oben ab, bis der Status "fulfilled" ist.