API Documentation
The VSCan API lets you scan VS Code extensions for security vulnerabilities programmatically. Extensions can come from the VS Code Marketplace or the Open VSX Registry.
Generate your API key
Head to the developer portal to instantly provision API credentials and quota.
How It Works
Scanning is asynchronous. You submit an extension, receive an analysisId, poll the status endpoint until it reports completed, then fetch the full report.
Submit a scan
Send a publisher + name to /scan. Get back an analysisId.
Poll the status
Call /status/:id until status is completed.
Fetch results
Call /results/:id for the risk score and findings.
All endpoints at a glance
/scan
Submit an extension for analysis
GET
/status/:analysisId
Check whether a scan has finished
GET
/results/:analysisId
Retrieve the score and findings
GET
/monitored-extensions
List your monitored extensions
POST
/monitored-extensions
Add an extension to a monitored slot
DELETE
/monitored-extensions
Remove an extension from a slot
DELETE
/monitored-extensions/all
Clear the whole list (24h after renewal/upgrade)
Authentication
Authenticate your requests by including your active API key in the X-API-Key header of every request.
curl -H "X-API-Key: your-api-key" \
https://vscan.dev/api/v1/status/your-analysis-id
Base URL
All endpoints are relative to the following base URL.
https://vscan.dev/api/v1Scanning
The three-step async flow: submit an extension, poll its status, then fetch the results.
Submit a Scan
/scan
Queue an extension for security analysis. Returns immediately with an analysisId you'll use to track progress and fetch results. Works with both the VS Code Marketplace and Open VSX Registry.
Request Body
The author/publisher identifier (namespace) of the extension.
The technical slug/name of the extension.
"marketplace" (default) or "openvsx".
Example Request
# VS Code Marketplace (default)
curl -X POST https://vscan.dev/api/v1/scan \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{"publisher": "ms-python", "name": "python"}'
# Open VSX Registry
curl -X POST https://vscan.dev/api/v1/scan \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{"publisher": "esbenp", "name": "prettier-vscode", "registry": "openvsx"}'
Response · 202 Accepted
{
"success": true,
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "pending",
"message": "Extension accepted for analysis.",
"statusUrl": "/api/v1/status/a1b2c3d4-...",
"resultsUrl": "/api/v1/results/a1b2c3d4-..."
}Check Scan Status
/status/:analysisId
Check whether a scan has finished. Poll this endpoint until status is completed, then call /results.
Path Parameters
The analysisId returned by POST /scan.
Example Request
curl https://vscan.dev/api/v1/status/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "X-API-Key: your-api-key"
Response · 200 OK
{
"success": true,
"analysisId": "a1b...",
"status": "processing",
"progress": 45,
"message": "Analyzing...",
"resultsUrl": null
}Status Values
pendingQueued, awaiting compute.processingExecuting analysis tools.completedDone — query /results.failedPackage unavailable/incompatible.Get Scan Results
/results/:analysisId
Retrieve the full report — risk score, extension info, and findings — for a completed scan.
Path Parameters
The analysisId returned by POST /scan.
Example Request
curl https://vscan.dev/api/v1/results/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "X-API-Key: your-api-key"
Response · 200 OK
{
"success": true,
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"results": {
"score": 85,
"extensionInfo": {
"publisher": "ms-python",
"name": "python",
"version": "2024.1.0"
},
"findings": [
// One entry per detected issue, grouped by scanner
...
],
"summary": {
// Counts of findings by severity
...
}
}
}Monitored Extensions
A monitored extension occupies a "slot" in your account and is tracked continuously against VSCan's marketplace threat intelligence. These endpoints let you list, add, and remove slots programmatically, up to your plan's slot limit.
These endpoints authenticate the same way — include your API key in the X-API-Key header. You can also manage slots visually in the API Portal.
List Monitored
/api/v1/monitored-extensions
List all extensions currently occupying a monitored slot in your account.
Example Request
curl https://vscan.dev/api/v1/monitored-extensions \
-H "X-API-Key: your-api-key"
Response · 200 OK
{
"extensions": [
{
"extensionId": "ms-python.python",
"publisher": "ms-python",
"name": "python",
"registry": "marketplace",
"addedAt": "2026-05-01T12:00:00.000Z",
"lastScannedAt": "2026-06-01T08:30:00.000Z"
}
]
}Add Monitored
/api/v1/monitored-extensions
Add an extension to a monitored slot. Fails with 403 if you've reached your plan's slot limit, or 409 if the extension is already monitored.
Request Body
The author/publisher identifier (namespace) of the extension.
The technical slug/name of the extension.
"marketplace" (default) or "openvsx".
Example Request
curl -X POST https://vscan.dev/api/v1/monitored-extensions \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{"publisher": "ms-python", "name": "python"}'
Response · 201 Created
{
"message": "Extension added successfully.",
"extensionId": "ms-python.python"
}Remove Monitored
/api/v1/monitored-extensions
Remove an extension from a monitored slot, freeing it for another. Counts against your plan's per-cycle slot swap limit (403 if exceeded).
Request Body
The author/publisher identifier (namespace) of the extension.
The technical slug/name of the extension.
Must match the registry the slot was created in — "marketplace" (default) or "openvsx".
Example Request
curl -X DELETE https://vscan.dev/api/v1/monitored-extensions \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{"publisher": "ms-python", "name": "python"}'
Response · 200 OK
{
"message": "Extension removed successfully.",
"extensionId": "ms-python.python"
}Clear All Monitored
/api/v1/monitored-extensions/all
Remove every extension from your monitored list in one call so you can start a fresh list — without spending any slot swaps.
This reset is only available for 24 hours after your subscription renews or is upgraded, and only once per cycle. Outside that window it returns 403 Not Available. Downgrades clear the list automatically, so this endpoint is not needed for them.
Example Request
curl -X DELETE https://vscan.dev/api/v1/monitored-extensions/all \
-H "X-API-Key: your-api-key"
Response · 200 OK
{
"success": true,
"message": "Monitored extension list cleared.",
"cleared": 42
}Reference
Rate Limits
Scan Submission
POST /api/v1/scan — compute-heavy jobs
Public API & Config
/api/v1/* status, results & config
General API
All /api/* routes — catch-all ceiling
Error Codes
400Bad request — a required field is missing or invalid401Missing or invalid X-API-Key header403Plan limit reached — out of monitored slots or slot swaps404No scan or extension found for that identifier409Conflict — the extension is already monitored429Rate limit exceeded — too many requests in the window500Something went wrong on our end — retry shortly