Appearance
Reports
3 reads, no writes, on train 2026-11. Scopes: reports:read.
| Operation | Method | Scope | Path |
|---|---|---|---|
| Cash from the buy | GET | reports:read | /api/v1/finance/reports/cash-from-the-buy |
| The fiscal year week by week | GET | reports:read | /api/v1/finance/reports/open-to-buy |
| The Monday pack for one 4-5-4 retail week | GET | reports:read | /api/v1/finance/reports/weekly-trade |
Cash from the buy
GET /api/v1/finance/reports/cash-from-the-buy
Scopes: reports:read
A year of retail weeks with the buy on each supplier's terms: what settles in, what a retailer has committed, what leaves the bank, what the plan of record still implies, and the balance and headroom walked against the declared cash floor. Four bands: the weeks, the suppliers with their terms and where those terms came from, the plan's own money, and the levers.
| Optional | In | What it is |
|---|---|---|
as_of | query | The day the ladder stands on, written 2026-11-08. |
Tightly-Version | header | The date train to answer on. |
bash
curl "https://api.app.tightly.io/api/v1/finance/reports/cash-from-the-buy" \
-H "Authorization: Bearer $TIGHTLY_API_KEY"What it answers
json
{
"data": {
"as_of": "2026-11-08T06:05:00+00:00",
"basis_line": "Merchandise cash · terms clock · retail week",
"coverage": {
"not_measured": [
"The order book was not read, so no week carries a retailer's committed cash."
],
"weeks_not_on_file": [
"FY26-W37"
]
},
"head": [
{
"against": [
{
"figure": {
"basis": "cash",
"cents": 25000000,
"reason": null,
"usd": 250000
},
"key": "floor",
"label": "Declared floor"
}
],
"figure": {
"basis": "cash",
"cents": -20000000,
"reason": null,
"usd": -200000
},
"foots_to": {
"column": "headroom",
"row": "FY26-W39",
"section": "weeks"
},
"key": "tightest",
"label": "Cash at the tightest week"
}
…
]
}
}What it refuses
- 400 The day could not be read
- 401
key_invalid: "The API key is not valid." 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
plan_excludes: "This organisation's plan does not include Commitments. It is sold with Pro." The key may not reach this operation.plan_excludeswhen Reports is sold with Pro and this organisation's plan does not include it;scope_missingwhen the key does not hold Reports;organization_mismatchwhen the path names an organisation that is not the key's;ip_not_allowedwhen the caller's address is outside the key's allowlist. - 429
The fiscal year week by week
GET /api/v1/finance/reports/open-to-buy
Scopes: reports:read
The fiscal year week by week against the plan and the envelope, as one read. Three bands: every 4-5-4 week of the year with what sold, what was placed, what arrived and the same week last year, footed by a total row; the plan of record's budget and forecast lines at cost by the Gregorian month they were written for; and the buying envelope behind both.
| Required | In | What it is |
|---|---|---|
fiscal_year | query | The fiscal year the plan is labelled by, four digits. |
| Optional | In | What it is |
|---|---|---|
Tightly-Version | header | The date train to answer on. |
bash
curl "https://api.app.tightly.io/api/v1/finance/reports/open-to-buy?fiscal_year=<fiscal_year>" \
-H "Authorization: Bearer $TIGHTLY_API_KEY"What it answers
json
{
"data": {
"as_of": "2026-09-05T06:10:02Z",
"basis_line": "Cost · 4-5-4 retail week · organisation calendar",
"calendar_note": "The weeks are 4-5-4 and the plan is by Gregorian month; neither is spread into the other.",
"coverage": {
"commitments_read": 4,
"reason": null
},
"head": [
{
"against": {
"plan": 3480000
},
"figure": 3120000,
"foots_to": {
"column": "year",
"row": "open_to_buy",
"section": "envelope"
},
"key": "open_to_buy",
"label": "Open to buy"
}
],
"kind": "open_to_buy",
"label": "Open to buy",
"period": "FY26",
"period_detail": {
"begins": "2026-02-01",
"ends": "2027-01-30",
"fiscal_year": 2026
},
"sections": [
{
"absence": null,
"as_of": "2026-09-05T06:10:02Z",
"data_source": "pg",
"key": "weeks",
"label": "The year, week by week",
"note": null
…
}
]
}
}What it refuses
- 400 The fiscal year could not be read
- 401
key_invalid: "The API key is not valid." 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
plan_excludes: "This organisation's plan does not include Commitments. It is sold with Pro." The key may not reach this operation.plan_excludeswhen Reports is sold with Pro and this organisation's plan does not include it;scope_missingwhen the key does not hold Reports;organization_mismatchwhen the path names an organisation that is not the key's;ip_not_allowedwhen the caller's address is outside the key's allowlist. - 429
The Monday pack for one 4-5-4 retail week
GET /api/v1/finance/reports/weekly-trade
Scopes: reports:read
The Monday pack for one 4-5-4 retail week, as one read. Eight bands: the ledger's lines for this week, last week, month to date and year to date, each against the plan and against the same fiscal week last year; where the move came from, cut by category, channel or commitment; best and worst sellers; the full-price and markdown mix; size availability; aged stock; future intake by week; and this week's breached and watched commitment verdicts.
| Required | In | What it is |
|---|---|---|
week | query | A fiscal year and a fiscal week, written 2026-W23. |
| Optional | In | What it is |
|---|---|---|
cut | query | How the "where the move came from" band is broken. Defaults to category. |
plan_id | query | Published plan in the selected fiscal year. Omit to use the unique published plan; multiple plans require an explicit selection. |
Tightly-Version | header | The date train to answer on. |
bash
curl "https://api.app.tightly.io/api/v1/finance/reports/weekly-trade?week=<week>" \
-H "Authorization: Bearer $TIGHTLY_API_KEY"What it answers
json
{
"data": {
"as_of": "2026-09-05T06:10:02Z",
"basis_line": "Net sales · 4-5-4 retail week · organisation calendar",
"calendar_note": "Weeks are 4-5-4 and Sunday-anchored; the plan is by Gregorian month.",
"coverage": {
"commitments_read": 4,
"reason": null
},
"head": [
{
"against": {
"last_year": 1171300,
"plan": 1236000
},
"figure": 1184200,
"foots_to": {
"column": "this_week",
"row": "net_sales",
"section": "ledger"
},
"key": "net_sales",
"label": "Net sales"
}
],
"kind": "weekly_trade",
"label": "Weekly trade",
"period": "FY26-W36",
"period_detail": {
"begins": "2026-08-30",
"ends": "2026-09-05",
"last_year": {
"alignment": "same_fiscal_week",
"week": "FY25-W36"
},
"week": "FY26-W36"
},
"sections": [
{
"absence": null
…
}
]
}
}What it refuses
- 400 The week could not be read, or the cut is not one this report offers
- 401
key_invalid: "The API key is not valid." 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
plan_excludes: "This organisation's plan does not include Commitments. It is sold with Pro." The key may not reach this operation.plan_excludeswhen Reports is sold with Pro and this organisation's plan does not include it;scope_missingwhen the key does not hold Reports;organization_mismatchwhen the path names an organisation that is not the key's;ip_not_allowedwhen the caller's address is outside the key's allowlist. - 404 No such report
- 429