Skip to main content

Caller identity

Turn on Share caller identity and each call to a data source tells your server who made it, instead of every call looking like incident.io. Your server can then:
  • Apply granular access controls based on the identity of the caller.
  • Rate-limit each caller separately.
  • Limit what automated callers, such as investigations, can do.
  • Record who made each call, for your own audits and operational controls.
It’s available for MCP and HTTP connectors and some telemetry sources, and it’s off until you turn it on.

Turning it on

Open the data source’s settings and turn on Share caller identity. You need the Manage Nexus sources permission for the data source. Turning it on or off is recorded in your audit log.

Which calls carry it

Every call to the data source carries it, from everywhere a call can be made: Investigations, Chat, workflows, and via the incident.io MCP.

Headers

Each call carries two headers. They’re always sent together.
X-Incident-Actor names the caller as <type>:<id>. It’s the same actor as on the call’s entry in your audit log, so you can match a request to its entry. X-Incident-Actor-Assertion is a signed JWT that proves the header. It’s valid for 60 seconds.

The assertion

The assertion is signed with ES256. Its header names the key that signed it:
Its claims: ctx uses the same keys as the call’s audit log entry. We leave out a key we don’t know rather than send it empty: Here’s a decoded assertion for a call from Chat that needed approval:

Verifying the assertion

Our public keys are published as a JSON Web Key Set at https://app.incident.io/.well-known/jwks.json. The endpoint needs no authentication, and responses can be cached for 5 minutes. Each key is a P-256 key with alg ES256 and use sig. Pick the key by the kid in the assertion’s header. Don’t hard-code a key or a kid, because keys change over time.