API reference

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.

Contents
  1. Authentication & tokens
  2. Data model in 60 seconds
  3. Tables
  4. Columns & column types
  5. Records: read, filter, sort, embed
  6. Records: create, update, delete, batch
  7. Running computed columns
  8. SQL (read-only)
  9. Schema & views & agents
  10. JavaScript SDK (aitizer.sdk)
  11. MCP server
  12. Errors, limits & quotas

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 typeWorks onNotes
rest_apiRESTFor your backend. Permissions per table on its MCP server. Tables it creates are granted to it automatically.
user_mcpMCPFor AI tools. Same per-table permissions. Refused on REST (403 WRONG_PROTOCOL).
vibe_mcpREST + MCPThe 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

3. Tables

MethodPathBody / result
GET/functions/v1/rest-api/tablesTables 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

MethodPathBody
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.

OperatorExampleMeaning
eq / neq?Status=eq.Openequals / not equals (select columns accept the label or the option id)
gt gte lt lte?Value=gte.1000numeric 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.truenull / boolean
not.<op>?Status=not.eq.Wonnegation of any operator

Several parameters combine with AND. The older form filter[Field][op]=value still works and can be mixed in.

ParameterExampleMeaning
orderorder=Deadline.asc,Value.desc (or sort=-Value)any column, system columns included
limit / offsetlimit=50&offset=100paging
selectselect=Title,Valueonly these fields
select with relationselect=Title,Client(Name,Email) or expand=Clientembed the related record instead of its id (needs read permission on the related table)
header Prefer: count=exactadds 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

MethodPathBody
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

MethodPathUse
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

MethodPathResult
GET/schemaThe 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/agentsAI 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}/requestsIntegration 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.

StatusCodeMeaning
401UNAUTHORIZEDmissing, expired or revoked token
403FORBIDDEN · WRONG_PROTOCOL · PLAN_READ_ONLYno permission on the table, wrong token type, or a plan that only allows reads
404table, column or record not found (also returned for records you cannot read)
400validation: missing required column, unknown operator, bad option id, batch too large
402PLAN_LIMIT_*monthly quota of the plan used up (API requests, automation runs, builds, tables, storage…)
429PLAN_RATE_LIMIT_APIrequests per minute of the plan for this workspace; the Retry-After header says when to retry
LimitFreeStarterProBusinessEnterprise
API requests / minute (workspace)606003,00010,000unlimited
API requests / month10,000100,0001,000,000unlimitedunlimited
Pipeline budget per row10 s30 s120 s300 s600 s
SQL timeout5 s5 s10 s30 s30 s
Rows per page / per batch1,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.