API reference
Rudopo API · version 1.0.0 · base URL https://rudopo.app/api/v1
Generated from the OpenAPI description that ships with the code. Every request needs Authorization: Bearer rudopo_pat_YOUR_TOKEN.
Endpoints
/budgetsList budgets
Every budget this token may reach. A token narrowed to specific budgets sees only those.
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
/accountsList accounts
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
| budget_id | query | string | yes | The budget to read. Required on every budget-scoped resource. |
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
/transactionsList transactions
Newest first. Filters run server-side, so the page limit applies to the FILTERED set.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
| budget_id | query | string | yes | The budget to read. Required on every budget-scoped resource. |
| account_id | query | string | no | |
| category_id | query | string | no | |
| start_date | query | string | no | YYYY-MM-DD, inclusive |
| end_date | query | string | no | YYYY-MM-DD, inclusive |
| search | query | string | no | Matches payee, memo and category. 200 characters maximum. |
| uncategorized | query | boolean | no | |
| uncleared | query | boolean | no | |
| limit | query | integer | no | 1–1000. |
| offset | query | integer | no |
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
/categoriesList category groups with their categories
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
| budget_id | query | string | yes | The budget to read. Required on every budget-scoped resource. |
| include_hidden | query | boolean | no | |
| limit | query | integer | no | 1–500. |
| offset | query | integer | no |
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
/payeesList payees
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
| budget_id | query | string | yes | The budget to read. Required on every budget-scoped resource. |
| limit | query | integer | no | 1–500. |
| offset | query | integer | no |
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
/labelsList labels
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
| budget_id | query | string | yes | The budget to read. Required on every budget-scoped resource. |
| limit | query | integer | no | 1–500. |
| offset | query | integer | no |
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
/months/{month}Get one budget month
The envelope answer for a month: what is left to assign, what was assigned, what is overspent.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
| month | path | string | yes | YYYY-MM |
| budget_id | query | string | yes | The budget to read. Required on every budget-scoped resource. |
Responses: 200 OK · 400 A parameter is missing or malformed · 401 No token, or the token is invalid, revoked or expired · 403 About the TOKEN: it lacks the scope, or is not scoped to that budget · 404 Not reachable by this token. A nonexistent id and another owner's id answer identically · 429 Rate limited — see Retry-After · 500 Something went wrong. The body never names internals
Shapes
Money fields are decimal strings in major units — parse them with a decimal type, never a float.
Budget
| id | string | |
| spaceId | string | |
| spaceName | string | null | |
| name | string | |
| currency | string | ISO 4217 code, e.g. USD |
| createdAt | string | null | ISO-8601 UTC |
| archivedAt | string | null | ISO-8601 UTC. Set when a clean slate left this budget behind as an archive; its balances also live in the successor budget. |
Account
| id | string | |
| name | string | |
| type | string | Account type |
| currency | string | null | null = the budget's currency |
| onBudget | boolean | |
| closed | boolean | |
| balance | string | Cleared + uncleared, budget currency, AS OF TODAY (server date, UTC). Future-dated transactions are excluded here but ARE counted by transactionCount and lastTransactionDate, so summing /transactions for this account will not equal this figure whenever one exists. |
| clearedBalance | string | Decimal string, major units, 2dp, e.g. "-45.00" |
| unclearedBalance | string | Decimal string, major units, 2dp, e.g. "-45.00" |
| nativeBalance | string | Balance in the account's own currency |
| transactionCount | integer | |
| lastTransactionDate | string | null | YYYY-MM-DD |
| createdAt | string | null |
Transaction
| id | string | |
| date | string | YYYY-MM-DD, no timezone |
| accountId | string | |
| accountName | string | null | |
| payeeId | string | null | |
| payeeName | string | null | |
| categoryId | string | null | |
| categoryName | string | null | |
| memo | string | |
| amount | string | Negative = outflow. Budget currency. |
| amountNative | string | null | Set only on foreign-currency accounts |
| exchangeRate | number | null | |
| currency | string | null | |
| type | string | Transaction kind |
| cleared | boolean | |
| reconciled | boolean | |
| transferAccountId | string | null | |
| splitGroupId | string | null | Shared by every leg of a split |
| labels | object[] | |
| createdAt | string | null |
Category
| id | string | |
| groupId | string | |
| name | string | |
| hidden | boolean | |
| note | string | null |
CategoryGroup
| id | string | |
| name | string | |
| hidden | boolean | |
| budgetMode | string | Where this group is funded |
| categories | object[] |
Payee
| id | string | |
| name | string |
Label
| id | string | |
| name | string |
Month
| month | string | YYYY-MM |
| readyToAssign | string | Decimal string, major units, 2dp, e.g. "-45.00" |
| assigned | string | Assigned in this month |
| cashBalance | string | Decimal string, major units, 2dp, e.g. "-45.00" |
| overspentTotal | string | Decimal string, major units, 2dp, e.g. "-45.00" |
| overspentCount | integer | |
| uncategorizedCount | integer | |
| heldForNextMonth | string | Decimal string, major units, 2dp, e.g. "-45.00" |
Pagination
| limit | integer | |
| offset | integer | |
| has_more | boolean | True when the page was full; fetch the next offset |
Error
| error | object |