Connectors
Connectors push Wytness anomaly alerts into the systems your team already watches — Microsoft Sentinel, Splunk, ServiceNow, Slack, or any HTTPS endpoint you run. This page is the setup contract: what leaves Wytness, how deliveries authenticate and retry, and the exact values each provider's wizard step asks for. Connectors are available on Business and Enterprise plans.
At a glance
- Gather the provider-side values (each provider's section below lists exactly what its wizard step asks for).
- In the Wytness app, go to Integrations → Connectors → Add connection and pick the provider.
- Fill in the details and click Test connection — a real test alert is delivered before anything is saved.
- Optionally narrow deliveries with severity and rule filters (empty filters forward every alert).
- Save. New anomalies dispatch within about 30 seconds of detection; the connection row shows per-delivery health from then on.
What gets delivered
Every delivery is one anomaly alert from the detection engine, reshaped into the target system's native format:
| Provider | Format | Where it lands |
|---|---|---|
| Microsoft Sentinel | JSON records via the Logs Ingestion API | The custom table behind your Data Collection Rule |
| Splunk | Newline-delimited HEC events (sourcetype _json by default) | The index pinned on your HEC token (or the index override) |
| ServiceNow | Incident Table records, or Event Management events (ITOM SKU) | Your instance's incident queue or EM pipeline |
| Slack | Block Kit message, colour-coded by severity | The channel behind your incoming-webhook URL |
| Generic webhook | CloudEvents 1.0 JSON, HMAC-signed | Your receiver |
Network requirements
Deliveries are outbound from Wytness to the destination — Wytness opens an HTTPS connection to the endpoint you configure; nothing is installed and nothing polls your network. Hand this table to your network team — for SaaS destinations the answer is no firewall change at all:
| Your destination | Firewall change on your side | Port | Notes |
|---|---|---|---|
| Sentinel, Splunk Cloud, ServiceNow, Slack | None — deliveries go to the vendor's cloud, not your network | — | The vendor receives; your network is not involved |
| Self-hosted Splunk HEC | One inbound HTTPS rule: the internet must reach your HEC endpoint | 8088 (typical) | Or publish HEC behind your existing TLS edge on 443 |
| Your own generic receiver | One inbound HTTPS rule: the internet must reach your receiver | 443 | Private and internal addresses are refused by design |
| Outbound from your network | None — Wytness never asks your network to open outbound connections | — | — |
Wytness-Signature HMAC on the generic webhook — that is what they are for.Delivery & trust contract
| Property | Contract |
|---|---|
| Direction | Outbound HTTPS POST from Wytness to your endpoint; nothing inbound to Wytness |
| TLS | Certificate verification is ON by default for every delivery |
| Secrets | Tokens, passwords and signing secrets are stored encrypted (AES-256-GCM) and never shown again after save |
| Retries | 3 attempts — after ~60s, ~5m, ~15m (jittered). 401/403/404/410/422 responses stop retries immediately |
| Dedup | Each alert is delivered at most once per connection; an alert that exhausts retries is recorded as failed and never re-sent |
Self-signed and internal-CA endpoints
Fresh self-hosted Splunk installations and Splunk Cloud trials ship a default HEC certificate that no public authority trusts, and some estates terminate TLS with an internal CA. For the Splunk and generic-webhook providers only, the wizard offers a Verify TLS certificate toggle. Leave it on unless the endpoint is one you control; connections that switch it off are flagged on the connections list. Sentinel, ServiceNow, and Slack endpoints always present publicly-trusted certificates, so those providers have no toggle and verification is mandatory.
Microsoft Sentinel
Wytness writes through the Azure Monitor Logs Ingestion API into a custom table you control, scoped to a single Data Collection Rule stream. Provision on the Azure side:
- Create a custom table (for example
Wytness_CL) in your Log Analytics workspace. - Create a Data Collection Endpoint (DCE) and a Data Collection Rule (DCR) with a stream declaration matching the table, flowing to your workspace.
- Create an App Registration with a client secret, and grant its service principal the Monitoring Metrics Publisher role on the DCR (allow a few minutes for the role to propagate).
| Wizard field | Where it comes from |
|---|---|
| Tenant ID | Your Entra tenant |
| Client ID | The app registration |
| Client secret | The app registration's secret (stored encrypted) |
| Data Collection Endpoint host | The DCE's logs-ingestion URL |
| DCR immutable ID | The Data Collection Rule (immutableId, not the resource name) |
| Stream name | The DCR's stream declaration, e.g. Custom-Wytness_CL |
The delivery URL is derived from those values — the wizard previews it and you never hand-compose it. Tokens are obtained via OAuth2 client-credentials and refreshed automatically.
The record contract
| Column | Type | Content |
|---|---|---|
| TimeGenerated | datetime | Detection time, RFC3339 UTC |
| AlertId | string | The alert UUID — the correlation key back to Wytness |
| AgentId | string | The agent that triggered the rule |
| RuleName | string | One of the seven anomaly rules |
| Severity | string | low / medium / high / critical |
| Description | string | The alert summary |
| Source | string | Always "Wytness" |
| WytnessUrl | string | Deep link to the alert in Wytness — declare the column in your DCR stream to receive it (streams without it drop the field silently) |
Your analytics rules, workbooks, and Logic Apps key on RuleName and Severity like any other table — for example, an analytics rule on Severity == "critical" feeding your incident automation. Field names stay stable so saved KQL keeps working.
Splunk
Wytness pushes to the HTTP Event Collector. In Splunk Web: Settings → Data inputs → HTTP Event Collector → New Token; pick an index and keep the default sourcetype (deliveries default to _json). On self-hosted Splunk, also confirm HEC is enabled under Global Settings.
| Deployment | HEC endpoint URL shape |
|---|---|
| Self-hosted | https://<host>:8088/services/collector/event |
| Splunk Cloud | https://http-inputs-<stack>.splunkcloud.com/services/collector/event |
| Splunk Cloud trial | https://inputs.<stack>.splunkcloud.com:8088/services/collector/event |
The event contract
One HEC envelope per anomaly: the envelope's time (epoch seconds) sets _time to the detection moment, and the event object carries alert_id (the correlation UUID), agent_id, rule_name, severity, description, detected_at, source ("wytness"), and wytness_url — a deep link back to the alert. With the default _json sourcetype these extract as search-time fields, so saved searches and alerts key on rule_name and severity directly.
ServiceNow
Wytness creates records over your instance's REST API with HTTP Basic auth. Create a dedicated integration user with rights to insert into the target table, then choose the endpoint kind in the wizard:
| Endpoint kind | Target | Notes |
|---|---|---|
| Incident Table (default) | /api/now/table/incident | One incident per alert; the description embeds the alert link, and u_wytness_event_id carries the alert ID once you create that column (stock instances drop unknown fields) |
| ITOM Event Management | /api/global/em/jsonv2 | Requires the paid ITOM Event Management SKU |
The wizard asks for the instance URL, username, and password (stored encrypted), and derives the delivery URL from the endpoint kind.
The incident field contract
Every incident carries the same deterministic fields — this is what your assignment rules, templates, and reports can key on:
| Field | Value | On a stock instance |
|---|---|---|
| short_description | [Wytness] {rule_name} on {agent_id} — stable, machine-matchable prefix | Always present |
| description | Alert text + a View-in-Wytness link carrying the alert ID | Always present |
| impact / urgency | critical → 1, high → 2, medium and low → 3 | Always present |
| category | wytness_anomaly | Silently dropped until you add it to the category choice list |
| u_wytness_event_id | The alert UUID (dedupe key) | Silently dropped until you create the column |
| u_wytness_rule / u_wytness_severity / u_wytness_agent_id / u_wytness_detected_at / u_wytness_url | Structured alert identity for routing and reporting | Silently dropped until you create the columns |
Routing to your teams
Wytness deliberately never sets assignment_group, assigned_to, caller_id, or cmdb_ci — assignment is your policy, and an integration that hardcodes it fights your process. Route with a standard assignment rule instead: on a stock instance, key it on short_description STARTSWITH [Wytness] (zero schema prep); after creating the columns, key on u_wytness_rule or u_wytness_severity — for example, chain-break alerts to the security queue and everything else to the AI-platform queue. Incident templates and SLAs attach the same way they do for any other source.
Slack
Create an incoming webhook in your Slack workspace (Slack App Directory → Incoming Webhooks, or a Slack app with the webhook feature) and paste its URL into the wizard. The URL itself is the credential — Wytness stores it encrypted.
Each alert is one message: a clickable View in Wytness title, fields for Agent, Severity, Rule, Alert ID and Description, and a severity-coloured bar (critical #ef4444, high #f97316, medium #eab308, low #3b82f6) stamped with the detection time. One webhook is one channel — to route severities to different channels, create one connection per channel and give each its own severity or rule filters (a high-and-critical pager channel beside an everything archive is the common shape).
Generic webhook — the receiver contract
The generic connector POSTs a CloudEvents 1.0 JSON envelope to any HTTPS endpoint you run, signed with an HMAC secret you choose at setup. Your receiver should verify the signature before trusting the body:
| Header | Contents |
|---|---|
| Wytness-Signature | t=<unix-seconds>,v1=<hex HMAC-SHA256 of "{t}." + raw body, keyed with your secret> |
| Wytness-Delivery | Unique UUID per delivery attempt — dedupe on it if you need exactly-once processing |
| Wytness-Event | The CloudEvents type, e.g. ai.wytness.anomaly.detected.v1 |
import hashlib, hmac, time def verify_wytness_signature(secret: str, header: str, raw_body: bytes) -> bool: """header: the Wytness-Signature value, e.g. "t=1788255069,v1=<hex>".""" parts = dict(p.split("=", 1) for p in header.split(",")) ts, received = int(parts["t"]), parts["v1"] if abs(time.time() - ts) > 300: # 5-minute replay window return False expected = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, received)Sign-off rules for a robust receiver: verify against the raw request bytes (not a re-serialised parse), enforce the 5-minute timestamp window, and respond with a 2xx quickly — anything else is retried on the ladder above, and 401/403/404/410/422 stops retries entirely. The envelope's data object carries the flat alert fields (alert_id, agent_id, rule_name, severity, description, detected_at) plus a url deep-linking the alert in Wytness.
Alert filters
Each connection can narrow what it forwards by severity (low / medium / high / critical) and by rule name (the seven anomaly rules). Empty filters forward everything. Filters are enforced server-side per connection, so two connections on the same provider can watch different slices — a high-severity pager channel beside an everything archive, for example.
Check it's working
- Test connection in the wizard delivers a real test alert before you save — if the credentials, URL, or TLS posture are wrong, you find out here with the exact error.
- After saving, each connection row shows health (last successful delivery, last error) and expands to a per-delivery log with status, HTTP code, and attempt count.
- Deliveries that exhaust retries or hit a terminal status appear as failed in the delivery log — fix the credentials and new alerts flow again (failed alerts are not re-sent).
Related
- Anomaly Detection — the seven rules that produce the alerts connectors forward.
- Wytness Collector — agentless capture on the inbound side.
- Security Model — where the cryptographic evidence lives (not in connector payloads).
Push your anomaly alerts where your team already looks.
Start recording