Turn ClickUp file outputs into direct URLs
Use GetFileURL when ClickUp has a file and the next step needs a direct public URL, not a private object, attachment wrapper, or redirecting share link.
- Reviewed by
- GetFileURL technical team
- Last updated
What this page answers
Turn ClickUp task attachments into direct public file URLs for OCR, AI, CRM, client portals, and webhook workflows.
Use this page when the workflow needs file bytes available at a direct URL with predictable metadata, lifecycle controls, and a cleanup path.
Updated
ClickUp files need a fetchable handoff.
ClickUp task attachments are useful inside a workspace, but external APIs often need a direct public URL instead of an authenticated app attachment.
Upload the actual file
Send the file bytes or exported file to GetFileURL rather than passing a private platform object onward.
Map the URL field
Use the returned `url` as the value for the next API, webhook, OCR service, AI step, or publishing action.
Keep the cleanup handle
Store `file_id` when the workflow should delete public access after the downstream step finishes.
Keep the integration thin and readable.
Download the ClickUp attachment in a trusted automation step, upload the file to GetFileURL, then store the returned `url` and `file_id` on the task or next workflow step.
Multipart upload
Use multipart form data for files already present in the workflow runtime.
Short expiry
Set an expiry window that survives queue delays and retries without creating permanent public storage by default.
Structured response
Map `url`, `content_type`, `size`, and `expires_at` into logs or later workflow steps.
Most failures are URL shape failures.
If the destination cannot fetch the file, confirm it received the GetFileURL CDN URL rather than the original ClickUp attachment URL or a signed workspace link.
No preview pages
The destination API should receive a URL that resolves to file bytes, not an HTML page.
Header visibility
Check content type and size when OCR, AI, social, or document APIs reject a file.
Expiry timing
Do not expire the URL before delayed branches, retries, or async destination fetches complete.
Copy the same upload shape into code or workflow steps
Use the same endpoint from a shell, backend route, worker, or automation code step. Upload the file, set expiry, then map the returned URL.
cURL
upload examplecurl -X POST https://api.getfileurl.com/v1/files \
-H 'Authorization: Bearer $GETFILEURL_KEY' \
-F 'file=@clickup-task-attachment.pdf' \
-F 'expires_in=24h'JavaScript
upload exampleconst form = new FormData();
form.append("file", file);
form.append("expires_in", "24h");
const res = await fetch("https://api.getfileurl.com/v1/files", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.GETFILEURL_KEY}` },
body: form,
});
const { url, file_id } = await res.json();
return { url, file_id };Answers before the workflow breaks
How do I turn a ClickUp file into a URL?
Upload the ClickUp file to GetFileURL, parse the JSON response, and pass the returned direct URL to the next step.
Why not pass the original ClickUp file link?
Original platform links can be private, temporary, or redirecting. External APIs usually need a URL that returns the file bytes directly.
What should I store from the response?
Store `url` for the next API call and `file_id` if the workflow should delete or inspect the file later.