---
title: "One style's live lines across every account, the transpose of the account's book"
method: GET
path: "/api/v1/order-book/style-lines"
tags: ["order_book"]
---

# One style's live lines across every account, the transpose of the account's book

`GET /api/v1/order-book/style-lines`

## Request

- Base URL: `https://api.app.tightly.io`
- URL: `https://api.app.tightly.io/api/v1/order-book/style-lines`
- Auth: HTTP bearer

One style's live lines across every account: quantity, wholesale price, status, ship window, cancel date and the confirmation verdict per account, with totals and a count of the cancelled lines.

`product_id` is required, and the scope is a `season_code` or a `commitment_id`, one of which is required too: served scopeless, an empty book would read as "nobody booked this style", which is a finding rather than a shrug. Given only a Commitment the season is resolved from its declared season label; given both, the season wins and the disagreement is stated in `scope_reason`. A rolling Commitment without a season reads only its explicitly linked bookings across recorded seasons. Its `season_code` stays null, `season_source` is `continuity_commitment`, and `scope_reason` identifies that narrower scope.

`lines` is null with a `reason` where no readable season or continuity scope could be resolved, or where the product id names nothing in the catalogue, because an unreadable style is not an unbooked one. A style with no live lines answers `lines: []` and `totals: null`, which is measured absence. A hold's price is null rather than zero, and `line_verdict` null means not yet confirmed, which is not accepted.

The transpose of get_order_book_account_styles, which is one account across every style.

Sold with Essentials+: without Tightly Connect the answer is 403 `plan_excludes`.

Scope: `order_book:read`.

## Query parameters

- `product_id` string, required
- `season_code` string
- `commitment_id` string
- `as_of` string, date-time

## Headers

- `Tightly-Version` string

## Response `200`

Every live line for the style, the totals over them, the count of cancelled lines, and where the season came from.

- object
  - `data` object
    - `as_of` string, date-time
    - `cancelled_lines` integer
    - `commitment_id` string, nullable
    - `currency` object: What the figures below are in. `functional` is the book's own currency and the denomination every amount here carries. `_usd` in a key name is the book's functional currency for historical reasons, never a claim of dollars. `transaction` is what the lines were agreed in where they agree on one, and null where they do not; `reporting` is what a reader of this organisation asked to see, with `rate` the dated rate between the last two, served, never applied, and dated to this read's `as_of` so a re-read of a past instant cannot move. `basis` is one of same, converted or unconverted, and `reason` carries the absence word where the block cannot say something.
    - `lines` object[], nullable: Null with a `reason` where the style or the season could not be read at all; [] where the book was read and holds nothing. Each line carries its `line_key` (what `GET /order-book/lines/{line_key}` reads, `?version=` for an earlier one), the `version` in force and the `source` that wrote it, and `firmness` (firm, walkable, unknown or soft: the class the firmness read sums it into), `firmness_basis` (the rule that placed it) and `walkable_until` (its cancel date, only inside an open cancellation window; null on an at-will line, which has no deadline).
    - `product_id` string
    - `reason` string, nullable
    - `scope_reason` string, nullable
    - `season_code` string, nullable
    - `season_source` string, nullable: Whether the season was stated or resolved from the Commitment.
    - `totals` object, nullable
  - `message` object: severity, service and desc.

## Other responses

- `400`: A required parameter is missing, or a date could not be read.
- `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 Order book is sold with Essentials+ and this organisation's plan does not include it; `scope_missing` when the key does not hold Order book; `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; `account_mismatch` when a key issued to one account calls this read, whose figure covers every account on the book; the sentence names `GET /order-book/account-styles` and `GET /order-book/account-anchor`, which are that account's own.
- `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)
