Fileinbox has an API that allows you to programmatically manage your upload pages, view submissions, and download files.
→ Get an API token to start using the API.
The API is versioned at /api/v1. Breaking changes will ship at a new path (e.g. /api/v2)
rather than changing this one. See the full machine-readable spec at
/openapi.json.
To use the API you'll need an access token. Go to your API Tokens page and click "Generate new token".
Permission levels:
Include your token in the Authorization header:
curl -H "Authorization: Bearer fi_xxxxx" \
https://fileinbox.com/api/v1/ping
{ "status": "ok", "user_id": 42 }
Keep your token secret. Anyone with your token can access your account's data.
| Status | Description |
|---|---|
| 401 | Missing or invalid token |
| 403 | Token doesn't have required permission |
| 404 | Resource not found |
| 422 | Validation error (includes details object with per-field errors) |
| 429 | Rate limit exceeded (100 requests/minute) |
{
"error": {
"code": "validation_failed",
"message": "Slug has already been taken",
"details": { "slug": ["has already been taken"] }
}
}
List endpoints return paginated results. Use page and per_page query parameters. per_page defaults to 25 (max 100).
{
"data": [...],
"meta": { "page": 1, "per_page": 25, "total": 42 }
}
GET /api/v1/pages/:slug
Permission: Read
curl -H "Authorization: Bearer fi_xxxxx" \
https://fileinbox.com/api/v1/pages/photos
{
"data": {
"id": 1,
"slug": "photos",
"title": "Upload Photos",
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-01-15T10:30:00Z",
"url": "https://fileinbox.com/photos",
"responses_count": 12,
"questions": [
{ "id": "q1", "type": "text", "title": "Your Name", "required": true }
],
"branding": {},
"access_code_enabled": false,
"api_submissions_enabled": false
}
}
GET /api/v1/pages
Permission: Read
Returns a paginated array of page objects. Supports page and per_page query parameters.
curl -H "Authorization: Bearer fi_xxxxx" \
https://fileinbox.com/api/v1/pages
POST /api/v1/pages
Permission: Read + Write
| Field | Type | Required | Description |
|---|---|---|---|
page[slug] |
string | yes | URL slug (unique, letters/numbers/hyphens) |
page[title] |
string | no | Page title shown to uploaders |
page[access_code] |
string | no | Require this code to access the page |
page[api_submissions_enabled] |
boolean | no | Allow unauthenticated API submissions |
page[branding] |
object | no | Branding settings |
page[new_questions] |
array | no | Form questions (see below) |
Each question in new_questions:
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier for the question |
type |
string | text, textarea, email, select, files |
title |
string | Question label shown to uploaders |
required |
boolean | Whether an answer is required |
placeholder |
string | Placeholder text |
help |
string | Help text |
settings |
object | Type-specific settings |
curl -X POST \
-H "Authorization: Bearer fi_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"page": {
"slug": "photos",
"title": "Upload Photos",
"new_questions": [
{ "id": "q1", "type": "text", "title": "Your Name", "required": true }
]
}
}' \
https://fileinbox.com/api/v1/pages
Response: 201 Created with the page object.
PATCH /api/v1/pages/:slug
Permission: Read + Write. Only include the fields you want to change.
curl -X PATCH \
-H "Authorization: Bearer fi_xxxxx" \
-H "Content-Type: application/json" \
-d '{ "page": { "title": "Upload Wedding Photos" } }' \
https://fileinbox.com/api/v1/pages/photos
Response: 200 OK with the updated page object.
DELETE /api/v1/pages/:slug
Permission: Read + Write
curl -X DELETE \
-H "Authorization: Bearer fi_xxxxx" \
https://fileinbox.com/api/v1/pages/photos
Response: 204 No Content
Responses are submissions that people make to your upload pages. Each response can contain form answers and uploaded files.
GET /api/v1/pages/:slug/responses/:id
Permission: Read
curl -H "Authorization: Bearer fi_xxxxx" \
https://fileinbox.com/api/v1/pages/photos/responses/1
{
"data": {
"id": 1,
"created_at": "2025-01-16T14:20:00Z",
"answers": [
{ "question_title": "Your Name", "question_type": "text", "value": "Jane Smith" }
],
"ip": "192.168.1.1",
"location": "Dallas, TX",
"client": "Chrome on macOS",
"files": [
{
"id": 10,
"filename": "photo.jpg",
"content_type": "image/jpeg",
"byte_size": 2048000,
"download_url": "/api/v1/pages/photos/responses/1/files/10"
}
]
}
}
If a response's files are gated (free plan, older than 30 days),
download_urlis omitted and"gated": trueis present instead.
GET /api/v1/pages/:slug/responses
Permission: Read
Returns a paginated array of response objects. Supports page, per_page, and since (ISO 8601 timestamp) query parameters.
curl -H "Authorization: Bearer fi_xxxxx" \
"https://fileinbox.com/api/v1/pages/photos/responses?since=2025-01-16T00:00:00Z"
DELETE /api/v1/pages/:slug/responses/:id
Permission: Read + Write
curl -X DELETE \
-H "Authorization: Bearer fi_xxxxx" \
https://fileinbox.com/api/v1/pages/photos/responses/1
Response: 204 No Content
GET /api/v1/pages/:slug/responses/:response_id/files/:id
Permission: Read
Returns a 302 redirect to a signed download URL (expires in 5 minutes). Use -L to follow the redirect.
curl -L -H "Authorization: Bearer fi_xxxxx" \
-o photo.jpg \
https://fileinbox.com/api/v1/pages/photos/responses/1/files/10
These endpoints allow unauthenticated submissions to pages that have api_submissions_enabled set to true. No API token required.
Enable via the page's Security settings or the API:
curl -X PATCH \
-H "Authorization: Bearer fi_xxxxx" \
-H "Content-Type: application/json" \
-d '{ "page": { "api_submissions_enabled": true } }' \
https://fileinbox.com/api/v1/pages/photos
POST /api/v1/pages/:slug/submissions
Content-Type: multipart/form-data
The simplest way to submit. Send answers and files in a single multipart request — the server handles file storage automatically.
curl -X POST \
-F "answers[q_default_email]=jane@example.com" \
-F "files[q_default_files][]=@report.pdf" \
-F "files[q_default_files][]=@photo.jpg" \
-F "access_code=secret123" \
https://fileinbox.com/api/v1/pages/photos/submissions
Response: 201 Created
{
"data": {
"id": 42,
"created_at": "2025-01-15T10:30:00Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
answers |
object | yes | Map of question ID → answer value |
files |
object | no | Map of file question ID → array of files |
access_code |
string | no | Required if the page has an access code set |
Use question IDs from the page's questions array as keys.
Rate limit: 10 requests/minute per IP.
For large files or browser-based uploads, you can use the two-step direct upload flow instead.
Step 1: Create upload URLs.
POST /api/v1/pages/:slug/uploads
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"blobs": [{
"filename": "document.pdf",
"byte_size": 1048576,
"content_type": "application/pdf"
}]
}' \
https://fileinbox.com/api/v1/pages/photos/uploads
{
"data": [
{
"signed_id": "eyJfcm...",
"filename": "document.pdf",
"direct_upload": {
"url": "https://storage.example.com/...",
"headers": { "Content-Type": "application/pdf" }
}
}
]
}
Upload the file bytes with a PUT to direct_upload.url using the provided headers. Rate limit: 20 requests/minute per IP.
Step 2: Submit with signed IDs.
POST /api/v1/pages/:slug/submissions
Content-Type: application/json
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"answers": { "q_default_email": "jane@example.com" },
"files": {
"q_default_files": [
{ "signed_id": "eyJfcm...", "name": "document.pdf" }
]
}
}' \
https://fileinbox.com/api/v1/pages/photos/submissions
Error Responses:
| Status | Description |
|---|---|
| 403 | API submissions not enabled for this page |
| 401 | Invalid access code |
| 404 | Page not found |
| 422 | Validation error (missing required fields) |
| 429 | Rate limit exceeded |
Share files by uploading them and getting a download link. Recipients can download without signing up.
File sharing uses a two-step presigned upload flow:
POST /api/v1/share_uploads
Authorization: Token fi_xxxxx
Content-Type: application/json
{
"blobs": [
{
"filename": "report.pdf",
"byte_size": 2097152,
"checksum": "abc123base64==",
"content_type": "application/pdf"
}
]
}
Response:
{
"data": [
{
"signed_id": "eyJfcm...",
"filename": "report.pdf",
"byte_size": 2097152,
"content_type": "application/pdf",
"direct_upload": {
"url": "https://nyc3.digitaloceanspaces.com/...",
"headers": {
"Content-Type": "application/pdf",
"Content-MD5": "abc123base64=="
}
}
}
]
}
Upload each file directly to the presigned URL using a PUT request with the provided headers.
curl -X PUT \
-H "Content-Type: application/pdf" \
-H "Content-MD5: abc123base64==" \
--data-binary @report.pdf \
"https://nyc3.digitaloceanspaces.com/..."
POST /api/v1/shares
Authorization: Token fi_xxxxx
Content-Type: application/json
{
"signed_ids": ["eyJfcm..."],
"title": "Q4 Report",
"message": "See page 3 for the summary.",
"to": ["sarah@example.com"],
"password": "optional-password",
"expires_in": "7d"
}
Response (201 Created):
{
"data": {
"id": "k8m2x9p3",
"url": "https://fileinbox.com/dl/k8m2x9p3",
"title": "Q4 Report",
"message": "See page 3 for the summary.",
"files": [
{ "name": "report.pdf", "size": 2097152, "content_type": "application/pdf" }
],
"to": ["sarah@example.com"],
"password_protected": false,
"expires_at": "2026-03-19T16:17:42Z",
"download_count": 0,
"created_at": "2026-03-12T16:17:42Z"
}
}
GET /api/v1/shares
Authorization: Token fi_xxxxx
Supports pagination with page and per_page parameters.
GET /api/v1/shares/:code
Authorization: Token fi_xxxxx
Returns share details with _links and _actions for hypermedia navigation.
PATCH /api/v1/shares/:code
Authorization: Token fi_xxxxx (write permission required)
Content-Type: application/json
{
"title": "Updated Title",
"message": "Updated message"
}
DELETE /api/v1/shares/:code
Authorization: Token fi_xxxxx (write permission required)
Returns 204 No Content. Soft-deletes the share.
| Status | Code | Description |
|---|---|---|
| 402 | share_limit_reached |
Free plan share limit (25) exceeded |
| 422 | file_too_large |
File exceeds plan size limit (100 MB free, 10 GB Pro) |
| 422 | no_files |
No files provided |
| 422 | invalid_signed_id |
Invalid file reference |
| 403 | — | Read-only token used for write operation |
| 404 | not_found |
Share not found |
| 429 | — | Rate limit exceeded |
| Free | Pro ($29/mo) | |
|---|---|---|
| Lifetime sends | 25 | Unlimited |
| Max file size | 100 MB | 10 GB |
| File availability | 7 days | Forever (or custom) |
| Custom expiry | No | Yes |
| Password protection | Yes | Yes |
Share download pages are publicly accessible at https://fileinbox.com/dl/:code. No authentication required to view or download files.
The download page supports content negotiation:
- Accept: text/html — Beautiful branded download page
- Accept: application/json — JSON with file metadata and download URLs
npm install -g fileinbox
fileinbox auth YOUR_API_KEY
fileinbox send report.pdf --title "Q4 Report" --to sarah@example.com