800 files · 40 GB
Photo delivery and client galleries
A shoot is 800 files and 40 GB. The client clicks once, gets one link, and can pick it up again tomorrow on hotel wifi — no “your download is being prepared” email.
Send a list of file URLs. Your users get one download link — and Eazip handles everything that happens after the click.
Help me decide whether to use Eazip (eazip.io) for "Download all as ZIP" in this project. Before changing any code, research it and write a plan. 1. Current setup. Find how this project handles bulk downloads or exports today: existing ZIP code or libraries (archiver, JSZip, zip.js, etc.), background jobs or queues, where the files live (S3, R2, GCS, Supabase Storage, local disk), typical file counts and sizes, how the result reaches the user, and runtime limits (serverless timeouts, memory, temp disk). 2. How Eazip would fit. Read eazip.io/llms.txt, then outline the integration: which backend endpoint calls POST /jobs, stream or stored mode, how source URLs are signed, webhook or polling, how long ZIPs are kept, and how very large exports are split. 3. Usage. Estimate monthly volume from what you found: exports per month × average size, repeat downloads, and how long ZIPs need to stay available. 4. Cost. In a table, compare (a) keeping or extending the current approach, if there is one, (b) building it in-house, and (c) Eazip on the plan that fits, using the current pricing listed in eazip.io/llms.txt. Include infrastructure (compute, storage, egress for repeat downloads), engineering time to build it, and ongoing maintenance and failure handling. State your assumptions. 5. Recommendation. Pick one and explain why. If Eazip isn't a good fit (for example, exports small enough to zip in the browser with the open-source Eazip.js), say so. Finish with the files you would change and the questions you need me to answer. Keep the report concise; link to evidence instead of dumping code.
Summer shoot
100 photos · 277 MB
Your app, your button. Eazip does everything after the click.
await fetch('https://api.eazip.io/jobs', {
method: 'POST',
headers: {
'X-API-Key': process.env.EAZIP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
zip_filename: 'summer-shoot.zip',
files: [
{ url: 'https://cdn.yourapp.com/summer/DSC_0001.jpg' },
{ url: 'https://cdn.yourapp.com/summer/DSC_0002.jpg' },
],
}),
});
// You get one download link for your user.
Follow one “Download all” click from request to cleanup. Every step below is handled by Eazip, on every plan.
Your server sends Eazip one request with the 800 file URLs of their 40 GB wedding gallery. Presigned S3, R2, and Supabase links work as they are.
{
"files": [ …800 file URLs… ],
"mode": "stored",
"expires_in": 345600,
"max_zip_size_bytes": 10000000000
}Files are pulled server-to-server and written into the ZIP as they arrive. Nothing passes through your servers, and there is no bucket CORS to configure.
Eazip retries it. If it still fails, you decide what happens: fail the job, or finish without that file and report it.
photos/0312.jpgtimed outretried ✓
"fail_on_url_error": trueThe job fails. Nothing half-finished reaches the client.
"fail_on_url_error": falseThe ZIP completes without it; the URL is listed in the job’s errors.
ZIP64 is always on, so big archives stay valid. With a split size set, the 40 GB gallery arrives as 10 GB parts.
A webhook tells your app, and the client gets signed download links that expire when you say.
{
"event": "job.completed",
"job_id": "9c4d2f8e-1234-5678-90ab-cdef01234567",
"zip_count": 4,
"zips": [ { "filename": "shoot_01.zip",
"download_url": "https://api.eazip.io/download/eyJ…" },
… ]
}The download picks up where it stopped. Nobody starts a 10 GB file over.
The stored ZIP is still there, so nothing is rebuilt. It is served from Eazip’s storage — your bucket isn’t touched again, and there is no egress fee.
The archive is deleted on schedule. There is no temp storage or cleanup cron for you to run. Keep ZIPs up to 4 days on Free, or up to 90 on Scale.
An illustrative stored job for a 40 GB gallery. Real timings depend on your sources.
800 files · 40 GB
A shoot is 800 files and 40 GB. The client clicks once, gets one link, and can pick it up again tomorrow on hotel wifi — no “your download is being prepared” email.
Attachments · invoices · audits
Attachment bundles, invoice exports, audit archives. The request every B2B customer eventually files, without a queue and a cleanup cron in your app.
400 RAW files
The team selects 400 RAW files across folders and gets one archive. Zero egress on delivery is what makes the math work at that size.
Eazip started as the export layer of our own file-sharing product and still carries that traffic every day.
As of Aug 2, 2026
Every feature is on every plan, Free included. Start with 500 GB of stream delivery a month, and add capacity and longer retention from $9/month as usage grows.
$0/month
Your first production export.
$9/mo
Export is a core workflow.
$29/mo
High volume, large archives.
$99/mo
Optional extra usage on paid plans: stream $4/TB, stored $2/TB-day. Switch it off and jobs stop at the quota.
Stream builds the ZIP during each download and is billed by the amount downloaded.
Stored builds it once and is billed by size × days kept — 100 GB-days is 100 GB for 1 day, or 25 GB for 4 days.
Every plan: no file-count limit, jobs up to 500 GB, split into ZIPs of up to 50 GB each.
Stream builds the ZIP while your user downloads it and keeps nothing afterwards; it’s billed by the amount downloaded. Stored builds the archive once and keeps it for your retention window; it’s billed by size × days kept. If the same ZIP may be downloaded more than once, use stored.
Every month, 500 GB of stream delivery and 100 GB-days of stored archives (for example, 25 GB kept for 4 days), with every feature and no card. Free is hard-capped: once you reach the quota, new stored jobs and stream downloads are rejected until it resets. You’re never billed.
Yes, and it’s the recommended way to share private files. Presign each object (S3, R2, GCS, Supabase Storage and others) and send the URLs; your bucket credentials never leave your server. They need to stay valid until the ZIP is built for stored jobs, and until your users finish downloading for stream jobs.
No. Eazip is one HTTP API, so any backend can call it with fetch or cURL. For frontends there are optional open-source packages, @eazip/react and @eazip/core (Eazip.js). They add a download tray with progress, cancel, and retry, and can zip smaller sets right in the browser while larger jobs go to Eazip.
Yes. Create a public key in the dashboard. It’s safe to ship in your frontend: it only works from the sites and file hosts you allow, within the delivery modes, file counts, and job sizes you set. Secret API keys stay on your server.
npm i @eazip/react · Eazip.js