API keys
An API key turns Snapi into a backend for anything you run: your ERP posts purchase orders straight onto a board, an AI agent triages overnight submissions before your team wakes up, a nightly script syncs records to your data warehouse. Each key is scoped to your organization, works from any language or tool that can make an HTTP request, and starts with the snapi_ prefix.
Creating an API key
- Go to Settings → API Keys.
- Enter a descriptive name (e.g., "ERP", "Betty's AI agent Sam").
- Choose an access level (see below).
- Click Create. The key is displayed once — copy it immediately.
Create one key per system that connects — your n8n instance, each AI agent, the CRM sync, the warehouse label printer. Named keys mean that when Betty's agent misbehaves, you revoke Sam without taking down everything else.
Access levels
Every key carries an access level that caps what it can do — over the REST API and for AI agents via MCP alike:
| Level | Allowed |
|---|---|
| Viewer | Read-only: list and read forms, records, boards, comments, files, history. |
| Editor | Viewer + create/update records, add and move kanban cards, comment, attach files. |
| Admin | Editor + create/edit/delete forms and boards, delete records. |
Give an agent the lowest level that does the job: a reporting bot gets Viewer, a triage agent Editor, and only a workspace-builder agent needs Admin. Exceeding the level returns 403 with the required role in the message.
Key limits per plan
| Plan | API keys allowed |
|---|---|
| Free | 1 |
| Starter | 3 |
| Team | 10 |
Authenticating with a key
Pass the key as a Bearer token in the Authorization header (an X-API-Key header also works):
GET /api/v1/entities
Host: api.snapi.ca
Authorization: Bearer snapi_abc123...
entities in the API for backwards compatibility — the endpoints below use /entities paths.Example with curl:
curl https://api.snapi.ca/api/v1/entities \
-H "Authorization: Bearer snapi_abc123..."
Example with fetch:
const res = await fetch('https://api.snapi.ca/api/v1/entities', {
headers: { 'Authorization': 'Bearer snapi_abc123...' }
});
const entities = await res.json(); // array of forms
REST API endpoints
Base URL: https://api.snapi.ca/api/v1
Forms
Records
Public submission (no auth required)
Public submissions are rate-limited to 30 per minute per IP.
Other endpoints — creating or editing forms, updating and deleting records, Kanban boards, files, and comments — currently require a signed-in user session and are not available with API keys.
Listing records
The records list endpoint supports search, sorting, and pagination:
GET /api/v1/entities/:entityId/records
?search=alice
&sort=created_desc
&page=1
&limit=50
search matches against the record title and data. sort accepts created_desc (default), created_asc, updated_desc, title_asc, or title_desc. limit is capped at 100. The response contains data, total, page, per_page, and pages.
Creating a record
POST /api/v1/entities/ent_abc123/records
Content-Type: application/json
Authorization: Bearer snapi_...
{
"name": "Alice Johnson",
"email": "alice@example.com",
"status": "new"
}
Response (201 Created):
{
"id": "rec_9d3f1e",
"entity_id": "ent_abc123",
"title": "Alice Johnson",
"data": {
"name": "Alice Johnson",
"email": "alice@example.com",
"status": "new"
},
"created_at": "2026-07-03T14:22:31.000Z",
"updated_at": "2026-07-03T14:22:31.000Z"
}
Error responses
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 402 | Plan limit reached (records, submissions, or forms) |
| 403 | Insufficient permissions for this action |
| 404 | Form or record not found |
| 409 | Submission aborted by a pre-event webhook — check the details field |
| 429 | Rate limit exceeded (API: 100 requests per 5 seconds; public submissions: 30 per minute per IP) |
All errors return a JSON body with an error message. Plan-limit (402) errors also include resource, limit, and current.
Revoking a key
Go to Settings → API Keys and click Revoke next to the key. Revocation is immediate — all requests using that key will return 401 from that moment.