API Reference
Categories
Organise transactions into income and expense categories. Every new user is seeded with a default set; the response returns those plus any additional categories the user has created.
/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." }
/api/categories
Create a category
Creates a custom category owned by the authenticated user.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
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."]
}
}
/api/categories/{id}
Retrieve a category
Returns a single category by ID.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
integer | Required | The category's unique identifier. |
/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
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Optional | New category name. |
type | string | Optional | One 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."]
}
}
/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