> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bolta.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Tax Invoice PDF

> Download the PDF of a tax invoice issued through the Open API: requirements, polling, file naming, and errors.

## What you can retrieve

Download a tax invoice issued through the Open API as a PDF. The PDF uses the same layout as the one in the Bolta dashboard.

| Path                                    | Purpose                                   |
| --------------------------------------- | ----------------------------------------- |
| `GET /v1/taxInvoices/{issuanceKey}/pdf` | Retrieve the tax invoice PDF download URL |

## Requirements

* Standard issuance (`issue`), reverse issuance (`issueRequest`), and amended tax invoices (`amend`) are all supported.
* The issuance must be finished. Call this API after you receive the issuance result webhook (`TAX_INVOICE_ISSUANCE_SUCCESS`) or after [Retrieve Tax Invoice](/api-reference/tax-invoice-retrieval/retrieve-tax-invoice) reports the issuance as complete.
* For reverse issuance, the PDF is available after the supplier approves and issuance finishes. If the supplier has not approved yet or has rejected the request, the API returns `400 TAX_INVOICE_RETRIEVE_NOT_AVAILABLE`.
* The PDF of an amended tax invoice marks the title as an amendment or cancellation and includes the amendment reason.
* Call it with the API key that requested the issuance. If you rotate or revoke a key, you can no longer retrieve PDFs for invoices issued with that key, so download the PDFs you need before you change keys.

## Pricing

This API does not deduct points.

## Retrieving the PDF

### Request

```bash theme={"dark"}
curl https://xapi.bolta.io/v1/taxInvoices/{issuanceKey}/pdf \
  -H "Authorization: Basic {apiKey}"
```

Set `issuanceKey` to the value from the issuance response.

### Response

The first call starts generating the PDF. While the PDF is being generated, the API returns `202 Accepted` with a `Retry-After` header. Wait that many seconds and **send the same request again.**

```http theme={"dark"}
HTTP/1.1 202 Accepted
Retry-After: 2
```

```json theme={"dark"}
{
  "issuanceKey": "8D529FAD3EBAE050B79CE943CCC7CEDE",
  "status": "PENDING",
  "downloadUrl": null,
  "downloadUrlExpiresAt": null,
  "filename": null
}
```

When the PDF is ready, the API returns `200 OK` with a download URL. Bolta does not regenerate a PDF once it exists, so later calls get `200` right away.

```json theme={"dark"}
{
  "issuanceKey": "8D529FAD3EBAE050B79CE943CCC7CEDE",
  "status": "READY",
  "downloadUrl": "https://example.com/tax-invoice-pdfs/8D529FAD3EBAE050B79CE943CCC7CEDE.pdf",
  "downloadUrlExpiresAt": "2026-09-24T03:05:00Z",
  "filename": "전자세금계산서_20260924_공급받는자 상호_20260924-10000000-00000001.pdf"
}
```

| Field                  | Type           | Description                                  |
| ---------------------- | -------------- | -------------------------------------------- |
| `issuanceKey`          | string         | The requested `issuanceKey`                  |
| `status`               | string         | `PENDING` (being generated), `READY` (ready) |
| `downloadUrl`          | string or null | PDF URL. Valid for 5 minutes                 |
| `downloadUrlExpiresAt` | string or null | URL expiry time (UTC)                        |
| `filename`             | string or null | File name saved on download                  |

`downloadUrl`, `downloadUrlExpiresAt`, and `filename` have values only when the status is `READY`. When the URL expires, send the same request again to get a new one. The URL contains a signature, so do not write the full URL to logs or analytics tools.

The file name is `{type}_{write date}_{supplied party name}_{approval number}.pdf`. The download URL sends the same name in the `Content-Disposition` header. Clients that do not support Korean file names receive a name that keeps only ASCII letters and digits.

<Warning>
  If the supplied party is an individual, the resident registration number sent in the issuance request appears unmasked in the PDF. Handle the file as personal information when you store or share it.
</Warning>

## Test key

Issuances made with a test key have no real tax invoice. Instead, the API returns `200` and a sample PDF URL right away. The sample has the same content for every issuance. The URL lifetime (5 minutes), retrieving again after expiry, and the file name delivery work the same as with a live key, so use a test key to check your download integration.

Test keys never return `202`. Check the logic that calls again after `Retry-After` with a live key.

## Rate limits

When 10 PDFs are being generated for the same business, or 20 PDFs are being generated for the same API key, the API returns `429 TOO_MANY_IN_FLIGHT` with a `Retry-After` header. The limit applies only to PDFs that need to be generated. Calls for PDFs that you already requested or that are ready are not blocked.

To download many PDFs at once, split your requests so that no more than 10 per business and 20 per key are in progress. Request the next one after an earlier PDF is ready.

## Errors

| Status code | Error code                           | Condition                                                                                                                                                                                      |
| ----------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`       | `TAX_INVOICE_RETRIEVE_NOT_AVAILABLE` | Issuance not finished or failed. For reverse issuance, the supplier has not approved or has rejected the request. Check the issuance result and call again                                     |
| `400`       | `INVALID_DOCUMENT`                   | The PDF cannot be generated from the document data stored in Bolta. Contact Bolta with the `issuanceKey`                                                                                       |
| `401`       | -                                    | API key authentication failed. Empty response body                                                                                                                                             |
| `403`       | `FORBIDDEN`                          | Not the API key that requested the issuance. Also applies to issuances made with a key you have since rotated or revoked                                                                       |
| `404`       | `NOT_FOUND`                          | Unknown `issuanceKey`                                                                                                                                                                          |
| `429`       | `TOO_MANY_IN_FLIGHT`                 | 10 PDFs in progress for the same business or 20 for the same API key. Call again after `Retry-After` (60 seconds)                                                                              |
| `500`       | `INTERNAL_SERVER_ERROR`              | Internal server error                                                                                                                                                                          |
| `503`       | `PDF_GENERATION_FAILED`              | The PDF could not be generated after several attempts. Send the same request after `Retry-After` (600 seconds) to generate it again. If it keeps failing, contact Bolta with the `issuanceKey` |
| `503`       | `SERVICE_UNAVAILABLE`                | Temporary internal API communication error                                                                                                                                                     |

If you call again before `Retry-After` after receiving `PDF_GENERATION_FAILED`, you get the same error.

## Related documents

* [Retrieve Tax Invoice PDF API](/api-reference/tax-invoice-retrieval/retrieve-tax-invoice-pdf)
* [Retrieve Tax Invoice API](/api-reference/tax-invoice-retrieval/retrieve-tax-invoice)
* [Tax invoice webhooks](/en/api-introduction/webhook-tax-invoice)
* [Error codes](/en/api-introduction/error-codes)
