Create a ZIP from text entries
Create a downloadable ZIP from text you paste into up to 50 named entries. The browser tool keeps safe relative folder paths and runs locally; PDF, image, and other binary upload is not available here yet.
Run — free
The small task that's easy to skip and expensive to skip badly
Configuration files, logs, CSV snippets, source notes, and generated text often belong in one download. Add one row per entry, give it a safe relative path, paste its text, and download one standard ZIP.
What goes in and what comes out
Each entry has a file name or relative path plus UTF-8 text content. The create zip file api preserves safe subfolders such as docs/readme.txt and returns a standard ZIP that common operating systems can open.
How the request and pricing work
POST up to 50 {name, content} text entries to /data/zip. The call returns a task_id and the finished archive is delivered through your signed webhook or result link. Pricing is $0.002 per request, and a failed task is never billed.
A format older than most of the software that uses it
The archive uses ZIP's store method: it packages bytes without trying to reduce their size. That keeps output deterministic and widely compatible, but it is bundling rather than size compression.
Where it fits into a pipeline
Use it after generating a group of text artifacts such as logs, configuration, CSV, or documentation. Binary source files need a different upload-aware workflow until that input is added here.
What you can do with it
Bundled data export
A SaaS platform bundles a CSV export, a JSON manifest, and a text summary into one download.
Delivering a finished project
A developer packages README, license, and configuration text under safe subfolders.
Log archiving
An automated job bundles the previous day's text logs into one archive.
Batch report packaging
A reporting service packages up to 50 generated CSV or text reports into one archive.
FAQ
How do I create a ZIP file with an API?
POST up to 50 objects with name and text content to /data/zip. The API returns a task_id and delivers the ZIP through the normal task result flow.
Is this API free to use?
The tool above runs free in your browser. The API is paid — each call draws from your prepaid ForHosting KIT balance: top up from $10.00 (it never expires), pay each request's published price, and a call with no balance returns HTTP 402. No subscription, no tokens, and a failed task is never charged.
Does the price change based on how many files I include?
No. The price is $0.002 per request, with a maximum of 50 text entries.
Can I preserve a folder structure inside the ZIP?
Yes, folder paths provided with the files are preserved in the resulting archive, so the ZIP opens with the same structure you specified.
What archive format does it produce?
It produces a standard ZIP archive, openable with the built-in tools on every major operating system and any ZIP-compatible library.
Can I upload PDF, image, or other binary files here?
Not yet. This browser form and the current API contract accept up to 50 UTF-8 text entries. Binary file upload needs an upload-aware capability.
Is the ZIP API live now?
Yes, this endpoint is live today at the published price of $0.002 per request.
Where is the content processed?
The free form builds the ZIP locally in your browser. With the API, the text entries and result follow the published task retention and signed-result flow.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/data/zip \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"files":[{"name":"a.txt","content":"hola"}]}'const res = await fetch("https://api.kit.forhosting.com/data/zip", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"files": [
{
"name": "a.txt",
"content": "hola"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/zip",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"files": [
{
"name": "a.txt",
"content": "hola"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/zip", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"files":[{"name":"a.txt","content":"hola"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"files":[{"name":"a.txt","content":"hola"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/zip", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"files": [
{
"name": "a.txt",
"content": "hola"
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.zip",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |