The Kirality API.
Pull your workspace data into Zapier, Make, custom scripts, or any HTTP client. Bearer-key auth, scoped access, JSON everywhere.
Authentication
Every request requires an Authorization header containing an
API key generated inside Kirality.
Authorization: Bearer kir_<your-key>
Generate keys under System → API Keys. The full key is shown once at creation — copy it immediately.
Scopes
| Scope | Description |
|---|---|
read:kanban | Read kanban items |
read:crm | Read CRM deals and contacts |
read:okr | Read objectives and key results |
read:hiring | Read hiring candidates |
read:activity | Read activity events |
write:activity | Push activity events into Kirality |
admin | Grants all scopes; required for webhook test fire |
Endpoints
/api/v1/kanban scope read:kanban{ "data": [{ "id": "...", "title": "Ship v2", "status": "todo", ... }] }/api/v1/crm/deals scope read:crm?stage=qualified{ "data": [{ "id": "...", "name": "Acme Co", "stage": "qualified", "amount": 5000 }] }/api/v1/crm/contacts scope read:crm{ "data": [{ "id": "...", "name": "Jane Doe", "email": "jane@acme.co" }] }/api/v1/okr scope read:okr{ "data": [{ "id": "...", "objective": "Grow ARR", "key_results": [...] }] }/api/v1/candidates scope read:hiring?stage=interview{ "data": [{ "id": "...", "name": "Pat Smith", "stage": "interview" }] }/api/v1/activity scope read:activity?limit=50{ "data": [{ "id": "...", "event_type": "deal.won", "created_at": "..." }] }/api/v1/activity scope write:activitybody: { event_type, description?, metadata? }{ "data": { "id": "...", "event_type": "external.sync_done" } }/api/v1/webhooks/test scope adminbody: { webhook_id?, event?, payload? }{ "data": { "event": "test.fired", "deliveries": [{ "status": 200 }] } }Quick example
curl -H "Authorization: Bearer kir_xxx" https://kirality.com/api/v1/kanban
Rate limits
100 requests per minute per API key, enforced across all /api/v1/* endpoints. The limit follows the key, not your IP —
every key gets its own budget.
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (Unix seconds when the window resets) so clients can self-throttle.
Exceeding the limit returns 429 with error code RATE_LIMITED and a Retry-After header (seconds).
Handle it by pausing until Retry-After elapses, then retrying —
ideally with exponential backoff rather than tight retry loops.
Errors
| Status | Meaning |
|---|---|
401 | Invalid, revoked, or expired API key |
403 | Key is valid but missing the required scope |
400 | Malformed request (missing fields, bad input) |
429 | Rate limit exceeded — wait for the Retry-After header, then retry |
500 | Server error |