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/meConventions
- Issue keys
AGENT-12, in any letter case. A leading#is ignored, and the numericidworks too.- Options
typeistask,bugorfeature.priorityislowest,low,medium,highorurgent. Timeactivityisdevelopment,review,testing,design,meetingorother.- Status categories
todo,in_progressordone.status=openmeans not done.- Markdown
descriptionand commentbodyare Markdown, returned as written. The web interface renders them with raw HTML escaped.- Dates
- ISO 8601 with offset for timestamps,
YYYY-MM-DDfor due dates and time entries. - Pagination
- Lists return
data,linksandmeta.per_pageis 1 to 100, 25 by default. - Limits
- More than 240 requests a minute per user returns
429.
| Code | Meaning |
|---|---|
401 | No token, or a bad one |
403 | The role or token ability does not allow it |
404 | Not found |
422 | Validation failed |
429 | Too many requests |
Endpoints
Every path is relative to /api/v1.
Scrollable table
| Method | Path | Purpose |
|---|---|---|
| GET | /me | Token owner and the token's abilities |
| GET | /users | People an issue can be assigned to |
| GET | /projects | Active projects with open issue counts |
| GET | /projects/{key} | A project with statuses, labels, types and priorities |
| GET | /projects/{key}/meta | What can be chosen when creating an issue |
| GET | /issues | Filtered, paginated list |
| POST | /issues | Create 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}/transitions | Statuses of its project, with the current one marked |
| POST | /issues/{key}/transitions | Change status |
| POST | /issues/{key}/assign | Assign or unassign |
| GET | /issues/{key}/comments | Comments, oldest first |
| POST | /issues/{key}/comments | Add a Markdown comment |
| GET | /issues/{key}/time-entries | Logged time |
| POST | /issues/{key}/time-entries | Log time |
| POST | /issues/{key}/attachments | Upload a file |
| GET | /attachments/{id} | Download a file |
| GET | /time-activities | Activities for time entries |
| GET | /search | Text search, with an exact key first |
| GET, POST | /webhooks | List 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"| Parameter | Values |
|---|---|
assignee | me, none, a user id or an e-mail |
reporter, watching | me |
status | open, closed, all, a status id or a name |
project | A key, or several separated by commas |
type, priority | An option id, or several separated by commas |
label | A label name |
q | Text in the title or description, or an exact key |
updated_since | An ISO 8601 timestamp |
sort | -updated by default, also created, priority, key and due, with - for descending |
per_page, page | Pagination |
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
- Set up the tracker
Run it and create a token.
- See the integrations
What works with each tracker.
- Read about data
What is stored and where.