Everything in your workspace, over HTTP.
UPDATED 2026-10-15 · BASE URL https://api.aitizer.com
Two doors into the same workspace: a REST API for your software and an MCP server for AI tools (Claude Code, Cursor, Codex, your own agents). Both use the same Bearer token, the same per-table permissions and the same data engine: every write runs the table's computed columns (formulas, HTTP calls, AI columns, record operations) on the server before it answers.
1. Authentication & tokens
In the app open MCP & API, create an MCP Server (it is just a named permission set), grant it tables and generate a token. Send it on every call:
Authorization: Bearer YOUR_TOKEN
| Token type | Works on | Notes |
|---|---|---|
| rest_api | REST | For your backend. Permissions per table on its MCP server. Tables it creates are granted to it automatically. |
| user_mcp | MCP | For AI tools. Same per-table permissions. Refused on REST (403 WRONG_PROTOCOL). |
| vibe_mcp | REST + MCP | The workspace's Vibe Builder credential: sees every table, all 54 tools. Admin only. Do not ship it to end users. |
Tokens can have an expiry, are shown once, and can be rotated or revoked. Every call is logged under Usage. Never put a token in a browser bundle: for browser apps use app users (SDK: db.auth) behind the Vibe relay, or your own backend.
2. Data model in 60 seconds
- A workspace is the tenant. A token belongs to exactly one workspace.
- A table has an
idand aname. You can address it by either in the SDK; the REST paths use the id. - A record is
{ id, fields, created_at, updated_at }.fieldsis keyed by column name. Select columns store and return the option id (you may write the label or the id; filters accept either), relations return the related id (or an embedded record when you ask for it), files return URLs. - Computed columns (formula, http_request, action, json_parser, ai_agent, create/update/delete/fetch_record, loop, delay) are never written by you; the server runs them when a record is created or edited and writes the result.
3. Tables
| Method | Path | Body / result |
|---|---|---|
| GET | /functions/v1/rest-api/tables | Tables the token can see: [{id, name, icon, created_at, updated_at}] |
| POST | /functions/v1/rest-api/tables | { "name": "Clients", "icon": "Users", "columns": [{ "name": "Email", "type": "text", "required": true }] }. Creates the physical table with the system columns and grants the token full access. Returns the table with its columns. |
| DELETE | /functions/v1/rest-api/tables/{id} | Drops the table and every record. Irreversible. |
curl -X POST https://api.aitizer.com/functions/v1/rest-api/tables \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"Cases","icon":"Scale","columns":[
{"name":"Title","type":"text","required":true},
{"name":"Client","type":"text"},
{"name":"Status","type":"single_select","options":[{"id":"open","label":"Open","color":"blue"},{"id":"won","label":"Won","color":"green"}]},
{"name":"Value","type":"number"},
{"name":"Deadline","type":"date"}]}'
4. Columns & column types
| Method | Path | Body |
|---|---|---|
| GET | /tables/{id}/columns[/{colId}] | Columns with id, name, type, required, options, position, computed, relation_table, relation_label_column. |
| POST | /tables/{id}/columns | { "name", "type", "required"?, "options"? , "formula"?, "relation_table_id"?, "relation_source_column_id"? } |
| PATCH | /tables/{id}/columns/{colId} | Any subset of the same fields (rename, change options, edit a formula). |
| DELETE | /tables/{id}/columns/{colId} | Removes the column and its values. |
Types. Data: text, number, date, checkbox, single_select, multi_select (options are [{id, label, color}]; colors red, orange, amber, green, teal, blue, indigo, purple, pink, gray), relation (needs relation_table_id and relation_source_column_id), file. Computed: formula (Excel-like SUM(), IF(), CONCAT(), DATEDIFF()… or JavaScript), http_request, action (a Special Field integration, 240 services), json_parser, ai_agent, create_record, update_record, delete_record, fetch_records, loop, delay. The live catalogue, including the integrations installed in your workspace, is the MCP tool check_column_types. Use the key type (alias column_type).
5. Records: read, filter, sort, embed
GET /functions/v1/rest-api/tables/{id}/records # list (default 100, max 1000 per page)
GET /functions/v1/rest-api/tables/{id}/records/{recordId} # one record
Filters are query parameters named after the column, PostgREST style. Filtering happens in the database, so a record outside the current page is still found and count is exact.
| Operator | Example | Meaning |
|---|---|---|
| eq / neq | ?Status=eq.Open | equals / not equals (select columns accept the label or the option id) |
| gt gte lt lte | ?Value=gte.1000 | numeric and date comparisons |
| like / ilike | ?Title=ilike.*contract* | pattern match (* or % as wildcard, ilike is case-insensitive) |
| in | ?Status=in.(Open,Won) | any of (up to 200 values) |
| cs | ?Tags=cs.{urgent,vip} | multi_select contains all |
| is | ?Deadline=is.null · ?Paid=is.true | null / boolean |
| not.<op> | ?Status=not.eq.Won | negation of any operator |
Several parameters combine with AND. The older form filter[Field][op]=value still works and can be mixed in.
| Parameter | Example | Meaning |
|---|---|---|
| order | order=Deadline.asc,Value.desc (or sort=-Value) | any column, system columns included |
| limit / offset | limit=50&offset=100 | paging |
| select | select=Title,Value | only these fields |
| select with relation | select=Title,Client(Name,Email) or expand=Client | embed the related record instead of its id (needs read permission on the related table) |
| header Prefer: count=exact | adds X-Total-Count and Content-Range to the response |
curl "https://api.aitizer.com/functions/v1/rest-api/tables/482/records?Status=eq.Open&Value=gte.1000&order=Deadline.asc&limit=20&select=Title,Value,Client(Name)" \
-H "Authorization: Bearer $TOKEN" -H "Prefer: count=exact"
6. Records: create, update, delete, batch
| Method | Path | Body |
|---|---|---|
| POST | /tables/{id}/records | { "fields": { "Title": "Smith vs. Jones", "Status": "Open", "Value": 12000 } }. Required columns are enforced. Computed columns run before the answer; add ?run_pipeline=false to skip them. Returns the record. |
| PATCH | /tables/{id}/records/{recordId} | { "fields": { "Status": "Won" } }. Partial: only the keys you send change. Edit-triggered computed columns run. |
| DELETE | /tables/{id}/records/{recordId} | Returns { id, deleted: true }. |
| POST | /tables/{id}/records/batch | { "rows": [ {fields…}, … ], "run_pipeline": true }. Up to 500 rows per call; returns one result per row (created record or error) without aborting the batch. |
Writing by filter (update or delete every record that matches) is a client-side convenience in the SDK: it resolves the ids and sends one request per record, 8 in parallel.
7. Running computed columns
| Method | Path | Use |
|---|---|---|
| POST | /tables/{id}/records/{rid}/run | { "mode": "edit" | "create", "changed_columns": ["Status"] }. Re-runs the record's pipeline as if those columns had changed. |
| POST | /tables/{id}/records/{rid}/compute/{Column name} | Re-runs exactly one computed column and returns the new value. Nothing else runs. |
| POST | /tables/{id}/run-actions | { "record_ids": [1,2,3] } or { "filters": [...] }, optional "column_ids". Bulk run over many records (the same engine schedules use). |
Each pipeline has a time and step budget set by your plan (10 s to 10 min per row). HTTP steps go through the platform proxy with your stored credentials, so secrets never leave the server.
8. SQL (read-only)
curl -X POST https://api.aitizer.com/functions/v1/rest-api/sql \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"query": "SELECT Title, Value FROM Cases WHERE Status = '"'"'Open'"'"' AND Value > 1000 ORDER BY Deadline LIMIT 20"}'
Grammar: SELECT (* | COUNT(*) | fields) FROM table [WHERE cond [AND cond]…] [ORDER BY f [ASC|DESC], …] [LIMIT n] [OFFSET m], with =, !=, <>, >, <, >=, <=, [NOT] LIKE, [NOT] IN (…), IS [NOT] NULL. Table and column names are the human names. It runs in a read-only transaction scoped to your workspace, with a timeout from your plan (5 to 30 s). Returns { rows, total, table, limit, offset } or { count }.
9. Schema, views & agents
| Method | Path | Result |
|---|---|---|
| GET | /schema | The whole workspace in one call: tables with columns (types, options, relations, computed flag) and the token's access per table, plus the AI agents and their public chat channels. Cache it; it is what Vibe apps generate schema.ts from. |
| GET / POST / DELETE | /tables/{id}/views[/{viewId}] | Saved views (grid, kanban, gallery, calendar, timeline, form, custom). POST body { name, view_type, config }. |
| GET | /agents | AI agents of the workspace with their web channel tokens, so your software can open or embed a chat. |
| GET | /special-fields/groups, /special-fields/groups/{id}/requests | Integration catalogue available to action columns. |
Agent chat from your software: POST /functions/v1/agent-webhook?type=web&token={public_token} with { "message": "…", "session_id": "…" }; add "stream": true or Accept: text/event-stream for token-by-token SSE.
10. JavaScript SDK (aitizer.sdk)
Zero dependencies, ESM, browsers, Node 18+, Deno, Bun. Supabase-style builder on top of the REST API above. Load it from the API or install npm i aitizer.sdk.
import { createClient } from 'https://api.aitizer.com/sdk/aitizer.js'
const db = createClient('https://api.aitizer.com', process.env.AITIZER_TOKEN)
// read
const { data, error, count } = await db.from('Cases')
.select('*, Client(Name, Email)', { count: 'exact' })
.eq('Status', 'Open').gte('Value', 1000).ilike('Title', '%contract%')
.order('Deadline').range(0, 19)
// write (computed columns run on the server)
await db.from('Cases').insert({ Title: 'Smith vs. Jones', Status: 'Open', Value: 12000 })
await db.from('Cases').update({ Status: 'Won' }).eq('id', 42)
await db.from('Cases').delete().eq('Status', 'Archived') // by filter: resolves ids, 8 in parallel
const one = await db.from('Cases').select('*').eq('id', 42).single()
// SQL, schema, compute
const { data: rows } = await db.sql("SELECT Title FROM Cases WHERE Value > 1000 LIMIT 10")
await db.tables(); await db.columns('Cases'); await db.compute('Cases', 42, 'Risk score')
// app users (e-mail + password accounts stored in the app's Users table)
await db.auth.signUp({ email, password }); await db.auth.signInWithPassword({ email, password })
Rows come back flat ({ id, created_at, updated_at, ...fields }); pass { flatten: false } for the raw shape. Every call resolves to { data, error, count, status } and never throws. Types: aitizer.d.ts.
11. MCP server
Endpoint https://api.aitizer.com/functions/v1/mcp-server (Streamable HTTP, spec 2025-06-18). Claude Code, Cursor and Codex connect directly, no bridge. The live tool list is GET https://api.aitizer.com/functions/v1/mcp-server/tools; every token gets check_column_types, list_tables, list_columns, list_records, get_record, create_record, update_record, delete_record, compute_cell, list_views, semantic_search, sql_query, and the Vibe Builder credential gets the 42 management tools (tables, columns, views, schedules, agents, channels, publishing). Setup snippets for each client are in the documentation.
claude mcp add --transport http aitizer https://api.aitizer.com/functions/v1/mcp-server \
--header "Authorization: Bearer $AITIZER_MCP_TOKEN"
12. Errors, limits & quotas
Errors are JSON: { "error": "message", "code": "CODE" }. Plan limits add "upgrade": true.
| Status | Code | Meaning |
|---|---|---|
| 401 | UNAUTHORIZED | missing, expired or revoked token |
| 403 | FORBIDDEN · WRONG_PROTOCOL · PLAN_READ_ONLY | no permission on the table, wrong token type, or a plan that only allows reads |
| 404 | table, column or record not found (also returned for records you cannot read) | |
| 400 | validation: missing required column, unknown operator, bad option id, batch too large | |
| 402 | PLAN_LIMIT_* | monthly quota of the plan used up (API requests, automation runs, builds, tables, storage…) |
| 429 | PLAN_RATE_LIMIT_API | requests per minute of the plan for this workspace; the Retry-After header says when to retry |
| Limit | Free | Starter | Pro | Business | Enterprise |
|---|---|---|---|---|---|
| API requests / minute (workspace) | 60 | 600 | 3,000 | 10,000 | unlimited |
| API requests / month | 10,000 | 100,000 | 1,000,000 | unlimited | unlimited |
| Pipeline budget per row | 10 s | 30 s | 120 s | 300 s | 600 s |
| SQL timeout | 5 s | 5 s | 10 s | 30 s | 30 s |
| Rows per page / per batch | 1,000 / 500 on every plan · 3,000 requests per minute per token as an anti-leak ceiling | ||||
Past a monthly quota, Pro and above can pay the extra in AI credits when auto-recharge is on; otherwise the call returns 402 until the next month. Usage and limits are live in the app under Billing & usage. Full table on pricing.
Something missing? Write to hi@aitizer.com. This page is maintained with the API: when a route changes, this changes.