# Returns the expense budgets defined for a PSA project.

`GET /psa/expenses/budgets`

Group: PSA › Expenses · Operation ID: `getExpenseBudgets`

Returns the budgets defined for one PSA project, selected by a numeric psaProjectId in the query string. The endpoint requires view access to that project.

[Open in the interactive reference](https://docs.api.lensing.ai/?op=getExpenseBudgets)

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | `"v1"` | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version `v1`. |
| `psaProjectId` | query | number | yes | The id of the PSA project. It is the numeric package-layer key, not the UUID that GET psa/projects/:id takes. |
| `isDefault` | query | boolean | no | When true, return only the project's default catch-all budget. When false or omitted, return all of the project's budgets. False does not filter to non-default budgets. |
| `cursor` | query | string | no | The cursor from the previous response's pagination.nextCursor. Omit on the first request. |
| `pageSize` | query | number | no | The number of budgets per page, between 1 and 200. Defaults to 50. A value above 200 is treated as 200, not rejected. |

## Response

`200` Success

Under `data` (getExpenseBudgetsOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `items` | array of object | yes | The project's budgets on this page. An empty array when the project has no budgets. |
| `items[].id` | number | yes | The unique identifier for the budget. |
| `items[].name` | string | yes | The display name of the budget. |
| `items[].budget` | string (decimal) | no | The budget amount, in the currency given by currency. Absent when the budget has no amount. |
| `items[].currency` | string | no | The currency of budget. Format ISO 4217, for example 'USD'. Absent when the budget has no amount. |
| `items[].isDefault` | boolean | yes | Whether this is the project's default catch-all budget. |
| `items[].lastModifiedDate` | string (date-time) | no | The date and time the budget definition last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
| `items[].billable` | boolean | no | Whether expenses against this budget are billable to the customer. |
| `items[].productId` | number | no | The id of the product tied to this budget. It is a numeric package-layer key, not the UUID that GET accounting/products/:id takes. Absent when the budget is not tied to a product. |
| `items[].productLineId` | number | no | The id of the product line tied to this budget. It is a numeric package-layer key, not the UUID that GET accounting/product-lines/:id takes. Absent when the budget is not tied to a product line. |
| `items[].salesOrderId` | number | no | The id of the sales order this budget bills against. It is a numeric package-layer key, not the UUID that GET accounting/sales-orders/:id takes. |
| `pagination` | object | yes | The pagination cursor for this page. |
| `pagination.nextCursor` | string | no | The cursor for the next page. Pass it as the cursor query parameter. Absent on the last page. |
| `pagination.hasMore` | boolean | yes | True when more budgets remain beyond this page. |

## Statuses

- `400` — Invalid request or business failure
- `401` — Missing or invalid access token
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests
- `500` — Internal server error
