API Documentation
Use the Pandai API to integrate with external services, AI agents, and automation tools. Authenticate using API keys for secure, scoped access.
Quick Start
1. Create API Key
Generate an API key from your account settings or via the API.
2. Authenticate
Include your API key in the X-API-Key header with each request.
3. Make Requests
Access workspaces, boards, items, and more via REST endpoints.
Authentication
All API requests require authentication using an API key. Include your key in one of these ways:
Option 1: X-API-Key Header (Recommended)
curl https://your-domain.com/api/v1/workspaces \
-H "X-API-Key: pk_live_your_api_key_here"Option 2: Bearer Token
curl https://your-domain.com/api/v1/workspaces \
-H "Authorization: Bearer pk_live_your_api_key_here"Scopes
API keys can be limited to specific scopes for security:
| Scope | Description |
|---|---|
| * | Full access (all permissions) |
| workspaces:read | List and view workspaces |
| workspaces:write | Create, update, delete workspaces |
| boards:read | List and view boards |
| boards:write | Create, update, delete boards |
| items:read | List and view items |
| items:write | Create, update, delete items |
| columns:read | List and view columns |
| columns:write | Create, update, delete columns |
API Key Management
Workspaces
Workspace Members
Member Roles
owner- Full control (only one per workspace)admin- Can manage members and settingseditor- Can edit boards and itemsviewer- Read-only access
Boards
Items
List and filter items. Supports filtering by column values, dates, and special filters.
Views
Manage board views (table, kanban, calendar, chart).
View Types
table- Spreadsheet-style table viewkanban- Kanban board with columnscalendar- Calendar view for date itemschart- Charts and analytics
Search
Global search across boards and items. Minimum 2 characters required.
Forms
Create intake forms linked to boards. Form submissions can create items automatically or require approval.
Submission Modes
auto- Creates item automaticallyreview- Requires approval before creating item
Columns
Comments / Updates
Activity / Audit Log
Fetch activity feed including audit logs and comments. Supports pagination and filtering.
Query Parameters
type- Filter type:all|items|boards|commentstable_name- Filter by table:items|boards|columns|invoicesrecord_id- Filter by specific record UUIDuser_ids- Comma-separated user UUIDslimit- Results per page (default: 50)offset- Pagination offset (default: 0)
Audit Actions
INSERT- Record createdUPDATE- Record modifiedDELETE- Record deleted
Email (Gmail Integration)
Send emails through connected Gmail accounts. First retrieve the available accounts, then send.
Invoices
Invoice Types
outgoing- Invoices you issueincoming- Bills you receivequote- Price quotes
Invoice Statuses
draft,sent,paidpending,overduecancelled,rejected
Column Types Reference
| Type | Value Format | Example |
|---|---|---|
| text | string | "Hello World" |
| number | number | 42 |
| status | option ID | "opt-done" |
| priority | option ID | "opt-high" |
| date | ISO date | "2024-12-14" |
| timeline | {start, end} | {"start": "2024-12-01", "end": "2024-12-31"} |
| person | user ID array | ["user-uuid"] |
| checkbox | boolean | true |
| progress | 0-100 | 75 |
| link | URL | "https://example.com" |
| "user@example.com" | ||
| phone | phone | "+1234567890" |
Code Examples
Python
import requests
BASE_URL = "https://your-domain.com/api/v1"
API_KEY = "pk_live_your_api_key_here"
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
# Get workspaces
workspaces = requests.get(f"{BASE_URL}/workspaces", headers=headers).json()
# Get boards
boards = requests.get(
f"{BASE_URL}/workspaces/{workspaces[0]['id']}/boards",
headers=headers
).json()
# Bulk create items
result = requests.post(
f"{BASE_URL}/boards/{boards[0]['id']}/items/bulk-create",
headers=headers,
json={
"items": [
{"values": {"col-name": f"Task {i}"}}
for i in range(1, 11)
]
}
).json()
print(f"Created {len(result['created'])} items")JavaScript / Node.js
const API_KEY = 'pk_live_your_api_key_here';
const BASE_URL = 'https://your-domain.com/api/v1';
const headers = {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
};
async function main() {
// Get workspaces
const workspaces = await fetch(`${BASE_URL}/workspaces`, { headers })
.then(r => r.json());
// Get boards
const boards = await fetch(
`${BASE_URL}/workspaces/${workspaces[0].id}/boards`,
{ headers }
).then(r => r.json());
// Bulk create items
const result = await fetch(
`${BASE_URL}/boards/${boards[0].id}/items/bulk-create`,
{
method: 'POST',
headers,
body: JSON.stringify({
items: Array.from({ length: 10 }, (_, i) => ({
values: { 'col-name': `Task ${i + 1}` }
}))
})
}
).then(r => r.json());
console.log(`Created ${result.created.length} items`);
}
main();