---
title: "The Monday pack for one 4-5-4 retail week"
method: GET
path: "/api/v1/finance/reports/weekly-trade"
tags: ["finance_reports"]
---

# The Monday pack for one 4-5-4 retail week

`GET /api/v1/finance/reports/weekly-trade`

## Request

- Base URL: `https://api.app.tightly.io`
- URL: `https://api.app.tightly.io/api/v1/finance/reports/weekly-trade`
- Auth: HTTP bearer

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.

EVERY HEAD FIGURE FOOTS. `foots_to` is the address of the row and column the figure was counted off, so a head can be tied to the band beneath it rather than taken on trust.

EVERY BAND CARRIES ITS OWN `as_of` AND `data_source`. Eight reads taken at eight moments have eight freshnesses, and one stamp at the top would date the stalest with the freshest's.

LAST YEAR IS A FISCAL WEEK, NOT A DATE. Where this year runs 53 weeks and last year ran 52, week 53 is read against last year's week 52 and `period_detail.last_year.alignment` says `restated_week_53` with the sentence beside it.

ABSENCE IS A WORD. A band whose read is not built yet carries `unsupported_reason`; an empty band carries one `absence` sentence; a plan cell with no line reads `No plan` and never a zero.

Scope: `reports:read`.

## Query parameters

- `week` string, required
- `cut` 'category' | 'channel' | 'commitment'
- `plan_id` string

## Headers

- `Tightly-Version` string

## Response `200`

The weekly trade report

## Other responses

- `400`: The week could not be read, or the cut is not one this report offers
- `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 Reports is sold with Pro and this organisation's plan does not include it; `scope_missing` when the key does not hold Reports; `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.
- `404`: No such report
- `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)
