Edit

Publish events to Azure Event Grid custom topics by using access keys

An Event Grid custom topic is an endpoint that your applications send their own events to, so that Event Grid can route those events to interested subscribers. This article shows you how to publish events to a custom topic by using access keys, which authenticate your requests without setting up Microsoft Entra ID. You get the topic endpoint and access key, format an event payload, send a sample event, and review the response.

The Service Level Agreement (SLA) applies only to posts that match the expected format.

Prerequisites

Note

Microsoft Entra authentication provides better authentication support than access key or shared access signature (SAS) token authentication. By using Microsoft Entra authentication, the Microsoft Entra identity provider validates the identity, so you don't handle keys in your code. You also benefit from security features built into the Microsoft identity platform, such as Conditional Access, that help improve your application's security. For more information, see Authenticate publishing clients using Microsoft Entra ID.

Get the topic endpoint

To publish events to a custom topic, send an HTTP POST request by using the following URI format: https://<topic-endpoint>?api-version=2018-01-01. For example, a valid URI is: https://exampletopic.westus2-1.eventgrid.azure.net/api/events?api-version=2018-01-01. To get the endpoint for a custom topic, use the Azure portal, Azure CLI, or Azure PowerShell.

Find the topic's endpoint on the Overview tab of the Event Grid Topic page in the Azure portal.

Screenshot of the Event Grid topic page in the Azure portal with the topic endpoint highlighted.

Get the access key

In the request, include a header value named aeg-sas-key that contains a key for authentication. For example, a valid header value is aeg-sas-key: xxxxxxxxxxxxxxxxxxxxxxx. To get the key for a custom topic, use the Azure portal, Azure CLI, or Azure PowerShell.

To get the access key for the custom topic, select the Access keys tab on the Event Grid Topic page in the Azure portal.

Screenshot that shows the Access Keys tab of the Event Grid topic page on the Azure portal.

Format the event payload

Format each event as a JSON object. The top-level fields are the same as standard resource-defined events, and the data property holds the properties that are unique to your custom topic. As the publisher, you define the contents of the data object. For a description of each property, see Azure Event Grid event schema.

[
  {
    "id": string,
    "eventType": string,
    "subject": string,
    "eventTime": string-in-date-time-format,
    "data":{
      object-unique-to-each-publisher
    },
    "dataVersion": string
  }
]

Keep these size limits in mind when you build the payload:

  • The event array can have a total size of up to 1 MB.
  • The maximum size for a single event is 1 MB. Events over 64 KB incur charges in 64-KB increments.
  • A batch can contain a maximum of 5,000 events.

The following example shows a valid event payload:

[{
  "id": "1807",
  "eventType": "recordInserted",
  "subject": "myapp/vehicles/motorcycles",
  "eventTime": "2017-08-10T21:03:07+00:00",
  "data": {
    "make": "Ducati",
    "model": "Monster"
  },
  "dataVersion": "1.0"
}]

Send a sample event

This section shows how to send a sample event to the custom topic.

  1. In the Azure portal, launch Cloud Shell.

  2. In the Cloud Shell, run the commands from the Azure PowerShell or Azure CLI in the Bash or PowerShell session.

    Screenshot that shows the Cloud Shell in the Azure portal.

Review the response

After you post to the topic endpoint, you receive a response. The response is a standard HTTP response code. Some common responses are:

Result Response
Success 200 OK
Event data has incorrect format 400 Bad Request
Invalid access key 401 Unauthorized
Incorrect endpoint 404 Not Found
Array or event exceeds size limits 413 Payload Too Large

For errors, the message body uses the following format:

{
    "error": {
        "code": "<HTTP status code>",
        "message": "<description>",
        "details": [{
            "code": "<HTTP status code>",
            "message": "<description>"
    }]
  }
}