Security Scan Data API

Machine-readable security review results for every indexed plugin — full snapshot, per-plugin JSON, scan state levels, and version binding. All data is static, cached, and free to reuse with attribution.

Endpoints
URLDescriptionUpdate
/data/security-scan.jsonFull snapshot — all plugins' scan results (verdict, counts, categories, hash, version)daily 01:10 Beijing (17:10 UTC)
/data/security-scan.schema.jsonJSON Schema for the snapshot — machine-readable contract for field validationappend-only updates
/artifact/<id>.jsonPer-plugin JSON — derived scan state + scan record + version infodaily 01:10 Beijing (17:10 UTC)

JSON endpoints allow cross-origin reads: Access-Control-Allow-Origin: *. No API key or registration is required.

Scan state levels

Derived from the scan verdict via deriveBadgeState (src/scripts/badge-state.ts). Evaluation order: outdated → critical → medium → warning → stale → passed.

LevelConditionMeaning
criticalverdict = failCritical findings in blocking categories (secrets / network / destructive / mining)
mediumverdict = warn && critical > 0Non-blocking critical findings (code-exec / shell / install / obfuscation) — shown as needs-review
warningverdict = warn && critical = 0Warning-level findings only
passedverdict = passNo critical/warning findings (info allowed)
outdatedscan.commitSha ≠ plugin.latestCommitSha && scannedAt > 7d agoRepo has newer commits and the scan is older than 7 days; result no longer describes current code
stalepassed && scannedAt > 30d agoLast passing scan is older than 30 days
unscannedno scan recordNot yet scanned (new plugin or scan failure)
Snapshot envelope

/data/security-scan.json is a single JSON object with the snapshot envelope below, not a bare map. Consumers should ignore unknown envelope fields.

FieldTypeSemantics
generatedstring (YYYY-MM-DD)Snapshot date derived from generatedAt
generatedAtstring (ISO 8601)Persisted pipeline snapshot time; never derived from web build time
sourcestringHuman registry page this snapshot derives from
schemastringAbsolute URL of the schema validating each scan record
updatestringCurrent pipeline cadence and owner
licenseobjectProvenance and reuse terms (attribution required)
countintegerNumber of plugin ids in scans
scansobjectPlugin-id to scan-record map; keys match plugins.json ids
Fields
FieldTypeSemantics
verdictpass|warn|failScan conclusion (see levels above)
countsobjectFinding counts by severity: critical / warning / info
criticalByCategoryobjectCritical findings grouped by category (shell, code-exec, secrets, network, destructive, obfuscation, install, mining)
filesScannedintegerSource files scanned (capped at 15)
scannedAtstring (ISO)When the scan ran
commitShastring | nullHEAD commit SHA at scan time — result valid only for this revision
pkgVersionstring | nullPlugin's own version from package.json (zero-cost extraction)
pkgDshbooleanWhether the repo declares a dsh manifest (package.json dsh field)
latestCommitShastring | nullRegistry's latest known HEAD (updated by update-plugins; used for outdated detection)
latestReleaseTagstring | nullLatest GitHub release tag (plugin's published semantic version)

latestCommitSha and latestReleaseTag are plugin-level metadata from plugins.json, exposed through per-plugin JSON for convenience. They may be null while the pipeline backfills discovery data.

Version binding

A scan result only describes the code at commitSha (the revision it ran on). New commits within 7 days are tolerated (the rating still counts); if the repository keeps moving and the scan is older than 7 days, the state degrades to outdated until the daily pipeline rescans. This prevents "certified-then-poisoned" scenarios.

Usage

Fetch the full snapshot or per-plugin data:

curl https://www.dsh.so/data/security-scan.json
curl https://www.dsh.so/artifact/<id>.json

Security scan data is aggregated from public GitHub repositories by the dsh.so pipelines: incremental discovery every 2h at Beijing even hours (02:00-22:00), manual submissions on Beijing odd hours (03:00-23:00), full refresh daily at 00:00 Beijing, and security scan daily at 01:10 Beijing. Fields are append-only: existing fields are never removed or renamed, and new fields are added with a schema update. The snapshot and schema are free to reuse with attribution to dsh.so; check changelog for additions.

Was this page helpful?