---
id: config-read-digital-wallet-open-id-verifier-file
title: "Download document for signing"
description: "Downloads one uploaded PDF document. With the ID of a verification instead, it downloads the PDF that the holder signed in that verification; a signed PDF is kept for 30 days after the signature. The response is the file itself (`application/pdf`), with `Content-Disposition: inline; filename='<fileId>.pdf'`."
sidebar_label: "Download document for signing"
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"}>Download document for signing</h1>

<MethodEndpoint method={"get"} path={"/v4/config/ows/verifier/files/{fileId}"}></MethodEndpoint>



Downloads one uploaded PDF document. With the ID of a verification instead, it downloads the PDF that the holder signed in that verification; a signed PDF is kept for 30 days after the signature. The response is the file itself (`application/pdf`), with `Content-Disposition: inline; filename="<fileId>.pdf"`.


## Request

<details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Path Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"name":"fileId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"The ID of the document, from the upload or the list, or the ID of a verification with a signed PDF."}}></ParamsItem></ul></div></details><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The PDF document.

</div><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/pdf"} value={"application/pdf"}><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 is missing, or the API key or token is not valid.

</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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"403"} value={"403"}><div>

The API key or token does not allow this call. An API key without the scope of the operation gets the older body `{"Code", "Message"}`. An `X-SandboxOrgId` header that names another sandbox organisation than the one of the API key gets `{"errorCode", "errorDescription"}`. When a platform admin has turned off the feature of the operation for the organisation, the answer has `errorKey` `feature_disabled` and the member `feature` (the name of the feature).

</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"}}><div><span className={"badge badge--info"}>anyOf</span><SchemaTabs><TabItem label={"MOD1"} value={"0-item-properties"}><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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></TabItem><TabItem label={"Older error body"} value={"1-item-properties"}><SchemaItem collapsible={false} name={"Code"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","description":"The HTTP status.","example":403}}></SchemaItem><SchemaItem collapsible={false} name={"Message"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"What went wrong.","example":"Unauthorized access;User doesn't have enough permissions;"}}></SchemaItem></TabItem></SchemaTabs></div></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"Code\": 403,\n  \"Message\": \"Unauthorized access;User doesn't have enough permissions;\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"404"} value={"404"}><div>

No document or signed PDF of the organisation has this ID, or the ID is not a UUID (`File not found`).

</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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"410"} value={"410"}><div>

The signed PDF of the verification is deleted, 30 days after the signature (`The signed PDF is deleted: a signed PDF is kept for 30 days after the signature. Ask the verifier to sign the document again`).

</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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

Unexpected server error (`An error occurred while reading the PDF`).

</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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      