← Zurück zu Cybiq

Für KI-Agenten: Anwendbarkeit der Cyberresilienz-Verordnung über HTTP prüfen

Cybiq lässt sich von einer Software vollständig prüfen, ohne Verkaufsgespräch und ohne dass ein Mensch ein Formular ausfüllt. Es gibt drei Wege hinein, und alle drei nutzen dieselbe Entscheidungslogik: einen laufenden Endpunkt unter POST /api/classify, einen MCP-Server unter POST /mcp und die gesamte Entscheidungslogik vorab berechnet als statisches JSON-Artefakt, für Agenten, die lieber im Wörterbuch nachschlagen als eine Anfrage zu stellen. Für keinen der drei Wege braucht es ein Konto oder einen Schlüssel.

Agenten-Skill (Installation): npx skills add maticijus/hexenkraft-agent-skills --skill cybiq-cra-scope - https://skills.sh/maticijus/hexenkraft-agent-skills/cybiq-cra-scope. Ein Mensch zahlt bei Stripe; die Ausgabe ist keine Rechtsberatung.

Diese Seite ist die menschenlesbare Fassung des Agentenabschnitts von llms.txt. Die maschinenlesbare Beschreibung steht in openapi.json, die Serverkarte für MCP unter /.well-known/mcp.json, und was die Pakete kosten und zu welchen Bedingungen, steht in /api/offers.json. Jede Seite hier trägt alle drei in einem Link-Kopffeld, es muss also nichts von dem erraten werden, was unten steht.

Was angeboten wird

Angebot ausschließlich für Unternehmer.

Eine Software kann einen Kauf mit dem Werkzeug start_pack_checkout weiter unten anstoßen. Der Aufruf kostet nichts. Der Handelsweg in v1 ist der Stripe-Zahlungslink: Das Werkzeug kann einen Zahlungslink übergeben, den ein Mensch öffnet und bezahlt, und die heutige Antwort 422 checkout_creation_not_permitted mit dem Link im Feld detail ist der vorgesehene Weg in v1, kein vorübergehender Notbehelf. Denselben Link trägt jedes Paket als payment_link in /api/offers.json, sodass eine Software ihn ohne den Fehlerpfad lesen kann. Eine spätere Installation kann weiterhin eine Checkout-Sitzung anlegen; dieser Weg ist optional. Der menschliche Käufer öffnet die URL, zahlt mit seiner eigenen Karte und setzt auf der Seite von Stripe das Häkchen bei den Bedingungen. Mit diesem Häkchen stimmt er der sofortigen Bereitstellung der digitalen Inhalte zu und verzichtet dadurch auf das Widerrufsrecht von 14 Tagen. Keine Software darf es an seiner Stelle setzen, und dieser Dienst liefert eine Sitzung ohne diese Zustimmung nicht aus. check_order_status braucht die Kennung einer Checkout-Sitzung und verfolgt keinen Kauf über den Zahlungslink; solche Käufe verfolgt der Mensch. Preis, umsatzsteuerliche Behandlung, Lieferumfang und die Bedingungen für eine Erstattung stehen sämtlich in /api/offers.json: Lesen Sie die Datei, bevor Sie jemanden zu einer Kasse schicken. Die Agenturlizenz wird weiterhin per E-Mail unter hello@cybiq.eu bestellt.

Die Endpunkte

EndpunktWas er tutKostenMengenbegrenzung
POST /api/classifyStuft ein Produkt ein. Die Maschine läuft im selben Prozess.kostenlosje aufrufender Adresse
POST /api/deadlinesBerechnet die Meldefristen nach Artikel 14 aus einem Zeitpunkt, den Sie angeben.kostenlosje aufrufender Adresse, gemeinsam mit classify
POST /mcpMCP-Server: classify_cra, start_pack_checkout, check_order_status, compute_reporting_deadlines.Aufruf kostenlosje aufrufender Adresse
GET /api/offers.jsonWas die Pakete kosten und zu welchen Bedingungen.kostenlosstatische Datei, bitte zwischenspeichern
GET /api/decisions.jsonJede mögliche Entscheidung, vorab berechnet.kostenlosstatische Datei, bitte zwischenspeichern
GET /api/decisions.de.jsonDieselben Entscheidungen mit deutscher Prosa.kostenlosstatische Datei, bitte zwischenspeichern

Die beiden Schnittstellen mit Mengenbegrenzung haben getrennte Kontingente. Wer zwanzig Produkte einstuft, verbraucht also nie das Kontingent, das ein Käufer für die Rückkehr von Stripe braucht. Wird eines überschritten, lautet die Antwort 429 in dem Umschlag, der unter Fehler beschrieben ist.

POST /api/classify

Senden Sie eine beliebige Teilmenge der sechs Antworten. Ein unvollständiger Satz ist kein Fehler: Die Maschine antwortet mit needs_review und nennt in missing, was ihr noch fehlt. Ein unbekannter Schlüssel oder ein unbekannter Wert wird mit 422 abgelehnt, statt stillschweigend verworfen zu werden.

curl -s https://cybiq.eu/api/classify \
  -H 'Content-Type: application/json' \
  -d '{"answers":{"market":"commercial","ossMonetized":false,
       "productKind":"installable_software","otherRegime":"none",
       "role":"manufacturer","category":"vpn"},"locale":"en"}'

Die Antwort trägt das Ergebnis, die geordneten reasons, die obligations mit ihren Artikeln der Cyberresilienz-Verordnung, den Fahrplan in timeline, den Weg zur Konformitätsbewertung, das passende packTier und sources: Kennungen aus dem Zitatbestand, die jede Aussage an ein wörtliches Zitat aus dem Amtsblatt binden. locale: "de" ändert nur die Prosa; Ergebnis, Artikel, Fundstellen und Daten sind in beiden Sprachen identisch.

POST /api/deadlines

Senden Sie kind (vulnerability oder incident) und awareness, den Zeitpunkt der Kenntniserlangung des Herstellers, als ISO 8601 mit Z oder Zeitzonenversatz. Mit measureAvailable (nur Schwachstelle) oder notificationSubmitted (nur Sicherheitsvorfall) lassen Sie die Frist für den Abschlussbericht beginnen; ohne diese Angabe steht der Abschlussbericht mit dueBy: null in der Liste. Die Antwort nennt jede Frist in zeitlicher Reihenfolge mit der Kennung basis aus dem Zitatbestand und der Fundstelle, die verwendete method und einen ics-Kalender mit einem Termin je datierter Frist. Das sind die frühesten Lesarten der äußeren Fristen: Jede Meldung ist in jedem Fall unverzüglich fällig. Dieselbe Berechnung ist das MCP-Werkzeug compute_reporting_deadlines. Nichts wird gespeichert, und Cybiq meldet und übermittelt nie etwas in Ihrem Namen; die Antwort wiederholt das in notice. Ein Zeitpunkt ohne Zeitzonenversatz, ein unmögliches Datum oder ein späterer Zeitpunkt vor awareness wird mit 422 invalid_deadline_input abgelehnt, und das Feld wird genannt.

curl -s https://cybiq.eu/api/deadlines \
  -H 'Content-Type: application/json' \
  -d '{"kind":"vulnerability","awareness":"2027-03-10T08:30:00+01:00",
       "measureAvailable":"2027-03-12T00:00:00Z","locale":"de"}'

POST /mcp

Model Context Protocol über Streamable HTTP: zustandslos, JSON-Antworten statt eines SSE-Stroms, ausschließlich POST. Ein GET wird mit 405 und einem Allow-Kopffeld beantwortet und nicht mit 404, denn ein Client, der einen Strom geöffnet hat, hat den richtigen Endpunkt gefunden. Es gibt keine Sitzungskennung, jede Anfrage steht also für sich. Sammelaufrufe nach JSON-RPC werden abgelehnt. Die angefragte Fassung des Protokolls wird zurückgegeben, sofern dieser Server sie spricht; andernfalls bietet er die neueste an, die er hat.

curl -s https://cybiq.eu/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s https://cybiq.eu/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"classify_cra",
                 "arguments":{"answers":{"market":"commercial",
                   "ossMonetized":false,"productKind":"installable_software",
                   "otherRegime":"none","role":"manufacturer",
                   "category":"vpn"}}}}'

classify_cra führt genau den Handler aus, den auch /api/classify ausführt; es gibt also keinen zweiten Codepfad, der anders antworten könnte. start_pack_checkout nimmt ein tier mit dem Wert verification_checklist_49 oder compliance_pack_199 entgegen, dazu wahlweise ein locale und einen idempotency_key. In v1 kann es mit 422 checkout_creation_not_permitted antworten und den öffentlichen Zahlungslink im Feld detail mitgeben; das ist so vorgesehen. Wenn Sie nur die Zahlungs-URL brauchen, lesen Sie payment_link in /api/offers.json. Eine spätere Installation kann weiterhin checkout_url, session_id, amount und currency aus einer Checkout-Sitzung liefern. Paket, Preis und Betrag werden serverseitig aus der Preiskennung bei Stripe bestimmt: Nichts im Rumpf der Anfrage kann einen Preis benennen. check_order_status braucht die Kennung einer Checkout-Sitzung (Form cs_...) und verfolgt keinen Kauf über den Zahlungslink; solche Käufe verfolgt der Mensch. Gibt es eine Sitzung, sagt das Werkzeug paid, unpaid oder unknown (die Sitzung ist kein Cybiq-Kauf: Der Preis der Sitzung gehört nicht zu Cybiq oder ihr Modus ist nicht payment). Eine bezahlte Sitzung trägt die Freischalt-URL nur, wenn der Käufer die Bedingungen beim Checkout akzeptiert hat; sonst lautet sie paid ohne unlock_url. Rufen Sie die Freischalt-URL nicht selbst auf: Sie wirkt genau einmal, und die Dokumente gehören dem Menschen, der bezahlt hat. compute_reporting_deadlines führt den Handler von /api/deadlines aus und meldet eine Ablehnung als Werkzeugfehler mit demselben Problemdokument. Die verbindlichen Schemata holen Sie mit tools/list, statt sie von dieser Seite abzuschreiben.

Idempotenz

start_pack_checkout nimmt einen idempotency_key entgegen, den Sie selbst wählen. Er ist kein Ausweis und lässt sich auch nicht als einer verwenden. Der Idempotenzschlüssel liegt unter Ihrer eigenen aufrufenden Adresse, ist an einen Prüfwert der Anfrage gebunden, für die er zuerst verwendet wurde, trägt eine serverseitige Einmalzahl, die Sie nie zu sehen bekommen, und verfällt nach 24 Stunden. Innerhalb dieser Frist gilt: Dieselbe Anfrage wiederholt die gespeicherte Sitzung, ohne Stripe erneut aufzurufen; derselbe Schlüssel mit einem anderen Paket oder einer anderen Sprache ergibt 422 idempotency_key_conflict und ist ein Fehler zum Beheben, kein Aufruf zum Wiederholen; dieselbe Anfrage, während die erste noch läuft, ergibt 409 idempotency_key_in_progress, was heißt: kurz warten und erneut versuchen, keinen zweiten Bezahlvorgang starten. Schicken Sie gar keinen Schlüssel, erhalten Sie schlicht eine neue Sitzung; dasselbe Paket absichtlich zweimal zu kaufen, funktioniert also.

GET /api/offers.json

Lesen Sie diese Datei, bevor Sie eine Kasse eröffnen. Sie trägt beide Pakete mit ihrer Plankennung, ihrem Namen, dem Preis in Euro, der Währung, dem Lieferumfang, der Vorlage für die URL zur Kasse und dem veröffentlichten payment_link (dem Stripe-Zahlungslink, den der Mensch öffnet); die umsatzsteuerliche Behandlung, nämlich dass der genannte Preis der gesamte berechnete Betrag ist und an der Kasse nichts hinzukommt; die Bedingungen zu Lieferung und Widerrufsrecht samt der Rechtsgrundlage, auf der sie beruhen; und jeden Fehlercode, den diese Schnittstelle zurückgeben kann, mit seinem Status. Sie wird aus denselben Konstanten erzeugt, die diese Website anzeigt; der Preis, der Ihnen genannt wird, und der Preis, den ein Mensch sieht, können deshalb nicht auseinandergehen.

GET /api/decisions.de.json

Eine Abfrage liefert alle 46 368 vollständigen Antwortkombinationen mit ihren Entscheidungen (816 verschiedene Ergebnisse). Schema: cybiq.decisions/v1. Speichern Sie das Artefakt großzügig zwischen und holen Sie es erneut, sobald sich schema ändert. Die deutsche Datei trägt locale mit dem Wert de; sie hat dieselben Antwortschlüssel und denselben index wie die englische, denn die Kennungen der Ergebnisse werden aus der englischen Entscheidung berechnet. Beide Dateien lassen sich also über die Kennung verbinden, und es unterscheidet sich nur die Prosa. Beschrieben in openapi.json; gegen die laufende Maschine geprüft von der Testsuite dieser Website bei jeder Auslieferung.

Nachschlagen

Das Objekt index bildet ein Antworttupel auf die Kennung eines Ergebnisses ab; das Objekt outcomes enthält die Entscheidungen. Aufbau des Schlüssels:

market|ossMonetized|productKind|otherRegime|role|category

mit diesen Werten:

Beispiel: ein gewerblich vertriebenes, installierbares Netzwerkgerät eines Herstellers einstufen.

curl -s https://cybiq.eu/api/decisions.de.json \
  | node -e '
    let raw = "";
    process.stdin.on("data", (c) => (raw += c));
    process.stdin.on("end", () => {
      const d = JSON.parse(raw);
      const key = ["commercial","false","installable_software","none",
                   "manufacturer","network_device"].join("|");
      console.log(d.outcomes[d.index[key]].headline);
    });'

Jede Entscheidung trägt sources: Kennungen aus dem Zitatbestand, die jede Aussage an den Wortlaut der Verordnung (EU) 2024/2847 binden (CELEX 32024R2847), wöchentlich von der CI gegen die aktuelle Fassung auf EUR-Lex geprüft. Ein Ergebnis zu übernehmen, ohne seine reasons zu lesen, ist ein Fehlgebrauch: Grauzonen wie reine Cloud-Dienste oder sich überschneidende Regelungen geben bewusst needs_review oder likely_out_of_scope mit konkreten nextSteps zurück statt einer selbstsicheren Vermutung.

Fehler

Jeder Fehlschlag, auf jeder Route, ist ein Problemdokument nach RFC 9457, ausgeliefert als application/problem+json. Die MCP-Werkzeuge geben dasselbe Dokument im structuredContent des Werkzeugergebnisses zurück, neben isError: true, und Ablehnungen auf Protokollebene tragen es im Feld error.data von JSON-RPC. Ein Vokabular deckt also beide Transportwege ab.

{
  "type": "https://cybiq.eu/for-agents.html#error-invalid_answer_value",
  "title": "Unknown answer value",
  "status": 422,
  "detail": "Invalid value for \"market\". Allowed values: ...",
  "code": "invalid_answer_value",
  "field": "market",
  "instance": "/api/classify"
}

Lesen Sie code, statt die URI in type zu zerlegen, auch wenn diese URI auflöst: Sie zeigt auf die Zeile dieses Codes weiter unten. status ist eine Eigenschaft des Codes und wird serverseitig einmal festgelegt; keine zwei Routen geben einem Code also zwei Bedeutungen, und die Zahl steht auch in einem Werkzeugergebnis über MCP, das keinen eigenen HTTP-Status hat. instance ist die Route und nie die URL der Anfrage; die Kennung einer Checkout-Sitzung kann so nicht in einem Fehlerdokument landen, das Sie protokollieren. Jede JSON-Antwort dieser Schnittstelle trägt außerdem X-Robots-Tag: noindex; die beiden Entscheidungsartefakte bewusst nicht, denn sie sind ein Datensatz, der gefunden werden soll.

CodeStatusTitelWann
invalid_body400Malformed request bodyDer Rumpf war kein JSON oder kein JSON-Objekt.
body_too_large413Request body too largeDer Rumpf war größer als 64 KB. Das Lesen endet an der Grenze und nicht erst nach dem letzten Byte.
unknown_field422Unknown fieldEin Feld der obersten Ebene, das wir nicht annehmen. Es wird abgelehnt und nicht ignoriert.
method_not_allowed405Method not allowedAlles außer POST auf einer Route, die nur POST annimmt.
rate_limited429Too many requestsDas Kontingent dieser Adresse für diese Schnittstelle ist aufgebraucht. Warten und erneut versuchen.
origin_not_allowed403Origin not allowedPOST /mcp enthielt einen Origin-Header, der nicht zu dieser Website gehört. MCP-Clients senden keinen; keinen Origin senden.
unsupported_media_type415Unsupported media typePOST /mcp mit einem anderen Content-Type als application/json. application/json senden.
missing_answers422Answers missinganswers fehlte.
invalid_answers422Answers must be an objectanswers war kein Objekt.
unknown_answer_key422Unknown answer keyEin Antwortschlüssel, den die Maschine nicht kennt. Er wird nie stillschweigend verworfen: ein verworfener Schlüssel ergäbe ein sicher klingendes Ergebnis über ein Produkt, das niemand beschrieben hat.
invalid_answer_value422Unknown answer valueEin Wert außerhalb der Aufzählung dieses Schlüssels. Es wird nie ein Standardwert eingesetzt.
invalid_locale422Unsupported localeEine andere Sprache als en oder de.
invalid_deadline_input422Invalid deadline inputEine Fristanfrage, die sich nicht berechnen lässt: ein unbekanntes kind, ein Zeitpunkt, der nicht ISO 8601 mit Z oder Zeitzonenversatz ist, measureAvailable bei einem Sicherheitsvorfall, notificationSubmitted bei einer Schwachstelle oder einer von beiden vor awareness. Das Feld field nennt es. Ebenfalls abgelehnt: awareness vor dem 2026-09-11 im Zeitzonenversatz des Aufrufers (ab diesem Tag gilt Artikel 14) und jeder Zeitpunkt nach dem Jahr 2100.
invalid_tier422Unknown pack tierEin Paket, das wir nicht verkaufen.
tier_not_configured422Tier not configured on this deploymentEin Paket, für das diese Installation keinen Stripe-Preis hat. Ein Problem des Betreibers, nicht Ihres.
invalid_idempotency_key422Malformed idempotency keyDer Schlüssel bestand nicht aus 8 bis 200 Zeichen aus Buchstaben, Ziffern, Unterstrich, Punkt, Doppelpunkt oder Bindestrich.
idempotency_key_conflict422Idempotency key already usedDer Schlüssel ist bereits für ein ANDERES Paket oder eine andere Sprache vergeben. Ein Schlüssel darf nur wiederverwendet werden, um dieselbe Anfrage zu wiederholen. Wählen Sie einen neuen Schlüssel; wiederholen Sie die Anfrage nicht mit dem alten.
idempotency_key_in_progress409Idempotent request in progressDieselbe Anfrage wird gerade bearbeitet. Wiederholen Sie sie in Kürze. Starten Sie keinen zweiten Bezahlvorgang.
checkout_creation_not_permitted422Checkout creation not permittedDer Stripe-Schlüssel dieser Installation darf Checkout-Sitzungen lesen, aber nicht anlegen. Das Feld detail enthält den öffentlichen Zahlungslink für das Paket; geben Sie ihn dem menschlichen Käufer. In v1 ist das der vorgesehene Handelsweg, kein vorübergehender Notbehelf. Derselbe Link steht als payment_link in /api/offers.json.
checkout_not_available422Automated checkout not availableDasselbe, jedoch ohne konfigurierten Zahlungslink. Das Feld detail nennt die Adresse für eine Bestellung per E-Mail.
checkout_creation_failed502Checkout could not be createdStripe hat abgelehnt oder eine Sitzung ohne URL geliefert. Wiederholen Sie es oder bestellen Sie per E-Mail.
invalid_session_id422Malformed Checkout Session idKeine gültige Form einer Stripe-Checkout-Sitzungskennung. Wird geprüft, bevor Stripe überhaupt aufgerufen wird.
unknown_session404Unknown Checkout SessionKeine solche Sitzung, oder sie war nicht lesbar.
invalid_params400Invalid tool parametersEin tools/call ohne brauchbares name. Ein JSON-RPC-Fehler, der dieses Dokument im Feld data trägt.
unknown_tool404No such toolKein Werkzeug dieses Namens. Rufen Sie tools/list auf.

Der gesamte Ablauf

  1. Klären Sie so viele der sechs Antworten über das Produkt, wie Sie können.
  2. Einstufen: POST /api/classify, das Werkzeug classify_cra oder ein Nachschlagen in /api/decisions.de.json. Alle drei sind dieselbe Maschine.
  3. Steht in verdict der Wert needs_review, lesen Sie missing und holen Sie diese Antworten nach. Die Maschine rät nie, um eine Lücke zu füllen.
  4. Steht in verdict der Wert in_scope, so nennt packTier das passende Paket. Lesen Sie /api/offers.json. Geben Sie payment_link an den Menschen weiter, oder rufen Sie start_pack_checkout auf (in v1 kann dieselbe URL in 422 checkout_creation_not_permitted stehen).
  5. check_order_status braucht die Kennung einer Checkout-Sitzung und verfolgt keinen Kauf über den Zahlungslink; solche Käufe verfolgt der Mensch. Gibt es später eine Sitzung, fragen Sie ab, bis dort paid steht, und geben Sie die Freischalt-URL an den Menschen weiter; öffnen Sie sie nicht selbst.
  6. Fällt das Produkt nicht in den Anwendungsbereich, geben Sie nextSteps weiter: Das ist die ehrliche Antwort, und es gibt nichts zu verkaufen.

Grundregeln

Kostenlose Prüfungen im Browser

Zwei weitere Prüfungen laufen als Webseiten im Browser der Besucherin oder des Besuchers. Sie sind keine Endpunkte der Schnittstelle und keine MCP-Werkzeuge: Ihre Antworten werden nicht an einen Server gesendet und nichts wird gespeichert, und Cybiq reicht nie etwas im Namen eines anderen ein oder übermittelt es. Ein Mensch öffnet sie; ein Agent kann den Menschen mit der Adresse dorthin schicken.

Zum Weiterlesen

Kontakt

Betreiber: HEXENKRAFT s.r.o., IČO 29665931, V zahradách 2462/31, Libeň, 180 00 Praha 8, Tschechien. Fragen, Schwierigkeiten bei der Anbindung oder ein falsches Ergebnis: hello@cybiq.eu.

Cybiq erzeugt automatisch Compliance-Dokumentation aus der Verordnung (EU) 2024/2847 in ihrer veröffentlichten Fassung. Das ist keine Rechtsberatung, und daran ändert sich nichts, wenn eine Software sie für jemanden auswertet.