Mulai cepat
Buat kunci di aplikasi pada Wire → Kunci API, lalu panggil API dari mana saja. Respons berupa JSON dan waktu dalam 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"])Autentikasi
Kirim kunci sebagai token Bearer. Kunci hanya ditampilkan sekali, disimpan sebagai hash, dapat kedaluwarsa setelah 30, 90, atau 365 hari, dan dapat diganti dengan masa tumpang tindih 24 jam.
Authorization: Bearer rr_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCakupan
Setiap kunci hanya membawa cakupan yang Anda pilih. Permintaan di luar cakupan mengembalikan 403 insufficient_scope, sehingga kunci baca-saja tidak bisa menambah item atau mengelola webhook.
| Cakupan | Endpoint |
|---|---|
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 |
Batas laju
Kunci standar mengizinkan 60 permintaan per menit dan kunci batas tinggi 300. Respons 429 berarti tunggu lalu coba lagi; penggunaan per kunci dan endpoint terlihat di Wire.
Paginasi
Endpoint daftar mengembalikan items dan nextCursor. Kirim kembali cursor hingga bernilai null; cursor bersifat buram dan stabil selama paginasi.
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:
breakGalat
Galat memakai satu format dengan kode tetap. Ulangi 5xx dan 429 dengan jeda bertahap; 4xx berarti ada masalah pada permintaan.
{ "error": { "code": "insufficient_scope", "message": "This key lacks the \"write:entities\" scope" } }invalid_api_key | 401 | Kunci tidak ada, salah format, atau dicabut |
api_key_expired | 401 | Kunci melewati masa berlaku atau masa penggantian |
insufficient_scope | 403 | Kunci tidak punya cakupan yang dibutuhkan endpoint ini |
not_found | 404 | Tidak ditemukan atau tidak terlihat oleh ruang kerja ini |
plan_limit | 409 | Batas item paket gratis tercapai |
ssrf_blocked | 422 | URL mengarah ke alamat privat atau internal |
rate_limited | 429 | Terlalu banyak permintaan — coba lagi setelah jeda |
Webhook
Webhook mengirim POST berisi peristiwa JSON saat peringatan setingkat atau di atas level Anda dibuat. Log pengiriman disimpan 30 hari dengan status, latensi, dan kirim ulang sekali klik.
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":{…}}Verifikasi tanda tangan
Hitung HMAC-SHA256 dari t, titik, dan body mentah dengan rahasia Anda, bandingkan dalam waktu konstan dengan v1 mana pun, dan tolak stempel waktu yang lebih lama dari lima menit. Setelah rahasia diganti, dua v1 dikirim selama 24 jam.
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/replayDependensi dan OSV
Lacak paket dengan purl seperti pkg:npm/lodash dan versi persis. Reality Radar memeriksa OSV.dev dan menandai kecocokan persis bila versi Anda tercantum terdampak. Unggah lockfile atau SBOM di aplikasi pada menu Impor.
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/entitiesGlosarium
Istilah yang akan Anda lihat di respons.
- Signal (sinyal)
- Perubahan yang terdeteksi dari sumber resmi, lengkap dengan bukti dan stempel waktu.
- Beacon
- Sumber data. Tingkat A adalah regulator atau produsen resmi, tingkat B basis data terkurasi.
- Jenis kecocokan
- exact, strong, probable, atau weak — seberapa yakin kami bahwa peristiwa itu tentang item Anda. Hanya exact dan strong yang dinyatakan pasti.
- Relevansi, keyakinan, keparahan
- Tiga skor 0–100 yang dihitung terpisah: apakah menyangkut Anda, seberapa tepercaya buktinya, seberapa serius perubahannya.
- purl
- Package URL, misalnya pkg:npm/lodash, pengenal standar untuk pencocokan OSV.
- Buku besar bukti
- Rantai hash anti-rusak dari setiap bukti yang disimpan, dapat diverifikasi siapa saja.