Programmatic file transfers with enterprise-grade encryption. Upload, share, and track — all through a simple REST interface.
# Upload a file
curl -X POST https://api.transfilio.com/v1/uploads \
-H "Authorization: Bearer zs_live_..." \
-F "file=@document.pdf"
# Response
{
"id": "upl_a1b2c3",
"status": "completed",
"share_url": "https://transfilio.com/s/abc123"
}
Get up and running in under 5 minutes
Sign up, go to Settings → API Keys, and generate a new key.
Add your key to the
Authorization
header as a Bearer token.
Upload files, create share links, and track downloads — all via the API.
# Check API status
curl https://api.transfilio.com/health
# Upload a file
curl -X POST https://api.transfilio.com/v1/uploads \
-H "Authorization: Bearer zs_live_..." \
-F "file=@report.pdf"
# Create a share link
curl -X POST https://api.transfilio.com/v1/links \
-H "Authorization: Bearer zs_live_..." \
-H "Content-Type: application/json" \
-d '{"upload_id": "upl_a1b2c3"}'
All API requests require authentication via an API key
# In your request headers
Authorization: Bearer zs_live_a1b2c3d4e5f6
Standard OAuth-style Bearer token. Works with all HTTP clients.
# Custom header alternative
X-API-Key: zs_live_a1b2c3d4e5f6
Useful when Authorization header is already in use.
Security:
Never expose keys in client-side code.
Use environment variables and rotate regularly via
POST /api/v1/api-keys/:id/rotate
(24h grace period).
Common settings for all API requests
https://api.transfilio.com
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {api_key} | Yes |
| Content-Type | application/json | Yes |
| Accept | application/json | Optional |
List endpoints return paginated results. Use
page
and
per_page
query parameters.
# Response includes pagination metadata
{
"data": [...],
"meta": {
"page": 1,
"per_page": 20,
"total": 142,
"total_pages": 8
}
}
Complete endpoint reference with request and response details
/api/health
Public
Returns API health status. No authentication required.
Response
/api/v1/uploads
Auth required
Upload a new file. Supports multipart form data up to your plan limit.
Parameters
file
file
required
—
The file to upload (multipart)
name
string
—
Custom display name
expires_at
datetime
—
Auto-expiry (ISO 8601)
Response
/api/v1/uploads/:id
Auth required
Retrieve upload details including status, size, and download count.
Response
/api/v1/uploads/:id
Auth required
Update upload metadata such as display name or expiration.
Parameters
name
string
—
Updated display name
expires_at
datetime
—
New expiry timestamp
Response
/api/v1/uploads/:id
Auth required
Permanently delete an upload and all associated share links.
Response
/api/v1/links
Auth required
Create a secure share link with optional password, expiry, and download limit.
Parameters
upload_id
string
required
—
ID of the upload to share
password
string
—
Optional password protection
expires_at
datetime
—
Link expiry timestamp
max_downloads
integer
—
Maximum download count
Response
/api/v1/links/:id
Auth required
Retrieve share link details including download statistics.
Response
/api/v1/links/:id
Auth required
Revoke a share link immediately.
Response
/api/v1/transfers
Auth required
List all transfers with pagination and filtering.
Parameters
page
integer
—
Page number (default: 1)
per_page
integer
—
Items per page (max: 100)
status
string
—
Filter: completed, pending, expired
Response
/api/v1/usage
Auth required
Get current billing period usage including storage, transfers, and API calls.
Response
/api/v1/api-keys/:id/rotate
Auth required
Rotate an API key with a 24-hour grace period for the old key.
Parameters
grace_period_hours
integer
—
Grace period (default: 24, max: 72)
Response
Sliding window rate limiting ensures fair usage across all plans
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 994
X-RateLimit-Reset: 1710345600
# When rate limited (HTTP 429):
Retry-After: 42 (seconds)
| Plan | Req/Hour | Max File |
|---|---|---|
| Free | 100 | 2 GB |
| Pro | 1,000 | 5 GB |
| Business | 5,000 | 20 GB |
| Enterprise | Custom | Unlimited |
When rate limited, the API returns
429 Too Many Requests
with a
Retry-After
header indicating seconds to wait.
Receive real-time notifications when events occur in your account
upload.completed
link.created
link.accessed
file.downloaded
link.expired
transfer.reviewed
POST https://your-app.com/webhooks/transfilio
X-Transfilio-Signature: sha256=a1b2c3...
{
"event": "file.downloaded",
"timestamp": "2026-03-13T14:30:00Z",
"data": {
"upload_id": "upl_a1b2c3",
"link_id": "lnk_x1y2z3",
"ip_address": "203.0.113.42"
}
}
All payloads are signed with HMAC-SHA256. Verify the
X-Transfilio-Signature
header to ensure authenticity.
import hmac, hashlib
def verify_signature(payload, signature, secret):
expected = hmac.new(
secret.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(
f"sha256={expected}", signature
)
Consistent JSON error responses with actionable codes
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key",
"details": []
}
}
Official client libraries for popular languages
from transfilio import TransfilioClient
client = TransfilioClient("zs_live_...")
# Upload with progress callback
upload = client.uploads.create(
"report.pdf",
on_progress=lambda p: print(f"{p}%")
)
# Create a password-protected link
link = client.links.create(
upload_id=upload.id,
password="secure123",
max_downloads=10
)
print(link.url)
Get your API key and start building in minutes. Free tier includes 100 API calls per hour.