Back to all resources
Outbound Events Outbound Events Json

Outbound Events: Stream to Azure Event Grid

Configure event streaming to Azure Event Grid for serverless event processing. Trigger Azure Functions, Logic Apps, or other Azure services when graph data changes.

Outbound Events: Stream to Azure Event Grid

This example streams graph events to Azure Event Grid:

Azure Event Grid benefits:

- Native Azure integration (Functions, Logic Apps, etc.)

- Serverless event routing

- High availability and scalability

- Event filtering at the grid level

Event type in this example:

indykite.audit.capture.batch.upsert.node (node create/update only)

Use with Azure:

- Azure Functions: Trigger code on events

- Logic Apps: Workflow automation

- Event Hubs: Stream analytics

- Custom webhooks: Any HTTP endpoint

Use case

Scenario: Trigger an Azure Function whenever a Pontiac car is added to inventory.

Configuration:

- Event type: indykite.audit.capture.batch.upsert.node (upsert only, not delete)

- Filter: Car nodes where manufacturer="pontiac"

- Destination: Azure Event Grid topic

Azure Function workflow:

1. Car(manufacturer:"pontiac") ingested in IndyKite

2. Event sent to Azure Event Grid

3. Azure Function triggered

4. Function processes event (e.g., sends notification, updates dashboard)

This enables reactive, serverless architectures with IndyKite as the data source.

ikg

Requirements

Prerequisites:

- ServiceAccount credentials: For configuration (Bearer token)

- AppAgent credentials: For data ingestion (X-IK-ClientKey)

- Azure Event Grid topic: With endpoint URL and access key

Azure setup:

- Create Event Grid topic in Azure portal

- Note the topic endpoint URL

- Generate access key for authentication

Steps

Step 1: Set Up Azure Event Grid Topic

- Action: Create Event Grid topic in Azure portal

- Note: Topic endpoint URL and access key needed

Step 2: Create Event Sink Configuration

- Authentication: ServiceAccount credential (Bearer token)

- Action: POST Event Sink with:

- Provider: Azure Event Grid

- Event type: indykite.audit.capture.batch.upsert.node

- Filters: Car label, manufacturer="pontiac"

- Endpoint: Your Event Grid topic URL

- Result: Event Sink active

Step 3: Ingest Matching Nodes

- Authentication: AppAgent credential (X-IK-ClientKey)

- Action: POST Car nodes with manufacturer="pontiac"

- Result: Events delivered to Azure Event Grid

Step 4-5: Add More Nodes and Verify

- Add additional matching nodes

- Check Azure portal for received events

- Verify non-matching nodes don't trigger events

Step 2

Create an EventSink configuration.

POST https://eu.api.indykite.com/configs/v1/event-sinksJson
{
  "project_id": "your_project_gid",
  "description": "description of eventsink",
  "display_name": "eventsink name",
  "name": "eventsink-name",
  "providers": {
    "provider-with-azure-event-grid": {
      "azure_event_grid": {
        "topicEndpoint": "https://ik-test.eventgrid.azure.net/api/events",
        "accessKey": "secret-access-key"
      }
    }
  },
  "routes": [
    {
      "provider_id": "provider-with-azure-event-grid",
      "event_type_key_values_filter": {
        "context_key_value": [
          {
            "key": "manufacturer",
            "value": "pontiac"
          },
          {
            "key": "captureLabel",
            "value": "Car"
          }
        ],
        "event_type": "indykite.audit.capture.upsert.node"
      },
      "stop_processing": true,
      "display_name": "Configuration Audit Events"
    }
  ]
}

Step 3

Capture the nodes needed for this use case.

POST https://eu.api.indykite.com/capture/v1/nodes/
{
  "nodes": [
    {
      "external_id": "alice",
      "is_identity": true,
      "type": "Person",
      "properties": [
        {
          "type": "email",
          "value": "alice@email.com"
        },
        {
          "type": "given_name",
          "value": "Alice"
        },
        {
          "type": "last_name",
          "value": "Smith"
        }
      ]
    },
    {
      "external_id": "knightrider",
      "type": "Person",
      "is_identity": true,
      "properties": [
        {
          "type": "email",
          "value": "knightrider@demo.com"
        },
        {
          "type": "name",
          "value": "Michael Knight"
        }
      ]
    },
    {
      "external_id": "satchmo",
      "type": "Person",
      "is_identity": true,
      "properties": [
        {
          "type": "email",
          "value": "satchmo@demo.com"
        },
        {
          "type": "name",
          "value": "Louis Armstrong"
        }
      ]
    },
    {
      "external_id": "karel",
      "type": "Person",
      "is_identity": true,
      "properties": [
        {
          "type": "email",
          "value": "karel@demo.com"
        },
        {
          "type": "name",
          "value": "Karel Plihal"
        }
      ]
    },
    {
      "external_id": "kitt",
      "type": "Car",
      "is_identity": false,
      "properties": [
        {
          "type": "manufacturer",
          "value": "pontiac"
        },
        {
          "type": "model",
          "value": "Firebird"
        }
      ]
    },
    {
      "external_id": "cadillacv16",
      "type": "Car",
      "is_identity": false,
      "properties": [
        {
          "type": "manufacturer",
          "value": "Cadillac"
        },
        {
          "type": "model",
          "value": "V-16"
        }
      ]
    },
    {
      "external_id": "harmonika",
      "type": "Bus",
      "is_identity": false,
      "properties": [
        {
          "type": "manufacturer",
          "value": "Ikarus"
        },
        {
          "type": "model",
          "value": "280"
        }
      ]
    },
    {
      "external_id": "listek",
      "type": "Ticket",
      "is_identity": false
    },
    {
      "external_id": "airbook-xyz",
      "type": "Laptop",
      "is_identity": false
    }
  ]
}

Step 4

Capture the nodes needed for this use case.

POST https://eu.api.indykite.com/capture/v1/nodes/
{
  "nodes": [
    {
      "external_id": "kitten",
      "type": "Car",
      "is_identity": false,
      "properties": [
        {
          "type": "manufacturer",
          "value": "pontiac"
        },
        {
          "type": "model",
          "value": "Bonneville"
        }
      ]
    },
    {
      "external_id": "kitty",
      "type": "Car",
      "is_identity": false,
      "properties": [
        {
          "type": "manufacturer",
          "value": "pontiac"
        },
        {
          "type": "model",
          "value": "Catalina"
        }
      ]
    }
  ]
}

ikg