Event forwarding API

These endpoints manage where your events are forwarded: the HTTPS destinations on Settings > Event forwarding. They list, add, change and remove destinations, replace a signing secret, and send a test event. What is sent, the formats and the signature are explained in Event forwarding.

List destinations

GET /api/forwarding/ lists your destinations with their delivery counters, plus the choices a destination takes. It is a read.

GET /api/forwarding/
{
  "destinations": [
    { "id": 3, "name": "Splunk", "url": "https://splunk.example.com:8088/services/collector/event",
      "enabled": true, "min_severity": "medium", "agent_kinds": [], "format": "splunk_hec",
      "auth_header_name": "Authorization", "auth_header_set": true,
      "delivered_events": 1520, "delivered_batches": 311, "failed_events": 0, "dropped_events": 0,
      "last_success_at": "2026-10-19T09:12:03Z", "last_error_at": null, "last_error": "",
      "queued": 0, "created_at": "2026-10-18T14:00:00Z", "updated_at": "2026-10-18T14:00:00Z" }
  ],
  "max_destinations": 5,
  "formats": ["json", "ndjson", "splunk_hec"],
  "severities": ["info", "low", "medium", "high", "critical"],
  "agent_kinds": [ { "kind": "python", "name": "es-python" } ],
  "signature_header": "X-EyalSec-Signature"
}

Secrets are never returned. auth_header_set says whether an auth header value is stored. queued is how many events are waiting to be sent right now.

Add a destination

POST /api/forwarding/ adds a destination and answers 201 with it and its signing_secret. The secret is shown this once, so store it where your receiver can read it.

POST /api/forwarding/

JSON body:

Field Meaning
url Required. The https:// address to POST events to. It must point at a public address.
name A label, up to 80 characters.
enabled false saves it paused. Default true.
min_severity info, low, medium (the default), high or critical.
agent_kinds Products to send, by events list name (python, browser). Empty sends every product the account holds.
format json (the default, a JSON array), ndjson (one event per line) or splunk_hec.
auth_header_name, auth_header_value One extra header sent on every request. The value is stored encrypted and never returned.
curl -s -X POST https://eyalsec.com/api/forwarding/ \
  -H "X-API-Key: es2_EXAMPLEKEYdoNotUse0000000000000000000000" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://splunk.example.com:8088/services/collector/event","format":"splunk_hec","auth_header_name":"Authorization","auth_header_value":"Splunk <hec-token>"}'
{ "destination": { "id": 3, "url": "https://splunk.example.com:8088/services/collector/event", "...": "..." },
  "signing_secret": "esfwd_..." }

A private, loopback, link-local or cloud metadata address, a plain http:// address, or a host that cannot be found answers 400 with the reason. A sixth destination answers 409.

Change a destination

PATCH /api/forwarding/{id}/ changes the fields the body names, with the same fields as above, and answers with the destination. Fields you leave out keep their values. A new url is checked again.

curl -s -X PATCH https://eyalsec.com/api/forwarding/3/ \
  -H "X-API-Key: es2_EXAMPLEKEYdoNotUse0000000000000000000000" \
  -H "Content-Type: application/json" \
  -d '{"min_severity":"high"}'

Send auth_header_value to replace the stored value. An empty auth_header_name removes the header. Another account's id answers 404.

Remove a destination

DELETE /api/forwarding/{id}/ removes a destination and answers 204. Events still waiting to be sent to it are discarded.

Replace the signing secret

POST /api/forwarding/{id}/secret/ makes a new signing secret and answers {"signing_secret": "esfwd_..."}, shown this once. The old secret stops being used at once.

Send a test event

POST /api/forwarding/{id}/test/ sends one test event now, signed like a real delivery and marked "test": true, and reports what the destination answered. It is tried once, with no retry, and works on a paused destination.

{ "ok": true, "status": 200, "error": "", "latency_ms": 184 }

When the destination refuses or cannot be reached, ok is false and error says why. One test per destination every 5 seconds; sooner answers 429.

Something unclear or missing on this page? Email support@eyalsec.com.

EyalSec Pricing Docs Security Research Vulnerabilities Play Security glossary About Contact עברית Login Get started Protect my Python app