Security Scan Data API

Machine-readable security review results for every indexed plugin — full snapshot, per-plugin JSON, badge SVGs. 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 00:00 UTC
/data/security-scan.schema.jsonJSON Schema for the snapshot — machine-readable contract for field validationappend-only updates
/artifact/<id>.jsonPer-plugin JSON — derived badge state + scan record + version infodaily 00:00 UTC
/badges/<id>-shield.svgGitHub-shield badge (dsh.so security label + level)daily 00:00 UTC

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

Badge levels

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

LevelConditionMeaning
critical badgeverdict = failCritical findings in blocking categories (secrets / network / destructive / mining)
high-risk badgeverdict = warn && critical > 0Non-blocking critical findings (code-exec / shell / install / obfuscation)
warning badgeverdict = warn && critical = 0Warning-level findings only
passed badgeverdict = passNo critical/warning findings (info allowed)
outdated badgescan.commitSha ≠ plugin.latestCommitShaRepo has newer commits since the scan; result no longer describes current code
stale badgepassed && scannedAt > 30d agoLast passing scan is older than 30 days
unscanned badgeno 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)
badgeLevelsobjectCurrent badge-state definitions for auditability
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). When the repository receives new commits (latestCommitSha advances), the badge automatically degrades to outdated until the daily pipeline rescans. This prevents "certified-then-poisoned" scenarios.

Usage

Embed a badge in your README. Replace <id> with the plugin id (example rendered below with dsh-plugins-finder):

GitHub-shield
[![dsh.so security](https://www.dsh.so/badges/<id>-shield.svg)](https://www.dsh.so/artifact/<id>/)GitHub-shield badge example

Fetch per-plugin data:

curl https://www.dsh.so/artifact/<id>.json

Data is aggregated from public GitHub repositories by the dsh.so pipelines (discovery every 2h, security scan daily 00:00 UTC). 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?