Introduction
VibeCheck is a public HTTP API that security-scans vibe-coded apps in two modes — lightweight static analysis of source code and robust AI-powered red-teaming of running applications through a built-in WebSocket reverse tunnel.
Lightweight mode analyzes source code via five static scanners (dependency, pattern, secret, config, and Gemini contextual). Robust mode deploys four Gemini-powered AI agents (recon, auth, injection, config) that actively probe a live target.
Base URL
or inline files
(dependency, pattern, secret, config, Gemini)
(recon, auth, injection, config)
with remediation advice
⚡ Quick Start Guide
Get from zero to security findings in 3 steps. We'll scan a real vulnerable repository — damn-vulnerable-MCP-server — to show you exactly how VibeCheck works.
Step 1 — Check API Health
Verify the API is up and running:
You should see {"status": "healthy", ...}. Try it below in the Health
endpoint.
Step 2 — Create a Scan
Submit the vulnerable repo for lightweight static analysis. This scans the code for SQL injection, hardcoded secrets, XSS, insecure configs, and more:
The API returns 202 Accepted with an assessment object. Copy the id field (e.g.
asm_abc123) — you'll need it for every following step.
Step 3 — Poll for Completion
The scan runs in the background. Poll the assessment status until it reaches complete:
Status progression: queued → cloning → analyzing → complete
(usually ~30-60 seconds).
Step 4 — View Findings
Once complete, fetch the security findings:
You'll see findings like SQL injection, hardcoded secrets, command injection, and more — each with severity, description, location, and remediation advice.
Step 5 — Deep-Dive with AI Analysis
Pick any finding and get Gemini AI-powered analysis with root cause, impact assessment, and an actionable fix plan:
asm_abc123 as a demo ID. Create your own assessment first (Step 2), then replace the ID in any
panel to explore your real results!
📝 Common Workflows
🔍 Scan a GitHub Repo
POST assessment with repo_url → poll status → GET findings → analyze finding with Gemini AI.
🎯 Red-Team a Live App
Connect via WebSocket tunnel or Cloudflare Tunnel → POST robust assessment with target_url → poll → GET findings + agent logs.
⚙️ CI/CD Integration
POST assessment with idempotency_key → poll until complete
→ GET findings → check for critical severity → fail/pass your
pipeline.
🖥️ IDE Integration (MCP)
Add this to your mcp.json in Cursor or VS Code to use VibeCheck tools directly from your
editor chat:
Then add a .cursorrules file to your project root so Cursor uses
VibeCheck automatically:
Authentication
VibeCheck requires no authentication (hackathon MVP). All endpoints are public. Every response
includes an X-Request-ID header for request tracing.
Error Handling
All errors return a consistent envelope:
| HTTP | Type | Codes |
|---|---|---|
400 |
validation_error, tunnel_error | INVALID_MODE, MISSING_REPO_URL, MISSING_TUNNEL_SESSION, TUNNEL_NOT_CONNECTED, INVALID_AGENT, LOGS_NOT_AVAILABLE |
404 |
not_found | ASSESSMENT_NOT_FOUND, FINDING_NOT_FOUND, AGENT_NOT_FOUND, TUNNELSESSION_NOT_FOUND |
409 |
conflict | ASSESSMENT_IN_PROGRESS, DUPLICATE_IDEMPOTENCY_KEY |
422 |
validation_error | VALIDATION_ERROR (Pydantic) |
502 |
external_error, tunnel_error | CLONE_FAILED, TARGET_UNREACHABLE |
Pagination
All list endpoints return a paginated response:
Standard query parameters: page (int, default 1) and per_page (int, default 20, max
100).
📋 Usage Notes
Concurrency: Scans are processed sequentially per instance.
Lightweight scans: Take ~15–60 seconds depending on repo size.
Robust scans: Take ~30–120 seconds depending on depth and number of agents.
WebSocket: Connections are cleaned up after 5 minutes of inactivity.
Health
Returns API health status, version, active tunnel count, and agent availability.
Parameters
None
Example Response
cURL
🧪 Try It
Assessments
Create a security assessment. Returns 202 Accepted. The scan runs in the background.
Body Parameters
| Param | Type | Required | Description |
|---|---|---|---|
mode |
string | Yes | "lightweight" or "robust" |
repo_url |
string | Conditional | GitHub URL. Required for lightweight if no files. |
files |
array | Conditional | Array of {path, content}. Required for lightweight if no repo_url. |
target_url |
string | Conditional | Any reachable URL. Required for robust. |
tunnel_session_id |
string | No | Only needed with built-in tunnel. |
agents |
string[] | No | Default: ["recon","auth","injection","config"] |
depth |
string | No | "quick" (5), "standard" (15), "deep" (30) |
idempotency_key |
string | No | Prevents duplicate scans. |
Example: Lightweight with repo_url
Example: Lightweight with inline files
Example: Robust with target_url
🧪 Try It
List assessments with pagination, filtering, and sorting.
Query Parameters
| Param | Type | Default | Description |
|---|---|---|---|
page |
int | 1 | Page number |
per_page |
int | 20 | Items per page (max 100) |
mode |
string | — | Filter: lightweight or robust |
status |
string | — | Filter: queued, cloning, analyzing, scanning, complete, failed |
sort |
string | -created_at | Sort field (prefix - for desc) |
🧪 Try It
Get full assessment detail. Status progresses: queued → cloning →
analyzing → scanning → complete | failed.
Path Parameters
| Param | Type | Required |
|---|---|---|
id |
string | Yes |
🧪 Try It
Delete assessment and all associated findings and logs. Returns 204 No Content.
🧪 Try It
Re-run a completed or failed assessment. Clears existing findings and logs, resets status to
queued. Returns 409 if the assessment is still in progress.
🧪 Try It
WebSocket endpoint for real-time assessment status updates. Server sends assessment_update
on status changes and assessment_terminal on completion.
Server Message: Status Update
Server Message: Terminal
Findings
List findings for an assessment. Filterable, searchable, and paginated. Default sort uses domain ordering: critical → high → medium → low → info.
Query Parameters
| Param | Type | Description |
|---|---|---|
page |
int | Page number (default 1) |
per_page |
int | Items per page (default 20) |
severity |
string | critical, high, medium, low, info |
category |
string | e.g. sql_injection, xss, hardcoded_secret |
agent |
string | Filter by agent name |
q |
string | Text search across title + description |
sort |
string | Default severity |
Example Finding Object
🧪 Try It
Get a single finding with full detail.
🧪 Try It
Gemini AI-powered deep analysis of a finding. Returns summary, impact, root cause, mode-specific guidance, where to fix, action plan, and similar findings from Supermemory.
Body (optional)
Response Shape
🧪 Try It
Agent Logs
Agent activity logs for robust scans. Returns 400 LOGS_NOT_AVAILABLE for lightweight
assessments.
Query Parameters
| Param | Type | Description |
|---|---|---|
page |
int | Page number |
per_page |
int | Items per page |
agent |
string | Filter by agent name |
Log Entry Shape
🧪 Try It
Agents
List all 5 agents with descriptions and categories.
🧪 Try It
Get a single agent by name. Valid names: recon, auth, injection,
config, static.
🧪 Try It
Tunnel
WebSocket endpoint for the reverse tunnel client. Used to expose localhost apps for robust scanning.
Quick Start
Protocol
List all tunnel sessions with status, target port, and last heartbeat.
🧪 Try It
Get a single tunnel session by ID.
🧪 Try It
Memory
Check if Supermemory integration is enabled.
🧪 Try It
Semantic search across stored findings using Supermemory.
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Search query text |
limit |
int | No | Max results (default 5, max 25) |
assessment_id |
string | No | Filter to specific assessment |