Turn webhook files into direct URLs
A webhook may send a file, buffer, attachment link, remote URL, or Base64 payload. The next system still wants one fetchable URL. Decode encoded sources when needed, upload bytes, and map the returned URL before Make, Zapier, n8n, OCR, AI, or CRM steps branch and retry.
- Reviewed by
- GetFileURL technical team
- Updated
- File
- webhook-attachment.pdf
- Content type
- source webhook file type or decoded payload type
- Not for
- a webhook router or event bus
What this page answers
Yes. Download or read the webhook file, upload it to GetFileURL, then map the returned url into the next API call.
- Reviewed by
- GetFileURL technical team
- Last updated
Webhook files arrive in several forms, but the next API still wants one URL.
Some webhooks include a temporary attachment link, some include file bytes or buffer data, some include Base64 JSON, and some only give a remote URL you must fetch first.
Attachment link
Fetch or download the file from the source system, upload it, then pass the returned URL onward.
Base64 payload
Decode the encoded content into bytes, keep filename and content type, then upload the decoded file.
Multipart handoff
If your webhook processor has file bytes, upload them directly as multipart form data.
Remote URL
Fetch and validate the remote file, then return a stable GetFileURL URL for the next system.
Turn inbound files into fields that workflow tools can map.
The returned JSON response gives Make, Zapier, n8n, and custom webhook handlers stable fields: `url`, `file_id`, `content_type`, `size`, and `expires_at`.
Make
Use the HTTP module to upload the mapped webhook file, then map `url` into the next module.
Zapier
Use Webhooks by Zapier or a code step to turn the file field or decoded Base64 source into a direct URL before the destination action.
n8n
Use the Webhook node input, upload binary data with HTTP Request, then map the returned `url` into the next node.
Check the returned URL like the destination API will.
A browser preview is not enough proof. The destination server should receive file bytes, a successful status, and the expected content type.
Status
`curl -I https://cdn.getfileurl.com/f/file_8ks41p/webhook-attachment.pdf` should return `200 OK`.
Content type
The header should match the decoded file, such as `Content-Type: application/pdf` or `Content-Type: image/png`.
Response JSON
Keep `url`, `file_id`, `content_type`, `size`, and `expires_at` visible near the webhook run.
Webhook retries make expiry timing more important.
A webhook may retry minutes later or branch into delayed processing. The URL must survive the actual fetch window, not only the first request.
Wrong field
Map the actual returned `url`, not an attachment object, source preview link, or full JSON blob.
Source link expired
Upload the file while the source webhook attachment is still reachable.
Base64 too large
Use multipart when the source can send bytes. Base64 adds size overhead and can hit JSON body limits.
Missing metadata
Send `filename` and `content_type` when the webhook gives you only an encoded or buffer field.
Retry delay
Compare `expires_at` with retry and dead-letter timing before reusing the URL.
Copy the same upload shape into code
Incoming webhook file shapes:
attachment_url -> fetch bytes, then upload
file/binary -> multipart field file
base64_json -> decode bytes, then multipart field file
remote_url -> fetch, validate, then upload
Returned JSON to map:
url, file_id, content_type, size, expires_atCommon questions
Can a webhook attachment become a public URL?
Yes. Download or read the webhook file, upload it to GetFileURL, then map the returned `url` into the next API call.
Can Make, Zapier, or n8n webhooks use this?
Yes. Use a Make HTTP module, Webhooks by Zapier, or an n8n HTTP Request node to upload the webhook file and map the returned `url` into the next step.
What if the webhook sends Base64 instead of a file?
Decode the Base64 content into bytes, keep filename and content type, upload those bytes as multipart, then map the returned URL.
How should webhook retries affect expiry?
Choose an expiry window that survives retries, delayed branches, and async destination fetches, then delete when processing finishes.