Skip to content

Order book ​

9 reads and 1 write, on train 2026-11. Scopes: order_book:read · order_book:write.

OperationMethodScopePath
What one account did last timeGETorder_book:read/api/v1/order-book/account-anchor
One account's booked lines folded into its own size shares (BE-ADJ-19)GETorder_book:read/api/v1/order-book/account-size-curve
One account's bookGETorder_book:read/api/v1/order-book/account-styles
Every account's book against its own prior seasonGETorder_book:read/api/v1/order-book/accounts
How the book was takenGETorder_book:read/api/v1/order-book/curve
How much of this book can still walkGETorder_book:read/api/v1/order-book/firmness
Record bookings a person has already takenPOSTorder_book:write/api/v1/order-book/lines
What is actually walkingGETorder_book:read/api/v1/order-book/signals
One style's live lines across every accountGETorder_book:read/api/v1/order-book/style-lines
What is booked for a seasonGETorder_book:read/api/v1/order-book/summary

What one account did last time ​

GET /api/v1/order-book/account-anchor

Scopes: order_book:read

What one account did last time and how each style is likely to perform there: what they booked last season, what their doors sold, and the baseline's grade.

RequiredInWhat it is
trading_partner_idqueryThe account. An id, never a name. Duplicate account names are ordinary in apparel.
season_codequeryThe season being planned, e.g. SS27.
OptionalInWhat it is
prior_season_codequeryThe season to anchor against. Unstated, it is resolved from the declared season chain; when stated it wins.
commitment_idqueryA Commitment whose scope selects the styles and whose window places the graded curve.
sellout_fromqueryStart of the sell-out window (YYYY-MM-DD). Unstated with sellout_to, it is detected.
sellout_toqueryEnd of the sell-out window (YYYY-MM-DD).
as_ofqueryRead the book as it stood at this instant, rather than now.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/account-anchor?trading_partner_id=<trading_partner_id>&season_code=<season_code>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "currency": {
      "basis": "same",
      "functional": "USD",
      "rate": null,
      "reason": null,
      "reporting": "USD",
      "transaction": "USD"
    },
    "engine": {
      "basis": null,
      "computed_at": "2026-09-04T02:15:41+00:00",
      "confidence": null,
      "inputs_through": "2026-09-04T01:58:00+00:00",
      "name": "baseline",
      "run_id": null,
      "stale_after": "2026-09-05T04:15:41+00:00",
      "state": "fresh"
    },
    "engine_state": "fresh",
    "grades_as_of": "2026-09-04T02:15:41+00:00",
    "grades_reason": null,
    "grades_state": "served",
    "next_run_at": "2026-09-04T07:00:00+00:00",
    "prior_season_code": "SS26",
    "prior_season_source": "declared_chain",
    "season_code": "SS27",
    "sellout_reason": null,
    "sellout_reported": true,
    "sellout_window": {
      "from": "2026-02-02",
      "source": "detected",
      "to": "2026-07-26"
    },
    "styles": [
      {
        "baseline": {
          "basis": "account_predecessor",
          "by_door": [
            …
          ]
        }
      }
    ]
  }
}

What it refuses

  • 400 A required parameter is missing, or the request 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 Tightly Connect. It is sold with Essentials+." 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 names another in trading_partner_id, and the sentence names both accounts.
  • 429

Try it in the reference

One account's booked lines folded into its own size shares (BE-ADJ-19) ​

GET /api/v1/order-book/account-size-curve

Scopes: order_book:read

One account's booked lines, folded into its own size shares in basis points summing to 10000. This is the run this retailer actually takes, beside the buy's own curve.

RequiredInWhat it is
trading_partner_idqueryThe account.
OptionalInWhat it is
season_codequeryThe season. One of season_code or commitment_id is required.
commitment_idqueryA Commitment whose declared season keys the book. Required where no season code is given.
as_ofqueryReconstruct the book as it stood at this instant (ISO-8601). Default is now.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/account-size-curve?trading_partner_id=<trading_partner_id>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "as_of": "2026-09-08T06:00:00+00:00",
    "commitment_id": null,
    "computed_at": "2026-09-08T06:00:04+00:00",
    "lines": 5,
    "reason": null,
    "scope_reason": null,
    "season_code": "SS27",
    "season_source": "declared",
    "shares_bp": {
      "L": 2500,
      "M": 3334,
      "S": 2500,
      "XL": 833,
      "XS": 833
    },
    "trading_partner_id": "tp_00417",
    "units": 1200,
    "unsized_lines": 1,
    "unsized_units": 500
  },
  "message": {
    "desc": "OK",
    "service": "order_book",
    "severity": "INFO"
  }
}

What it refuses

  • 400 A required parameter is missing, or the request 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 Tightly Connect. It is sold with Essentials+." 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 names another in trading_partner_id, and the sentence names both accounts.
  • 429

Try it in the reference

One account's book ​

GET /api/v1/order-book/account-styles

Scopes: order_book:read

One account's book, style by style: prebook, at-once and undated quantities, the booked quantity and value, last price, line count, ship window, cancel date, status, Commitments and a split block naming the prebook anchor.

RequiredInWhat it is
trading_partner_idqueryThe account.
OptionalInWhat it is
season_codequeryThe season, e.g.
commitment_idqueryNarrow the book to one Commitment.
as_ofqueryRead the book as it stood at this instant, rather than now.
season_startqueryDECLARE the day the season starts shipping, which is what each row's prebook / at-once split is measured against.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/account-styles?trading_partner_id=<trading_partner_id>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "as_of": "2026-09-04T06:00:00+00:00",
    "currency": {
      "basis": "same",
      "functional": "USD",
      "rate": null,
      "reason": null,
      "reporting": "USD",
      "transaction": "USD"
    },
    "scope_reason": null,
    "season_code": "SS27",
    "split": {
      "anchor": {
        "season_start": "2027-02-01",
        "source": "declared"
      },
      "at_once": {
        "booked_qty": 0
      },
      "lines_dated": 71,
      "lines_undated": 0,
      "prebook": {
        "booked_qty": 5900
      }
    },
    "styles": [
      {
        "at_once_qty": 0,
        "booked_qty": 1400,
        "booked_value_usd": 41300,
        "commitment_ids": [
          "cmt_0091"
        ],
        "first_ship_window_start": "2027-02-15",
        "has_cancelled": false,
        "held_at": null,
        "held_by_name": null,
        "held_qty_from_account": 0
        …
      }
    ]
  }
}

What it refuses

  • 400 A required parameter is missing, or the request 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 Tightly Connect. It is sold with Essentials+." 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 names another in trading_partner_id, and the sentence names both accounts.
  • 429

Try it in the reference

Every account's book against its own prior season ​

GET /api/v1/order-book/accounts

Scopes: order_book:read

One row per account: this season's booked quantity and value, and the same account's prior-season book read at the same number of days before the season started shipping, with each account's identity, reference and terms. held_qty is the hold units already inside booked_qty, never a figure beside it: a hold has no price, so it moves the booked quantity and not the booked value.

RequiredInWhat it is
season_codequeryThe season being read, e.g. SS27.
OptionalInWhat it is
commitment_idqueryNarrow the book to one Commitment's scope.
as_ofqueryReconstruct the book as it stood at this instant (ISO-8601). Default is now.
prior_season_codequeryThe season to compare against. Unstated, it is resolved from the declared season chain.
season_startqueryDeclare the date this season starts shipping. Omitted, it is derived and labelled derived.
prior_season_startqueryDeclare the prior season's start, so the T-minus-N cut is the same distance on both.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/accounts?season_code=<season_code>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "accounts": [
      {
        "account_reference": "SLF-4471",
        "account_reference_reason": null,
        "account_tier": 1,
        "booked_qty": 5900,
        "booked_value_usd": 188400,
        "doors_on_file": 6,
        "doors_reporting": 4,
        "fill_rate_target_pct": 97,
        "held_qty": 800,
        "name": "Selfridges",
        "predicted_qty": 7200,
        "prior": {
          "booked_qty": 6400,
          "booked_value_usd": 194100
        },
        "sales_channel_id": "61240442",
        "trading_partner_id": "tp_00417"
      }
    ],
    "anchors": {
      "current": {
        "season_start": "2027-02-01",
        "source": "declared"
      },
      "prior": {
        "read_as_of": "2025-09-05T00:00:00+00:00",
        "season_code": "SS26",
        "season_start": "2026-02-02",
        "source": "derived"
      },
      "prior_reason": null
    },
    "as_of": "2026-09-04T06:00:00+00:00",
    "currency": {
      "basis": "same",
      "functional": "USD"
      …
    }
  }
}

What it refuses

  • 400 A required parameter is missing, or a date 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 Tightly Connect. It is sold with Essentials+." 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

Try it in the reference

How the book was taken ​

GET /api/v1/order-book/curve

Scopes: order_book:read

How a season's book was taken over time: one point per week carrying the book as it stood at the end of that week, with booked quantity, booked value and line count.

RequiredInWhat it is
season_codequeryThe season being read, e.g. SS27.
OptionalInWhat it is
commitment_idqueryNarrow the book to one Commitment's scope.
as_ofqueryReconstruct the book as it stood at this instant (ISO-8601). Default is now.
grainqueryThe bucket the curve is cut into. week is the only grain served.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/curve?season_code=<season_code>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "currency": {
      "basis": "same",
      "functional": "USD",
      "rate": null,
      "reason": null,
      "reporting": "USD",
      "transaction": "USD"
    },
    "grain": "week",
    "points": [
      {
        "as_of": "2026-07-06",
        "booked_qty": 9100,
        "booked_value_usd": 241800,
        "lines": 118
      },
      {
        "as_of": "2026-07-13",
        "booked_qty": 18640,
        "booked_value_usd": 501200,
        "lines": 233
      }
    ],
    "scope": {
      "commitment_id": null,
      "season_code": "SS27"
    },
    "scope_reason": null
  },
  "message": {
    "desc": "OK",
    "service": "order_book",
    "severity": "INFO"
  }
}

What it refuses

  • 400 A required parameter is missing, or a date 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 Tightly Connect. It is sold with Essentials+." 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

Try it in the reference

How much of this book can still walk ​

GET /api/v1/order-book/firmness

Scopes: order_book:read

How much of a season's committed value is firm, how much can still walk, and how much nobody has said: the three-way split for the scope, the same split per account ordered by walkable value, and the date each piece stops being walkable.

RequiredInWhat it is
season_codequeryThe season being read, e.g. SS27.
OptionalInWhat it is
commitment_idqueryNarrow the book to one Commitment's scope.
as_ofqueryReconstruct the book at this instant AND measure every cancel date against that day.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/firmness?season_code=<season_code>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "accounts": [
      {
        "firm": {
          "booked_qty": 3100,
          "lines": 44,
          "value_usd": 96200
        },
        "name": "Selfridges",
        "trading_partner_id": "tp_00417",
        "unknown": {
          "booked_qty": 0,
          "lines": 0,
          "value_usd": 0
        },
        "walkable": {
          "booked_qty": 5900,
          "lines": 71,
          "value_usd": 188400
        }
      }
    ],
    "as_of": "2026-09-04T06:00:00+00:00",
    "currency": {
      "basis": "same",
      "functional": "USD",
      "rate": null,
      "reason": null,
      "reporting": "USD",
      "transaction": "USD"
    },
    "firmness": {
      "committed_lines": 612,
      "committed_qty": 40210,
      "committed_value_usd": 1284300,
      "firm": {
        "booked_qty": 23600,
        "lines": 341,
        "value_usd": 742800
        …
      }
    }
  }
}

What it refuses

  • 400 A required parameter is missing, or a date 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 Tightly Connect. It is sold with Essentials+." 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

Try it in the reference

Record bookings a person has already taken ​

POST /api/v1/order-book/lines

Scopes: order_book:write

Record existing wholesale bookings as JSON. One booking or a whole account's season. Limit: 1 MiB; above it use file import.

OptionalInWhat it is
Tightly-VersionheaderThe date train to answer on.
Idempotency-KeyheaderA string of your own, up to 255 characters, that makes this write safe to retry.
bash
curl -X POST "https://api.app.tightly.io/api/v1/order-book/lines" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json

What to send, as body.json

json
{
  "lines": [
    {
      "account": "Harrods",
      "cancelled_qty": 24,
      "external_line_ref": "PO-88431-L4",
      "quantity": 240,
      "season": "SS27",
      "ship_window_start": "2027-02-15",
      "shipped_at": "2027-02-20",
      "shipped_qty": 216,
      "sku": "FTH-HOODY-BLK-M",
      "status": "booked",
      "wholesale_price": 68
    }
  ]
}

What it answers

json
{
  "data": {
    "recorded": 1,
    "rejected": [],
    "status": "success",
    "unchanged": 0
  },
  "message": {
    "desc": "1 order book line(s) recorded",
    "service": "order_book",
    "severity": "INFO"
  }
}

What it refuses

  • 400 bad_request: "No account named Harrods." An account this book does not hold, or a body that does not parse. The whole request is refused before anything is written. A misspelt account is never minted here.
  • 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 scope_missing: "This key cannot write Order book." The key may not make this write. scope_missing when the key does not hold Order book at write; plan_excludes when Order book is sold with Essentials+ and this organisation's plan does not include it; 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 names another, in a sentence naming both. That last one is the key's own binding rather than one of the seam's five, and it is its own code so a caller can branch on it.
  • 413 Booking JSON exceeds the 1 MiB limit; use the file import for larger books.
  • 429

Try it in the reference

What is actually walking ​

GET /api/v1/order-book/signals

Scopes: order_book:read

The pending claims retailers have made against their book: one row per claim with the account, the line it names, the claim type, what the retailer wants, the line's current booked value and quantity, the source text it was read from, and when it was raised, with totals by type.

RequiredInWhat it is
season_codequeryThe season being read, e.g. SS27.
OptionalInWhat it is
commitment_idqueryNarrow the book to one Commitment's scope.
as_ofqueryReconstruct the book as it stood at this instant (ISO-8601). Default is now.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/signals?season_code=<season_code>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "as_of": "2026-09-04T06:00:00+00:00",
    "scope": {
      "commitment_id": null,
      "season_code": "SS27"
    },
    "scope_reason": null,
    "signals": [
      {
        "account": "Selfridges",
        "asked_for": {
          "cancel_date": null,
          "price_amount": null,
          "quantity": null,
          "ship_window_start": "2027-04-01"
        },
        "id": 3341,
        "line_booked_qty": 1400,
        "line_key": "tp_00417|SS27|4410092",
        "line_value_usd": 41800,
        "raised_at": "2026-09-01T09:12:44+00:00",
        "signal_type": "reschedule",
        "source_text": "Can we push the March drop to April",
        "status": "pending",
        "trading_partner_id": "tp_00417",
        "unsized_reason": null
      }
    ],
    "totals": {
      "by_type": {
        "reschedule": 1
      },
      "pending": 1,
      "sized_lines": 1,
      "sized_value_usd": 41800,
      "unsized_claims": 0
    }
  },
  "message": {
    …
  }
}

What it refuses

  • 400 A required parameter is missing, or a date 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 Tightly Connect. It is sold with Essentials+." 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

Try it in the reference

One style's live lines across every account ​

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

Scopes: order_book:read

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.

RequiredInWhat it is
product_idqueryThe style. The asking surface's rows are styles, so this is required.
OptionalInWhat it is
season_codequeryThe season. One of season_code or commitment_id is required.
commitment_idqueryA Commitment whose declared season keys the book.
as_ofqueryReconstruct the book as it stood at this instant (ISO-8601). Default is now.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/style-lines?product_id=<product_id>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "as_of": "2026-09-04T06:00:00+00:00",
    "cancelled_lines": 1,
    "commitment_id": null,
    "currency": {
      "basis": "same",
      "functional": "USD",
      "rate": null,
      "reason": null,
      "reporting": "USD",
      "transaction": "USD"
    },
    "lines": [
      {
        "booked_qty": 1400,
        "cancel_date": "2027-01-15",
        "line_verdict": "accepted",
        "name": "Selfridges",
        "ship_window_start": "2027-02-15",
        "status": "confirmed",
        "trading_partner_id": "tp_00417",
        "wholesale_price_amount": 29.5
      },
      {
        "booked_qty": 600,
        "cancel_date": null,
        "line_verdict": null,
        "name": "Le Bon Marché",
        "ship_window_start": null,
        "status": "hold",
        "trading_partner_id": "tp_00902",
        "wholesale_price_amount": null
      }
    ],
    "product_id": "4410092",
    "reason": null,
    "scope_reason": null,
    "season_code": "SS27",
    "season_source": "stated"
    …
  }
}

What it refuses

  • 400 A required parameter is missing, or a date 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 Tightly Connect. It is sold with Essentials+." 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

Try it in the reference

What is booked for a season ​

GET /api/v1/order-book/summary

Scopes: order_book:read

The headline of a wholesale book for one season: booked quantity and value, lines, accounts, the split by status and by channel, the buy envelope the book runs against with open to buy, the prebook against at-once split, and the firm, walkable and unknown split of the committed value.

RequiredInWhat it is
season_codequeryThe season being read, e.g. SS27.
OptionalInWhat it is
commitment_idqueryNarrow the book to one Commitment's scope.
as_ofqueryReconstruct the book as it stood at this instant (ISO-8601). Default is now.
season_startqueryDeclare the date the season starts shipping, what the prebook / at-once split is measured against.
Tightly-VersionheaderThe date train to answer on.
bash
curl "https://api.app.tightly.io/api/v1/order-book/summary?season_code=<season_code>" \
  -H "Authorization: Bearer $TIGHTLY_API_KEY"

What it answers

json
{
  "data": {
    "as_of": "2026-09-04T06:00:00+00:00",
    "book": {
      "accounts": 37,
      "booked_qty": 48210,
      "booked_value_usd": 1284300,
      "by_channel": [
        {
          "booked_qty": 31200,
          "booked_value_usd": 903100,
          "sales_channel_id": "61240442"
        }
      ],
      "by_status": {
        "confirmed": {
          "qty": 40210,
          "value_usd": 1284300
        },
        "hold": {
          "qty": 8000,
          "value_usd": null
        }
      },
      "committed_qty": 40210,
      "lines": 612,
      "soft_qty": 8000,
      "soft_value_usd": null
    },
    "currency": {
      "basis": "same",
      "functional": "USD",
      "rate": null,
      "reason": null,
      "reporting": "USD",
      "transaction": "USD"
    },
    "envelope": {
      "committed_usd": 1284300,
      "envelope_usd": 1600000
      …
    }
  }
}

What it refuses

  • 400 A required parameter is missing, or a date 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 Tightly Connect. It is sold with Essentials+." 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

Try it in the reference

Tightly API, version 2026-11.