Kanban Comments
List and create threaded comments on Kanban cards for team collaboration.
Prerequisites
All endpoints on this page require a valid JWT token, API key, and tenant header. See Authentication for details.
List Comments
Retrieve a paginated list of comments for a specific card, ordered by creation date (newest first).
GET
/apidev/v1/kanban/cards/{id}/commentsPermissionAPICLI_KANBAN_READ
Rate Limit30 req/min (sliding window)
Cache15s
Request Headers
Every request to a protected endpoint requires these headers:
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer token obtained from the Login endpoint. Format: Bearer <token> |
X-API-Key | Yes | Company integration key provided during onboarding. Format: gtk_xxx... |
tenant | Yes | Your company hostname (e.g., yourcompany.geotareas.com) |
Content-Type | Conditional | application/json — required for POST and PUT requests |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Card unique identifier (BigInt) |
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
limit | integer | No | 25 | Min 1, Max 100 | Records per page |
offset | integer | No | 0 | ≥ 0 | Records to skip |
Response
| Field | Type | Description |
|---|---|---|
id | string | Comment unique identifier (BigInt) |
text | string | Comment text content |
author | object | {id, name} of the author |
mentions | array | [{id, name}] mentioned users |
created_at | string | ISO 8601 timestamp |
updated_at | string | ISO 8601 timestamp |
Code Examples
- cURL
- JavaScript
- Python
curl -s -X GET "$TENANT_URL/apidev/v1/kanban/cards/4200000000000001/comments?limit=10" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"
const response = await fetch(
`${TENANT_URL}/apidev/v1/kanban/cards/4200000000000001/comments?limit=10`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`,
"X-API-Key": APIKEY,
"tenant": TENANT,
},
}
);
const { data, meta } = await response.json();
console.log(`Fetched ${data.length} of ${meta.total} comments`);
import requests
response = requests.get(
f"{TENANT_URL}/apidev/v1/kanban/cards/4200000000000001/comments",
headers={
"Authorization": f"Bearer {TOKEN}",
"X-API-Key": APIKEY,
"tenant": TENANT,
},
params={"limit": 10},
)
result = response.json()
for comment in result["data"]:
print(f"{comment['author']['name']}: {comment['text']}")
Example Response
{
"success": true,
"data": [
{
"id": "5500000000000001",
"text": "Device installed successfully. Waiting for signal confirmation.",
"author": {"id": "1100000000000001", "name": "Carlos Mendoza"},
"mentions": [],
"created_at": "2026-03-18T15:30:00",
"updated_at": "2026-03-18T15:30:00"
},
{
"id": "5500000000000002",
"text": "Please prioritize this — client escalated. @Maria please review.",
"author": {"id": "1100000000000002", "name": "Admin User"},
"mentions": [{"id": "1100000000000003", "name": "Maria Lopez"}],
"created_at": "2026-03-17T10:00:00",
"updated_at": "2026-03-17T10:00:00"
}
],
"meta": {
"total": 3,
"limit": 10,
"offset": 0
}
}
Rate Limit Headers
Every response includes rate limit information in the headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum number of requests allowed in the current window |
X-RateLimit-Remaining | Number of requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp (seconds) when the current window resets |
Retry-After | Seconds to wait before retrying (only present on 429 responses) |
X-Request-Id | Unique request identifier for debugging and support tickets |
Create Comment
Add a new comment to a card. Returns HTTP 201.
POST
/apidev/v1/kanban/cards/{id}/commentsPermissionAPICLI_KANBAN_WRITE
Rate Limit30 req/min (sliding window)
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Card unique identifier (BigInt) |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
text | string | Yes | Max length 5000 | Comment text content |
Response
| Field | Type | Description |
|---|---|---|
id | string | Comment unique identifier (BigInt) |
text | string | Comment text content |
author | object | {id, name} of the author (from JWT) |
created_at | string | ISO 8601 timestamp |
Code Examples
- cURL
- JavaScript
- Python
curl -s -X POST "$TENANT_URL/apidev/v1/kanban/cards/4200000000000001/comments" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '{
"text": "Signal confirmed. Closing this card."
}'
const response = await fetch(
`${TENANT_URL}/apidev/v1/kanban/cards/4200000000000001/comments`,
{
method: "POST",
headers: {
"Authorization": `Bearer ${TOKEN}`,
"X-API-Key": APIKEY,
"tenant": TENANT,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "Signal confirmed. Closing this card.",
}),
}
);
const { data } = await response.json();
console.log(`Comment ${data.id} created by ${data.author.name}`);
import requests
response = requests.post(
f"{TENANT_URL}/apidev/v1/kanban/cards/4200000000000001/comments",
headers={
"Authorization": f"Bearer {TOKEN}",
"X-API-Key": APIKEY,
"tenant": TENANT,
},
json={
"text": "Signal confirmed. Closing this card.",
},
)
comment = response.json()["data"]
print(f"Comment {comment['id']} created by {comment['author']['name']}")
Example Response
{
"success": true,
"data": {
"id": "5500000000000003",
"text": "Signal confirmed. Closing this card.",
"author": {"id": "1100000000000001", "name": "Carlos Mendoza"},
"created_at": "2026-03-19T17:00:00"
},
"meta": {}
}
Errors
| Code | HTTP | Description |
|---|---|---|
BAD_REQUEST | 400 | Missing required headers |
VALIDATION_ERROR | 400 | Invalid parameters |
UNAUTHORIZED | 401 | Invalid or expired JWT / API Key |
FORBIDDEN | 403 | User lacks required permission |
NOT_FOUND | 404 | Resource not found |
RATE_LIMITED | 429 | Exceeded rate limit |
INTERNAL_ERROR | 500 | Unexpected server error |