Overview
The Org API v1 is the enterprise API for the orchestra operating layer. It is scoped to one organization and uses your workspace slug in the path.
Base path:
/api/org/v1/{slug}{slug} is your organization's workspace slug. Responses are JSON and return Cache-Control: no-store.
Authentication
Create an org API key in Settings -> API & webhooks. The secret is shown once, so store it securely.
Send it as a bearer token:
Authorization: Bearer abo_org_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxA key is bound to one organization. Requesting another organization's slug with your key returns 404.
Response envelope
Success:
{ "success": true, "data": { "id": "..." } }Error:
{
"success": false,
"error": {
"message": "...",
"code": "API_SCOPE_MISSING",
"details": {}
}
}List endpoints wrap items in a page object:
{
"success": true,
"data": {
"items": [],
"page": 1,
"limit": 50,
"total": 120,
"totalPages": 3
}
}Status codes
| Status | Meaning |
|---|---|
401 | Missing, malformed, invalid, or revoked key |
403 | Key lacks the endpoint's scope |
404 | Slug is not this key's org, or the resource is not in this org |
409 | Resource-booking time conflict |
422 | Validation error |
429 | Rate limit exceeded per key |
Scopes
| Scope | Grants |
|---|---|
org:read:operations | Productions, services, works, performance history, tours, reports metadata, org info |
org:read:personnel | Personnel roster names, role, and section. Emails are not exposed. |
org:read:resources | Resources, rooms, and instrument inventory. Serials and insured values are not exposed. |
org:write:contacts | Create and update address-book contacts |
org:write:bookings | Create and cancel resource bookings |
org:write:checklist | Create and complete production checklist items |
org:write:requests | Create member requests |
Read endpoints
| Method | Path | Scope | Notes |
|---|---|---|---|
| GET | / | org:read:operations | Organization info |
| GET | /productions | org:read:operations | Supports status, q, page, and limit |
| GET | /productions/{id} | org:read:operations | Includes its services |
| GET | /services | org:read:operations | Supports productionId, from, to, page, and limit |
| GET | /works | org:read:operations | Repertoire |
| GET | /members | org:read:personnel | Supports q, page, and limit; no emails |
| GET | /resources | org:read:resources | Rooms and resources |
| GET | /instruments | org:read:resources | No serials or insured values |
| GET | /tours | org:read:operations | Tours |
| GET | /reports | org:read:operations | Report metadata only; no row data |
| GET | /performance-history | org:read:operations | Supports search, composer, conductor, from, and to |
Write endpoints
| Method | Path | Scope | Body |
|---|---|---|---|
| POST | /contacts | org:write:contacts | { name, type, company?, email?, phone?, city?, country?, role?, notes?, tags? } |
| PATCH | /contacts/{id} | org:write:contacts | Full contact representation |
| POST | /resource-bookings | org:write:bookings | { resourceId, title, startAt, endAt, notes? } |
| PATCH | /resource-bookings/{id}/cancel | org:write:bookings | No body required |
| POST | /productions/{id}/checklist | org:write:checklist | { label } |
| PATCH | /productions/{id}/checklist/{itemId} | org:write:checklist | { done?: boolean } |
| POST | /member-requests | org:write:requests | { membershipId, type, subject, body?, startDate?, endDate? } |
The organization is always taken from your key. A foreign id in any write returns 404.
Webhooks
Register endpoints in Settings -> API & webhooks. Choose event types. A per-endpoint signing secret is shown once.
Each live attempt preserves the original Kalinklo signature and also carries the Standard Webhooks headers:
X-Kalinklo-Signature: sha256=<hex HMAC-SHA256 of the raw body using your signing secret>
webhook-id: <stable event id>
webhook-timestamp: <Unix attempt timestamp>
webhook-signature: v1,<base64 HMAC-SHA256>The standard signature covers webhook-id.webhook-timestamp.raw-body. The event id remains stable across retries; the timestamp and signature are refreshed for each attempt. Verify the exact raw request bytes before parsing JSON. Existing receivers may keep verifying X-Kalinklo-Signature while migrating to a Standard Webhooks verifier.
Payload shape:
{
"id": "evt_...",
"type": "production.created",
"createdAt": "2026-...",
"data": {}
}Event types:
production.createdproduction.updatedservice.updatedmember_request.createdmember_request.updatedresource_booking.createdresource_booking.cancelledtour.updatedreport.generatedchecklist_item.completedengagement.updated
Delivery status in v1
v1 records, signs (HMAC-SHA256), and delivers each webhook over outbound HTTPS. An egress worker runs every few minutes, retrying with backoff, recording each attempt's response status, and enforcing SSRF controls (private hosts blocked, DNS re-validated at connect time, redirects refused).
Each emitted event creates a signed delivery you can inspect in the delivery log, where every attempt shows its HTTP response status. The Send test button records a SIMULATED delivery without calling your endpoint — use it to preview the payload and signature. Real events are delivered live.
All currently emitted events:
production.createdproduction.updatedservice.updatedresource_booking.createdresource_booking.cancelledmember_request.createdmember_request.updatedtour.updatedreport.generatedchecklist_item.completedengagement.updated
Delivery is asynchronous and at-least-once. Deduplicate on the stable webhook-id or payload id, and return a successful status only after durably accepting the event.
Not included in v1
Org API v1 does not include dangerous writes such as deleting organizations or members, payroll mutation, contract signing, payments, real email sends, permission changes, API-key management through the API, OAuth2 app authorization, GraphQL, or engagement and financial API data.