Skip to content

REST API

Full REST API for integration with dashboards, widgets, or custom tools.

Swagger UI

Interactive API documentation is available at runtime:

http://localhost:3000/swagger-ui

OpenAPI 3.1 spec: http://localhost:3000/api-docs/openapi.json

Base URL

https://your-domain.com/api

Authentication

All mutating endpoints require authentication via session cookie (set by OAuth login).

Cookie: session=<JWT token>

Endpoints

Projects

MethodPathAuthDescription
GET/projectsNoList all projects
POST/projectsAdminCreate project
GET/projects/{slug}NoProject detail
PATCH/projects/{slug}AdminUpdate project
DELETE/projects/{slug}AdminDelete project

Posts

MethodPathAuthDescription
GET/projects/{slug}/postsNoList posts (sort, filter, search, paginate)
POST/projects/{slug}/postsMemberCreate post
GET/posts/{id}NoPost detail + comments
PATCH/posts/{id}AdminUpdate status/category
DELETE/posts/{id}Admin/CreatorDelete post

Votes

MethodPathAuthDescription
POST/posts/{id}/voteMemberToggle vote

Comments

MethodPathAuthDescription
GET/posts/{id}/commentsNoList comments (threaded)
POST/posts/{id}/commentsMemberAdd comment
DELETE/comments/{id}Admin/CreatorDelete comment

Attachments

MethodPathAuthDescription
GET/posts/{id}/attachmentsNoList attachments for a post
POST/posts/{id}/attachmentsAuthor/AdminUpload image (multipart, max 10MB)
GET/attachments/{id}NoServe/download an image
DELETE/attachments/{id}Author/AdminDelete an attachment

Auth

MethodPathAuthDescription
GET/auth/providersNoList active OAuth providers
GET/auth/meMemberCurrent user info
GET/auth/{provider}/loginNoStart OAuth flow
GET/auth/{provider}/callbackNoOAuth callback
GET/auth/logoutNoLogout

Query Parameters (Posts)

ParameterTypeDescription
sortstringnewest, oldest, most_votes, least_votes, recently_updated
statusstringopen, planned, in_progress, done, declined
categorystringfeedback, bug, feature, question
qstringSearch query (title + description)
offsetnumberPagination offset (default: 0)
limitnumberItems per page (default: 20, max: 100)

Response Format

All responses are JSON.

Success

json
{
  "data": { ... },
  "total": 42,
  "offset": 0,
  "limit": 20
}

Error

json
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Post not found"
  }
}

Status Codes

CodeMeaning
200Success
201Created
204No content (deleted)
400Bad request
401Unauthorized
403Forbidden
404Not found
422Validation error
500Internal error