Teable is an open-source Airtable alternative built on PostgreSQL. Spreadsheet UI with database power — real SQL under the hood, full API access, and self-hosted.
Why Teable?
- PostgreSQL-backed: Real database, not a spreadsheet
- Airtable-like UI: Drag-and-drop, views, filters
- API-first: Full REST API for everything
- Self-hosted: Your data, your server
- Realtime: Collaborative editing
- 100K+ rows: Handles real data, not just demos
- Views: Grid, Kanban, Form, Gallery, Calendar
Self-Host
git clone https://github.com/teableio/teable.git
cd teable
docker compose up -d
API: List Records
curl https://your-teable.com/api/table/TABLE_ID/record \
-H 'Authorization: Bearer API_TOKEN' \
-G -d 'fieldKeyType=name'
API: Create Record
curl -X POST https://your-teable.com/api/table/TABLE_ID/record \
-H 'Authorization: Bearer API_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"records": [
{
"fields": {
"Name": "Alice Johnson",
"Email": "alice@example.com",
"Status": "Active",
"Score": 95
}
}
]
}'
API: Update Record
curl -X PATCH https://your-teable.com/api/table/TABLE_ID/record \
-H 'Authorization: Bearer API_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"records": [
{
"id": "rec_xxx",
"fields": {"Status": "Completed", "Score": 100}
}
]
}'
API: Query with Filters
curl https://your-teable.com/api/table/TABLE_ID/record \
-H 'Authorization: Bearer API_TOKEN' \
-G --data-urlencode 'filter={"conjunction":"and","filterSet":[{"fieldId":"fld_xxx","operator":"is","value":"Active"}]}' \
-d 'sort=[{"fieldId":"fld_yyy","order":"desc"}]' \
-d 'take=20'
API: Delete Record
curl -X DELETE https://your-teable.com/api/table/TABLE_ID/record/RECORD_ID \
-H 'Authorization: Bearer API_TOKEN'
JavaScript SDK
import { TeableSDK } from '@teable/sdk';
const teable = new TeableSDK({ baseUrl: 'https://your-teable.com', token: 'API_TOKEN' });
// List records
const records = await teable.record.getRecords({
tableId: 'tbl_xxx',
take: 50,
fieldKeyType: 'name',
});
// Create record
await teable.record.createRecords({
tableId: 'tbl_xxx',
records: [{ fields: { Name: 'Bob', Email: 'bob@example.com' } }],
});
Webhooks
curl -X POST https://your-teable.com/api/table/TABLE_ID/webhook \
-H 'Authorization: Bearer API_TOKEN' \
-d '{
"url": "https://your-app.com/webhook",
"events": ["record.created", "record.updated"]
}'
Real-World Use Case
A startup paid $240/year for Airtable Pro (5 users). They switched to self-hosted Teable — same spreadsheet UI, same API, but with real PostgreSQL queries. They can now join Teable data with their production database directly.
Need to automate data collection? Check out my Apify actors for ready-made scrapers, or email spinov001@gmail.com for custom solutions.
Top comments (0)