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/:slugNoProject detail
PATCH/projects/:slugAdminUpdate project
DELETE/projects/:slugAdminDelete project

Posts

MethodPathAuthDescription
GET/projects/:slug/postsNoList posts (sort, filter, search, paginate)
POST/projects/:slug/postsMemberCreate post
GET/posts/:idNoPost detail + comments
PATCH/posts/:idAdminUpdate status/category
DELETE/posts/:idAdmin/CreatorDelete post

Votes

MethodPathAuthDescription
POST/posts/:id/voteMemberToggle vote

Comments

MethodPathAuthDescription
GET/posts/:id/commentsNoList comments (threaded)
POST/posts/:id/commentsMemberAdd comment
DELETE/comments/:idAdmin/CreatorDelete comment

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