GET /api/categories

List categories

Returns the authenticated user's categories, including the seeded defaults.

Response

200 OK
[
  {
    "id": 1,
    "user_id": 1,
    "name": "Salary",
    "type": "income"
  },
  {
    "id": 2,
    "user_id": 1,
    "name": "Groceries",
    "type": "expense"
  },
  {
    "id": 17,
    "user_id": 1,
    "name": "Side Hustle",
    "type": "income"
  }
]
401 Unauthorized
{ "message": "Unauthenticated." }
POST /api/categories

Create a category

Creates a custom category owned by the authenticated user.

Request body

NameTypeRequiredDescription
name string Required Category name. Max 255 characters.
type string Required One of: income, expense.

Request body example

REQUEST
{
  "name": "Side Hustle",
  "type": "income"
}

Responses

201 Created
{
  "id": 17,
  "user_id": 1,
  "name": "Side Hustle",
  "type": "income"
}
422 Unprocessable Entity
{
  "message": "The given data was invalid.",
  "errors": {
    "type": ["The selected type is invalid."]
  }
}
GET /api/categories/{id}

Retrieve a category

Returns a single category by ID.

Path parameters

NameTypeRequiredDescription
id integer Required The category's unique identifier.
PUT /api/categories/{id}

Update a category

Updates a category owned by the authenticated user. Duplicate (name, type) pairs are blocked by a unique key and return 422.

Request body

NameTypeRequiredDescription
namestringOptionalNew category name.
typestringOptionalOne of: income, expense.

Responses

200 OK
{
  "id": 17,
  "user_id": 1,
  "name": "Freelance Work",
  "type": "income"
}
422 Unprocessable Entity
{
  "message": "The given data was invalid.",
  "errors": {
    "name": ["The name has already been taken."]
  }
}
DELETE /api/categories/{id}

Delete a category

Deletes a category owned by the authenticated user, including the seeded defaults.

Response

204 No Content
HTTP/1.1 204 No Content

© 2026 Pasona Finance Tracker API. All rights reserved.

API version: v1