API Reference
All endpoints require a bearer token from php artisan apikey:create.
Authorization: Bearer tfk_xxxxxxxxxxxxxxxxxxxxxxxx
Rate limit: 30 requests per minute per key.
POST /api/tasks — Create a task
Natural language is parsed from the name field if date or recurrence_pattern are not explicitly provided (same parser as the web quick-add bar).
Request body (JSON):
{
"name": "Team sync every Tuesday",
"description": "Optional markdown description",
"date": "2026-02-24",
"time": "14:30",
"project_id": 1,
"recurrence_pattern": "Tuesday",
"recurrence_floating": false,
"tag_ids": [1, 2],
"assignee_ids": [1]
}
All fields except name are optional. If assignee_ids is omitted, the task is assigned to the key owner. If project_id is omitted, the task goes into the key owner's inbox.
Response (201):
{
"success": true,
"task": {
"id": 42,
"name": "Team sync",
"date": "2026-02-24",
"time": "14:30",
"status": "incomplete",
"recurrence_pattern": "Tuesday",
"recurrence_floating": false,
"creator": { "id": 1, "name": "..." },
"project": { "id": 1, "name": "..." },
"tags": [...],
"assignees": [...]
}
}
Error response (422) — returned when an unrecognized recurrence keyword is detected in the name:
{
"success": false,
"message": "The recurrence pattern in '...' was not recognized. ..."
}
GET /api/tasks/on/{date} — Tasks due on a date
Returns all non-archived tasks dated YYYY-MM-DD visible to the key owner (created by or assigned to them).
GET /api/tasks/on/2026-02-24
Response (200):
{
"success": true,
"date": "2026-02-24",
"tasks": [...]
}
GET /api/tasks/completed/{date} — Tasks completed on a date
Returns tasks with status = done whose updated_at falls on YYYY-MM-DD.
GET /api/tasks/completed/2026-02-24
Response shape is the same as /api/tasks/on/{date}.