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

  1. Go to Settings → API Keys.
  2. Enter a descriptive name (e.g., "ERP", "Betty's AI agent Sam").
  3. Choose an access level (see below).
  4. 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:

LevelAllowed
ViewerRead-only: list and read forms, records, boards, comments, files, history.
EditorViewer + create/update records, add and move kanban cards, comment, attach files.
AdminEditor + 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.

!
The key is shown only once. After you close the dialog, it cannot be retrieved. If you lose a key, revoke it and create a new one.

Key limits per plan

Plan API keys allowed
Free1
Starter3
Team10

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...
i
Naming note: forms are called 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

GET/entities
GET/entities/:entityId

Records

GET/entities/:entityId/records
GET/records/:recordId
GET/records/recent
POST/entities/:entityId/records

Public submission (no auth required)

POST/public/submit/:entityId

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
401Missing or invalid API key
402Plan limit reached (records, submissions, or forms)
403Insufficient permissions for this action
404Form or record not found
409Submission aborted by a pre-event webhook — check the details field
429Rate 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.

i
For AI agent use cases, see AI agents & MCP. AI agents can use the REST API with an API key today; a hosted MCP server is launching soon.