REST API reference for Timill Platform including all endpoints and request/response formats.
REST API reference for Timill Platform including all endpoints and request/response formats.
Base URL#
https://your-domain.com/api/v1
Authentication#
All endpoints require JWT authentication except public endpoints:
Authorization: Bearer <token>
Endpoints#
Instance-admin endpoints (/api/v1/admin/...) — listing every group on
the instance and managing manual Plus subscriptions — live on a separate,
scope-gated surface, documented for instance admins inside your own instance
at /docs/api-reference/admin-rest-api/.
Authentication#
| Method | Endpoint | Description |
|---|
| POST | /auth/login | Login with email/password |
| POST | /auth/logout | Logout |
| POST | /auth/refresh | Refresh token |
| POST | /auth/forgot-password | Request password reset |
| POST | /auth/reset-password | Reset password |
| GET | /auth/google | Google OAuth redirect |
| GET | /auth/google/callback | Google OAuth callback |
Users#
| Method | Endpoint | Description |
|---|
| GET | /users/me | Get current user |
| PUT | /users/me | Update current user |
| GET | /users | List users (admin) |
| GET | /users/:id | Get user by ID |
| PUT | /users/:id | Update user (admin) |
| DELETE | /users/:id | Delete user (admin) |
Groups#
| Method | Endpoint | Description |
|---|
| GET | /groups | List groups |
| POST | /groups | Create group |
| GET | /groups/:id | Get group |
| PUT | /groups/:id | Update group |
| DELETE | /groups/:id | Delete group |
| GET | /groups/:id/members | Get group members |
| POST | /groups/:id/members | Add member |
| DELETE | /groups/:id/members/:userId | Remove member |
Items#
| Method | Endpoint | Description |
|---|
| GET | /groups/:groupId/items | List items |
| POST | /groups/:groupId/items | Create item |
| GET | /groups/:groupId/items/:id | Get item |
| PUT | /groups/:groupId/items/:id | Update item |
| DELETE | /groups/:groupId/items/:id | Delete item |
Item Types#
| Method | Endpoint | Description |
|---|
| GET | /groups/:groupId/item-types | List item types |
| POST | /groups/:groupId/item-types | Create item type |
| GET | /groups/:groupId/item-types/:id | Get item type |
| PUT | /groups/:groupId/item-types/:id | Update item type |
| DELETE | /groups/:groupId/item-types/:id | Delete item type |
Scripts#
| Method | Endpoint | Description |
|---|
| GET | /groups/:groupId/scripts | List scripts |
| POST | /groups/:groupId/scripts | Create script |
| GET | /groups/:groupId/scripts/:id | Get script |
| PUT | /groups/:groupId/scripts/:id | Update script |
| DELETE | /groups/:groupId/scripts/:id | Delete script |
| POST | /groups/:groupId/scripts/:id/run | Run script manually |
Pages#
| Method | Endpoint | Description |
|---|
| GET | /groups/:groupId/pages | List pages |
| POST | /groups/:groupId/pages | Create page |
| GET | /groups/:groupId/pages/:id | Get page |
| PUT | /groups/:groupId/pages/:id | Update page |
| DELETE | /groups/:groupId/pages/:id | Delete page |
| Method | Endpoint | Description |
|---|
| GET | /groups/:groupId/forms | List forms |
| POST | /groups/:groupId/forms | Create form |
| GET | /groups/:groupId/forms/:id | Get form |
| PUT | /groups/:groupId/forms/:id | Update form |
| POST | /forms/:id/submit | Submit form |
| Method | Endpoint | Description |
|---|
| GET | /groups/:groupId/items/:itemId/comments | List comments |
| POST | /groups/:groupId/items/:itemId/comments | Add comment |
| DELETE | /groups/:groupId/items/:itemId/comments/:id | Delete comment |
Query Parameters#
| Parameter | Description | Default |
|---|
page | Page number | 1 |
per_page | Items per page | 20 |
Filtering#
| Parameter | Description | Example |
|---|
query | Timill query syntax | type:task status:open |
sort | Sort field | createdDate:desc |
fields | Fields to include | title,status,assignee |
Creating Resources#
{
"title": "New Item",
"description": "Item description",
"status": "open",
"assignee": "userId123",
"customFields": {
"priority": "high",
"estimate": 8
}
}
Updating Resources#
{
"status": "in-progress",
"assignee": "userId456"
}
Single Resource#
{
"id": "item-uuid",
"groupId": "group-uuid",
"title": "New Item",
"status": "open",
"assignee": "userId123",
"createdAt": "2026-04-19T12:00:00Z",
"updatedAt": "2026-04-19T12:00:00Z"
}
List Response#
{
"data": [...],
"meta": {
"page": 1,
"perPage": 20,
"total": 100,
"totalPages": 5
}
}
Error Handling#
Error Response#
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"field": "title",
"message": "Title is required"
}
]
}
}
HTTP Status Codes#
| Code | Description |
|---|
| 200 | Success |
| 201 | Created |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 422 | Validation Error |
| 429 | Rate Limited |
| 500 | Internal Server Error |
Rate Limiting#
| Level | Limit |
|---|
| Per user | 100 requests/minute |
| Per IP | 1000 requests/minute |
| SSE connections | 10 per user |
Webhooks#
Configuring Webhooks#
POST /groups/:groupId/webhooks
Content-Type: application/json
{
"url": "https://your-app.com/webhook",
"events": ["item.created", "item.updated"],
"secret": "webhook-secret"
}
Webhook Payload#
{
"event": "item.created",
"timestamp": "2026-04-19T12:00:00Z",
"data": { ... }
}
Verifying Signatures#
const crypto = require('crypto');
const signature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
SDK Examples#
JavaScript#
const response = await fetch('/api/v1/items', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'New Item',
status: 'open'
})
});
cURL#
curl -X POST https://your-domain.com/api/v1/items \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "New Item", "status": "open"}'
See also: