---
id: config-read-digital-wallet-open-id-presentation-status-sse
title: "Stream verification status (SSE)"
description: "Streams the status of one verification request over Server-Sent Events. The server sends the current status at once, then a frame for each change, and it ends the stream after a final status. Use it to show a live status while the holder answers the request, for example a Digital Credentials API request."
sidebar_label: "Stream verification status (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 verification status (SSE)</h1>

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



Streams the status of one verification request over Server-Sent Events. The server sends the current status at once, then a frame for each change, and it ends the stream after a final status. Use it to show a live status while the holder answers the request, for example a Digital Credentials API request.

### Authentication

Send the `Authorization` header (`ApiKey <key>` or `Bearer <token>`). The browser `EventSource` API cannot set request headers: get a one-time ticket with `POST /v2/config/sse-ticket` (body `{"path": "/v3/config/digital-wallet/openid/notifications/presentation-status/sse"}`) and put it in the `ticket` query parameter.

### Response headers

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

### Frames that the server writes

1. `retry: 30000` - the server writes this frame first. 2. One unnamed event (a `data` line, no `event` line) with the current status, at once. 3. One unnamed event for each change of the status. 4. `: keep-alive` - an SSE comment line every 15 seconds. It carries no event, and clients
   ignore it.


The `data` field holds a JSON object with `verificationId` (the value of the query parameter), `status` and, for `failed` and `expired`, `reason`. The frames have no `id` field: a client that connects again gets the current status in the first frame.

### Statuses

| `status` | Meaning | `reason` | | --- | --- | --- | | `pending` | The request is sent and has no answer yet. | - | | `received` | The holder sent a presentation and it is valid. Final. | - | | `failed` | The holder sent a presentation that is not valid, or an error. Final. | The message of the first failed check (a wallet error as `<error>: <description>`), else `Presentation is not valid`. | | `expired` | The request expired before an answer. Final. | `Presentation request expired` |

A request expires at the `exp` of the stored request object, else at its creation time plus `presentationRequestExpiresIn` of the verifier global configuration (default 3600 seconds).

### End of the stream

The server ends the stream after it sends a final status (`received`, `failed` or `expired`), after 3900 seconds, or when the client closes the connection. Errors before the stream (an unknown verification request, too many open streams) come as a JSON answer with a 4xx or 5xx status, not as a frame.

## 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":"Identifier of the verification request (the `presentationExchangeId` of the verification history).","in":"query","name":"verificationId","required":true,"schema":{"type":"string","format":"uuid","example":"8a1f2c3d-4e5b-4c6d-9e7f-0a1b2c3d4e5f"}}}></ParamsItem><ParamsItem className={"paramsItem"} param={{"description":"One-time ticket for a client that cannot send the `Authorization` header, for example the browser `EventSource` API. Get the ticket with `POST /v2/config/sse-ticket`, sent with the `Authorization` header and the body `{\"path\": \"/v3/config/digital-wallet/openid/notifications/presentation-status/sse\"}`. The ticket is valid for 30 seconds and for one request to this path. An unknown, used or expired ticket gives 401. A request with the `Authorization` header needs no ticket.","in":"query","name":"ticket","required":false,"schema":{"type":"string"}}}></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 stream ends after a final status.

</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></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={"400"} value={"400"}><div>

The `verificationId` query parameter is missing, or the organisation (or the sandbox) has no OpenID4VC wallet deployment.

</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={"401"} value={"401"}><div>

The `Authorization` header is missing or not valid, or the ticket is unknown, used or expired.

</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={"404"} value={"404"}><div>

The wallet has no verification request with this `verificationId`, or the value is not a UUID.

</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><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"errorCode\": 404,\n  \"errorDescription\": \"Verification history not found\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"503"} value={"503"}><div>

The server has too many open event streams. Try again later.

</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><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"errorCode\": 503,\n  \"errorDescription\": \"Too many open event streams\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      