Why Does My PDFMonkey Download URL Return a 403 Error?

Last updated March 23, 2026

If you try to access a document’s download URL and receive a 403 Forbidden error, the URL has expired.

Why this happens

Download URLs are temporary signed links valid for 1 hour after they are generated. Once that time passes, the URL stops working and returns a 403 error. This is expected behavior: the URL is designed to be short-lived for security.

Every time you fetch a document’s details (via the API, an integration, or the Dashboard), you receive a fresh download URL with a new 1-hour window. The generated file itself remains available on PDFMonkey’s servers until it is deleted; only the signed URL expires.

How to fix it

Fetch the document again to get a fresh download URL. You do not need to regenerate the document.

Via the API

Send a GET request to retrieve the document. The response includes a new download_url:

curl https://api.pdfmonkey.io/api/v1/documents/YOUR_DOCUMENT_ID \
  -H "Authorization: Bearer YOUR_SECRET_API_KEY"

See the Documents API reference for the full response format.

Via an integration

Use a “Get Document” or “Find Document” action in Zapier, Make, n8n, or another platform to refresh the URL.

Via the Dashboard

Open the document in the Dashboard. The download link shown on the document detail page is always current.

Via the Ruby SDK

Call document.reload! to fetch the latest attributes, including a fresh download_url:

document = PdfMonkey::Document.find("YOUR_DOCUMENT_ID")
document.reload!
document.download_url  # => fresh URL valid for 1 hour

See the Ruby SDK documentation for setup instructions.

How to avoid this

  • Download immediately after generation. When you receive a webhook notification or poll for completion, download the file right away rather than storing the URL for later.
  • Store the file, not the URL. If you need the generated file later, save it to your own storage (S3, Google Drive, etc.) instead of relying on the temporary PDFMonkey download URL.
  • Use share links for permanent access. If you need a stable URL to share in emails or embed in web pages, enable Share Links (available on Pro+ and Premium plans). Unlike download URLs, share links never expire.
  • Re-fetch when needed. If none of the above apply and you need the file later, fetch the document details again to get a fresh URL. It takes a single GET request.

Frequently asked questions

Does the 403 error mean my document was deleted?

Not necessarily. A 403 means the signed URL expired, not that the file is gone. Fetch the document again via the API; if you get a new download_url, the file is still available. If the document has been deleted (via TTL or manually), the API returns a 404 instead.

How long exactly is a download URL valid?

Exactly 1 hour from the moment the URL is generated (when you fetch the document details). The clock does not start from when the document was created or when generation completed.

Does this apply to image output too?

Yes. Download URLs work the same way regardless of output format (PDF, PNG, JPG, or WebP). They all expire after 1 hour.

Can I extend the expiration time?

No. The 1-hour duration is fixed and cannot be configured. If you need longer-lived links, use Share Links or save the file to your own storage.

Frequently asked questions

Why does the PDFMonkey download URL give a 403 error?
Download URLs expire after 1 hour. Fetch the document again via the API, an integration, or the Ruby SDK to get a fresh URL with a new 1-hour window.
How do I get a new download URL after it expires?
Fetch the document again via the API (GET /api/v1/documents/:id), through an integration like Zapier or Make, or in the Dashboard. Each fetch returns a fresh URL valid for 1 hour. You do not need to regenerate the document.
Can I get a permanent download link that never expires?
Yes. Enable Share Links on Pro+ or Premium plans to get a permanent public URL for each document. Unlike download URLs, share links do not expire.