---
title: "One commitment's plan of record at cost, on its own fiscal months"
method: GET
path: "/api/v1/commitments/{commitment_id}/money"
tags: ["commitments"]
---

# One commitment's plan of record at cost, on its own fiscal months

`GET /api/v1/commitments/{commitment_id}/money`

## Request

- Base URL: `https://api.app.tightly.io`
- URL: `https://api.app.tightly.io/api/v1/commitments/{commitment_id}/money`
- Auth: HTTP bearer

One commitment's plan of record at cost, in integer cents, on the commitment's own 4-5-4 fiscal months (each keyed by the calendar year-month it maps to).

The plan of record is five declared terms per category and month, planned sales, planned markdown, planned closing stock, planned intake margin and the receipts they imply, and the identity that closes on them. It is the line a variance is measured against, so the figures are what a planner typed and not what an engine would say today.

AN ABSENCE STAYS AN ABSENCE. A month with no modelled demand is `null` in its array, because a 0 there would read as "plan for nothing", while a month the order book expects nothing in is a measured `0`. Every null carries its reason in the category's `unavailable` list, in a planner's words. `open_to_commit` is receipts needed less what is already on order, and it is the same figure the Open to buy report and the cash gate's `planned_out` are built from.

`company_declaration` carries the finance lead's cover target, in weeks, and markdown rate, in basis points, for the plan's fiscal year, served once for the grid rather than per cell. A category's plan cell may hold a different figure, and this block is how a reader tells the two apart; either figure reads null where the company has declared neither.

For the versions of this plan, frozen as they were locked, read `list_plan_versions`.

Scope: `planning:read`.

## Path parameters

- `commitment_id` string, required

## Query parameters

- `mfp_id` string
- `mfp_version_id` integer
- `calendar_hash` string
- `horizon_start` string, date
- `horizon_end` string, date
- `fiscal_year_start_month` integer

## Headers

- `Tightly-Version` string

## Response `200`

The commitment's money position.

The plan block carries what has actually been MARKED DOWN beside what was planned, on the same months. `realised_markdown` is at COST, the plan's own basis, which is the only pair that may be subtracted; `realised_markdown_at_retail` is what the season handed over at the till, beside it and never subtracted from a plan stated at cost. `markdown_left_to_close_cents` is the subtraction, with `markdown_left_to_close_reason` where it cannot be made. A month still ahead carries null and never a zero, and `realised_markdown_reason` says why a whole row has none -- a season that has not opened, a channel scope, or a read that could not be taken.

The order book arrives in three bands on those same months, off one scan and under one refusal. `on_order` is placed purchase-order money at its expected delivery month, the envelope ladder's own definition of placed. `drafted` is purchase-order money still in draft at the same grain: written up, no envelope consumed, and its own band because a draft is not an order. `received` is the delivered subset of the placed lines at the same expected delivery month, so it is the landed slice of that month's on-order figure rather than an actual-arrival series, and it is never more than `on_order` for a month. A month the book was read for that holds nothing in a band is a measured 0; all three bands are null together, with the reason on the category, where the book cannot answer for the scope at all.

## Other responses

- `401`: No usable key: malformed, unknown, revoked, expired or stopped. One refusal covers all five, telling a caller which is which maps the surface for them. A request with no Authorization header at all is refused 400 before any key is looked for.
- `403`: The key may not reach this operation. `plan_excludes` when the plan of record is sold with Pro and this organisation's plan does not include it; `scope_missing` when the key does not hold Planning; `organization_mismatch` when the path names an organisation that is not the key's; `ip_not_allowed` when the caller's address is outside the key's allowlist.
- `429`: The key has spent its allowance for this minute. 600 reads and 120 writes a minute, counted per key, refused calls included. `Retry-After` says how long to wait.
- `503`: The database is briefly out of reach, which is what a failover or a full connection pool looks like from outside. Wait the seconds `Retry-After` names and send the request again. A read is safe to repeat. A write is not, because the connection was lost in the middle of it, so read the object back before sending it a second time. Branch on the status rather than on `code`, which is `POSTGRES_UNAVAILABLE` from one of the two seams that raise this and `SERVICE_UNAVAILABLE` from the other.

---

[API](https://skmtc.dev/tightly/apis/tightly-api.md) · [All operations](https://skmtc.dev/tightly/apis/tightly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tightly/apis/tightly-api/revisions/199f7eb35afb?raw)
