This page uses workflow template syntax (
{{ parameter }}, {{ label_output }}) and assumes familiarity with blocks. See Build a Workflow for an introduction.Downloading files
When your workflow needs to retrieve documents from a website — invoices from a vendor portal, confirmation letters after form submission, compliance certificates — usefile_download. Downloaded files land in SKYVERN_DOWNLOAD_DIRECTORY, a temporary directory created for each workflow run. Every file downloaded during a run accumulates here, and you can reference this directory in later blocks to upload or email the files.
Downloading a single file
Say you’ve just filed an SS-4 form on the IRS website and need to grab the EIN confirmation letter. Thefile_download block navigates the page and triggers the download:
navigation_goaltells Skyvern what to do on the page — find the download button, click it, and mark the task complete when the download starts. Write this the way you’d explain the task to a colleague looking at the screen.download_suffixnames the downloaded file. Without it, you’d get a generic filename. Use a descriptive suffix so you can identify the file later when you upload or email it.urlsets the starting page. If your previous block already navigated to the right page, omiturland the download block continues from there.
| Parameter | Type | Use this to |
|---|---|---|
navigation_goal | string | Describe how to find and click the download button |
url | string | Set the starting page (omit to continue from previous block) |
download_suffix | string | Set the filename for the downloaded file |
download_timeout | number | Allow more time for large files (in seconds) |
parameter_keys | array | List workflow parameters this block can access |
max_retries | integer | Retry the block on failure |
max_steps_per_run | integer | Limit how many actions the block can take |
engine | string | Set the AI engine (skyvern-1.0 or skyvern-2.0) |
Downloading multiple files
When you need to download a batch of files — say, all monthly invoices from a vendor portal — pair afor_loop with file_download. A prior block (like an extraction) returns a list of URLs, and the loop downloads each one.
Here, get_invoices is an extraction block that scrapes invoice URLs from the portal. The loop iterates over its output and downloads each one:
loop_over_parameter_keypoints to the output of the prior extraction block (get_invoices_output).{{ download_invoice.current_value }}gives you one URL per iteration — the inner block’s label (download_invoice) followed by.current_value.continue_on_failure: trueon the loop means a single failed download won’t stop the rest. All successful downloads still land inSKYVERN_DOWNLOAD_DIRECTORY.
If a download fails, the block fails. Set
continue_on_failure: true on the loop (as shown above) so a single failed download doesn’t stop the entire workflow.Parsing files
When your workflow needs to act on information inside a file — filling forms with resume data, processing orders from a spreadsheet, extracting fields from a PDF — usefile_url_parser. It downloads the file, parses it, and returns structured data you can use in subsequent blocks.
Parsing a PDF with a schema
Say you’re building a workflow that applies to jobs on Lever. You have a candidate’s resume as a PDF URL and need to extract their name, email, and work history so a later navigation block can fill the application form. Define the fields you want in ajson_schema, and Skyvern uses an LLM to extract them:
file_urlpoints to the file. Here,{{ resume }}is a workflow parameter passed at runtime — it could be a public URL, an S3 presigned URL, or a Google Drive link.file_typetells Skyvern how to read the file. Usecsv,excel,pdf,image, ordocx.json_schemadefines exactly what to extract. The LLM reads the PDF and returns data matching this structure. Thework_experiencearray means you’ll get one object per job withcompanyandrolefields.
{{ parse_resume_output }} in subsequent blocks and looks like this:
json_schema, you get the raw parsed content instead — plain text for PDFs, or an array of row objects for CSVs. The schema is what turns unstructured file content into typed, structured data.
| Parameter | Type | Use this to |
|---|---|---|
file_url | string | Point to the file (HTTP URL, S3 URI, or parameter like {{ resume }}) |
file_type | string | Specify format: csv, excel, pdf, image, or docx |
json_schema | object | Define the structure you want extracted |
file_url:
- HTTP/HTTPS URLs
- S3 URIs (
s3://bucket/path/file.csv) - Azure Blob URIs (
azure://container/path/file.xlsx) - Google Drive links (auto-converted)
- Workflow parameters (
{{ parameter_name }})
Parsing a CSV and processing each row
Say your procurement team exports purchase orders as a CSV and you need to enter each one into your web-based ERP. First parse the CSV, then loop over the rows:json_schema needed for CSVs since the column headers already provide structure:
for_loop iterates over this array. On each iteration, {{ enter_order.current_value }} contains one row object (e.g., { "order_id": "ORD-001", "product": "Widget", "quantity": "10" }), which the navigation block uses to fill the ERP form.
Saving files
When your workflow needs to store downloaded files permanently — archiving invoices, sending reports to a shared bucket, integrating with other systems — use one of the upload blocks.| Block | When to use it |
|---|---|
upload_to_s3 | Store files in Skyvern’s managed S3. Simplest option — no credentials needed. |
file_upload | Store files in your own S3 bucket or Azure Blob Storage. Use when you need files in your infrastructure. |
download_to_s3 | Save a file from a URL directly to Skyvern’s S3, skipping the browser. Use when you already have the file URL. |
Upload to Skyvern’s S3
After downloading EIN confirmation letters from the IRS, archive them to Skyvern’s managed S3. PassSKYVERN_DOWNLOAD_DIRECTORY as the path and the block uploads every file downloaded during this run:
{{ save_invoices_output }}) is a list of S3 URIs you can return from your workflow or pass to subsequent blocks.
| Parameter | Type | Use this to |
|---|---|---|
path | string | Specify what to upload (SKYVERN_DOWNLOAD_DIRECTORY or a specific file path) |
Upload to your own storage
When compliance certificates need to land in your company’s own S3 bucket (not Skyvern’s), usefile_upload with your AWS credentials:
storage_typeselects the destination:s3for AWS,azurefor Azure Blob Storage.- Credentials should use
aws_secretparameters backed by AWS Secrets Manager — credentials auto-resolve at runtime without being passed in the run payload. pathworks the same asupload_to_s3— passSKYVERN_DOWNLOAD_DIRECTORYto upload everything, or a specific file path.
| Parameter | Type | Use this to |
|---|---|---|
storage_type | string | Choose s3 or azure |
path | string | Specify what to upload (SKYVERN_DOWNLOAD_DIRECTORY or a file path) |
s3_bucket, aws_access_key_id, aws_secret_access_key, region_name
Azure parameters: azure_storage_account_name, azure_storage_account_key, azure_blob_container_name, azure_folder_path
Limit: 50 files maximum per upload.
Quick URL-to-S3
When you already have a direct URL to a file — say, a Google Analytics export link — and just need to save it without opening a browser, usedownload_to_s3:
| Parameter | Type | Use this to |
|---|---|---|
url | string | Specify the file URL to download and save |
Passing files between blocks
Files flow through workflows in two ways: throughSKYVERN_DOWNLOAD_DIRECTORY for downloaded files, and through output parameters for parsed data.
Using downloaded files
Say you downloaded invoices from a vendor portal earlier in the workflow and now need to email them to your accounting team. Any file downloaded during the run sits inSKYVERN_DOWNLOAD_DIRECTORY, and you can attach the entire directory to an email:
file_attachments: ["SKYVERN_DOWNLOAD_DIRECTORY"] attaches every file downloaded during the run. The SMTP credentials use aws_secret parameters — these reference keys stored in AWS Secrets Manager so your credentials are never exposed in the workflow definition.
Using parsed data
When you parse a file, the extracted data becomes available as{{ label_output }}. This is how you chain a parse step with a navigation step — for example, parsing a resume PDF and then using the candidate’s info to fill a Lever job application:
{{ parse_resume_output }} in its navigation_goal — Skyvern replaces this with the full parsed data (name, email, work experience) and uses it to fill the form fields.
Accepting files as workflow inputs
To accept a file when the workflow runs, define a parameter withworkflow_parameter_type: file_url:
Next steps
Workflow Blocks Reference
Complete parameter reference for all file blocks
Build a Workflow
Learn how blocks pass data to each other

