Responder Service API

Hand-written reference. This page was written in November 2024 and has not been re-checked endpoint by endpoint against the code since. Paths, fields and examples may have drifted; the service’s own OpenAPI document is authoritative. Corrections are welcome as issues or pull requests.

All IDs, keys (such as your-api-key) and host names in the examples are fictitious placeholders.

Gateway path: https://<host>/api/v1/responder/... (proxied to the service’s /v1/...)
Local port: listed in Service ports; the examples below call the service directly on localhost
Authentication: Bearer Token (JWT, JSON Web Token) required


Overview

The Responder Service orchestrates incident response and remediation workflows through SOAR (Security Orchestration, Automation, and Response) playbooks. It executes automated response actions, manages incident tickets, tracks remediation progress, and integrates with external connectors for alert triage, ticket creation, and remediation execution.

Table of Contents


Authentication

All Responder Service endpoints require JWT Bearer token authentication:

curl -X GET http://localhost:8018/v1/playbooks \
  -H "Authorization: Bearer your-jwt-token"

Playbook Management

GET /playbooks

List all available SOAR playbooks.

Method: GET Endpoint: /api/v1/playbooks Authentication: Required (Bearer Token) Rate Limit: 100 requests/minute

Query Parameters:

Name Type Required Description
category string No Filter by category: incident_response, malware, threat_intel, access_control
enabled boolean No Filter by enabled status
limit integer No Number of results (default: 50)
offset integer No Pagination offset
search string No Search playbook name or description

Request:

curl -X GET "http://localhost:8018/v1/playbooks?category=incident_response&enabled=true" \
  -H "Authorization: Bearer your-jwt-token"

Response (200 OK):

{
  "count": 24,
  "results": [
    {
      "id": "pb-001",
      "name": "Malware Detection Response",
      "category": "malware",
      "description": "Automated response to malware detection alerts",
      "enabled": true,
      "created_at": "2024-06-15T10:30:00Z",
      "updated_at": "2024-11-07T14:25:00Z",
      "version": "2.1",
      "triggers": ["malware_detected", "suspicious_process"],
      "actions": [
        "isolate_host",
        "kill_process",
        "create_ticket",
        "notify_team"
      ],
      "execution_timeout_seconds": 600,
      "success_rate": 0.98
    },
    {
      "id": "pb-002",
      "name": "Brute Force Attack Response",
      "category": "access_control",
      "description": "Respond to repeated failed authentication attempts",
      "enabled": true,
      "triggers": ["failed_login_threshold"],
      "actions": ["block_ip", "reset_password", "create_ticket", "alert_security"]
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 24
  }
}

GET /playbooks/{playbook_id}

Get detailed information about a specific playbook.

Method: GET Endpoint: /api/v1/playbooks/{playbook_id} Authentication: Required (Bearer Token)

Path Parameters:

Name Type Description
playbook_id string Playbook identifier

Request:

curl -X GET http://localhost:8018/v1/playbooks/pb-001 \
  -H "Authorization: Bearer your-jwt-token"

Response (200 OK):

{
  "id": "pb-001",
  "name": "Malware Detection Response",
  "category": "malware",
  "description": "Comprehensive automated response to malware detection alerts",
  "enabled": true,
  "version": "2.1",
  "created_by": "security-team",
  "created_at": "2024-06-15T10:30:00Z",
  "updated_at": "2024-11-07T14:25:00Z",
  "triggers": [
    {
      "type": "malware_detected",
      "source": "antivirus",
      "severity": "critical"
    },
    {
      "type": "suspicious_process",
      "source": "edr",
      "severity": "high"
    }
  ],
  "steps": [
    {
      "step_id": 1,
      "name": "Isolate Host",
      "action": "isolate_host",
      "connector": "network_isolation",
      "parameters": {
        "action": "network_isolation",
        "duration_minutes": 60
      },
      "timeout_seconds": 60,
      "retry_count": 2
    },
    {
      "step_id": 2,
      "name": "Kill Malicious Process",
      "action": "kill_process",
      "connector": "endpoint_security",
      "parameters": {
        "process_criteria": "detection_source"
      },
      "timeout_seconds": 30
    },
    {
      "step_id": 3,
      "name": "Create Incident Ticket",
      "action": "create_ticket",
      "connector": "jira",
      "parameters": {
        "project": "SEC",
        "issue_type": "Incident",
        "priority": "Highest"
      }
    },
    {
      "step_id": 4,
      "name": "Notify Security Team",
      "action": "notify_team",
      "connector": "slack",
      "parameters": {
        "channel": "#security-incidents",
        "mention_on_call": true
      }
    }
  ],
  "execution_timeout_seconds": 600,
  "success_rate": 0.98,
  "last_run": "2024-11-07T16:30:00Z",
  "total_executions": 156
}

POST /playbooks/{playbook_id}/execute

Execute a playbook with specified parameters.

Method: POST Endpoint: /api/v1/playbooks/{playbook_id}/execute Authentication: Required (Bearer Token)

Path Parameters:

Name Type Description
playbook_id string Playbook identifier

Request Body:

Field Type Required Description
trigger_data object Yes Data from the triggering event
alert_id string No Associated alert ID
incident_id string No Associated incident ID
priority string No Priority: low, normal, high, critical (default: normal)

Request:

curl -X POST http://localhost:8018/v1/playbooks/pb-001/execute \
  -H "Authorization: Bearer your-jwt-token" \
  -H "Content-Type: application/json" \
  -d '{
    "trigger_data": {
      "host": "workstation-42",
      "process_name": "malware.exe",
      "severity": "critical"
    },
    "alert_id": "alert-12345",
    "priority": "critical"
  }'

Response (202 Accepted):

{
  "run_id": "run-550e8400-e29b-41d4-a716-446655440000",
  "playbook_id": "pb-001",
  "playbook_name": "Malware Detection Response",
  "status": "started",
  "created_at": "2024-11-07T18:35:00Z",
  "started_at": "2024-11-07T18:35:02Z",
  "completed_at": null,
  "progress": "Step 1/4: Isolating host..."
}

Execution & Monitoring

GET /runs/{run_id}

Get the status and results of a playbook execution.

Method: GET Endpoint: /api/v1/runs/{run_id} Authentication: Required (Bearer Token)

Path Parameters:

Name Type Description
run_id string Execution run identifier

Request:

curl -X GET http://localhost:8018/v1/runs/run-550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer your-jwt-token"

Response (200 OK) - In Progress:

{
  "run_id": "run-550e8400-e29b-41d4-a716-446655440000",
  "playbook_id": "pb-001",
  "playbook_name": "Malware Detection Response",
  "status": "running",
  "created_at": "2024-11-07T18:35:00Z",
  "started_at": "2024-11-07T18:35:02Z",
  "completed_at": null,
  "current_step": 2,
  "total_steps": 4,
  "progress": "Step 2/4: Killing malicious process...",
  "steps_completed": [
    {
      "step_id": 1,
      "name": "Isolate Host",
      "status": "success",
      "started_at": "2024-11-07T18:35:02Z",
      "completed_at": "2024-11-07T18:35:45Z",
      "duration_seconds": 43,
      "result": {
        "host": "workstation-42",
        "action": "isolated",
        "isolation_id": "iso-789"
      }
    }
  ]
}

Response (200 OK) - Completed:

{
  "run_id": "run-550e8400-e29b-41d4-a716-446655440000",
  "playbook_id": "pb-001",
  "playbook_name": "Malware Detection Response",
  "status": "success",
  "created_at": "2024-11-07T18:35:00Z",
  "started_at": "2024-11-07T18:35:02Z",
  "completed_at": "2024-11-07T18:37:32Z",
  "total_duration_seconds": 150,
  "current_step": 4,
  "total_steps": 4,
  "steps_completed": [
    {
      "step_id": 1,
      "name": "Isolate Host",
      "status": "success",
      "started_at": "2024-11-07T18:35:02Z",
      "completed_at": "2024-11-07T18:35:45Z",
      "duration_seconds": 43,
      "result": {
        "host": "workstation-42",
        "action": "isolated"
      }
    },
    {
      "step_id": 2,
      "name": "Kill Malicious Process",
      "status": "success",
      "started_at": "2024-11-07T18:35:45Z",
      "completed_at": "2024-11-07T18:35:62Z",
      "duration_seconds": 17,
      "result": {
        "process": "malware.exe",
        "action": "terminated"
      }
    },
    {
      "step_id": 3,
      "name": "Create Incident Ticket",
      "status": "success",
      "started_at": "2024-11-07T18:35:62Z",
      "completed_at": "2024-11-07T18:36:15Z",
      "duration_seconds": 53,
      "result": {
        "ticket_id": "SEC-2024-001234",
        "url": "https://jira.example.com/browse/SEC-2024-001234"
      }
    },
    {
      "step_id": 4,
      "name": "Notify Security Team",
      "status": "success",
      "started_at": "2024-11-07T18:36:15Z",
      "completed_at": "2024-11-07T18:36:32Z",
      "duration_seconds": 17,
      "result": {
        "channel": "#security-incidents",
        "message_id": "msg-xyz789"
      }
    }
  ],
  "summary": {
    "host_isolated": true,
    "process_terminated": true,
    "ticket_created": "SEC-2024-001234",
    "team_notified": true
  }
}

GET /runs

List playbook executions with filtering and pagination.

Method: GET Endpoint: /api/v1/runs Authentication: Required (Bearer Token)

Query Parameters:

Name Type Description
playbook_id string Filter by playbook
status string Filter by status: running, success, failed, cancelled
limit integer Results per page (default: 50)
offset integer Pagination offset
time_range string 1h, 24h, 7d, 30d

Request:

curl -X GET "http://localhost:8018/v1/runs?status=success&time_range=24h" \
  -H "Authorization: Bearer your-jwt-token"

Response (200 OK):

{
  "count": 45,
  "results": [
    {
      "run_id": "run-550e8400-e29b-41d4-a716-446655440000",
      "playbook_id": "pb-001",
      "playbook_name": "Malware Detection Response",
      "status": "success",
      "created_at": "2024-11-07T18:35:00Z",
      "completed_at": "2024-11-07T18:37:32Z",
      "duration_seconds": 150
    }
  ]
}

DELETE /runs/{run_id}

Cancel a running playbook execution.

Method: DELETE Endpoint: /api/v1/runs/{run_id} Authentication: Required (Bearer Token)

Request:

curl -X DELETE http://localhost:8018/v1/runs/run-550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer your-jwt-token"

Response (200 OK):

{
  "message": "Execution cancelled",
  "run_id": "run-550e8400-e29b-41d4-a716-446655440000",
  "status": "cancelled"
}

Connector Management

GET /connectors

List all configured connectors for playbook actions.

Method: GET Endpoint: /api/v1/connectors Authentication: Required (Bearer Token)

Query Parameters:

Name Type Description
category string Filter by category: ticketing, notification, orchestration, threat_intel
status string Filter by status: active, inactive, error

Request:

curl -X GET "http://localhost:8018/v1/connectors?status=active" \
  -H "Authorization: Bearer your-jwt-token"

Response (200 OK):

{
  "count": 12,
  "results": [
    {
      "id": "conn-jira-001",
      "name": "Jira - Ticketing",
      "category": "ticketing",
      "platform": "Atlassian JIRA",
      "status": "active",
      "version": "1.0",
      "supported_actions": [
        "create_issue",
        "update_issue",
        "add_comment",
        "transition_issue",
        "assign_issue"
      ],
      "last_tested": "2024-11-07T16:30:00Z"
    },
    {
      "id": "conn-slack-001",
      "name": "Slack - Notifications",
      "category": "notification",
      "platform": "Slack",
      "status": "active",
      "supported_actions": [
        "send_message",
        "post_file",
        "update_status",
        "create_channel"
      ]
    }
  ]
}

Error Codes

Code Status Description
200 OK Request successful
202 Accepted Playbook execution started
400 Bad Request Invalid request parameters
401 Unauthorized Missing or invalid token
404 Not Found Playbook or execution not found
409 Conflict Playbook disabled or execution already running
429 Too Many Requests Rate limit exceeded
500 Internal Server Error Service error

Rate Limiting

The Responder Service enforces rate limits per token:

  • Standard tokens: 100 requests/minute
  • Privileged tokens: 1,000 requests/minute

Rate limit information is returned in response headers:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1730963100

Examples

Automated Incident Response Workflow

# 1. List available playbooks
PLAYBOOKS=$(curl -s http://localhost:8018/v1/playbooks?category=malware \
  -H "Authorization: Bearer $TOKEN" | jq '.')

# 2. Execute malware response playbook
RUN_ID=$(curl -s -X POST http://localhost:8018/v1/playbooks/pb-001/execute \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "trigger_data": {
      "host": "infected-host",
      "process": "malware.exe",
      "severity": "critical"
    },
    "priority": "critical"
  }' | jq -r '.run_id')

echo "Playbook execution started: $RUN_ID"

# 3. Monitor execution progress
while true; do
  RUN=$(curl -s http://localhost:8018/v1/runs/$RUN_ID \
    -H "Authorization: Bearer $TOKEN")

  STATUS=$(echo "$RUN" | jq -r '.status')
  PROGRESS=$(echo "$RUN" | jq -r '.progress')

  echo "[$STATUS] $PROGRESS"

  if [[ "$STATUS" == "success" ]] || [[ "$STATUS" == "failed" ]]; then
    echo "Execution complete!"
    echo "$RUN" | jq '.summary'
    break
  fi

  sleep 2
done

Trigger Playbook from Alert

#!/bin/bash

# Receive alert from SIEM
ALERT_DATA=$(cat <<'EOF'
{
  "alert_id": "alert-001",
  "severity": "critical",
  "title": "Suspicious Activity Detected",
  "host": "prod-web-01",
  "alert_type": "suspicious_network_activity"
}
EOF
)

# Execute appropriate playbook
if grep -q "suspicious_network" <<< "$ALERT_DATA"; then
  PLAYBOOK_ID="pb-network-isolation"
else
  PLAYBOOK_ID="pb-generic-response"
fi

# Execute playbook
curl -X POST "http://localhost:8018/v1/playbooks/$PLAYBOOK_ID/execute" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"trigger_data\": $ALERT_DATA,
    \"alert_id\": \"$(echo $ALERT_DATA | jq -r '.alert_id')\",
    \"priority\": \"critical\"
  }"