Projects

Set a project's budget

Sets the project's budget: its divisions and their line items, with display order taken from array order. If the project already has draws, each draw is seeded with line items matching the new budget.

The budget can be set only while the project has none; once any divisions or budget (or draw) line items exist the request is refused with 409 and code BUDGET_ALREADY_SET. Changing an existing budget is done in Rabbet, where drawn-against line items are reconciled.

Line items are classified as hard or soft costs from their division's name: items in a division whose name contains "hard cost" — case-insensitive, "hard" and "cost" separated by exactly one space (so "Hard Costs" matches, "Hard-Costs" does not) — are hard costs, all others are soft costs.

Line items are also tagged with Rabbet's budget categories (contingency, fees, developer fees, land acquisition, financing, interest reserves, allowances, tenant improvements) inferred from each line item's name — a line item named "Contingency" is tagged as contingency, "Interest Reserve" as interest reserves, and so on. These tags drive reporting and rules inside Rabbet; they are not settable through this API.

Idempotency

Because the budget can be set only once, a blind retry of a successful request would be refused with 409 BUDGET_ALREADY_SET. Use the optional Idempotency-Key header to make retries safe: repeating the same request with the same key replays the original response. Reusing the key for a different request returns 409 with code IDEMPOTENCY_KEY_CONFLICT; until the original has recorded a result, a concurrent retry receives 409 with code IDEMPOTENCY_KEY_IN_FLIGHT and should retry after a short backoff. Keys are scoped per service account.

put/projects/{projectId}/budget

Request

  • Base URL: https://api.rabbet.com/v1
  • URL: https://api.rabbet.com/v1/projects/{projectId}/budget
  • Auth: OAuth 2 (client credentials, token URL https://api.rabbet.com/oauth/token, scopes: write)

Path parameters

projectIdstring uuid required

Rabbet project UUID. To resolve your own identifier to a project, use GET /projects?custom_id=....

Headers

Idempotency-Keystring

Optional client-supplied key making this request idempotent. Reuse the same value (for the same request) to safely retry.

Request body

Example request

{
  "divisions": [
    {
      "name": "Hard Costs",
      "line_items": [
        {
          "name": "Concrete",
          "amount": {
            "amount": "123.45",
            "currency": "USD"
          },
          "number": "03-3000",
          "retainage_percentage": 0.1
        }
      ]
    }
  ]
}

Response

The stored budget (or original response replayed for a reused Idempotency-Key).

Example response

{
  "data": {
    "divisions": [
      {
        "id": "f7a55f21-9c62-4a5e-8f2b-2b1f0f6f3d10",
        "name": "Hard Costs",
        "line_items": [
          {
            "id": "a3fc8f60-2f8e-4de4-9436-5cf0bb1c1a77",
            "name": "Concrete",
            "number": "03-3000",
            "amount": {
              "amount": "123.45",
              "currency": "USD"
            },
            "line_item_type": "hard_costs",
            "retainage_percentage": 0.1
          }
        ]
      }
    ]
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.