Zum Inhalt springen

Befunde und Abdeckung

Teil der API-Referenz. Authentifizierung, Scopes, Anfragegrenzen und Fehler stehen im Überblick.

BitHive Reporting Desk API · 0.11.0

Befunde und Abdeckung

GET/v1/products/{productId}/findings

Befunde eines Produkts auflisten

Gibt die Befunde der überwachten Uploads des Produkts zurück (jede Produktversion auf dem Markt und der neueste Upload), jeweils mit ihrem Upload und ihrer Produktversion: Eine Schwachstelle, die in zwei überwachten Produktversionen steckt, ergibt zwei Befunde. Befunde zu Schwachstellen, die als ausgenutzt bekannt sind, kommen zuerst, dann nach Schweregrad, dann die neuesten. In dieser Reihenfolge ist zu arbeiten: Eine aktiv ausgenutzte Schwachstelle löst die 24-Stunden-Meldung der Cyberresilienz-Verordnung aus.

Ob eine Schwachstelle ausgenutzt wird, wird bei der Beantwortung der Anfrage ermittelt und nicht am Befund gespeichert, denn eine Schwachstelle wird erst später ausgenutzt, und genau dieser Zeitpunkt zählt.

Erfordert die Berechtigung findings:read.

Scope: findings:read

Parameter

ParameterWoTypBeschreibung
productId erforderlichpathstring (uuid)Kennung des Produkts.

Antworten

200 Die Befunde des Produkts. FindingList

{
  "findings": [
    {
      "id": "a1c3e5f7-0b2d-4e6f-8a91-b2c3d4e5f607",
      "component": {
        "name": "golang.org/x/net",
        "version": "0.38.0",
        "purl": "pkg:golang/golang.org/x/net@0.38.0"
      },
      "vulnerability": {
        "id": "GHSA-qppj-fm5r-hxr3",
        "summary": "HTTP/2 rapid reset can cause excessive work in net/http",
        "severity": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
        "severity_type": "CVSS_V3",
        "url": "https://osv.dev/vulnerability/GHSA-qppj-fm5r-hxr3"
      },
      "evidence": "range",
      "matched_range": ">=0, <0.38.1",
      "state": "open",
      "exploited": true,
      "exploited_cve": "CVE-2023-44487",
      "exploited_since": "2023-10-10",
      "ransomware": false,
      "first_seen_at": "2026-09-19T05:02:18Z",
      "last_seen_at": "2026-09-21T05:01:47Z",
      "sbom_id": "5d7e9f10-2b4c-4d6e-8f90-a1b2c3d4e5f6",
      "release": "2.4.1"
    }
  ],
  "total": 7,
  "exploited": 1
}

Beispiel

curl --fail-with-body -sS \
  -H "Authorization: Bearer $BITHIVE_TOKEN" \
  "https://app.bithive-it.com/v1/products/$PRODUCTID/findings"

POST/v1/products/{productId}/decisions

Eine VEX-Aussage zu den Befunden eines Produkts festhalten

Hält die eigene Aussage des Kontos zu einer oder mehreren benannten Produktversionen und einer Schwachstelle fest: ob die Produktversion betroffen ist und warum. Je Produktversion wird eine Aussage geschrieben, sodass eine Aussage auf einmal für jede überwachte Produktversion mit derselben Komponentenversion gegeben werden kann. Jede Produktversion muss eine sein, in der ein Befund des Produkts zu der Schwachstelle entstanden ist.

Eine Aussage wird nie geändert. Eine Änderung ist eine neue Aussage, die die ersetzte nennt, und die neueste ist die geltende Entscheidung. Das Token handelt als der Benutzer, der es erstellt hat: Inhaber, Administratoren und Mitglieder halten eine Aussage fest, wo keine gilt; nur Inhaber oder Administratoren ersetzen eine geltende.

Für jeden Status gelten eigene Regeln, angelehnt an das VEX-Profil von CSAF 2.0: not_affected erfordert eine justification oder ein impact_statement oder beides und lässt keine Maßnahme zu; affected erfordert eine action_category und ein action_statement und lässt keine Begründung zu; fixed und under_investigation lassen keins von beidem zu. Ein Feld, das der Status nicht zulässt, wird abgelehnt, nicht verworfen.

Eine Aussage ändert nie einen Fall oder dessen Fristen.

Nimmt einen Idempotency-Key an. Erfordert die Berechtigung findings:decide.

Scope: findings:decide

Parameter

ParameterWoTypBeschreibung
Idempotency-Keyheaderstring1 bis 255 sichtbare ASCII-Zeichen, neu für jeden Schreibvorgang und gleich, wenn derselbe Schreibvorgang erneut gesendet wird. Sendet dasselbe Token denselben Schlüssel innerhalb von 24 Stunden erneut, erhält es die erste Antwort, und nichts geschieht doppelt; zusammen mit einer anderen Anfrage wird der Schlüssel abgewiesen (422), ebenso, solange die erste Anfrage noch läuft (409). Nur eine erfolgreiche Antwort wird aufbewahrt, sodass ein abgewiesener Schreibvorgang korrigiert und mit demselben Schlüssel gesendet werden kann. Eine geschriebene Vorfallsakte, Meldung oder Aussage wird unter ihrem Schlüssel nie ein zweites Mal geschrieben: Ist die Antwort der ersten Anfrage nach dem Schreiben fehlgeschlagen, wird dieselbe Anfrage, erneut gesendet, mit dem Geschriebenen beantwortet, oder mit 409, solange diese Antwort noch ermittelt wird.
productId erforderlichpathstring (uuid)Kennung des Produkts.

Anfragekörper

  • application/json
{
  "releases": [
    "2.4.1",
    "2.5.0"
  ],
  "vulnerability": "GHSA-qppj-fm5r-hxr3",
  "status": "not_affected",
  "justification": "vulnerable_code_not_in_execute_path"
}

Antworten

201 Die Aussagen, eine je Produktversion. DecisionList

{
  "decisions": [
    {
      "id": "0d1e2f30-4a5b-4c6d-8e7f-90a1b2c3d4e5",
      "release": "2.4.1",
      "vulnerability": "GHSA-qppj-fm5r-hxr3",
      "status": "not_affected",
      "justification": "vulnerable_code_not_in_execute_path",
      "decided_at": "2026-10-30T09:15:00Z",
      "stale": false
    }
  ]
}

400 Der Inhalt ist nicht das JSON, das der Vertrag nennt, oder ein Abfrageparameter fehlt. Problem

{
  "type": "about:blank",
  "title": "Bad Request",
  "status": 400,
  "detail": "Send the decision as a JSON object with the members the contract names."
}

409 Eine Anfrage mit demselben Idempotency-Key läuft noch. Problem

Beispiel

422 Die Aussage verletzt eine Regel ihres Status oder nennt keine Produktversion, oder der Idempotency-Key wurde mit einer anderen Anfrage gesendet. Problem

{
  "type": "about:blank",
  "title": "Unprocessable Entity",
  "status": 422,
  "detail": "not_affected needs a justification or an impact_statement."
}

Beispiel

curl --fail-with-body -sS -X POST \
  -H "Authorization: Bearer $BITHIVE_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @new-decision.json \
  "https://app.bithive-it.com/v1/products/$PRODUCTID/decisions"

GET/v1/products/{productId}/decisions/history

Die Aussagen zu einer Produktversion und einer Schwachstelle lesen

Gibt jede Aussage zurück, die zu einer Produktversion des Produkts und einer Schwachstelle festgehalten wurde, die neueste zuerst. Die erste ist die geltende Entscheidung.

Erfordert die Berechtigung findings:read.

Scope: findings:read

Parameter

ParameterWoTypBeschreibung
productId erforderlichpathstring (uuid)Kennung des Produkts.
release erforderlichquerystringDie Produktversion, wie sie benannt ist.
vulnerability erforderlichquerystringDie Kennung der Schwachstelle, wie die Befunde sie nennen.

Antworten

200 Die Aussagen, die neueste zuerst. DecisionList

Beispiel

400 Der Inhalt ist nicht das JSON, das der Vertrag nennt, oder ein Abfrageparameter fehlt. Problem

Beispiel

Beispiel

curl --fail-with-body -sS \
  -H "Authorization: Bearer $BITHIVE_TOKEN" \
  "https://app.bithive-it.com/v1/products/$PRODUCTID/decisions/history"

GET/v1/products/{productId}/vex

Das VEX-Dokument eines Produkts herunterladen

Gibt die geltenden Aussagen des Produkts als OpenVEX-Dokument (v0.2.0) oder als CycloneDX-VEX (Spezifikation 1.6) zurück. Jede Produktversion wird mit der Paket-URL benannt, die ihre eigene SBOM für ihren Gegenstand angibt, sonst mit urn:bithive:product:<product id>:<release>. Ein Befund ohne Aussage steht nicht im Dokument, und das Dokument nennt keine Person, nur wann jede Aussage getroffen wurde.

Das Token handelt als der Benutzer, der es erstellt hat; er muss Inhaber oder Administrator sein. Ein Konto kann höchstens drei VEX-Dokumente je Stunde exportieren.

Erfordert die Berechtigung findings:read.

Scope: findings:read

Parameter

ParameterWoTypBeschreibung
productId erforderlichpathstring (uuid)Kennung des Produkts.
format erforderlichquerystringDas Format des Dokuments.

Antworten

200 Das VEX-Dokument.

{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "urn:uuid:11111111-2222-4333-8444-555555555555",
  "author": "ACME GmbH",
  "timestamp": "2026-10-31T12:00:00Z",
  "version": 1,
  "tooling": "BitHive Reporting Desk",
  "statements": [
    {
      "vulnerability": {
        "name": "GHSA-qppj-fm5r-hxr3"
      },
      "timestamp": "2026-10-30T09:15:00Z",
      "products": [
        {
          "@id": "urn:bithive:product:6f1c2a3b-4d5e-4f60-8a71-9b0c1d2e3f40:2.4.1",
          "subcomponents": [
            {
              "@id": "pkg:golang/golang.org/x/net@0.38.0"
            }
          ]
        }
      ],
      "status": "not_affected",
      "justification": "vulnerable_code_not_in_execute_path"
    }
  ]
}

400 Der Inhalt ist nicht das JSON, das der Vertrag nennt, oder ein Abfrageparameter fehlt. Problem

Beispiel

409 Das Produkt hat noch keine Aussage. Ein OpenVEX-Dokument (v0.2.0) braucht mindestens eine Aussage, daher wird `format=openvex` abgelehnt, bis eine Aussage festgehalten ist; `format=cyclonedx` liefert eine leere Liste `vulnerabilities`. Nichts wird exportiert, nichts wird ins Audit-Protokoll geschrieben, und die Ablehnung zählt nicht zu den drei Exporten in der Stunde. Problem

Beispiel

Beispiel

curl --fail-with-body -sS \
  -H "Authorization: Bearer $BITHIVE_TOKEN" \
  "https://app.bithive-it.com/v1/products/$PRODUCTID/vex"

GET/v1/products/{productId}/coverage

Lesen, wie viel von einem Produkt geprüft werden kann

Gibt zurück, wie viele Komponenten des neuesten Uploads des Produkts wir prüfen können, und nennt, was sich nicht prüfen lässt. Die Ergebnisse hängen von der Vollständigkeit der Stückliste ab, deshalb wird der nicht abgedeckte Teil benannt und nicht bloß abgezogen: Ein Client sieht, welche Ökosysteme nicht abgedeckt sind und warum.

Eine Komponente wird nicht überwacht, wenn sie keine Paketkennung trägt (häufig bei Firmware, die mit Yocto oder Buildroot gebaut ist), wenn sie keine Version nennt oder wenn sie zu einem Ökosystem gehört, dessen Abgleich noch nicht nachgewiesen ist.

Erfordert die Berechtigung findings:read.

Scope: findings:read

Parameter

ParameterWoTypBeschreibung
productId erforderlichpathstring (uuid)Kennung des Produkts.

Antworten

200 Wogegen der neueste Upload des Produkts geprüft werden konnte. Coverage

{
  "sbom_id": "5d7e9f10-2b4c-4d6e-8f90-a1b2c3d4e5f6",
  "components": 412,
  "monitored": 389,
  "monitored_percent": 94.4,
  "not_monitored": [
    {
      "reason": "no package identifier",
      "components": 14
    },
    {
      "reason": "ecosystem not supported yet",
      "ecosystem": "alpine",
      "components": 9
    }
  ]
}

Beispiel

curl --fail-with-body -sS \
  -H "Authorization: Bearer $BITHIVE_TOKEN" \
  "https://app.bithive-it.com/v1/products/$PRODUCTID/coverage"

Der Vertrag selbst. Diese Seite entsteht aus dem OpenAPI-Dokument des Dienstes. Es ist als Datei veröffentlicht, damit ein Client-Generator denselben Vertrag lesen kann, den diese Seite beschreibt. openapi.yaml herunterladen

Doku

14 Tage kostenlos testen