Create shareable tables programmatically. PRO
All Pro features require an API key. Pass it in the JSON request body as apiKey.
Keys are issued automatically after a $5 one-time purchase on Ko-fi and emailed to you. Format:
ts_live_xxxxxxxxxxxxxxxxxxxxxxxx
Creates a new shared table from raw row data. Works without an API key (free tier limits apply). Pro key unlocks higher limits and premium features.
| Field | Type | Required | Description |
|---|---|---|---|
data | array<array> | Yes | Array of rows, each row is an array of cell values |
apiKey | string | No | Pro API key. Omit for free tier. |
title | string | No | Optional title shown on table page (max 100 chars) |
password | string | No | Password to protect the table PRO |
expiry | number | No | Seconds until expiry. Free: max 604800 (7d). Pro: 3600 to 7776000 (1h–90d) |
noBranding | boolean | No | Hide "Created with Table Share" footer PRO |
noHeaders | boolean | No | Treat first row as data, not headers |
{
"id": "a1b2c3d4",
"url": "https://table-share.org/t/a1b2c3d4",
"passwordProtected": false
}
curl -X POST https://table-share.org/api/create \
-H "Content-Type: application/json" \
-d '{
"apiKey": "ts_live_xxxxxxxxxxxxxxxxxxxxxxxx",
"title": "Q2 Sales Report",
"expiry": 2592000,
"data": [
["Region", "Revenue", "Growth"],
["NA", "$1.2M", "+12%"],
["EU", "$890K", "+8%"],
["APAC", "$540K", "+22%"]
]
}'
Server-side fetches a CSV/TSV from a public URL and turns it into a table. Pro key required.
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | HTTPS URL returning CSV/TSV text |
apiKey | string | Yes | Pro API key |
title | string | No | Optional title (max 100 chars) |
password | string | No | Password protection |
expiry | number | No | Seconds until expiry (3600–7776000) |
noBranding | boolean | No | Hide footer branding |
noHeaders | boolean | No | Treat first row as data |
curl -X POST https://table-share.org/api/fetch-url \
-H "Content-Type: application/json" \
-d '{
"apiKey": "ts_live_xxxxxxxxxxxxxxxxxxxxxxxx",
"url": "https://example.com/data.csv",
"title": "Live CSV snapshot"
}'
Public endpoint. Returns the lifetime count of tables created.
curl https://table-share.org/api/stats
// → { "total": 53 }
| Status | Meaning | Common cause |
|---|---|---|
400 | Bad request | Invalid data shape, oversized payload, malicious content, exceeded tier limits |
401 | Unauthorized | Invalid or expired API key on a Pro-only endpoint |
403 | Forbidden | Free tier attempting a Pro feature (password, long expiry, branding removal) |
429 | Rate limited | More than 5 creates per minute from a single IP. Pro: higher limit. |
500 | Server error | Transient. Retry with exponential backoff. |
{ "error": "Human-readable message" }
| Limit | Free | Pro ($5 one-time) |
|---|---|---|
| Max rows | 500 | 5,000 |
| Max columns | 50 | 100 |
| Max payload | 5 MB | 5 MB |
| Expiry | 7 days (fixed) | 1 hour – 90 days |
| Password protection | — | ✓ |
| Remove branding | — | ✓ |
| URL fetch | — | ✓ |
import requests
API_KEY = "ts_live_xxxxxxxxxxxxxxxxxxxxxxxx"
resp = requests.post(
"https://table-share.org/api/create",
json={
"apiKey": API_KEY,
"title": "Q2 Sales",
"expiry": 2592000, # 30 days
"data": [
["Region", "Revenue"],
["NA", "$1.2M"],
["EU", "$890K"],
]
},
timeout=10
)
resp.raise_for_status()
print(resp.json()["url"])
const API_KEY = "ts_live_xxxxxxxxxxxxxxxxxxxxxxxx";
const r = await fetch("https://table-share.org/api/create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
apiKey: API_KEY,
title: "Q2 Sales",
expiry: 2592000,
data: [
["Region", "Revenue"],
["NA", "$1.2M"],
["EU", "$890K"],
]
})
});
if (!r.ok) throw new Error('HTTP ' + r.status);
const { url } = await r.json();
console.log(url);
cat data.csv | python -c "
import sys, json, csv, requests
rows = list(csv.reader(sys.stdin))
r = requests.post('https://table-share.org/api/create',
json={'apiKey': 'ts_live_xxxxxxxxxxxxxxxxxxxxxxxx', 'data': rows})
print(r.json()['url'])
"