Skip to content

Tracker API

REST API v1 of Skribly Tracker, for agents as much as for people. It takes and returns JSON, and an OpenAPI 3.1 description ships with the app.

Authentication

Create a personal access token in your profile and send it as a bearer token. A token acts with its owner's role: viewers can only read, members and admins can change issues, and webhooks are for admins. Endpoints that change data also need the token's write ability.

export TRACKER=http://localhost:8100/api/v1
export TOKEN='...'
curl -H "Authorization: Bearer $TOKEN" -H "Accept: application/json" $TRACKER/me

Conventions

Issue keys
AGENT-12, in any letter case. A leading # is ignored, and the numeric id works too.
Options
type is task, bug or feature. priority is lowest, low, medium, high or urgent. Time activity is development, review, testing, design, meeting or other.
Status categories
todo, in_progress or done. status=open means not done.
Markdown
description and comment body are Markdown, returned as written. The web interface renders them with raw HTML escaped.
Dates
ISO 8601 with offset for timestamps, YYYY-MM-DD for due dates and time entries.
Pagination
Lists return data, links and meta. per_page is 1 to 100, 25 by default.
Limits
More than 240 requests a minute per user returns 429.
Error status codes
CodeMeaning
401No token, or a bad one
403The role or token ability does not allow it
404Not found
422Validation failed
429Too many requests

Endpoints

Every path is relative to /api/v1.

Scrollable table

REST API v1 endpoints
MethodPathPurpose
GET/meToken owner and the token's abilities
GET/usersPeople an issue can be assigned to
GET/projectsActive projects with open issue counts
GET/projects/{key}A project with statuses, labels, types and priorities
GET/projects/{key}/metaWhat can be chosen when creating an issue
GET/issuesFiltered, paginated list
POST/issuesCreate an issue
GET/issues/{key}One issue with comments and attachments
PATCH/issues/{key}Change some fields
DELETE/issues/{key}Delete an issue, as an admin or its reporter
GET/issues/{key}/transitionsStatuses of its project, with the current one marked
POST/issues/{key}/transitionsChange status
POST/issues/{key}/assignAssign or unassign
GET/issues/{key}/commentsComments, oldest first
POST/issues/{key}/commentsAdd a Markdown comment
GET/issues/{key}/time-entriesLogged time
POST/issues/{key}/time-entriesLog time
POST/issues/{key}/attachmentsUpload a file
GET/attachments/{id}Download a file
GET/time-activitiesActivities for time entries
GET/searchText search, with an exact key first
GET, POST/webhooksList or add webhooks, for admins
DELETE/webhooks/{id}Remove a webhook, for admins

Filter issues

curl -H "Authorization: Bearer $TOKEN" "$TRACKER/issues?assignee=me&status=open&sort=-updated&per_page=100"
curl -H "Authorization: Bearer $TOKEN" "$TRACKER/issues?updated_since=2026-10-29T12:00:00Z&status=all"
Filters on the issue list
ParameterValues
assigneeme, none, a user id or an e-mail
reporter, watchingme
statusopen, closed, all, a status id or a name
projectA key, or several separated by commas
type, priorityAn option id, or several separated by commas
labelA label name
qText in the title or description, or an exact key
updated_sinceAn ISO 8601 timestamp
sort-updated by default, also created, priority, key and due, with - for descending
per_page, pagePagination

Change issues

Create

Only project and title are required. Unknown label names are created in the project.

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" $TRACKER/issues -d '{
  "project": "AGENT",
  "title": "Saved filters in the sidebar",
  "type": "feature",
  "priority": "medium",
  "assignee": "me"
}'

Change status

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  $TRACKER/issues/AGENT-3/transitions -d '{"status": "Done"}'

Comment and log time

hours is required, above 0 and at most 24. date defaults to today, and activity to development.

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  $TRACKER/issues/AGENT-3/comments -d '{"body": "## Done\n- Filters saved"}'
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  $TRACKER/issues/AGENT-3/time-entries -d '{"hours": 1.5, "comment": "Review", "activity": "review"}'

Webhooks

Admins add webhooks in Settings or through the API. The secret is shown once. Events are issue.created, issue.updated, issue.deleted and comment.created, and each delivery is a queued POST with up to three tries.

POST /hooks/skribly
Content-Type: application/json
X-Skribly-Event: issue.updated
X-Skribly-Signature: sha256=<hex HMAC-SHA256 of the raw body>

To verify a delivery, compute the HMAC of the raw body with the webhook secret, and compare in constant time.

Keep reading

Search this site

Arrows move through the results, Enter opens one, Esc closes. Ctrl K /