Skip to content
Agentmart
Submit a tool

officeworks.com.au

Officeworks printing prices: flyer and document-print quantity ladders, per size, paper stock, siding and colour.

Skill by overseers-desk

IndexedMIT★ 1
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/overseers-desk-officeworks-com-au

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Officeworks printing prices: flyer and document-print quantity ladders, per size, paper stock, siding and colour. The price grid renders empty to curl.

Use cases: documents, research, finance

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/officeworks-com-au

Tools it pre-approves 2

From allowed-tools in SKILL.md: the agent may use these without asking you each time.

  • Bash,
  • Read

What's inside

Skill name
officeworks.com.au
Description
Officeworks printing prices: flyer and document-print quantity ladders, per size, paper stock, siding and colour. The price grid renders empty to curl.
License
MIT
Allowed tools
Bash,, Read
Instructions
68 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts
  • Pre-approves some shell commands
  • Instructions call the network

Agent Skills spec issues

  • name: only lowercase letters, digits and single hyphens allowed

Files (2)

  • SKILL.md
  • pub-price-ladder.py

SKILL.md (first lines)

# Officeworks Print + Create pricing

Officeworks sells print as many products, each with its own price schedule, at `/print-copy/p/<slug>`. This skill reads the ladder a product's price grid shows, for a chosen size, paper stock, siding and colour. It was built and verified against **Flyers** (`flyers-pcdhflcp`) and **Document Prints** (`document-prints-pcdhdpcp`); any other Print + Create slug can be passed through and works where its `pricingType` is one of the composition rules below.

No login, no browser, no cookie.

## Why a plain page read does not work

The grid is a React widget. The page server-renders its Redux slice at `priceTableFetchStatus: "FETCHING"` with `priceTableData: null`, so a DOM dump carries no price, and the rendered table arrives later from a fetch.

But the prices are not in the page's HTML at any point either. The widget composes a SKU per row from the product configuration the page already ships, and asks one endpoint for each. That endpoint is reachable directly:

```
GET https://www.officeworks.com.au/app/pcc-product/api/pricing?<params>
```

(In the page's client bundle this is `rootUrl()` = `/` + `RESOURCE_NAMESPACE` `app/pcc-product` + `/api`, then `/pricing`.)

Verified 2026-09-12: it answers with **no User-Agent, no cookie, no CSRF token and no Referer**. Response `{"totalPrice": <cents>, "items": {"<sku>": {"price": <cents>}}, "permutationPricingSku": <sku|null>}`. A SKU it cannot resolve is HTTP 404 `{"message": "Price not found"}`.

The option tree comes from `window.__INITIAL_STATE__` on the product page (`productReducer.productConfiguration`), which plain curl returns at HTTP 200. The ladder is composed from that tree, so the page's own dropdowns are never driven.

## The composition rules

`productConfiguration.pricingType` picks which. Each was read out of the page's own `client.<hash>.bundle.js`.

**`PERMUTATION`** — Flyers. One `genSku` prices the whole configuration. It is `productShortCode` followed by the `optionKey` of every **non-optional** component that carries an `optionKeyOrder`, concatenated in `optionKeyOrder` order with nothing between them. Flyers is `FY` + Pack Size (`03`) + Finished Size (`09`) + Siding (`12`) + Business Print Paper (`21`) + Template (`84`), so the default DL / 50-pack / single / 120gsm bond / upload is `FY3310S80U`, which prices at 1995 — the same figure the page server-renders into `priceReducer`. The ladder walks the Pack Size component, so **the price is per pack**, and the per-unit figure is the pack price divided by the pack quantity, as the widget does it.

**`ACCUMULATIVE`** — Document Prints. There is no `genSku`; each component option carries its own SKU and the SKUs add up. The Printing component already holds one option per (size, siding, colour, quantity band) — `A4CL1PRNT1` is A4 / colour / single / 1–1000 — so the ladder is those options priced in one call. **The price is per printed side, in quantity bands, not per pack.** The paper stock is a separate charge per sheet on top; the default stock carries no SKU, which is the page's way of saying it is included in the print price.

Passing `--sided double` on Document Prints selects the `2PRNT` band SKUs, whose price is per side as well.

## Calls

```bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/officeworks.com.au/pub-price-ladder.py \
  prices --product flyers --size A5 --paper "120gsm Bond" --sided single

python3 ${CLAUDE_PLUGIN_ROOT}/skills/officeworks.com.au/pub-price-ladder.py \
  prices --product document-prints --size A4 --colour colour --sided single

python3 ${CLAUDE_PLUGIN_ROOT}/skills/officeworks.com.au/pub-price-ladder.py \
  options --product flyers
```

`--product` takes `flyers`, `document-prints`, or any `/print-copy/p/<slug>` path. `--size` is a finished size as the product offers it (Flyers: A3 A4 A5 A6 DL; Document Prints: A3 A4 A5). `--paper` is any substring of a stock's name, and an ambiguous one is refused with the stocks it matched rather than guessed at. `--sided` is `single` or `double`. `--colour` is `colour` or `black & white`, and matters only where the product offers the choice — Flyers has no Print Colour component and prints colour only. An option left unset takes the product's own default.

`options` prints the whole component tree, which is how to find out what a product actually offers before asking for a price.

Python 3 standard library only; no config keys, so nothing under `Prerequisites`.

## Output

The canonical envelope, with the ladder inside `result`. There is no `identity` key: the pages read here are signed-out and the site declares no account to name.

`result.ladder.basis` says which shape came back — `per_pack` (rows carry `quantity`, `pack_price_cents`, `unit_price_cents`, `gen_sku`) or `per_side` (rows carry `quantity_band`, `min`, `max`, `price_per_side_cents`, `sku`). A `per_side` result also carries `result.paper`, the stock's per-sheet charge or the fact that it is included. Money is integer cents, AUD, GST inclusive — the figure the signed-out retail page displays, which its own summary panel labels Inc GST.

A failure — an unreachable page, a size the product does not offer, an ambiguous paper name, a SKU the endpoint 404s — comes back as a fault envelope and exit 65.

## Limits

A signed-in business account with a contract price sees different money; the endpoint takes an `includeContractPricing` parameter for that, and this skill never sends it, so every figure here is the ordinary retail price.

Delivery and same-day-print availability are not priced. `result.product` carries the lead times the page states (`delivery_to_door`, `click_and_collect`) and nothing more.

Products whose `pricingType` is neither `PERMUTATION` nor `ACCUMULATIVE`: unbuilt, undecided. `options` still prints their component tree.

From overseers-desk/magazines, MIT.

More from overseers-desk/magazines

Signals

Stars
1
Forks
0
Open issues
36
Last commit (this folder)
Oct 4, 2026 (25 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from overseers-desk

Cite this page

officeworks.com.au skill. Agent Mart. https://agentmart.dev/skills/overseers-desk-officeworks-com-au (last updated 2026-10-24)