How to Upload Large Video Files to Notion via API: Chunking, Compression, and HIPAA Compliance

Learn how to reliably upload large video files to Notion using multi-part chunking, video compression via AWS Lambda, and HIPAA-compliant pipeline design.

Jun 16, 2026
How to Upload Large Video Files to Notion via API: Chunking, Compression, and HIPAA Compliance
When your organization needs to store video recordings directly on Notion's servers — not embedded from an external host — the Notion File Upload API is the right tool. But uploading large files like hour-long Zoom recordings runs into a specific constraint: Notion's file upload session expires after 60 minutes, meaning the entire upload must complete within that window.
This guide covers the three main approaches to reliably upload large videos to Notion via API, with notes on HIPAA compliance for healthcare and regulated teams.
Uploading large video files to Notion via API. Photo by Growtika on Unsplash.
Uploading large video files to Notion via API. Photo by Growtika on Unsplash.

Why Upload Videos Directly to Notion?

Many teams default to embedding videos from Zoom, S3, or Cloudinary. But if your organization:
  • Has signed a Business Associate Agreement (BAA) with Notion Enterprise
  • Needs video recordings to remain on Notion's HIPAA-compliant infrastructure
  • Wants videos accessible without requiring staff to authenticate into a third-party platform
...then native Notion file storage is the right approach — not an embed from an external source.
Notion Enterprise is HIPAA compliant and supports BAAs, making it a valid destination for protected health information (PHI) including recorded video.

The Core Problem: The 1-Hour Expiry Window

When you initiate a file upload via the Notion API, Notion creates a file upload object with a status of pending. Once the upload completes, the status changes to uploaded. You then attach the file to a page block.
The challenge: the file upload object expires 1 hour after creation *(as of June 2026 — verify current Notion API docs)*. For large video files (300–500 MB), transferring through a third-party automation server can easily exceed that window — especially if the file has to route through a Zapier or Make step that adds latency at each node.

Three Approaches to Solve It

1. Compress the Video Before Uploading

Reducing file size is the most straightforward way to fit inside the 1-hour window.
  • Use an AWS Lambda function to compress the video using FFmpeg before uploading
  • A 500 MB recording compressed to 100–150 MB transfers significantly faster
  • The compressed file remains a native video file — not a zip — so Notion can play it directly
Trade-off: Some quality reduction. For meeting recordings this is usually acceptable. For training or clinical content, test the minimum acceptable bitrate first.

2. Multi-Part Upload (Chunking)

The Notion API supports multi-part file uploads for files larger than 20 MB. You split the file into segments of 5–20 MB each, upload each part, then finalize the upload.
Key implementation details:
  • All parts must complete upload within the 1-hour window from when the file upload object was created
  • Use a Linux split command or a Node.js library like split-file to generate parts
  • Track each part's upload status before finalizing
  • More parts = more API calls, but smaller per-request payloads
This approach works well when you cannot reduce file size (for example, when quality must be preserved).

3. Route Through a Fast Intermediate Host

If your automation pipeline routes the file through an intermediary server, that server's upload speed to Notion becomes the constraint. Moving to a direct server-to-server connection can dramatically reduce upload time.
Option A: Direct AWS-to-Notion upload
If the video is stored in an S3 bucket, trigger a Lambda function that uploads directly from S3 to Notion — bypassing the automation platform entirely. AWS-to-Notion transfers happen across backbone internet infrastructure and are significantly faster than routing through a third-party automation server.
Important caveat: Notion requires a HEAD request before the GET request when uploading via external URL. AWS S3 pre-signed URLs only respond to GET by default. You will need to either configure your Lambda to serve both HEAD and GET responses, or use a different intermediate host.
Option B: Stage through Cloudinary
Cloudinary can serve both HEAD and GET requests, and Cloudinary Enterprise is HIPAA-compliant. Use it as a staging location: push the video from AWS to Cloudinary, then upload from Cloudinary's URL to Notion. Once the upload completes, delete the Cloudinary copy.

HIPAA Compliance Considerations

If your client has a BAA with Notion (available on Notion Enterprise), storing video directly on Notion's servers satisfies their compliance requirement. This means:
  • Files should not be made public at any point in the pipeline
  • Any intermediate storage (S3, Cloudinary) must also be covered by a BAA or kept behind strict access controls
  • Tokens and pre-signed URLs should expire quickly to minimize exposure
The work is ensuring the transfer pipeline does not leak the file along the way — once the file lands on Notion Enterprise, you are in compliance.

Recommended Approach

Combine compression and direct server-to-server upload:
  1. Store the original video in a private S3 bucket
  1. Trigger an AWS Lambda function that compresses the video using FFmpeg
  1. Upload the compressed video directly from Lambda to Notion using the File Upload API (bypassing slow automation middleware)
  1. Attach the uploaded file to the appropriate Notion page block
This avoids the automation platform bottleneck, reduces file size, and keeps the entire pipeline within HIPAA-controlled infrastructure.

Common Troubleshooting

  • Upload times out before completion: The file is too large for the 1-hour window even after routing. Add compression to reduce file size further.
  • Notion rejects the external URL: Confirm the serving endpoint responds to both HEAD and GET requests. S3 pre-signed URLs only support GET.
  • Video plays but quality is poor: Increase the target bitrate in your FFmpeg compression settings. For meeting recordings, 720p at 1 Mbps is usually acceptable.
  • Multi-part upload fails partway through: Implement retry logic for individual parts. Notion's API returns the part upload status so you can resume from the last successful part.

Get Help Building This Pipeline

Need help building this pipeline for your team? Book a free discovery call with a Connex automation expert.