CodeWallDocs
API Reference

API Endpoints

Available API endpoints and operations.

Tests

MethodEndpointDescription
GET/v1/testsList all tests
POST/v1/testsCreate and launch a new test
GET/v1/tests/:idGet test details
DELETE/v1/tests/:idCancel a running test
GET/v1/tests/:id/statusGet test status and progress

Create a test

curl -X POST https://api.codewall.ai/v1/tests \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://app.example.com",
    "target_type": "web_app",
    "seed_targets": [
      "app.example.com",
      "api.example.com"
    ],
    "config": {
      "scope": {
        "allowed_domains": ["app.example.com", "api.example.com"],
        "excluded": ["/admin/delete-all"]
      }
    }
  }'
FieldTypeDescription
target_urlstringPrimary URL for the target application
target_typestringOne of: web_app, web_api, surface_discovery, mcp_server, llm_app
seed_targetsstring[]Up to 10 seed domains, URLs, or IPs for reconnaissance (replaces legacy seed_target)
seed_targetstringLegacy single seed target (use seed_targets instead)
project_idstringProject to associate the test with
configobjectFull test configuration (scope, auth, safety, etc.)

Findings

MethodEndpointDescription
GET/v1/findingsList all findings across tests
GET/v1/tests/:id/findingsList findings for a specific test
GET/v1/findings/:idGet finding details
PATCH/v1/findings/:idUpdate finding status
POST/v1/findings/importImport findings from an external scanner

List findings with filters

curl "https://api.codewall.ai/v1/findings?severity=critical,high&status=open" \
  -H "Authorization: Bearer YOUR_API_KEY"

Import findings

Upload findings from Nessus or Qualys XML scan exports:

curl -X POST https://api.codewall.ai/v1/findings/import \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@scan_results.xml" \
  -F "tool=nessus" \
  -F "project_id=proj_abc123"
FieldTypeDescription
filefileXML scan export (max 50 MB)
toolstringScanner type: nessus or qualys
project_idstringProject to associate imported findings with

Imported findings are deduplicated by fingerprint. A synthetic test run is created to group the imported findings.

Assets

MethodEndpointDescription
GET/v1/assetsList all assets (supports min_confidence, type, project_id filters)
POST/v1/assetsCreate a new asset
GET/v1/assets/:idGet asset details including confidence score
PATCH/v1/assets/:idUpdate asset (confidence, notes)
DELETE/v1/assets/:idDelete an asset

Targets

MethodEndpointDescription
GET/v1/targetsList all targets
POST/v1/targetsCreate a new target
GET/v1/targets/:idGet target details
PATCH/v1/targets/:idUpdate target configuration
DELETE/v1/targets/:idDelete a target

Schedules

MethodEndpointDescription
GET/v1/schedulesList all schedules
POST/v1/schedulesCreate a new schedule
PATCH/v1/schedules/:idUpdate a schedule
DELETE/v1/schedules/:idDelete a schedule
POST/v1/schedules/:id/pausePause a schedule
POST/v1/schedules/:id/resumeResume a schedule

Approval

MethodEndpointDescription
POST/v1/runs/:id/approveApprove or reject a pending phase gate
POST/v1/runs/:id/approve-commandApprove or reject a pending command

Approve a phase gate

curl -X POST https://api.codewall.ai/v1/runs/:run_id/approve \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "decision": "approve"
  }'
FieldTypeDescription
decisionstringapprove or reject
rejection_actionstringOn reject: cancel (default) or skip_to_report

Approve a command

curl -X POST https://api.codewall.ai/v1/runs/:run_id/approve-command \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "decision": "approve"
  }'

Reachability

MethodEndpointDescription
POST/v1/reachability/checkCheck whether targets are reachable from CodeWall's infrastructure

Check reachability

curl -X POST https://api.codewall.ai/v1/reachability/check \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "targets": ["app.example.com", "api.example.com:8443"]
  }'

Response:

{
  "results": [
    {
      "target": "app.example.com",
      "reachable": true,
      "method": "http",
      "latency_ms": 42
    },
    {
      "target": "api.example.com:8443",
      "reachable": false,
      "method": "tcp",
      "error": "connection timed out"
    }
  ],
  "all_reachable": false
}
FieldTypeDescription
targetsstring[]Up to 20 hostnames, IPs, or host:port pairs to check

Dashboard Views

MethodEndpointDescription
GET/v1/dashboard-viewsList all saved dashboard views
POST/v1/dashboard-viewsCreate a new custom dashboard view
GET/v1/dashboard-views/:idGet a dashboard view
PATCH/v1/dashboard-views/:idUpdate a dashboard view
DELETE/v1/dashboard-views/:idDelete a dashboard view

Reports

MethodEndpointDescription
GET/v1/tests/:id/reportDownload PDF report
GET/v1/tests/:id/report/csvDownload CSV export
GET/v1/tests/:id/report/jsonDownload JSON export

Pagination

List endpoints return paginated results:

{
  "data": [...],
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total": 142,
    "total_pages": 6
  }
}

Use ?page=2&per_page=50 query parameters to paginate.