loading...
arrow_rightview all
Tascer API v1.1

API Reference

A stateless, API-key authenticated REST API to read and write your Tascer projects, boards and tasks. The base route is a self-describing discovery document, so an automated client can learn the whole surface from a single call.

Base URL …/apis/index.phpcontent_copy
AuthAPI key
FormatJSON

Quickstart

Call the base route first with your key. It returns the full, machine-readable map of every endpoint, its parameters and body schema — enough for a client (or an AI agent) to operate the API without any other documentation.

Recommended flow

  1. GET /me — confirm which user this key belongs to.
  2. GET /projects — list the projects you can see.
  3. GET /boards?project_id=<id> — list boards in a project.
  4. GET /boards/<id> — fetch a board with its statuses, types, priorities and members. Use these ids when creating or updating tasks.
  5. GET /boards/<id>/tasks — list tasks (paginated, filterable).
  6. POST /boards/<id>/tasks — create a task (only title is required).
  7. PATCH / DELETE /tasks/<id> — update or remove. Delete cascades comments and files.
curl · discoverycontent_copyCopy
curl -H "Authorization: Bearer tsk_your_key" \
     https://your-host/apis/index.php

Authentication

Every request needs a valid Tascer API key. Generate one in the web app under API Keys — keys are shown once, scoped to your user, and can be revoked or given an expiry. A key inherits exactly the access of the user it belongs to.

Supply the key in one of three ways

MethodExampleRecommended
Bearer headerAuthorization: Bearer <API_KEY>Yes
Custom headerX-API-Key: <API_KEY>Yes
Query parameter?api_key=<API_KEY>Avoid — leaks into logs
lockPrefer a header. Query-string keys end up in server access logs, browser history and referrers.

Conventions

Consistent envelopes and rules across the whole API.

Response envelopes

Successful responses wrap the payload in data; paginated lists add meta. Errors always use a single error object.

successcontent_copyCopy
{ "data": { /* object or array */ }, "meta": { "page": 1, "limit": 50, "total": 128 } }
errorcontent_copyCopy
{ "error": { "code": "validation_error", "message": "Status does not belong to this board.",
             "details": { "field": "task_status_id" } } }

Rules

  • Content type: application/json; charset=utf-8.
  • Dates: returned as Y-m-d H:i:s; inputs are parsed leniently (ISO 8601 accepted).
  • Pagination: list endpoints accept limit (max 200) and page (1-based); the total is in meta.total.
  • Authorization: you only see and modify projects/boards/tasks you own or are a member of (admins see everything). Board-scoped ids (task_status_id, task_type_id, task_priority_id, user_id) are validated against the target board on write.

Discovery & session

GET/apis/index.php

Returns the full, self-describing API map: auth, conventions, every endpoint with parameters and body schema, examples and error codes. Call it first.

GET/apis/index.php/me

The user this API key belongs to.

200 · responsecontent_copyCopy
{ "data": { "user_id": 1, "username": "admin", "is_admin": true } }

Projects

GET/apis/index.php/projects

Lists the projects visible to you.

200 · responsecontent_copyCopy
{ "data": [
    { "id": 7, "name": "Website Relaunch", "status": "active",
      "url": "https://example.com", "created_at": "2026-05-01 10:15:00",
      "modified_at": "2026-05-30 12:11:22", "created_by": 3 }
] }
GET/apis/index.php/projects/{project_id}

A single project. Returns 403 no_access if you are not a member, 404 not_found if it does not exist.

Boards

GET/apis/index.php/boards

Lists boards visible to you.

QueryTypeRequiredDescription
project_idintegernoRestrict to one project.
GET/apis/index.php/boards/{board_id}

A board together with everything needed to create or update its tasks — statuses, types, priorities and members in one call.

200 · responsecontent_copyCopy
{ "data": {
    "id": 3, "title": "Testboard", "status": "1", "project_id": 3,
    "statuses":   [ { "id": 9,  "title": "Todo",    "color": "red",    "last_step": 0 }, ... ],
    "types":      [ { "id": 5,  "title": "task",     "color": "",       "icon": "" }, ... ],
    "priorities": [ { "id": 3,  "title": "normal",   "color": "",       "level_number": 1 } ],
    "members":    [ { "id": 2,  "username": "Testuser" } ]
} }
GET/apis/index.php/boards/{board_id}/statuses · /types · /priorities · /members

The individual lists, if you only need one of them. members are the valid task assignees for the board.

GET/apis/index.php/boards/{board_id}/tasks

Lists tasks on a board, newest change first.

QueryTypeDefaultDescription
limitinteger50Page size, max 200.
pageinteger11-based page number.
status_idintegerFilter by task_status_id.
updated_afterdatetimeOnly tasks modified at/after this time.
fieldscsvallSubset of task fields to return.
200 · responsecontent_copyCopy
{ "data": [ { /* task */ } ], "meta": { "page": 1, "limit": 50, "total": 12 } }
POST/apis/index.php/boards/{board_id}/tasks

Creates a task. Only title is required; board-scoped ids must belong to the board and user_id must be a board member.

FieldTypeRequired
titlestringyes
descriptionstringno
deadlinedatetime | nullno
estimated_time · taken_timenumberno
task_status_id · task_type_id · task_priority_idinteger (board-scoped)no
user_idinteger (board member; defaults to you)no
request bodycontent_copyCopy
{ "title": "Landingpage QA", "description": "Check mobile spacing",
  "task_status_id": 9, "task_priority_id": 3, "user_id": 2 }
201 · responsecontent_copyCopy
{ "data": {
    "id": 42, "title": "Landingpage QA", "description": "Check mobile spacing",
    "estimated_time": 0, "taken_time": 0, "deadline": null,
    "created_at": "2026-07-12 20:07:39", "modified_at": "2026-07-12 20:07:39",
    "task_status_id": 9, "task_type_id": 5, "task_priority_id": 3,
    "user_id": 2, "board_id": 3 } }

Tasks

GET/apis/index.php/tasks/{task_id}

A single task with all fields.

PATCH/apis/index.php/tasks/{task_id}

Partial update — send only the fields to change. Board-scoped ids are validated against the task's board. Returns the full updated task.

request bodycontent_copyCopy
{ "task_status_id": 12, "taken_time": 1.75 }
DELETE/apis/index.php/tasks/{task_id}

Deletes the task and cascades its comments, attached files (also removed from disk) and view records.

200 · responsecontent_copyCopy
{ "data": { "deleted": true, "id": 42 } }

Comments

GET/apis/index.php/tasks/{task_id}/comments

Comments on a task, oldest first.

200 · responsecontent_copyCopy
{ "data": [ { "id": 8, "comment": "hello from API",
              "created_at": "2026-07-12 20:07:39", "user_id": 1, "username": "admin" } ] }
POST/apis/index.php/tasks/{task_id}/comments

Adds a comment. Body: { "comment": "text" }. Returns the created comment (201).

Errors

Every error uses the error envelope with a stable machine code.

StatusCodeMeaning
401missing_api_keyNo key supplied.
401invalid_api_keyKey unknown, revoked or expired.
403no_accessNot allowed to access this object.
404not_foundObject or route does not exist.
405method_not_allowedRoute exists, but not for this HTTP method.
422validation_errorPayload failed validation (see details).
400invalid_jsonRequest body was not valid JSON.
500server_errorUnexpected failure.

Live explorer

Send a real request against this instance. Your key is used only in your browser to make the call — it is never stored.

Tascer API v1.1 · This reference mirrors the live discovery document at the base route.
Home · Imprint · Privacy · Login