Schnellstart
Erstellen Sie in der App unter Wire → API-Schlüssel einen Schlüssel und rufen Sie die API von überall auf. Antworten sind JSON, Zeiten ISO-8601 UTC.
curl -H "Authorization: Bearer rr_live_…" \
https://realityradar-7h6.pages.dev/api/v1/public/alerts?limit=5const res = await fetch('https://realityradar-7h6.pages.dev/api/v1/public/entities', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.RADAR_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ entityType: 'software_version', displayName: 'Node.js', modelOrVersion: '18.20.0',
identifiers: { eolProduct: 'nodejs' }, relationship: 'used' }),
});
console.log(res.status, await res.json());import os, requests
r = requests.get("https://realityradar-7h6.pages.dev/api/v1/public/events", params={"type": "product_recall", "limit": 20},
headers={"Authorization": f"Bearer {os.environ['RADAR_KEY']}"}, timeout=10)
r.raise_for_status()
for e in r.json()["items"]:
print(e["firstSeenAt"], e["title"], e["sourceUrl"])Authentifizierung
Senden Sie den Schlüssel als Bearer-Token. Er wird nur einmal angezeigt, nur als Hash gespeichert, kann nach 30, 90 oder 365 Tagen ablaufen und mit 24 Stunden Überlappung ersetzt werden.
Authorization: Bearer rr_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBerechtigungen
Jeder Schlüssel trägt nur die gewählten Berechtigungen. Anfragen außerhalb liefern 403 insufficient_scope, sodass ein Nur-Lese-Schlüssel nie Objekte hinzufügen oder Webhooks verwalten kann.
| Berechtigung | Endpunkte |
|---|---|
read:signals | GET /public/eventsGET /public/events/{id} |
read:entities | GET /public/entities |
write:entities | POST /public/entities |
read:alerts | GET /public/alerts |
manage:webhooks | GET /public/webhooksPOST /public/webhooksDELETE /public/webhooks/{id}GET /public/webhooks/{id}/deliveriesPOST /public/webhooks/{id}/deliveries/{deliveryId}/replay |
Ratenlimits
Standardschlüssel erlauben 60 Anfragen pro Minute, erhöhte 300. Ein 429 heißt warten und erneut versuchen; die Nutzung pro Schlüssel und Endpunkt sehen Sie in Wire.
Paginierung
Listen liefern items und nextCursor. Geben Sie den Cursor zurück, bis er null ist; Cursor sind undurchsichtig und beim Blättern stabil.
cursor = None
while True:
page = requests.get(f"https://realityradar-7h6.pages.dev/api/v1/public/events", headers=H, params={"limit": 100, "cursor": cursor}).json()
handle(page["items"])
cursor = page["nextCursor"]
if not cursor:
breakFehler
Fehler haben ein einheitliches Format mit stabilem Code. Wiederholen Sie 5xx und 429 mit Backoff; ein 4xx bedeutet ein Problem mit der Anfrage.
{ "error": { "code": "insufficient_scope", "message": "This key lacks the \"write:entities\" scope" } }invalid_api_key | 401 | Schlüssel fehlt, ist fehlerhaft oder widerrufen |
api_key_expired | 401 | Ablauf oder Ersetzungsfrist des Schlüssels überschritten |
insufficient_scope | 403 | Dem Schlüssel fehlt die nötige Berechtigung |
not_found | 404 | Nicht gefunden oder für diesen Arbeitsbereich nicht sichtbar |
plan_limit | 409 | Objektlimit des kostenlosen Tarifs erreicht |
ssrf_blocked | 422 | URL zeigt auf eine private oder interne Adresse |
rate_limited | 429 | Zu viele Anfragen – nach dem Zeitfenster erneut versuchen |
Webhooks
Webhooks senden per POST ein JSON-Ereignis, sobald eine Warnung ab Ihrer Stufe entsteht. Das Zustellprotokoll speichert 30 Tage mit Status, Latenz und erneutem Senden per Klick.
POST /your/endpoint
Content-Type: application/json
User-Agent: RealityRadar-Webhook/1.0
X-Radar-Signature: t=1761112800,v1=5f2b…a91c,v1=03de…77b0
{"type":"alert.created","alert":{"impactLevel":"critical","matchType":"exact",…},"event":{…}}Signaturen prüfen
Berechnen Sie HMAC-SHA256 aus t, einem Punkt und dem Rohinhalt mit Ihrem Secret, vergleichen Sie in konstanter Zeit mit einem beliebigen v1 und lehnen Sie Zeitstempel älter als fünf Minuten ab. Nach einem Secret-Wechsel kommen 24 Stunden lang zwei v1.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody: the exact bytes you received (do not re-serialize JSON)
export function verifyRadar(header, rawBody, secret) {
const parts = header.split(',').map((p) => p.split('='));
const t = Number(parts.find(([k]) => k === 't')?.[1]);
const sigs = parts.filter(([k]) => k === 'v1').map(([, v]) => v);
if (!Number.isFinite(t) || Math.abs(Date.now() / 1000 - t) > 300) return false;
const mac = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return sigs.some((v) => v.length === mac.length && timingSafeEqual(Buffer.from(v), Buffer.from(mac)));
}import hmac, hashlib, time
def verify_radar(header: str, raw_body: bytes, secret: str) -> bool:
parts = [p.split("=", 1) for p in header.split(",")]
t = next((int(v) for k, v in parts if k == "t"), None)
sigs = [v for k, v in parts if k == "v1"]
if t is None or abs(time.time() - t) > 300:
return False
mac = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
return any(hmac.compare_digest(mac, s) for s in sigs)func VerifyRadar(header string, rawBody []byte, secret string) bool {
var t int64 = -1
var sigs []string
for _, p := range strings.Split(header, ",") {
k, v, ok := strings.Cut(p, "=")
if !ok { continue }
if k == "t" { t, _ = strconv.ParseInt(v, 10, 64) }
if k == "v1" { sigs = append(sigs, v) }
}
if t < 0 || math.Abs(float64(time.Now().Unix()-t)) > 300 { return false }
m := hmac.New(sha256.New, []byte(secret))
fmt.Fprintf(m, "%d.", t)
m.Write(rawBody)
want := hex.EncodeToString(m.Sum(nil))
for _, s := range sigs {
if hmac.Equal([]byte(want), []byte(s)) { return true }
}
return false
}# Replay a delivery (fresh timestamp + signature)
curl -X POST -H "Authorization: Bearer rr_live_…" \
https://realityradar-7h6.pages.dev/api/v1/public/webhooks/WEBHOOK_ID/deliveries/DELIVERY_ID/replayAbhängigkeiten und OSV
Verfolgen Sie Pakete mit einer purl wie pkg:npm/lodash und exakter Version. Reality Radar prüft OSV.dev und markiert einen exakten Treffer, wenn Ihre Version als betroffen gelistet ist. Lockfiles oder SBOMs laden Sie in der App unter Import hoch.
curl -X POST -H "Authorization: Bearer rr_live_…" -H "Content-Type: application/json" \
-d '{"entityType":"software_version","displayName":"lodash","modelOrVersion":"4.17.20","identifiers":{"purl":"pkg:npm/lodash"},"relationship":"used"}' \
https://realityradar-7h6.pages.dev/api/v1/public/entitiesGlossar
Begriffe, die in Antworten vorkommen.
- Signal
- Eine erkannte Änderung aus einer offiziellen Quelle, mit Belegen und Zeitstempeln.
- Beacon
- Eine Datenquelle. Stufe A ist eine offizielle Behörde oder ein Hersteller, Stufe B eine kuratierte Datenbank.
- Übereinstimmungstyp
- exact, strong, probable oder weak – wie sicher wir sind, dass das Ereignis Ihr Objekt betrifft. Nur exact und strong werden als sicher dargestellt.
- Relevanz, Vertrauen, Schwere
- Drei getrennt berechnete Werte von 0–100: Betrifft es Sie, wie verlässlich sind die Belege, wie schwer ist die Änderung.
- purl
- Package-URL, z. B. pkg:npm/lodash, der Standardbezeichner für den OSV-Abgleich.
- Beweisregister
- Eine manipulationssichere Hash-Kette aller gespeicherten Belege, von jedem überprüfbar.