LiteSOC

LiteSOC API Reference

Complete guide to integrate security observability

LiteSOC provides two primary APIs for comprehensive security observability:

Using an AI Editor?
Paste into Cursor or Claude to generate your integration code instantly.
Event Collection API
Ingestion

Send security events from your application to LiteSOC for analysis and threat detection.

  • POST /collect endpoint
  • 26 standard event types
  • Auto geo-IP enrichment
Management API
Operations

Query events, manage alerts, and integrate with automation tools like n8n.

  • GET /events endpoint
  • GET/PATCH /alerts PRO
  • Forensics & enrichment data

26

Standard Events

<50ms

API Latency

3

Official SDKs

99.9%

Uptime SLA

Code Examples & Testing Tools

Browse examples in JavaScript, Python, cURL, and more on GitHub

View on GitHub

Authentication

All API requests require authentication using an API key. Include your API key in theX-API-Keyheader with every request.

Required Header

X-API-Key: lsoc_your_api_key_here

Base URL

All API requests should be made to the following base URL:

https://api.litesoc.io

Browser Security (CORS)

For security reasons, LiteSOC restricts browser-side API requests to authorized domains only. This prevents unauthorized websites from making API calls using your API key.

Setup Instructions
Configure authorized origins in 3 easy steps
1

Go to Settings

Navigate to Dashboard → Settings → General

2

Add Your Domain

In the Authorized Origins section, enter your domain including the protocol. You can use exact URLs or wildcard subdomains.

https://app.mydomain.comhttps://*.mydomain.com (matches all subdomains)
3

Save Changes

Click "Save Origins" to apply your changes immediately.

Plan Limits
Number of authorized origins per plan

1

Free

5

Pro

Enterprise

✨ Wildcard Subdomains

Pro and Enterprise users can use wildcard patterns like https://*.yourdomain.com to authorize all subdomains at once.

Note: The following origins are always allowed for testing:

  • https://127.0.0.1:3000
  • http://localhost:3000

Install our SDKs

The fastest way to integrate LiteSOC. Our official SDKs provide a unified interface for both the Event Collection API and Management API, with automatic batching, retries, and type-safe methods.

Event Collection

track() methods for sending security events

Management API

getEvents(), getAlerts() for querying data

For detailed usage, advanced configuration, and more examples, visit our GitHub repositories:

Installation

bash
npm install litesoc

Event Collection API

Send security events to LiteSOC

typescript
import { LiteSOC } from 'litesoc';

const litesoc = new LiteSOC('YOUR_API_KEY');

// Track events with the generic track() method
await litesoc.track('auth.login_failed', {
  actor: 'user_123',         // or { id: 'user_123', email: '...' }
  actorEmail: 'user@example.com',
  userIp: request.ip,        // Required for Behavioral AI
  metadata: { reason: 'invalid_password' }
});

// Or use convenience methods
await litesoc.trackLoginSuccess('user_123', { userIp: request.ip });
await litesoc.trackPrivilegeEscalation('admin_user');
await litesoc.trackSensitiveAccess('user_123', 'customer_pii_table');

// Events are automatically batched - flush before exit
await litesoc.flush();

Management APIPRO+

Query events and manage alerts programmatically

typescript
// Fetch recent security events
const { data: events, metadata } = await litesoc.getEvents({
  limit: 50,
  severity: 'critical',
  eventName: 'auth.login_failed'
});
console.log(`Plan: ${metadata.plan}, Retention: ${metadata.retentionDays} days`);

// Get a single event by ID
const { data: event } = await litesoc.getEvent('evt_abc123');

// List active alerts (Pro+ only)
const { data: alerts } = await litesoc.getAlerts({
  status: 'open',
  severity: 'critical'
});

// Get a single alert by ID (Pro+ only)
const { data: alert, metadata } = await litesoc.getAlert('alt_abc123');
console.log(`Alert: ${alert.title} (${alert.status})`);

// Resolve an alert (alertId, resolutionType, notes?)
// resolutionType: 'blocked_ip' | 'reset_password' | 'contacted_user' | 'false_positive' | 'other'
await litesoc.resolveAlert('alt_abc123', 'blocked_ip', 'IP blocked in firewall');

// Mark alert as safe (false positive)
await litesoc.markAlertSafe('alt_def456', 'Expected behavior from CI/CD pipeline');

Quick Start

Send your first security event in under a minute:

1

Get your API key

Copy your key from Dashboard → Settings → API

2

Send an event

POST to the collect endpoint:

Endpoint
POST https://api.litesoc.io/collect
3

View in Dashboard

Events appear in real-time on your dashboard

Event Collection API

Send security events to LiteSOC for analysis

Use this API to send authentication events, admin actions, data access logs, and security incidents from your application. LiteSOC will automatically normalize, enrich, and analyze each event for potential threats.

Event Collection Endpoint

All API requests should be made to the following base URL:

Available Endpoints

EndpointMethodPurposePlan
/collectPOSTIngest security eventsAll

Error Responses

CodeStatusDescription
202AcceptedEvent queued for processing (production mode)
201CreatedEvent directly inserted (debug mode only)
400Bad RequestInvalid JSON or validation error
401UnauthorizedMissing or invalid API key
403ForbiddenOrigin not authorized (CORS) or monthly quota exceeded
429Too Many RequestsRate limit exceeded, retry after cooldown
500Internal Server ErrorUnexpected server error
503Service UnavailableEvent ingestion temporarily paused for maintenance

Example Responses

JSON
{
  "status": "queued",
  "quota": {
    "remaining": 4999,
    "limit": 5000
  }
}

POST /collectIngestion

Send a single security event to LiteSOC. Events are processed asynchronously and appear in your dashboard within seconds.

Endpoint
POST https://api.litesoc.io/collect
bash
# Replace YOUR_API_KEY with your actual key from the dashboard
# This sends a test login event

curl -X POST https://api.litesoc.io/collect \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "event": "auth.login_success",
    "actor": {
      "id": "test_user_123",
      "email": "test@example.com"
    },
    "user_ip": "203.0.113.50",
    "metadata": {
      "method": "password",
      "test": true
    }
  }'

Request Headers

HeaderValueRequired
Content-Typeapplication/jsonYes
X-API-Keylsoc_your_api_keyYes

Batch Ingestionv2.5+

Send up to 100 events in a single HTTP request by wrapping them in an events array. The server uses Redis pipelining so the entire batch costs one Upstash request unit instead of N — dramatically reducing latency and ingestion costs for high-volume workloads.

Same endpoint, new body shape
Single event (existing)
POST https://api.litesoc.io/collect{ "event": "auth.login_success", "actor": { … }, … }
Batch (new in v2.5)
POST https://api.litesoc.io/collect{ "events": [ { "event": "auth.login_success", … }, { "event": "data.export", … } ] }

Batch Body Schema

FieldTypeRequiredDescription
eventsarrayYesArray of event objects. Min 1, max 100.
events[].eventstringYesEvent name (e.g. auth.login_failed).
events[].actorobjectNo{ id, email } — same as single-event.
events[].user_ipstringNo*Per-event end-user IP. Required for Behavioral AI features.
events[].metadataobjectNoArbitrary key-value metadata for the event.

Batch Response (202)

json
{
  "status": "queued",
  "queued": 3,
  "quota": {
    "remaining": 49997,
    "limit": 50000
  }
}

SDK Examples

typescript
import { LiteSOC } from 'litesoc-node';

const litesoc = new LiteSOC({ apiKey: process.env.LITESOC_API_KEY! });

// Track up to 100 events in ONE HTTP request
const { queued } = await litesoc.trackBatch([
  {
    eventName: 'auth.login_success',
    actor: { id: user.id, email: user.email },
    userIp: clientIp,
  },
  {
    eventName: 'data.export',
    actor: user.id,
    userIp: clientIp,
    metadata: { rows: 500, table: 'orders' },
  },
  {
    eventName: 'admin.settings_changed',
    actor: adminId,
    userIp: adminIp,
    metadata: { field: 'mfa_required', old: false, new: true },
  },
]);

console.log(`${queued} events accepted`);

Raw API Examples

For Go, Ruby, Rust, or other languages without an official SDK, use the raw HTTP API. All examples show how to properly extract and forward the end-user's IP address.

bash
# ================================================
# LiteSOC API - cURL Example
# ================================================
# This example shows how to send a security event
# Replace YOUR_API_KEY with your actual API key
# ================================================

curl -X POST https://api.litesoc.io/collect \
  -H "Content-Type: application/json" \
  -H "x-api-key: lsoc_your_api_key_here" \
  -d '{
    "event": "auth.login_success",
    "actor": {
      "id": "user_123",
      "email": "user@example.com"
    },
    "user_ip": "203.0.113.50",
    "metadata": {
      "method": "password",
      "browser": "Chrome"
    }
  }'

Payload Schema

The request body must be a JSON object with the following structure:

Request Body Fields
FieldTypeRequiredDescription
eventstringYesEvent type. Must start with a letter, only alphanumeric, dots, underscores, hyphens allowed. Max 255 chars.
actorobject | nullOptionalUser who performed the action
actor.idstringRecommendedUnique user ID from your system
actor.emailstringOptionalUser's email address
user_ipstring | nullCriticalEnd-user's IP address (IPv4 or IPv6) for geo-detection
ipstring | nullOptionalAlias for user_ip. If both provided, user_ip takes precedence.
metadataobject | nullOptionalAdditional context data. Max 50 keys, 64KB total size.

Complete Example

JSON
{
  "event": "auth.login_success",
  "actor": {
    "id": "user_abc123",
    "email": "user@example.com"
  },
  "user_ip": "203.0.113.50",
  "metadata": {
    "method": "password",
    "mfa_used": true,
    "browser": "Chrome",
    "os": "macOS",
    "source": "main-website",
    "environment": "production"
  }
}

Standard Events

LiteSOC defines 26 standard security events organized into 5 categories. Events marked as criticaltrigger instant alerts on all plans.

auth.login_success

User successfully authenticated

info
auth.login_failed

Failed authentication attempt

warning
auth.logout

User session ended

info
auth.password_reset

Password reset requested or completed

info
auth.mfa_enabled

Multi-factor authentication activated

info
auth.mfa_disabled

Multi-factor authentication deactivated

warning
auth.session_expired

User session timed out

info
auth.token_refreshed

Authentication token renewed

info

authz.access_denied⚡ Instant Alert

User denied access to a resource

critical
authz.role_changed⚡ Instant Alert

User role or permissions modified

critical
authz.permission_granted

New permission assigned to user

info
authz.permission_revoked

Permission removed from user

warning

admin.user_created

New user account created

info
admin.user_deleted

User account removed

warning
admin.user_suspended

User account temporarily disabled

warning
admin.privilege_escalation⚡ Instant Alert

User gained elevated permissions

critical
admin.settings_changed

System or organization settings modified

info
admin.api_key_created

New API key generated

info
admin.api_key_revoked

API key disabled or deleted

warning

data.export

Data exported from the system

info
data.bulk_delete⚡ Instant Alert

Large-scale data deletion

critical
data.sensitive_access⚡ Instant Alert

Access to sensitive or private data

critical

security.suspicious_activity⚡ Instant Alert

Anomalous or suspicious behavior detected

critical
security.rate_limit_exceeded

API rate limit hit

warning
security.ip_blocked

IP address blocked due to suspicious activity

warning
security.brute_force_detected⚡ Instant Alert

Multiple failed login attempts from same source

critical

IP Address Tracking

IP Field Reference

FieldSourceUsed For
user_ipYou send this (recommended)Geo-IP, Impossible Travel, Brute Force
ipAlias for user_ipSame as user_ip (fallback if user_ip not set)
server_ipAuto-detected from headersAudit trail, fallback if no user_ip

How to Extract User IP

Most web frameworks provide helpers, but behind a reverse proxy (nginx, Cloudflare, AWS ALB), you need to check headers in order of priority:

JavaScript
// Common pattern for extracting real user IP
function getUserIP(request) {
  return (
    // Standard proxy header (nginx, AWS ALB, most proxies)
    request.headers['x-forwarded-for']?.split(',')[0]?.trim() ||
    // Cloudflare-specific header
    request.headers['cf-connecting-ip'] ||
    // Alternative proxy header
    request.headers['x-real-ip'] ||
    // Direct connection (no proxy)
    request.connection?.remoteAddress ||
    '127.0.0.1'
  );
}

Server IP Auto-Detection

The server_ip field is automatically populated from request headers in this order:

  1. x-forwarded-for (first IP in the chain)
  2. cf-connecting-ip (Cloudflare)
  3. x-real-ip (nginx/other proxies)
  4. Falls back to 127.0.0.1 if none found

Event Normalizer

LiteSOC accepts 60+ legacy event formats and automatically normalizes them to our 26 standard events. This means you can migrate from existing logging systems without changing your event names.

Example Normalizations
Send any of these formats—they'll be normalized automatically
user.login.failedauth.login_failed
permission.deniedauthz.access_denied
privilege.escalationadmin.privilege_escalation
rate_limit.exceededsecurity.rate_limit_exceeded
session.expiredauth.session_expired
user.bannedadmin.user_suspended

Management API

Retrieve and manage security data

Use this API to programmatically read events and alerts, automate workflows, and integrate LiteSOC with tools like n8n, Zapier, or your own scripts. For n8n-specific setup and workflow examples, see the n8n Integration Guide.

Available Endpoints

The Management API provides the following endpoints for querying events and managing alerts. Endpoints marked with PRO+ require a Pro or Enterprise subscription.

EndpointMethodDescriptionPlan
/eventsGETFetch raw event logs with filtersAll
/events/:idGETRetrieve a single event by IDAll
/alertsGETList & filter security alertsPRO+
/alerts/:idGETRetrieve a single alert by IDPRO+
/alerts/:idPATCHResolve or mark alert as safePRO+
All PlansEvents API

Query and retrieve security events. Available to all plans with retention limits (7 days Free, 30 days Pro, 90 days Enterprise).

PRO+Alerts API

Manage security alerts programmatically. Resolve alerts, mark as safe, and integrate with automation workflows like n8n.

Response Headers

Every Management API response includes these custom headers for transparency and debugging.

HeaderDescriptionExample Value
X-LiteSOC-PlanYour current subscription tierpro
X-LiteSOC-RetentionData retention window for your plan (in days)30 days
X-LiteSOC-CutoffISO timestamp of your oldest accessible log2025-01-29T10:30:00.000Z
X-RateLimit-LimitMaximum requests per minute100
X-RateLimit-RemainingRequests remaining in current window99
Retry-AfterSeconds to wait if rate limited (429 only)60

Error Responses

All Management API endpoints return consistent error responses. Understanding these error codes will help you build robust integrations and handle edge cases gracefully.

Error Response Format

All errors follow a standard JSON structure:

JSON
{
  "success": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "Human-readable error description",
    "details": { ... }  // Optional: additional context
  }
}

HTTP Status Codes

StatusCodeDescription
200OKRequest succeeded. Response body contains requested data.
400BAD_REQUESTInvalid request parameters or malformed request body.
401UNAUTHORIZEDMissing or invalid API key in X-API-Key header.
403FORBIDDENValid API key but insufficient permissions (e.g., Free tier accessing Pro features).
403RETENTION_EXPIREDResource exists but is outside your plan's retention window.
404NOT_FOUNDRequested resource doesn't exist or belongs to another organization.
429RATE_LIMIT_EXCEEDEDToo many requests. Wait and retry after the Retry-After duration.
500INTERNAL_ERRORServer error. Contact support if this persists.

Common Error Examples

401 Unauthorized
JSON
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Missing or invalid API key"
  }
}
403 Forbidden (Plan Restriction)
JSON
{
  "success": false,
  "error": {
    "code": "PLAN_REQUIRED",
    "message": "Alerts API is blocked for Free tier",
    "details": {
      "required_plan": "pro",
      "current_plan": "free",
      "upgrade_url": "https://www.litesoc.io/pricing"
    }
  }
}
403 Retention Expired
JSON
{
  "success": false,
  "error": {
    "code": "RETENTION_EXPIRED",
    "message": "Event expired based on your plan retention.",
    "details": {
      "event_age_days": 15,
      "plan_retention_days": 7,
      "upgrade_url": "https://www.litesoc.io/pricing"
    }
  }
}
429 Rate Limit Exceeded
JSON
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Maximum 60 requests per minute.",
    "retry_after": 45
  }
}

Check the Retry-After response header for seconds until you can retry.

GET /events

Fetch security events from your organization. Access is tiered based on your subscription plan.

Tiered Access
PlanLimitPaginationNotes
Free100 per requestEnabled7-day retention, forensics redacted
Pro100 per requestEnabled30-day retention, full forensics
Enterprise100 per requestFull historical90-day retention, full forensics

Query Parameters

ParameterTypeDescription
event_namestringFilter by event type (e.g., auth.login_failed)
actor_idstringFilter by actor ID
severitystringFilter by severity: critical, warning, info (auto-assigned by LiteSOC)
limitnumberResults per page (max 100)
offsetnumberPagination offset

Response Structure

The response includes the events array, pagination info, and metadata:

JSON
{
  "success": true,
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "event_name": "auth.login_success",
      "severity": "info",
      "actor_id": "user_abc123",
      "user_ip": "203.0.113.50",
      "server_ip": "10.0.0.1",
      "country_code": "US",
      "city": "San Francisco",
      "is_vpn": false,
      "is_tor": false,
      "is_proxy": false,
      "is_datacenter": false,
      "latitude": 37.7749,
      "longitude": -122.4194,
      "metadata": { ... },
      "created_at": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "total": 150,
    "limit": 50,
    "offset": 0,
    "has_more": true
  },
  "meta": {
    "plan": "pro",
    "retention_days": 30,
    "cutoff_date": "2024-01-01T00:00:00Z",
    "redacted": false,
    "max_limit": 100
  }
}

Event Object Fields

Each event object in the data array includes:

FieldTypeDescription
idstringUnique event identifier (UUID)
event_namestringEvent type (e.g., auth.login_success)
severitystringAuto-assigned by LiteSOC: critical, warning, or info
actor_idstring | nullUser who performed the action
user_ipstring | nullEnd-user's IP address (from your request)
server_ipstring | nullYour server's IP address (auto-detected)
country_codestring | nullISO country code (e.g., US, GB)
citystring | nullCity name from geo-IP lookup
is_vpnboolean | nullWhether IP is from a VPN Pro+
is_torboolean | nullWhether IP is a Tor exit node Pro+
is_proxyboolean | nullWhether IP is from a proxy Pro+
is_datacenterboolean | nullWhether IP is from a datacenter Pro+
latitudenumber | nullGPS latitude coordinate Pro+
longitudenumber | nullGPS longitude coordinate Pro+
metadataobjectAdditional event context (includes network_intelligence, geolocation)
created_atstringISO 8601 timestamp

Pagination Object

FieldTypeDescription
totalnumberTotal number of events matching the query
limitnumberNumber of events per page (max 100)
offsetnumberCurrent pagination offset
has_morebooleanWhether more results exist beyond current page

GET /events/:id

Retrieve a single security event by its unique identifier. Useful for fetching detailed information about a specific event or for audit trail purposes.

Path Parameters

ParameterTypeDescription
idstring (UUID)The unique event identifier

Example Request

cURL
curl -X GET "https://api.litesoc.io/events/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-API-Key: YOUR_API_KEY"

Response Structure

Returns the event wrapped in a standard response object:

JSON
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "event_name": "auth.login_success",
    "severity": "info",
    "actor_id": "user_abc123",
    "user_ip": "203.0.113.50",
    "server_ip": "10.0.0.1",
    "country_code": "US",
    "city": "San Francisco",
    "is_vpn": false,
    "is_tor": false,
    "is_proxy": false,
    "is_datacenter": false,
    "latitude": 37.7749,
    "longitude": -122.4194,
    "metadata": { ... },
    "created_at": "2024-01-15T10:30:00Z"
  },
  "meta": {
    "plan": "pro",
    "retention_days": 30,
    "redacted": false
  }
}

GET /alertsPro+

Fetch security alerts with optional filters for status and severity.

Query Parameters

ParameterTypeValues
statusstringopen, acknowledged, resolved, dismissed
severitystringcritical, high, medium, low (auto-assigned by LiteSOC)
alert_typestringimpossible_travel, brute_force_attack, geo_anomaly, new_device, privilege_escalation, data_exfiltration, suspicious_activity, rate_limit_exceeded
limitnumberPro: max 200, Enterprise: max 500
offsetnumberPagination offset

Response Fields

Each alert object in the response includes:

FieldTypeDescription
idstringUnique alert identifier (UUID)
alert_typestringType of alert (brute_force_attack, impossible_travel, etc.)
severitystringAuto-assigned by LiteSOC: critical, high, medium, or low
statusstringCurrent status: open, acknowledged, resolved, dismissed
titlestringHuman-readable alert title
descriptionstring | nullDetailed description of the alert
source_ipstring | nullIP address that triggered the alert
actor_idstring | nullUser associated with the alert
metadataobjectAdditional alert context and evidence
resolved_atstring | nullISO 8601 timestamp when alert was resolved
resolved_bystring | nullUser ID who resolved the alert
created_atstringISO 8601 timestamp when alert was created
updated_atstringISO 8601 timestamp when alert was last updated

GET /alerts/:idPro+

Retrieve a single alert by its unique identifier. Useful for fetching detailed information about a specific alert or for audit trail purposes.

Path Parameters

ParameterTypeDescription
idstring (UUID)The unique alert identifier

Example Request

cURL
curl -X GET "https://api.litesoc.io/alerts/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-API-Key: YOUR_API_KEY"

Response

Returns the complete alert object with all fields.

PATCH /alerts/:idPro+

Update an alert's status. Use this to resolve alerts or mark them as safe (false positives).

Request Body

FieldTypeRequiredDescription
actionstring"resolve" or "mark_safe"
resolution_typestringWhen action="resolve""blocked_ip", "reset_password", "contacted_user", "false_positive", or "other"
internal_notesstringOptionalNote explaining the resolution (max 2000 characters)
resolved_bystringOptionalUser ID or identifier of who resolved the alert (defaults to "n8n-api")

Response Fields

FieldTypeDescription
idstringAlert UUID
statusstringNew status: "resolved" or "dismissed"
actionstringAction performed: "resolve" or "mark_safe"
resolution_typestring | nullResolution type if action was "resolve"
resolved_atstring | nullISO 8601 timestamp when resolved (null for mark_safe)
resolved_bystringUser ID or identifier who resolved the alert
updated_atstringISO 8601 timestamp
Example: Resolve an Alert
curl -X PATCH "https://api.litesoc.io/alerts/550e8400-e29b-41d4-a716-446655440000" \
  -H "x-api-key: lsoc_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "resolve",
    "resolution_type": "contacted_user",
    "internal_notes": "Verified as legitimate user activity",
    "resolved_by": "user_abc123"
  }'
Example: Mark as Safe (False Positive)
curl -X PATCH "https://api.litesoc.io/alerts/550e8400-e29b-41d4-a716-446655440000" \
  -H "x-api-key: lsoc_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "mark_safe",
    "internal_notes": "Expected activity from automated deployment pipeline",
    "resolved_by": "user_abc123"
  }'

Enrichment DataPRO+

Security events include enrichment data in the metadata object for Pro and Enterprise plans. This includes network intelligence (VPN/Tor/proxy detection) and geolocation data.

Event Response with Enrichment Data
JSON
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "event_name": "auth.login_success",
  "actor_id": "user_abc123",
  "user_ip": "203.0.113.50",
  "country_code": "US",
  "city": "San Francisco",
  "is_vpn": false,
  "is_tor": false,
  "is_proxy": false,
  "is_datacenter": false,
  "latitude": 37.7749,
  "longitude": -122.4194,
  "metadata": {
    "actor_email": "user@example.com",
    "method": "password",
    "geolocation": {
      "country": "US",
      "city": "San Francisco",
      "latitude": 37.7749,
      "longitude": -122.4194
    },
    "network_intelligence": {
      "is_vpn": false,
      "is_tor": false,
      "is_proxy": false,
      "is_datacenter": false,
      "isp": "Comcast Cable Communications"
    }
  },
  "created_at": "2024-01-15T10:30:00Z"
}

Top-Level Enrichment Fields

These fields are available directly on event objects:

FieldTypeDescription
is_vpnboolean | nullWhether IP is from a known VPN provider
is_torboolean | nullWhether IP is a Tor exit node
is_proxyboolean | nullWhether IP is from a known proxy service
is_datacenterboolean | nullWhether IP is from a datacenter/hosting provider
latitudenumber | nullGPS latitude coordinate
longitudenumber | nullGPS longitude coordinate

Metadata Enrichment Objects

Additional enrichment data is also available in the metadata object:

FieldTypeDescription
metadata.network_intelligenceobject | nullNetwork detection info (is_vpn, is_tor, is_proxy, is_datacenter, isp)
metadata.geolocationobject | nullLocation data (country, city, latitude, longitude)
metadata.network_intelligence.ispstring | nullInternet Service Provider name

Outgoing WebhooksPro+

LiteSOC sends real-time JSON alerts to your server when security threats are detected. Configure a webhook endpoint to receive instant notifications for brute force attacks, impossible travel, geo-anomalies, and critical security events.

How It Works
  1. Configure your webhook URL in Dashboard → Settings → Outgoing Webhooks
  2. LiteSOC detects a security threat (brute force, impossible travel, etc.)
  3. We send a signed POST request to your endpoint with the alert payload
  4. Your server verifies the signature and processes the alert

Security & Signature Verification

To ensure the integrity and authenticity of webhook requests, LiteSOC includes a signature in each request. This section explains how to verify these signatures and secure your webhook endpoints.

Webhook Headers
HeaderDescription
X-LiteSOC-SignatureHMAC-SHA256 signature: sha256=...
X-LiteSOC-TimestampISO 8601 timestamp when the webhook was sent
X-LiteSOC-Webhook-VersionWebhook payload version (currently 2.0)
Content-Typeapplication/json
X-LiteSOC-Event-TypeThe event name (e.g., security.brute_force_detected)
X-LiteSOC-Retry-CountRetry attempt number (0 = first attempt)
User-AgentLiteSOC-Webhook/2.0
Signature Verification (Node.js)
Verify the HMAC-SHA256 signature using your webhook_signing_secret from the dashboard.
import crypto from 'crypto';

function verifyWebhookSignature(
  payload: string,
  signature: string,
  timestamp: string,
  secret: string
): boolean {
  // Recreate the signed message: timestamp.payload
  const message = `${timestamp}.${payload}`;
  
  // Generate expected signature
  const expectedSignature = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(message)
    .digest('hex');
  
  // Constant-time comparison to prevent timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}

// Usage in your webhook handler:
const isValid = verifyWebhookSignature(
  JSON.stringify(req.body),
  req.headers['x-litesoc-signature'],
  req.headers['x-litesoc-timestamp'],
  process.env.LITESOC_WEBHOOK_SECRET
);

if (!isValid) {
  return res.status(401).json({ error: 'Invalid signature' });
}

Standard Payload Schema

All LiteSOC webhooks follow a standardized JSON schema, regardless of the specific event type.

Webhook Payload Structure
All webhook payloads follow this standardized schema. Write one parser for all LiteSOC webhooks.
{
  "version": "2.0",
  "event": "security.alert",
  "timestamp": "2026-03-01T14:32:00.000Z",
  "data": {
    "alert_id": "550e8400-e29b-41d4-a716-446655440000",
    "trigger_event_id": "660e8400-e29b-41d4-a716-446655440001",
    "org_id": "org_abc123",
    "event_name": "security.brute_force_detected",
    "severity": "high",
    "actor": {
      "id": "user_12345",
      "email": "user@example.com"
    },
    "user_ip": "203.0.113.50",
    "country_code": "RU",
    "timestamp": "2026-03-01T14:32:00.000Z",
    "forensics": {
      "network": {
        "is_vpn": true,
        "is_tor": false,
        "is_proxy": false,
        "is_datacenter": false,
        "isp": "Example ISP"
      },
      "location": {
        "city": "Moscow",
        "country_code": "RU",
        "latitude": 55.7558,
        "longitude": 37.6173
      }
    },
    "metadata": {
      "failed_attempts": 15,
      "unique_actors": 3,
      "time_window_minutes": 5
    }
  }
}
Field Reference
FieldTypeDescription
alert_idstring (UUID)Unique identifier for the alert in our database
trigger_event_idstring | nullUUID of the specific event that triggered the alert
org_idstringYour organization ID
event_namestringType of security event (see Event Triggers below)
severitystringinfo | low | medium | high | critical
actorobjectUser who triggered the alert (id, email)
user_ipstring | nullIP address associated with the alert
country_codestring | nullISO 3166-1 alpha-2 country code
forensicsobject | nullNetwork intelligence and location data (Pro+ only)
metadataobjectAlert-specific additional data

Event Triggers

LiteSOC supports a wide range of security event triggers that can fire webhooks. Each event has a severity level and may be restricted to certain subscription plans. Below is a reference table of common events that can trigger outgoing webhooks.

Events That Trigger Webhooks
Event NameSeverityDescriptionPlan
security.brute_force_detectedhighMultiple failed login attempts from same IPAll
security.impossible_travelhighSame user logged in from distant locationsPro+
security.geo_anomalymediumLogin from high-risk or new countryPro+
security.custom_rule_triggeredvariesCustom threat model rule matchedEnterprise
admin.privilege_escalationcriticalUser performed privilege escalationAll
data.bulk_deletecriticalBulk data deletion detectedAll
data.sensitive_accesscriticalSensitive data accessedAll

Implementation Example

Next.js API Route Receiver
A complete webhook receiver that validates signatures and processes alerts.
// app/api/webhooks/litesoc/route.ts
import { NextRequest, NextResponse } from 'next/server';
import crypto from 'crypto';

const WEBHOOK_SECRET = process.env.LITESOC_WEBHOOK_SECRET!;

function verifySignature(payload: string, signature: string, timestamp: string): boolean {
  const message = `${timestamp}.${payload}`;
  const expected = 'sha256=' + crypto.createHmac('sha256', WEBHOOK_SECRET)
    .update(message).digest('hex');
  
  try {
    return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
  } catch {
    return false;
  }
}

export async function POST(request: NextRequest) {
  const signature = request.headers.get('x-litesoc-signature');
  const timestamp = request.headers.get('x-litesoc-timestamp');
  
  if (!signature || !timestamp) {
    return NextResponse.json({ error: 'Missing headers' }, { status: 400 });
  }
  
  // Get raw body for signature verification
  const payload = await request.text();
  
  // Verify signature
  if (!verifySignature(payload, signature, timestamp)) {
    return NextResponse.json({ error: 'Invalid signature' }, { status: 401 });
  }
  
  // Parse the verified payload
  const webhook = JSON.parse(payload);
  const alert = webhook.data;
  
  console.log(`[LiteSOC] Received alert: ${alert.event_name}`);
  console.log(`[LiteSOC] Alert ID: ${alert.alert_id}`);
  console.log(`[LiteSOC] Severity: ${alert.severity}`);
  
  // Process based on event type
  switch (alert.event_name) {
    case 'security.brute_force_detected':
      // Block the IP, notify security team, etc.
      await handleBruteForce(alert);
      break;
    case 'security.impossible_travel':
      // Force re-authentication, notify user
      await handleImpossibleTravel(alert);
      break;
    case 'admin.privilege_escalation':
      // High priority: investigate immediately
      await handlePrivilegeEscalation(alert);
      break;
    default:
      console.log(`[LiteSOC] Unhandled event: ${alert.event_name}`);
  }
  
  // Always return 200 to acknowledge receipt
  return NextResponse.json({ received: true });
}

async function handleBruteForce(alert: any) {
  // Example: Add IP to blocklist
  console.log(`Blocking IP: ${alert.user_ip}`);
  // await blockIP(alert.user_ip);
}

async function handleImpossibleTravel(alert: any) {
  // Example: Revoke user sessions
  console.log(`Suspicious travel for actor: ${alert.actor.id}`);
  // await revokeUserSessions(alert.actor.id);
}

async function handlePrivilegeEscalation(alert: any) {
  // Example: Alert security team via Slack
  console.log(`CRITICAL: Privilege escalation by ${alert.actor.id}`);
  // await sendSlackAlert(alert);
}

Best Practices

To build a robust integration with LiteSOC webhooks, follow these best practices for security, reliability, and performance.

5-Second Timeout

LiteSOC waits up to 5 seconds for your endpoint to respond. If processing takes longer, acknowledge the webhook immediately and process asynchronously.

Async Processing

For complex operations (database writes, external API calls), use a background job queue like BullMQ, Inngest, or AWS SQS.

HTTPS Required

Your webhook endpoint must use HTTPS. We reject HTTP URLs to ensure payloads are encrypted in transit.

Retry Logic

We retry failed webhooks with exponential backoff (up to 4 total attempts: 1 initial + 3 retries). Delays are 1s, 2s, 4s with jitter. On persistent failure, we log to your dashboard audit trail.

Infrastructure & Quotas

Rate limits, retention, and system headers

This section covers the technical infrastructure details you need to know: rate limits for both APIs, data retention policies, and the custom headers returned in API responses.

Event Collection

100-2,000

requests/min by plan

Management API

60-500

requests/min by plan

Data Retention

7-90

days by plan

Rate Limits

LiteSOC has two types of rate limits: Event Collection API (for sending security logs) and Management API (for reading data via n8n or custom integrations).

Event Collection API

Optimized for high-volume ingestion when sending security events from your application.

PlanRate LimitMonthly EventsData Retention
Free
100 req/min5,0007 days
Pro
500 req/min50,00030 days
Enterprise
2,000 req/min500,00090 days

Management API

Designed for stable polling when reading events and alerts via n8n or custom integrations.

PlanRate LimitEvents AccessAlerts Access
Free
60 req/min100/req (redacted forensics)Blocked
Pro
100 req/min100/req (full forensics)Full Access
Enterprise
500 req/min100/req (full forensics)Full Access

Retention Policy

Data retention determines how long your security events and alerts are stored. Results from the Management API are strictly filtered by your plan's retention window.

PlanRetentionCutoff BehaviorUpgrade Path
Free
7 daysEvents older than 7 days return 403→ Pro for 30 days
Pro
30 daysEvents older than 30 days return 403→ Enterprise for 90 days
Enterprise
90 daysEvents older than 90 days return 403Custom retention available
JSON (403 Response)
{
  "success": false,
  "error": {
    "code": "RETENTION_EXPIRED",
    "message": "Event expired based on your plan retention.",
    "retention_days": 7
  }
}

Security Intelligence

LiteSOC automatically enriches every security event with powerful forensic data. When you provide the user_ip field, we unlock a comprehensive suite of security intelligence features.

Geolocation
  • City and Country detection
  • Precise GPS coordinates (Latitude/Longitude)
  • Interactive map visualization
  • Country flag emoji display
Network Intelligence
  • VPN provider detection
  • Tor exit node identification
  • Proxy service detection
  • Datacenter IP detection (AWS, GCP, Azure, etc.)

Geolocation Enrichment

Every event with a valid user_ip is automatically enriched with geolocation data. This data is stored in the database and displayed in the Event Forensics view.

FieldTypeDescription
country_codestringISO 3166-1 alpha-2 country code (e.g., "US", "GB")
citystringCity name (e.g., "San Francisco", "London")
latitudefloatGPS latitude coordinate
longitudefloatGPS longitude coordinate

Network Intelligence

LiteSOC analyzes every IP address against comprehensive databases of known VPN providers, Tor exit nodes, proxy services, and cloud/datacenter IP ranges. This helps you identify potentially suspicious traffic sources.

FlagRisk LevelDescription
🕵️ is_torHigh RiskIP is a known Tor exit node. Traffic is fully anonymized.
🔒 is_vpnElevatedIP belongs to a known VPN provider (NordVPN, ExpressVPN, etc.)
🛡️ is_proxyModerateIP is associated with a commercial proxy service
🖥️ is_datacenterInformationalIP belongs to a cloud provider (AWS, GCP, Azure, DigitalOcean, etc.)

Event Forensics UI

View comprehensive forensic data for any security event directly in your dashboard. Simply click any row in the Activity Feed table to open the Event Detail Sheet.

What You'll See
Click any event row to access these forensic details

Geolocation & Travel Path

  • • Interactive OpenStreetMap with location marker
  • • City, Region, and Country with flag emoji
  • • Precise GPS coordinates
  • Travel Path Map for impossible travel alerts with:
    • - Previous & current locations on Mapbox
    • - Distance traveled in kilometers
    • - Country flags for both locations

Network Intelligence Panel

  • • Security alert banner for VPN/Tor/Proxy detection
  • • Network type badge (residential, datacenter, etc.)
  • • Visual security check indicators (VPN, Tor, Proxy, Datacenter)
  • • Provider / ISP identification
  • • User IP & Server IP with copy buttons
  • • "Trusted" badge for whitelisted IPs

Event Details

  • • Event type with severity badge
  • • Actor identity (ID and email)
  • • Timestamps in your local timezone
  • • User agent parsing (browser, OS, device)

Raw Payload

  • • Full JSON metadata with syntax highlighting
  • • Copy-to-clipboard functionality
  • • Event ID for reference

Incident ResolutionPro+

  • • Mark events as resolved with resolution notes
  • • Track resolution status across your team
  • IP Whitelisting option Enterprise

Enrichment Pipeline

When you submit an event to LiteSOC, it returns HTTP 202 Accepted immediately, meaning your data has been queued for processing. Behind the scenes, LiteSOC runs a powerful enrichment pipeline to transform raw events into actionable security intelligence.

Pipeline Stages

IP Reputation

Each IP address is checked against known threat databases:

  • Tor exit node detection
  • VPN provider identification
  • Proxy & datacenter flagging
Geo-Mapping

IP addresses are converted to geographic coordinates:

  • Country & city resolution
  • Latitude/longitude coordinates
  • Interactive map visualization
Threat Scoring

Each event receives a severity level based on risk signals:

  • LowNormal activity
  • MediumUnusual patterns
  • HighSuspicious behavior
  • CriticalActive threat

Enriched Event Example

After processing, your raw event is enriched with security intelligence data:

JSON
{
  "event": "auth.login_success",
  "actor_id": "user_123",
  "actor_email": "user@example.com",
  "user_ip": "185.220.101.42",
  
  // Geo-Mapping (auto-enriched)
  "country": "DE",
  "city": "Frankfurt",
  "latitude": 50.1109,
  "longitude": 8.6821,
  
  // IP Reputation (auto-enriched)
  "is_vpn": false,
  "is_tor": true,
  "is_proxy": false,
  "is_datacenter": false,
  "network_type": "tor",
  "network_provider": "Tor Exit Node",
  
  // Threat Scoring (auto-enriched)
  "severity": "critical",
  "risk_signals": ["tor_exit_node", "high_risk_country"]
}

Plan Features

LiteSOC offers three tiers with progressively more powerful threat detection capabilities.

Free
$0/mo
For side projects and testing
5,000 events/month
7-day data retention
Basic brute force detection
Critical event alerts
Email notifications
Forensics redacted in API
ProPopular
$15/mo
For growing teams
50,000 events/month
Impossible Travel detection
Geo-Anomaly detection
Slack & Discord webhooks
30-day retention + full forensics
Strict brute force (5 attempts)
Enterprise
$99/mo
For security-conscious orgs
500,000 events/month
90-day retention + full forensics
Custom Threat Models
IP Whitelisting (CIDR support)
SAML/OIDC Single Sign-On
Compliance audit logs
Priority support

Threat Detection

LiteSOC automatically analyzes your security events to detect threats in real-time.

Brute Force Detection
All Plans
Detects repeated failed login attempts from the same IP. Free plan triggers at 20 failures in 15 minutes; Pro/Enterprise triggers at 5 failures in 5 minutes.
Impossible Travel
Pro+
Detects when a user logs in from two geographically distant locations within an impossibly short timeframe (e.g., NYC to Tokyo in 10 minutes).
Geo-Anomaly Detection
Pro+

Alerts when a user logs in from a new country for the first time, or from high-risk regions. Learns your organization's normal geographic patterns over a 30-day baseline period.

High-Risk Countries:

🇰🇵 North Korea🇮🇷 Iran🇷🇺 Russia🇨🇳 China🇧🇾 Belarus🇻🇪 Venezuela🇸🇾 Syria🇨🇺 Cuba
Custom Threat Models
Enterprise
Build your own detection rules. Define conditions like "5+ data.export events from the same user in 10 minutes" and get custom alerts with your chosen severity.
Critical Event Alerts
All Plans
Instant notifications for high-severity events like admin.privilege_escalation,data.bulk_delete, andsecurity.suspicious_activity.

Remediation WebhooksPro+

Automatically receive webhook notifications when admins resolve security alerts. Use this to trigger automated remediation in your application—like blocking users, resetting passwords, or revoking sessions.

Setup
  1. Create a POST /api/security-callback endpoint in your app
  2. Go to Dashboard → Settings → Outgoing Webhooks
  3. Enter your endpoint URL in the Remediation Webhook URL field
  4. Save and you're ready to receive webhook calls
Webhook Payload
When an admin resolves an alert, you'll receive this JSON payload:
{
  "event_type": "alert.resolved",
  "timestamp": "2024-01-15T14:32:00Z",
  "alert": {
    "id": "alert_abc123",
    "type": "impossible_travel",
    "status": "resolved",
    "severity": "high"
  },
  "resolution": {
    "type": "blocked_ip",        // or: reset_password, contacted_user, false_positive, other
    "notes": "User confirmed they weren't traveling. Blocking suspicious IP.",
    "resolved_by": "admin@company.com",
    "resolved_at": "2024-01-15T14:32:00Z"
  },
  "actor": {
    "id": "user_12345",          // The affected user's ID
    "ip": "203.0.113.50"         // The suspicious IP address
  },
  "organization": {
    "id": "org_xyz789"
  }
}
Resolution Types
TypeDescriptionSuggested Action
blocked_ipAdmin blocked the IP addressAdd IP to firewall blocklist
reset_passwordAdmin reset user's passwordForce password reset, invalidate sessions
contacted_userAdmin contacted the userLog the interaction, no automated action
false_positiveAlert was a false alarmNo action needed, update ML training data
otherCustom resolutionCheck notes field for details
Example Handler (Node.js/Express)
// POST /api/security-callback
app.post('/api/security-callback', async (req, res) => {
  const { event_type, resolution, actor } = req.body;

  if (event_type !== 'alert.resolved') {
    return res.status(200).json({ received: true });
  }

  // Handle different resolution types
  switch (resolution.type) {
    case 'blocked_ip':
      // Add IP to your blocklist
      await firewall.blockIP(actor.ip);
      break;

    case 'reset_password':
      // Force password reset for the user
      await db.users.update({
        where: { id: actor.id },
        data: { 
          password_reset_required: true,
          sessions: { deleteMany: {} }  // Invalidate all sessions
        }
      });
      break;

    case 'contacted_user':
      // Log the interaction
      await db.audit_log.create({
        data: {
          user_id: actor.id,
          action: 'security_contact',
          notes: resolution.notes,
          admin: resolution.resolved_by
        }
      });
      break;

    case 'false_positive':
      // Maybe whitelist this pattern
      console.log('False positive logged:', actor.id, actor.ip);
      break;
  }

  res.json({ success: true });
});
Verifying Webhook Signatures (Enterprise)
All outgoing webhooks include an X-LiteSOC-Signature header for verification. Enterprise users should always verify this signature to ensure requests originate from LiteSOC.

Webhook Headers

  • X-LiteSOC-Signature — HMAC-SHA256 signature (format: sha256=<hex>)
  • X-LiteSOC-Event — Event type (e.g., alert.resolved)
  • X-LiteSOC-Timestamp — ISO 8601 timestamp when the request was sent

Signature Computation

signature = HMAC-SHA256(
  key: signing_secret,
  message: timestamp + "." + JSON.stringify(payload)
)
const crypto = require('crypto');

function verifyLiteSOCWebhook(payload, signature, timestamp, secret) {
  // Signature is computed over: timestamp.payload
  // This prevents replay attacks
  const signedPayload = timestamp + '.' + JSON.stringify(payload);
  
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(signedPayload)
    .digest('hex');
  
  // Use timing-safe comparison to prevent timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your webhook handler:
app.post('/api/security-callback', (req, res) => {
  const signature = req.headers['x-litesoc-signature'];
  const timestamp = req.headers['x-litesoc-timestamp'];
  
  // Optional: Reject requests older than 5 minutes (anti-replay)
  const requestTime = new Date(timestamp).getTime();
  const now = Date.now();
  if (Math.abs(now - requestTime) > 5 * 60 * 1000) {
    return res.status(401).json({ error: 'Request too old' });
  }
  
  if (!signature || !verifyLiteSOCWebhook(req.body, signature, timestamp, WEBHOOK_SECRET)) {
    return res.status(401).json({ error: 'Invalid signature' });
  }
  
  // Process the webhook...
});

Security Best Practice: Always verify the signature before processing webhook payloads. Store your signing secret securely (e.g., environment variables) and never expose it in client-side code.

Enterprise SSOEnterprise

Enable SAML 2.0-based Single Sign-On for your organization. Enterprise SSO allows your team members to authenticate using your identity provider (IdP) such as Okta, Azure AD, Google Workspace, or OneLogin.

Setting Up SAML SSO
  1. Navigate to Dashboard → Settings → Single Sign-On (SSO)
  2. Copy the ACS URL and Entity ID from the Service Provider Details section to your IdP
  3. Enter your Identity Provider Metadata URL (e.g., https://your-idp.com/metadata.xml)
  4. Configure the SSO Domain (your company email domain like company.com)
  5. Click Save Configuration, then enable the SSO toggle
SSO Login Flow

When SSO is enabled, users with matching email domains will be automatically routed to your identity provider. The flow detects the SSO domain from the email address.

// Automatic domain detection on login
user@company.comSSO enabledRedirect to IdP
Service Provider Details

Use these values when configuring your Identity Provider:

ACS URL:https://<project-ref>.supabase.co/auth/v1/sso/saml/acs
Entity ID:https://<project-ref>.supabase.co/auth/v1/sso/saml/metadata

The actual values are shown in your Dashboard → Settings → SSO page.

Audit LogsPro & Enterprise

Comprehensive audit logging tracks all administrative actions and security-relevant events across your organization. Essential for compliance (SOC 2, GDPR, HIPAA) and security investigations.

Tracked Actions

API & Webhooks

  • api_key.regenerated
  • webhook.slack_updated
  • cors.origins_updated

Security

  • sso.enabled
  • ip_whitelist.added
  • mfa.enrolled

Organization

  • organization.member_invited
  • organization.role_changed
  • billing.plan_changed

Account

  • account.password_changed
  • session.revoked
  • settings.profile_updated

Threat Models

  • threat_model.created
  • threat_model.updated
  • threat_model.deleted

Billing

  • billing.subscription_created
  • billing.payment_succeeded
  • billing.payment_failed
Compliance Export
Enterprise Only

Export audit logs as CSV for compliance reporting and external analysis. Navigate to Dashboard → Settings → Audit Logs and click the Export CSV button.

Exports include: timestamp, actor email, action, target, IP address, user agent, and detailed metadata for each event.

IP WhitelistingEnterprise

Bypass threat detection alerts for trusted IP addresses. When an IP is whitelisted, events from that IP will still be logged but will not trigger brute force, impossible travel, or geo-anomaly alerts.

How It Works

Whitelisted IPs are excluded from threat detection analysis. This is useful for:

  • Office IPs that generate high-volume legitimate traffic
  • CI/CD servers running automated tests
  • VPN exit nodes used by your team
  • Staging and development environments

⚠️ Events are still recorded — only alerting is bypassed.

CIDR Notation Support

Configure IP whitelists using individual IPs or CIDR notation for entire ranges:

192.168.1.100 // Single IP
10.0.0.0/24 // 256 IPs (10.0.0.0 - 10.0.0.255)
172.16.0.0/16 // 65,536 IPs (172.16.0.0 - 172.16.255.255)
10.0.0.0/8 // Entire 10.x.x.x range
Configuration
  1. Go to Dashboard → Settings → Security tab → IP Whitelist
  2. Click Add IP Address and enter an IP or CIDR range
  3. Add a label and optional description for reference
  4. Toggle individual entries on/off using the switch

Changes take effect immediately. Whitelisted IPs will bypass threat detection on the next processing cycle.

Whitelist Entry Fields
ip_addressIPv4 address or CIDR range (e.g., 192.168.1.0/24)
labelShort identifier (e.g., "Office", "VPN", "CI Server")
descriptionOptional notes about the IP source
is_activeToggle to enable/disable the entry without deleting it