Once tables exist in your schema, these endpoints are automatically available.
| Method | Path | Purpose |
|---|
| GET | /v1/{app_id}/{table} | List rows |
| GET | /v1/{app_id}/{table}/{id} | Read single row |
| POST | /v1/{app_id}/{table} | Create a row |
| PATCH | /v1/{app_id}/{table}/{id} | Update a row |
| DELETE | /v1/{app_id}/{table}/{id} | Delete a row |
Format: column=operator.value
| Operator | Example | SQL |
|---|
eq | status=eq.published | = 'published' |
neq | status=neq.draft | != 'draft' |
gt | age=gt.18 | > 18 |
gte | age=gte.18 | >= 18 |
lt | price=lt.100 | < 100 |
lte | price=lte.100 | <= 100 |
like | title=like.%hello% | LIKE '%hello%' |
ilike | title=ilike.%hello% | ILIKE '%hello%' |
is | deleted_at=is.null | IS NULL |
in | id=in.(1,2,3) | IN (1,2,3) |
fts | title=fts.hello | Full-text search |
?order=name.asc,created_at.desc
?select=id,title,created_at
| Auth method | Role | Access |
|---|
| None | butterbase_anon | Public data only |
| End-user JWT | butterbase_user | User-scoped data (RLS) |
API key (bb_sk_...) | butterbase_service | All data (bypasses RLS) |
Content-Type: application/json
Authorization: Bearer {token}
If the table has a user isolation policy with auto-populate trigger, the user_id column is filled automatically.
PATCH /v1/{app_id}/posts/{id}
Content-Type: application/json
Authorization: Bearer {token}
Only send columns you want to change.
DELETE /v1/{app_id}/posts/{id}
Authorization: Bearer {token}
| Method | Path | Purpose |
|---|
| GET | /v1/{app_id}/schema | Read current schema |
| POST | /v1/{app_id}/schema/apply | Apply schema update (dry_run: true to preview) |
| GET | /v1/{app_id}/migrations | List applied migrations |
| Method | Path | Purpose |
|---|
| GET | /apps | List your apps |
| POST | /init | Create a new app. Body: {"name": "my-app"} |
| DELETE | /apps/{app_id} | Delete an app permanently |