API · Integrations

Integrations forward a project's events to your SIEM or log pipeline. Forwarding has two parts, the same two the dashboard shows under Integrations:

  • An integration is a credential: a provider, an endpoint, and an optional token. It belongs to your account and is defined once. (The dashboard calls it a connection.)
  • A destination switches an integration on for one project, with optional per-project overrides.

Every endpoint on this page authenticates with a personal access token.

Finding your account ID

Integration endpoints are addressed by account. Your account ID is the account_id on any of your projects, so you need at least one project first:

ACCOUNT_ID=$(curl -s https://api.everscribe.io/v1/projects \
  -H "Authorization: Bearer $EVERSCRIBE_PAT" | jq -r '.projects[0].account_id')

The integration object

{
  "id": "e2b9c4f7-1a3d-4b8e-9f60-7c2d5a0e1b94",
  "account_id": "a8e3f1c2-7b4d-4e2a-9c5f-6d1b0e8a3f47",
  "name": "Splunk prod",
  "kind": "splunk_hec",
  "endpoint": "https://splunk.example.com:8088/services/collector",
  "has_token": true,
  "options": { "index": "audit", "sourcetype": "everscribe", "team": "payments" },
  "created_at": "2026-10-30T14:10:27.903Z",
  "updated_at": "2026-10-30T14:10:27.903Z"
}
Field Description
id Integration ID (UUID).
name Your label, unique within the account.
kind The provider. See Kinds.
endpoint Where events are sent.
has_token Whether a token is stored. The token itself is never returned.
options Key/value pairs with string values. See Options.

Kinds

kind Provider Token
webhook Generic JSON over HTTPS. The token is sent as Authorization: Bearer <token>, or raw in the header named by the auth_header option. optional
syslog RFC 5424 syslog with a CEF payload. not allowed
splunk_hec Splunk HTTP Event Collector. required
datadog Datadog Logs intake. required
sentinel Microsoft Sentinel (Azure Monitor / Log Analytics). required
elastic Elasticsearch _bulk API. required

Options

Some option keys configure the provider; every other key is metadata added to each forwarded event.

kind Provider settings
splunk_hec index, sourcetype, source
datadog service, ddtags
elastic index
sentinel stream
webhook auth_header
syslog protocol

In the example above, index and sourcetype go to Splunk as settings and team: payments is added to every event. Values must be strings; other types are stored but dropped when events are forwarded.

List integrations

GET /v1/accounts/{id}/integrations

Requires the account owner. Returns {"integrations": [...]}.

curl https://api.everscribe.io/v1/accounts/$ACCOUNT_ID/integrations \
  -H "Authorization: Bearer $EVERSCRIBE_PAT"

Create an integration

POST /v1/accounts/{id}/integrations

Requires the account owner.

Body field Required Description
name yes Label, 1 to 100 characters after trimming whitespace, unique within the account.
kind yes One of the kinds.
endpoint yes The provider's URL, or host:port for syslog. URLs must be https and can't point at a private or internal address.
token depends on kind The credential. Write-only.
options no String key/value pairs.

Returns 201 with {"integration": {...}}. The endpoint is saved as given, without being checked or contacted. A bad endpoint shows up only when you send a test event or in the destination's last_error.

curl -X POST https://api.everscribe.io/v1/accounts/$ACCOUNT_ID/integrations \
  -H "Authorization: Bearer $EVERSCRIBE_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Splunk prod",
    "kind": "splunk_hec",
    "endpoint": "https://splunk.example.com:8088/services/collector",
    "token": "'"$SPLUNK_HEC_TOKEN"'",
    "options": { "index": "audit" }
  }'
Status Body When
400 name is required / name must be 100 characters or fewer Bad name.
400 invalid integration kind Unknown kind.
400 A token is required for <kind> integrations. / syslog integrations don't use a token. Token rule for the kind broken.
402 Your plan allows N SIEM destination(s). Upgrade to add more. The account is at its plan's integration limit.
404 account not found Not your account.
409 integration name already taken Name in use.

Update an integration

PUT /v1/accounts/{id}/integrations/{iid}

Requires the account owner. Body fields: name, endpoint, token, options. The kind can't change.

PUT replaces name, endpoint, and options: send all three every time. A missing name fails with 400 name is required, and a missing endpoint or options is saved as empty. token is the exception. Leave it out to keep the stored token, or send a new one to rotate it.

Returns {"integration": {...}}. Errors match Create an integration, plus 404 integration not found.

curl -X PUT https://api.everscribe.io/v1/accounts/$ACCOUNT_ID/integrations/$INTEGRATION_ID \
  -H "Authorization: Bearer $EVERSCRIBE_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Splunk prod",
    "endpoint": "https://splunk.example.com:8088/services/collector",
    "options": { "index": "audit-v2" }
  }'

Delete an integration

DELETE /v1/accounts/{id}/integrations/{iid}

Requires the account owner. Returns 204 with no body. Forwarding stops on every project that used it, and its destinations are removed.

List a project's destinations

GET /v1/projects/{id}/destinations

Requires viewer on the project. Returns {"destinations": [...]}, ordered by integration name. Only integrations that have been set on this project appear, whether enabled or not. To see every integration the project could use, list the account's integrations.

{
  "destinations": [
    {
      "integration_id": "e2b9c4f7-1a3d-4b8e-9f60-7c2d5a0e1b94",
      "project_id": "5d1c0e7a-3f2b-4c8e-9a61-0d4f2b7c9e10",
      "enabled": true,
      "options": { "index": "billing-audit" },
      "last_delivered_at": "2026-10-30T14:21:09.774Z",
      "last_error_at": "0001-01-01T00:00:00Z",
      "integration_name": "Splunk prod",
      "kind": "splunk_hec",
      "created_at": "2026-10-30T14:12:44.310Z",
      "updated_at": "2026-10-30T14:12:44.310Z"
    }
  ]
}

last_error is a sanitized status and reason from the most recent failed delivery, and is left out when there's none. It never contains the token, endpoint, or response body.

Enable or disable a destination

PUT /v1/projects/{id}/destinations/{iid}

Requires editor on the project. {iid} is the integration ID, which must belong to the same account as the project.

Body field Required Description
enabled yes true to forward this project's events, false to stop. Leaving it out counts as false.
options no Per-project overrides, merged key by key over the integration's options.

Like the integration PUT, this replaces: options you leave out are cleared. Returns {"destination": {...}} (without integration_name and kind, which only the list includes), or 404 integration not found.

curl -X PUT https://api.everscribe.io/v1/projects/$PROJECT_ID/destinations/$INTEGRATION_ID \
  -H "Authorization: Bearer $EVERSCRIBE_PAT" \
  -H "Content-Type: application/json" \
  -d '{"enabled": true, "options": {"index": "billing-audit"}}'

Forwarding only covers events recorded after a destination is enabled; history isn't replayed. Delivery is at least once, so use the event id to de-duplicate on your side.

Send a test event

POST /v1/projects/{id}/destinations/{iid}/test

Requires editor on the project. Sends one synthetic everscribe.integration.test event to the integration right away and reports what happened. The destination doesn't need to be enabled. The test uses the integration's own options; this project's overrides aren't applied.

This endpoint always returns 200 when the test ran. Check ok in the body:

{ "ok": false, "error": "egress: sink returned status 401" }
Field Description
ok true if the provider accepted the event.
error Sanitized reason when ok is false, e.g. a rejected status, a connection failure, or an endpoint that isn't https.
curl -X POST https://api.everscribe.io/v1/projects/$PROJECT_ID/destinations/$INTEGRATION_ID/test \
  -H "Authorization: Bearer $EVERSCRIBE_PAT"