---
id: config-list-digital-wallet-open-id-notification-sse
title: "Stream notifications (SSE)"
description: "Streams wallet notifications for OID4VCI credential lifecycle events over Server-Sent Events. The server keeps the connection open and writes one frame for each new notification."
sidebar_label: "Stream notifications (SSE)"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "get api-method"
info_path: docs/openid4vc-api/igrant-io-api-documentation
custom_edit_url: null
---

> **Build this with an AI coding agent.** Install the iGrant.io Agent Skills, then ask your agent to build the integration:
>
> ```bash
> npx skills add L3-iGrant/skills
> ```


import ApiTabs from "@theme/ApiTabs";
import DiscriminatorTabs from "@theme/DiscriminatorTabs";
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes";
import MimeTabs from "@theme/MimeTabs";
import ParamsItem from "@theme/ParamsItem";
import ResponseSamples from "@theme/ResponseSamples";
import SchemaItem from "@theme/SchemaItem";
import SchemaTabs from "@theme/SchemaTabs";
import Markdown from "@theme/Markdown";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";

<h1 className={"openapi__heading"}>Stream notifications (SSE)</h1>

<MethodEndpoint method={"get"} path={"/v2/config/digital-wallet/openid/notifications/sse"}></MethodEndpoint>



Streams wallet notifications for OID4VCI credential lifecycle events over Server-Sent Events. The server keeps the connection open and writes one frame for each new notification.

### Authentication

The browser `EventSource` API cannot set request headers. The server therefore reads the `Authorization` header first, and it falls back to the `authorization` query parameter only when that header is empty. Give the scheme prefix and the space in the value, that is `ApiKey <key>` or `Bearer <token>`. The server accepts both schemes on this operation.

### Response headers

`Content-Type: text/event-stream`, `Cache-Control: no-cache`, `Connection: keep-alive`.

### Frames that the server writes

1. `retry: 30000` - the server writes this frame first, before it checks the organisation. It
   tells the client to wait 30 seconds before it reconnects.
2. `event: connected` with the data `{}` - the server writes this frame after the subscription
   is live.
3. `event: notification` - one frame for each new notification. The frame holds an `id` field
   with the stream sequence number, and a `data` field with the notification object.
4. `: keep-alive` - an SSE comment line every 15 seconds. It carries no event, and clients
   ignore it.
5. `event: error` - the server writes this frame when it cannot find the organisation or cannot
   resolve the wallet, and it then closes the stream. The data holds one field, `error`. The
   status line is already sent at that point, so this frame arrives with HTTP 200, not with a
   4xx status.


### Payload of a notification frame

The `data` field holds the notification object with **no envelope**, unlike the read and update operations, which wrap the object in `notification`. The object always holds these eight fields: `id`, `organisationId`, `notificationType`, `notificationTypeRelatedId`, `notificationContent`, `status`, `createdAt` and `updatedAt`. Note `organisationId`, which the read, update and list operations do not return. The status of a new notification is always `unread`, and `createdAt` and `updatedAt` are Unix timestamps in seconds.

### Behaviour

The server writes a frame only when it creates a notification. A status change and a deletion produce no frame. The server does not replay frames that the client missed: a reconnection starts from live traffic, and `Last-Event-ID` is not supported. Use the list operation to read the notifications that the wallet holds already. When a client reads the stream too slowly, the server drops frames for that client rather than blocking the other clients, so the `id` sequence can hold gaps.

This operation takes no filter parameters. The server ignores `status`, `limit` and `offset` on this path. Use the list operation to filter notifications.

## Request

<details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Query Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"description":"Authorization value with its scheme prefix, for example `ApiKey <key>` or `Bearer <token>`. Use this parameter when the client cannot send the `Authorization` header, for example the browser `EventSource` API. The server reads the header first and uses this parameter only when the header is empty.","in":"query","name":"authorization","required":false,"schema":{"type":"string","example":"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyIn0.signature"}}}></ParamsItem></ul></div></details><details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Header Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"description":"Optional. Unique identifier of the sandbox organisation to use for this request. When you send this header, the service runs the operation in the context of the named sandbox organisation, that is, against the wallet of that sandbox organisation and not against the main wallet of the organisation. Leave the header out to use the main wallet.\n\nThe service reads this header only when you authenticate with a bearer access token. When you authenticate with an API key, the service takes the sandbox organisation from the API key and ignores this header. To run an API-key call in a sandbox organisation, bind the key to the sandbox organisation with `PUT /v2/config/admin/apikey/{apiKeyId}/sandbox-org` instead.\n\n`X-SubwalletId` is the deprecated name of this header. The service continues to accept it, but `X-SandboxOrgId` wins if you send both headers.\n\nThe sandbox organisation must exist, must belong to your organisation and must be deployed. An unknown identifier, an identifier of a sandbox organisation that is not deployed, and an identifier that belongs to a different organisation all make the call fail with HTTP 400.","in":"header","name":"X-SandboxOrgId","required":false,"schema":{"type":"string"},"example":"6889e1a4c5b2f30001a3d710"}}></ParamsItem></ul></div></details><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The server opened the Server-Sent Events stream. The response stays open until the client closes the connection or the server closes the channel.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}><li className={"schemaItem"}><summary style={{}}><strong>Cache-Control</strong><span style={{"opacity":"0.6"}}> string</span></summary><div><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The server always sends `no-cache`.

</div></div></li><li className={"schemaItem"}><summary style={{}}><strong>Connection</strong><span style={{"opacity":"0.6"}}> string</span></summary><div><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The server always sends `keep-alive`.

</div></div></li></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"text/event-stream"} value={"text/event-stream"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem","marginLeft":"1rem"}}>

string

</div></ul></details></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"401"} value={"401"}><div>

The `Authorization` header and the `authorization` query parameter are both empty, or the value has no `ApiKey ` or `Bearer ` prefix.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

The server does not support response streaming.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      