FOR DEVELOPERS

File to API.
API to proxy.
Zero backend.

Upload a spreadsheet and query it instantly. Connect any REST API and call it through a proxy. Plain HTTP, JSON responses, no SDK required.

TERMINAL
$ curl -F file=@products.csv -F name=products api.liteio.dev/upload {"name":"products", "rows":2847, "api":"https://api.liteio.dev/d/products"} $ curl "api.liteio.dev/d/products?category=electronics&sort=-rating&limit=3" {"data":[ {"name":"Pro Headphones","price":299,"rating":4.9}, {"name":"USB-C Hub","price":79,"rating":4.7}, {"name":"Wireless Mouse","price":59,"rating":4.6} ]}
DATA → API

Upload a file. Query it instantly.

Drop a CSV, JSON, TSV, JSONL, or Excel file. Types detected automatically. You get back an API URL with filtering, sorting, full-text search, and pagination.

1

Upload

Multipart POST with a name field. The name becomes your API path.

UPLOAD
$ curl -F file=@products.csv -F name=products \ https://api.liteio.dev/upload { "name": "products", "rows": 2847, "columns": ["id", "name", "category", "price", "rating"], "api": "https://api.liteio.dev/d/products" }
2

Query

Filter, sort, search, and paginate. All from query parameters.

QUERY
$ curl "api.liteio.dev/d/products?category=electronics&price:gt=50&sort=-rating" {"data":[...], "total":247, "page":1, "limit":25} $ curl "api.liteio.dev/d/products?q=wireless headphones" {"data":[...], "total":12} $ curl api.liteio.dev/d/products/schema {"columns":[{"name":"price","type":"number"},...], "rows":2847}
3

Export

Download as CSV, JSON, or JSONL. Apply filters before export.

EXPORT
$ curl "api.liteio.dev/d/products?format=csv&category=electronics" > electronics.csv
QUERY ENGINE

Nine operators. Any combination.

Filter by any column with typed operators. Chain multiple filters. Sort by any field, ascending or descending. Full-text search across all text columns.

Typed operators price:gt=50&rating:gte=4
Multi-sort sort=-price,name
Full-text search q=wireless headphones
field=valueexact match
field:gt=100greater than
field:gte=100greater or equal
field:lt=50less than
field:lte=50less or equal
field:ne=booksnot equal
field:like=wire%pattern match
field:in=a,b,cin set
field:null=trueis null
CONNECT → PROXY

Call any API. Never expose a key.

Store credentials once. Call any endpoint through the proxy. Auth headers injected automatically. Your client code never touches a secret.

1

Create a connection

Store credentials encrypted. Bearer, API key, basic auth, OAuth2 all supported.

CONNECT
$ curl -X POST api.liteio.dev/connections \ -H "Authorization: Bearer $TOKEN" \ -d '{"name":"OpenAI", "base_url":"https://api.openai.com", "auth_type":"bearer", "auth_config":{"token":"sk-proj-..."}}' {"id": "cn_a8f3e1b2", "name": "OpenAI"}
2

Call via proxy

Use the connection ID. Auth headers injected automatically. Response streamed back.

PROXY
$ curl api.liteio.dev/proxy/cn_a8f3e1b2/v1/models \ -H "Authorization: Bearer $TOKEN" 200 OK 42ms {"data": [{"id":"gpt-4o"}, {"id":"gpt-4o-mini"}]}
Browse pre-configured APIs →
CODE EXAMPLES

Works with any language.

Plain HTTP. No SDK required.

CURL
# Upload data curl -F file=@products.csv -F name=products \ https://api.liteio.dev/upload # Query with filters curl "api.liteio.dev/d/products?category=electronics&sort=-rating" # Connect an API curl -X POST api.liteio.dev/connections \ -H "Authorization: Bearer $TOKEN" \ -d '{"name":"Stripe","base_url":"https://api.stripe.com", "auth_type":"bearer","auth_config":{"token":"sk_live_..."}}' # Call via proxy curl api.liteio.dev/proxy/cn_d5e6/v1/customers?limit=10 \ -H "Authorization: Bearer $TOKEN"
JAVASCRIPT
// Upload data const form = new FormData(); form.append("file", file, "products.csv"); form.append("name", "products"); const dataset = await fetch("https://api.liteio.dev/upload", { method: "POST", body: form }).then(r => r.json()); // Query const results = await fetch( "https://api.liteio.dev/d/products?category=electronics&sort=-rating" ).then(r => r.json()); // Connect + proxy an API const conn = await fetch("https://api.liteio.dev/connections", { method: "POST", headers: { "Authorization": `Bearer ${TOKEN}`, "Content-Type": "application/json" }, body: JSON.stringify({ name: "GitHub", base_url: "https://api.github.com", auth_type: "bearer", auth_config: { token: "ghp_..." } }) }).then(r => r.json()); const repos = await fetch( `https://api.liteio.dev/proxy/${conn.id}/user/repos`, { headers: { "Authorization": `Bearer ${TOKEN}` } } ).then(r => r.json());
PYTHON
import requests # Upload data with open("products.csv", "rb") as f: dataset = requests.post("https://api.liteio.dev/upload", files={"file": f}, data={"name": "products"}).json() # Query results = requests.get("https://api.liteio.dev/d/products", params={"category": "electronics", "sort": "-rating"}).json() # Connect + proxy an API conn = requests.post("https://api.liteio.dev/connections", headers={"Authorization": f"Bearer {TOKEN}"}, json={ "name": "Slack", "base_url": "https://slack.com/api", "auth_type": "bearer", "auth_config": {"token": "xoxb-..."} }).json() channels = requests.get( f"https://api.liteio.dev/proxy/{conn['id']}/conversations.list", headers={"Authorization": f"Bearer {TOKEN}"}).json()
GO
// Upload data body := &bytes.Buffer{} w := multipart.NewWriter(body) w.WriteField("name", "products") part, _ := w.CreateFormFile("file", "products.csv") io.Copy(part, file) w.Close() req, _ := http.NewRequest("POST", "https://api.liteio.dev/upload", body) req.Header.Set("Content-Type", w.FormDataContentType()) resp, _ := http.DefaultClient.Do(req) // Query resp, _ = http.Get("https://api.liteio.dev/d/products?category=electronics") // Connect + proxy an API connBody := `{"name":"Twilio","base_url":"https://api.twilio.com", "auth_type":"basic","auth_config":{"username":"AC...","password":"..."}}` req, _ = http.NewRequest("POST", "https://api.liteio.dev/connections", strings.NewReader(connBody)) req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Content-Type", "application/json") resp, _ = http.DefaultClient.Do(req)
API SURFACE

Two groups. All you need.

Data

Upload files, query datasets, inspect schemas, export data. Your file becomes a full API.

POST /upload GET /d/{name} GET /d/{name}/schema GET /d/{name}/stats GET /datasets

Connect

Store credentials encrypted. Call any API through the proxy. Auth injected automatically.

POST /connections ALL /proxy/{connId}/* POST /connections/{id}/test
AI INTEGRATION

Your AI queries your data and calls your APIs.

Connect Claude or ChatGPT via MCP. Upload a spreadsheet, then ask questions in English. Your AI agent can also call any connected API from the conversation.

dataset_list
List your datasets
dataset_query
Query with filters
dataset_schema
Get column types
connection_list
List API connections
api_call
Authenticated API call
api_discover
Preview OpenAPI spec

Claude.ai

Settings → Integrations → Add custom connector → https://api.liteio.dev/mcp

ChatGPT

Settings → Connected apps → Add by URL → https://api.liteio.dev/mcp

SECURITY

Credentials are never exposed.

AES-GCM-256

Per-account derived keys via HKDF-SHA256. Decrypted only at proxy time.

Account isolation

Every resource scoped to your account. No cross-tenant access.

Audit logging

Every proxied request logged with method, status, and duration.

Masked responses

Credentials shown as sk-p***. Full values never leave the server.

Start building.

Upload your first file or connect your first API. No signup required for public datasets.

# Developer Guide Base URL: https://api.liteio.dev Upload any file and get a live REST API with filtering, search, and pagination. Connect any REST API and call it through a proxy that manages your credentials. Plain HTTP, JSON responses, no SDK required. ## Quickstart: Upload Data
bash # Upload a CSV (or JSON, TSV, JSONL, Excel) curl -F file=@products.csv -F name=products https://api.liteio.dev/upload # → {"name":"products", "rows":2847, "api":"https://api.liteio.dev/d/products"}
bash # Query with filters + sort curl "https://api.liteio.dev/d/products?category=electronics&price:gt=50&sort=-rating" # Full-text search curl "https://api.liteio.dev/d/products?q=wireless headphones" # Schema and stats curl https://api.liteio.dev/d/products/schema curl https://api.liteio.dev/d/products/stats # Export curl "https://api.liteio.dev/d/products?format=csv"
### Filter Operators
OperatorExampleDescription
=category=electronicsExact match
:gtprice:gt=50Greater than
:gteprice:gte=50Greater or equal
:ltprice:lt=100Less than
:lteprice:lte=100Less or equal
:nestatus:ne=draftNot equal
:likename:like=wire%Pattern match
:instatus:in=active,pendingIn set
:nullemail:null=trueIs null
### Query Parameters
ParameterExampleDescription
sortsort=-price,nameSort (prefix - for desc)
qq=wireless headphonesFull-text search
limitlimit=25Max rows per page
pagepage=2Page number
offsetoffset=50Skip rows
columnscolumns=name,priceSelect columns
formatformat=csvExport as CSV, JSON, JSONL
## Quickstart: Connect an API
bash # Store credentials once curl -X POST https://api.liteio.dev/connections \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "OpenAI", "base_url": "https://api.openai.com", "auth_type": "bearer", "auth_config": {"token": "sk-proj-..."} }' # → {"id":"cn_a8f3e1b2", "name":"OpenAI"}
bash # Call through proxy (credentials injected automatically) curl https://api.liteio.dev/proxy/cn_a8f3e1b2/v1/models \ -H "Authorization: Bearer $TOKEN" # → {"data":[{"id":"gpt-4o"}, ...]}
### Auth Types
Typeauth_config
bearer{"token": "sk-..."}
api_key{"key": "abc123", "header": "X-API-Key"}
basic{"username": "user", "password": "pass"}
oauth2_token{"access_token": "ya29..."}
## Code Examples ### JavaScript
javascript const BASE = "https://api.liteio.dev"; // Upload data const form = new FormData(); form.append("file", fileBlob, "products.csv"); form.append("name", "products"); const dataset = await fetch(`${BASE}/upload`, { method: "POST", body: form, }).then(r => r.json()); // Query const results = await fetch( `${BASE}/d/products?category=electronics&sort=-rating&limit=10` ).then(r => r.json()); // Connect an API const conn = await fetch(`${BASE}/connections`, { method: "POST", headers: { "Authorization": `Bearer ${TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Stripe", base_url: "https://api.stripe.com", auth_type: "bearer", auth_config: { token: "sk_live_..." }, }), }).then(r => r.json()); // Call via proxy const customers = await fetch( `${BASE}/proxy/${conn.id}/v1/customers?limit=10`, { headers: { "Authorization": `Bearer ${TOKEN}` } }, ).then(r => r.json());
### Python
python import requests BASE = "https://api.liteio.dev" # Upload data with open("products.csv", "rb") as f: dataset = requests.post(f"{BASE}/upload", files={"file": f}, data={"name": "products"}).json() # Query results = requests.get(f"{BASE}/d/products", params={"category": "electronics", "sort": "-rating"}).json() # Connect an API conn = requests.post(f"{BASE}/connections", headers={"Authorization": f"Bearer {TOKEN}"}, json={ "name": "GitHub", "base_url": "https://api.github.com", "auth_type": "bearer", "auth_config": {"token": "ghp_..."}, }).json() # Call via proxy repos = requests.get( f"{BASE}/proxy/{conn['id']}/user/repos", headers={"Authorization": f"Bearer {TOKEN}"}, ).json()
### Go
go // Upload data body := &bytes.Buffer{} writer := multipart.NewWriter(body) writer.WriteField("name", "products") part, _ := writer.CreateFormFile("file", "products.csv") io.Copy(part, file) writer.Close() req, _ := http.NewRequest("POST", "https://api.liteio.dev/upload", body) req.Header.Set("Content-Type", writer.FormDataContentType()) resp, _ := http.DefaultClient.Do(req) // Query resp, _ = http.Get("https://api.liteio.dev/d/products?category=electronics&sort=-rating") // Connect an API connBody := `{"name":"Slack","base_url":"https://slack.com/api", "auth_type":"bearer","auth_config":{"token":"xoxb-..."}}` req, _ = http.NewRequest("POST", "https://api.liteio.dev/connections", strings.NewReader(connBody)) req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Content-Type", "application/json") resp, _ = http.DefaultClient.Do(req) // Call via proxy req, _ = http.NewRequest("GET", "https://api.liteio.dev/proxy/"+connID+"/conversations.list", nil) req.Header.Set("Authorization", "Bearer "+token) resp, _ = http.DefaultClient.Do(req)
## API Surface ### Data
MethodEndpointDescription
POST/uploadUpload file (multipart, name field required)
GET/d/{name}Query dataset (filters, sort, search, pagination)
GET/d/{name}/schemaColumn names, types, row count
GET/d/{name}/statsMin, max, avg, nulls, uniques, top values
GET/d/{name}/{row}Get single row
PUT/d/{name}Replace dataset
POST/d/{name}/appendAppend rows
DELETE/d/{name}Delete dataset
GET/datasetsList your datasets
### Connections
MethodEndpointDescription
POST/connectionsCreate connection (encrypted credentials)
GET/connectionsList connections (credentials masked)
PUT/connections/{id}Update connection
DELETE/connections/{id}Delete connection
POST/connections/{id}/testTest connection
### Proxy
MethodEndpointDescription
ALL/proxy/{connId}/*Transparent proxy (auth injected)
## AI Integration (MCP) Connect Claude or ChatGPT via MCP. Your AI agent queries your data and calls your APIs directly from the conversation.
ToolDescription
dataset_listList your datasets
dataset_queryQuery a dataset with filters
dataset_schemaGet dataset schema
connection_listList API connections
api_callMake authenticated API call via connection
### Connect Claude.ai Settings > Integrations > Add custom connector > https://api.liteio.dev/mcp ### Connect ChatGPT Settings > Connected apps > Add by URL > https://api.liteio.dev/mcp ## Security - Encrypted credentials: AES-GCM-256 with per-account derived keys. Decrypted only at proxy time. - Account isolation: every resource scoped to authenticated account. No cross-tenant access. - Masked responses: credentials shown as sk-p*. Full values never leave the server. - Audit logging**: every proxied request logged with method, status, and duration. ## Links - API Reference: Full endpoint documentation - CLI: Command-line tool - Marketplace: Browse popular APIs - Architecture: How it works