Skip to main content

Conventions

Formats​

JSON with snake_case fields; ids are UUIDs; times are ISO 8601 in UTC (2026-10-05T12:00:00Z), dates 2026-10-05. Values from a fixed list come as {"code": "in_progress", "name": "In Progress"}: the code never changes, the name follows Accept-Language (tr gives Turkish, anything else English).

Pages​

Lists answer {"data": [...], "next_cursor": "…"}. Ask for the next page with cursor=<next_cursor>; the last page has next_cursor: null. limit is 1–200 (default 50). Keep the other parameters the same while paging.

def every(path, token, **params):
"""every item of a list, page by page"""
cursor = None
while True:
query = {**params, "limit": 200, **({"cursor": cursor} if cursor else {})}
page = requests.get(f"{API}{path}", params=query, timeout=30,
headers={"Authorization": f"Bearer {token}"}).json()
yield from page["data"]
cursor = page["next_cursor"]
if not cursor:
return

Errors​

Errors answer {"error": {"code": "…", "message": "…"}} (invalid_body also has details with the fields).

StatusCodeMeaning
400invalid_parameterA query parameter doesn't fit (a time, an id, limit, a cursor).
401invalid_tokenNo token, an unknown, expired or revoked one — get a new token.
403insufficient_scopeThe token lacks the scope this endpoint needs.
403forbiddenThe integration's permissions don't allow this (on this record, now).
403access_deniedThe integration can't be used now (turned off, the plan, the organization).
403read_onlyThe organization is read-only (unpaid plan): only answering work orders goes on.
403plan_limitThe plan doesn't allow this (e.g. creating work orders).
404not_foundNo such record, or the integration may not read it.
409external_id_takenAnother record of the organization has this external_id.
409request_in_progressThe first request with this Idempotency-Key is still running.
422invalid_bodyThe body doesn't fit (details lists the fields).
422rule_violationA rule of kommuns refused it (e.g. a required question unanswered) — the message says which.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
429rate_limitedOver the per-minute limit; wait Retry-After seconds.

Idempotency​

POST, PATCH and DELETE accept an Idempotency-Key header (1–200 characters, e.g. a UUID or your own record's number). The same key with the same request within 24 hours returns the first answer again, marked Idempotent-Replayed: true, and creates nothing new — so a retry after a timeout is safe.

Your own numbers: external_id​

Inventory nodes, work orders and feedback can carry your system's own number (up to 128 characters, unique within the organization). Inventory numbers are entered in kommuns on the node's General tab ("External system number"); work orders and feedback get theirs when you create them. Find a record by it with ?external_id=.