One workspace. Every endpoint.
The complete reference for the AITIZER REST API, MCP server, realtime channel and automation engine — the same surface our own app runs on.
Introduction
The AITIZER API is organized around REST. Every table, column, record, view, agent and action in your workspace is programmable — the same surface our own app, the Vibe Builder and your AI agents use.
All requests are served over HTTPS from your workspace’s base URL and accept / return JSON.
https://api.aitizer.comThree protocols are available on the same data: the REST API for classic integrations, a native MCP server (JSON-RPC 2.0) for AI agents and MCP clients like Claude, and a WebSocket realtime channel for live updates.
Authentication
Authenticate with a workspace-scoped token in the Authorization header. Tokens are created in your workspace and can also be sent as X-MCP-Token.
curl https://api.aitizer.com/functions/v1/rest-api/tables \
-H "Authorization: Bearer $AITIZER_TOKEN"Token types
| Field | Type | Description |
|---|---|---|
| rest_api | token | Full REST API access for integrations and your own backend. Cannot call the MCP protocol. |
| user_mcp | token | Restricted MCP token for end users and embedded agents — read/write records only; no schema or admin operations. |
| vibe_mcp | token | System token used by the Vibe Builder agent. Full tool access, created automatically per workspace. |
Per-table permissions
Every token carries an explicit permission grid per table — nothing is implicit:
| Field | Type | Description |
|---|---|---|
| can_read_all | boolean | Read every record in the table. |
| can_create | boolean | Insert new records. |
| can_edit | boolean | Update existing records. |
| can_delete | boolean | Delete records. |
Errors
AITIZER uses conventional HTTP status codes, and data-layer errors are returned in a predictable envelope so your client can branch on error.code.
{
"data": null,
"error": {
"message": "No rows found",
"code": "PGRST116"
}
}Status codes
| Field | Type | Description |
|---|---|---|
| 400 | http | Invalid request — missing or malformed fields. |
| 401 | http | Missing or invalid token. |
| 403 | http | Token is valid but lacks permission for this table or operation. |
| 404 | http | Resource not found. |
| 429 | http | Rate limited. |
| 500 | http | Something went wrong on our side. |
Credits & limits
AI work — LLM tokens, ElevenLabs voice characters, Whisper transcription and embeddings — is metered against your workspace wallet. Plain REST calls are not AI-metered.
Every call is also written to an audit log (api_usage_logs) with the endpoint, method, table, status code and token used — so you can attribute every byte of usage.
Tables
Tables are the core container. Creating one provisions a real Postgres table behind the scenes.
/functions/v1/rest-api/tablesList every table in the workspace your token can see.
/functions/v1/rest-api/tables| Field | Type | Description |
|---|---|---|
| name | string | REQUIRED Table display name. |
| icon | string | Lucide icon name, e.g. Users. |
| columns | array | Optional initial columns: { name, type, options? }. |
curl -X POST https://api.aitizer.com/functions/v1/rest-api/tables \
-H "Authorization: Bearer $AITIZER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Customers",
"icon": "Users",
"columns": [
{ "name": "Name", "type": "text" },
{ "name": "Email", "type": "text" },
{ "name": "Status", "type": "single_select",
"options": [ { "id": "active", "label": "Active", "color": "green" } ] }
]
}'{
"id": 123,
"name": "Customers",
"icon": "Users",
"pg_table_name": "data_123_456",
"created_at": "2026-06-11T12:00:00Z"
}/functions/v1/rest-api/tables/:idPermanently deletes the table and all of its data.
Columns
/functions/v1/rest-api/tables/:id/columns/functions/v1/rest-api/tables/:id/columns| Field | Type | Description |
|---|---|---|
| name | string | REQUIRED Column name — also usable as a {Tag} in formulas and actions. |
| type | string | REQUIRED One of the 22 column types — see Column types. |
| required | boolean | Reject empty values on create. |
| options | array | For selects: { id, label, color } items. |
| position | number | Order in the grid — also the execution order of action columns. |
/functions/v1/rest-api/tables/:id/columns/:colIdPartial update — send only the fields you want to change.
/functions/v1/rest-api/tables/:id/columns/:colIdRecords
/functions/v1/rest-api/tables/:id/recordsQuery parameters
| Field | Type | Description |
|---|---|---|
| limit | number | Max records to return. |
| offset | number | Pagination offset. |
| filter[Field] | query | Equality filter by column name, e.g. filter[Status]=active. |
| filter[Field][op] | query | Operator filter — eq, neq, contains, ncontains, gt, gte, lt, lte, empty, nempty. |
/functions/v1/rest-api/tables/:id/recordsCreating a record runs the table’s automation pipeline: formulas compute, action columns fire, embeddings update — the row executes itself.
curl -X POST https://api.aitizer.com/functions/v1/rest-api/tables/123/records \
-H "Authorization: Bearer $AITIZER_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "row_data": { "col_789": "ada@acme.com", "col_790": "active" } }'{
"id": 999,
"row_data": { "col_789": "ada@acme.com", "col_790": "active" },
"created_at": "2026-06-11T12:00:00Z",
"created_by": "user-uuid"
}/functions/v1/rest-api/tables/:id/records/:recordId/functions/v1/rest-api/tables/:id/records/:recordId/functions/v1/rest-api/tables/:id/records/:rid/compute/:colNameRecompute a single formula / computed column for one record — useful for previews and testing.
Views
Six view types render the same rows: grid, kanban, gallery, form, calendar and timeline (Gantt).
/functions/v1/rest-api/tables/:id/views/functions/v1/rest-api/tables/:id/views| Field | Type | Description |
|---|---|---|
| name | string | REQUIRED View display name. |
| view_type | string | REQUIRED grid · kanban · gallery · form · calendar · timeline |
| kanban_column_id | number | For kanban: the single-select column that defines the lanes. |
| filters | array | Saved filter conditions for the view. |
| form_config | object | For forms: field order, sections, visibility. |
/functions/v1/rest-api/tables/:id/views/:viewIdRun actions
Trigger action columns (HTTP, AI, cross-table operations) on demand for one or many records — the same engine the grid uses.
/functions/v1/rest-api/tables/:id/run-actions| Field | Type | Description |
|---|---|---|
| record_ids | number[] | REQUIRED Records to run the pipeline on. |
| column_ids | number[] | Restrict to specific action columns; omit to run all. |
| mode | string | sequential (default) or parallel. |
{
"results": [
{ "record_id": 999, "column_id": 456, "success": true, "result": "..." }
]
}Column types
22 column types in three families. Data columns store, computed columns derive, action columns execute.
Data
textPlain or rich-text Markdown.numberInteger or float values.checkboxBoolean toggle.dateISO 8601 date or datetime.fileMulti-file attachments with thumbnails.single_selectOne option, colored badges.multi_selectMany options at once.user_referenceOne or more workspace users.relationLink rows to another table.Computed
formulaExpression or full JavaScript, with {Column} refs.rollupAggregate related rows: sum, avg, min, max, count, concat.json_parserExtract a value from JSON by path, e.g. items[0].price.Actions
http_requestCall any API — method, headers, auth, templated body.actionRun a catalog integration (Stripe, Slack, OpenAI…).ai_agentRun an AI agent on the row, with memory.create_recordInsert a row into another table with field mappings.update_recordUpdate matching rows in any table by filter.delete_recordDelete matching rows by filter.fetch_recordsQuery another table; result stored as JSON.loopIterate an array — downstream columns run once per item.delayPause the pipeline (rate-limit friendly).Example — an AI column
{
"name": "Analyze with AI",
"type": "ai_agent",
"agentId": 7,
"prompt": "Score this lead from 0-100 and explain why:\n{Feedback}",
"executeOnCreate": true,
"executeOnEdit": false
}Example — a rollup
{
"name": "Total Spent",
"type": "rollup",
"rollupRelationColumnId": "col_orders",
"rollupTargetColumnId": "col_amount",
"rollupAggregator": "sum"
}Template tags
Anywhere an action takes text — URLs, bodies, prompts, field mappings — you can reference the current row with tags. Tags resolve at execution time.
| Field | Type | Description |
|---|---|---|
| {Column Name} | tag | The row’s value for that column. |
| {$item} | tag | Inside a loop: the current array item (JSON). |
| {$item.field} | tag | A property of the current loop item. |
| {$index} | tag | The current loop index, starting at 0. |
POST https://api.example.com/process?id={$item.id}
Body: { "name": "{Name}", "amount": {Amount} }Execution model
Action columns execute in position order, left to right — the grid is the pipeline.
| Field | Type | Description |
|---|---|---|
| executeOnCreate | boolean | Run when a row is created. |
| executeOnEdit | boolean | Re-run when any cell on the row changes. |
| conditions | array | Gate execution: only run when all conditions match (equals, contains, gt, is_empty…). |
Safety
Circular dependencies between columns are detected and blocked — a formula cannot reference itself, and loops cannot nest loops. Every execution is logged per record and column, and you can test on a sample row from the UI before going live.
Integrations
27 ready integrations ship as action catalogs — each exposes typed actions you map to your columns. The list is unlimited: any HTTP endpoint can be registered as a custom action.
AIOpenAI · Anthropic · Gemini · ElevenLabs · TavilyPaymentsStripe · Mercado Pago · AsaasMessagingWhatsApp Cloud · Telegram · Slack · Discord · Meta GraphEmailResend · SendGrid · BrevoCRM & toolsHubSpot · Notion · ClickUp · Trello · Airtable · Google Sheets · ShopifyDev & dataGitHub · Linear · Hostinger · OpenWeather · custom HTTPCredential modes
| Field | Type | Description |
|---|---|---|
| admin_credential | mode | Key stored at workspace level by an admin; editors just pick it. Secrets never touch the client. |
| editor_credential | mode | Entered in the column config, encrypted server-side (pgcrypto), returned only as set: true. |
| platform_llm | mode | AITIZER injects the platform LLM key — zero setup for white-label end users. |
AI Agents
An agent is a configured LLM with memory, tools, knowledge, a voice and explicit permissions over your tables.
| Field | Type | Description |
|---|---|---|
| name | string | REQUIRED Agent display name. |
| system_prompt | string | REQUIRED The agent’s instructions. Every change is versioned with diff & restore. |
| llm_provider | string | REQUIRED openai · anthropic · google |
| llm_model | string | REQUIRED e.g. gpt-4o, claude-sonnet-4, gemini-2.5-pro. |
| temperature | number | 0.0 — 1.0. |
| audio_response | boolean | Reply with ElevenLabs voice audio. |
| voice_id | string | ElevenLabs voice (80+ voices in EN, PT-BR, ES, multilingual). |
| interpret_images | boolean | Enable vision — the agent reads images users send. |
| mcp_server_id | number | Which MCP server (and therefore which table permissions) the agent uses. |
Agent channels
One agent, four channels: web iframe, web embed, WhatsApp Cloud and Telegram. All hit the same webhook.
/functions/v1/agent-webhook?type=web&agent_id=:id{
"session_id": "web_3f1c...",
"message": "I want a quote for 50 seats"
}{
"reply": "Great - what company are you with?",
"session_id": "web_3f1c...",
"audio_response": "<base64 mp3, if voice is on>",
"tool_calls": []
}WhatsApp (type=whatsapp) handles Meta’s verification handshake and message payloads; Telegram (type=telegram) auto-registers its webhook and supports text, voice notes (transcribed with Whisper) and photos (vision). Sessions are persistent per user: wa_<phone>, tg_<chat>, web_<uuid>, with the last 20 messages as memory.
Intake / lead capture
Intake fields make the agent collect data before the conversation starts — and it will not move on until every required field is answered and valid.
| Field | Type | Description |
|---|---|---|
| label | string | REQUIRED Internal field name, e.g. "Customer Name". |
| prompt_question | string | REQUIRED What the agent asks, e.g. "What’s your name?". |
| validation_regex | string | Server-side validation; invalid answers are re-asked. |
| required | boolean | Re-ask while empty. Default true. |
| target_table_id | number | Table that receives the collected lead. |
| target_column_id | number | Column the answer is written to. |
When the last field is collected the lead row is created automatically — then the normal conversation begins.
Knowledge & tools
Knowledge base
Attach Markdown documents to an agent (inline or uploaded). They are injected into the system prompt as reference material, with a smart budget so context never explodes.
Custom tools
Give an agent typed tools the LLM can call — three kinds:
| Field | Type | Description |
|---|---|---|
| special_field | kind | Bridge to a catalog integration action (e.g. "Charge customer" via Stripe). |
| mcp | kind | A curated AITIZER MCP tool: read/write records, run SQL, inspect schema. |
| http | kind | Any endpoint: method, URL, headers, templated body, JSON-Schema input. |
{
"name": "create_ticket",
"description": "Open a support ticket for the current customer",
"kind": "http",
"http_config": {
"method": "POST",
"url": "https://api.example.com/tickets",
"body": "{ \"subject\": \"{subject}\", \"priority\": \"{priority}\" }"
},
"input_schema_json": {
"type": "object",
"properties": {
"subject": { "type": "string" },
"priority": { "type": "string", "enum": ["low", "high"] }
},
"required": ["subject"]
}
}Voice
Agents speak with ElevenLabs (eleven_multilingual_v2) and listen with Whisper. Voice replies return as MP3 alongside the text; voice notes on Telegram are transcribed automatically.
/functions/v1/agent-tts-preview| Field | Type | Description |
|---|---|---|
| voiceId | string | REQUIRED ElevenLabs voice ID. |
| text | string | REQUIRED Text to synthesize. |
| workspaceId | number | REQUIRED Workspace whose key and wallet are used. |
Returns binary audio/mpeg. Characters are metered against the workspace wallet.
Vectorization
Enable the vectorizer on any table and every record is embedded automatically — on create, on update, removed on delete. No external vector DB to run: embeddings live in Postgres (pgvector, 1536 dims).
/functions/v1/vectorize| Field | Type | Description |
|---|---|---|
| action | string | REQUIRED sync_table · vectorize_record · search · delete_embedding |
| table_id | number | REQUIRED Which table. |
| record_id | number | For single-record actions. |
| query | string | For search: the natural-language query. |
| limit | number | Top-K results for search (default 10). |
Models: text-embedding-3-small (default), text-embedding-3-large, ada-002 — selectable per table.
Semantic search
curl -X POST https://api.aitizer.com/functions/v1/vectorize \
-H "Authorization: Bearer $AITIZER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"action": "search",
"table_id": 123,
"query": "unhappy enterprise customers asking for refunds",
"limit": 5
}'{
"results": [
{
"record_id": 412,
"content_text": "Name: Acme Corp\nPlan: Enterprise\nLast note: requested refund...",
"similarity": 0.89
}
],
"tokens_used": 12
}Under the hood this is a cosine-similarity match (match_embeddings) over your table’s vectors — RAG without the plumbing.
Realtime
Subscribe to row-level changes over WebSocket — a LISTEN/NOTIFY bridge straight from Postgres.
wss://api.aitizer.com/realtime{
"type": "subscribe",
"subId": "sub-1",
"table": "app_tables",
"event": "*",
"filter": "workspace_id=eq.456"
}{
"type": "change",
"subId": "sub-1",
"payload": {
"eventType": "INSERT",
"new": { "id": 123, "name": "New Table" },
"old": null
}
}Storage
Workspace file storage with public and authenticated buckets (branding-assets, agent-avatars, attachments…).
/storage/v1/object/:bucket/:pathUpload binary or multipart. Returns the storage key and a public URL.
/storage/v1/object/public/:bucket/:path/storage/v1/object/authenticated/:bucket/:path/storage/v1/object/list/:bucket/storage/v1/object/:bucket/:pathMCP server
AITIZER ships a native MCP server — the open protocol that lets AI agents (ours, yours, or Claude itself) act on your workspace with real, scoped permissions.
/functions/v1/mcp-serverJSON-RPC 2.0. Authenticate with Authorization: Bearer or X-MCP-Token.
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "create_record",
"arguments": {
"table_id": 123,
"fields": { "Name": "Ada Lovelace", "Status": "Active" }
}
}
}Writes respect field-level AI control: columns flagged ai_populates: false are silently stripped — the model can never touch fields you own.
MCP tools
19 tools, named exactly as the server exposes them:
check_column_typesLive catalog of types, integrations and agents — call this first.list_tablesTables with this token’s permission per table.create_tableCreate a table (with optional columns).delete_tableDrop a table and its data.list_columnsColumns with ai_purpose hints.create_columnAdd a column of any type.update_columnChange a column’s config.delete_columnRemove a column.list_recordsRows with filters and paging.get_recordOne row by id.create_recordInsert — respects ai_populates.update_recordUpdate — respects ai_populates.delete_recordDelete a row.compute_cellRe-run a computed column on one row.list_viewsViews for a table.create_viewCreate grid/kanban/gallery/form views.list_special_field_groupsInstalled integrations.list_special_field_requestsActions inside an integration.sql_querySELECT with human-readable table and column names.user_mcp tokens see only the safe data subset (reads, record writes, sql_query, compute_cell); schema and admin tools require a full token.
Permissions
Roles
| Field | Type | Description |
|---|---|---|
| super_admin | role | Everything — members, billing, branding, integrations. |
| admin | role | Workspace management except super-admin accounts. |
| editor | role | Full data and schema work; no members or billing. |
| viewer | role | Read-only across tables and views. |
Row-level security
Every query runs through Postgres RLS policies (is_workspace_member, has_role) — isolation is enforced by the database, not by application code.
Field-level AI control
| Field | Type | Description |
|---|---|---|
| ai_populates | boolean | When false, AI writes to this column are silently dropped. The system or humans own it. |
| ai_purpose | string | A hint the model reads, e.g. "customer’s email, used for invoices". |
White-label
Each workspace carries its own brand — your clients (and their clients) see your product.
| Field | Type | Description |
|---|---|---|
| app_name | string | Product name shown across the app and login. |
| app_subtitle | string | Tagline. |
| logo_light_url / logo_dark_url | string | Brand logos per theme. |
| icon_light_url / icon_dark_url | string | App icons per theme. |
| favicon_url | string | Browser tab icon. |
| primary_color / secondary_color | string | HSL theme colors applied app-wide. |
| subdomain | string | your-brand.aitizer.app — branding resolves before login. |
| custom_domain | string | Bring your own domain. |
| public_registration | boolean | Let end users sign up without an invite. |
Combine with scoped rest_api / user_mcp tokens per client and per-table permission grids, and every client of yours gets an isolated, branded, API-ready workspace.
