officeworks.com.au
Officeworks printing prices: flyer and document-print quantity ladders, per size, paper stock, siding and colour.
Skill by overseers-desk
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.
About
Use cases: documents, research, finance
Reviews
Write a reviewNo 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
- 0.580score
ndis.gov.au
overseers-desk
Australia's official NDIS provider register: search registered disability providers by suburb/postcode and radius, or confirm whether a named provider (or…
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
ihg.com
overseers-desk
Anonymous hotel availability, pricing and search; plus logged-in IHG One Rewards member data (your own stays, bookings, points and reward activity) via…
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
interlinetravel.com.au
overseers-desk
Interline Travel cruise deals at industry staff rates on interlinetravel.com.au: prices, availability, interline rates, search.
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
marriott.com
overseers-desk
find hotel properties near a destination, lookup by property code; info (name, brand, address, coords, images, reviews).
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
premierinn.com
overseers-desk
Premier Inn (Whitbread) hotel room availability, live nightly pricing, room-type inventory, rate plans (Flex/Standard/Non-Flex), occupancy rules.
SkillAFreshness: A★ 1Claude Code +9 - 0.543score
linkedin
overseers-desk
search people, and search inside named members' connections, read profiles, read a job posting, check keywords, verify connect eligibility, find role/company.
SkillBFreshness: B★ 1Claude Code +9 - 0.540score
hainanairlines.com
overseers-desk
Hainan Airlines (HU) fares and flight availability by route and date: international itineraries priced per cabin, China domestic schedules with seat counts.
SkillBFreshness: B★ 1Claude Code +9 - 0.540score
kiwi.com
overseers-desk
Cheapest flights across airlines that do not interline, including self-transfer combinations no airline or OTA sells, priced for the whole party.
SkillBFreshness: B★ 1Claude Code +9 - 0.540score
facebook
overseers-desk
find posts in a group or across Facebook by keyword; search people, read profiles, extract hashtags and tagged people, dump reel comments, audit group-post…
SkillBFreshness: B★ 1Claude Code +9 - 0.540score
beatthatflight.com.au
overseers-desk
Cheapest fares on any route worldwide, shopped across dozens of online agencies at once: one-way, return or multi-city, with the agency's booking link.
SkillBFreshness: B★ 1Claude Code +9 - 0.540score
csair.com
overseers-desk
China Southern (CZ) fares and itinerary availability by route and date, including China domestic + international through-fares OTAs do not price.
SkillBFreshness: B★ 1Claude Code +9 - 0.540score
otter.ai
overseers-desk
Otter.ai recordings: list, rename, trash, fetch speaker-labelled transcripts, and download mp3 audio from a logged-in Otter account.
SkillBFreshness: B★ 1Claude Code +9
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
- Repository
- github.com/overseers-desk/magazines
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from overseers-desk
- 0.580score
premierinn.com
overseers-desk
Premier Inn (Whitbread) hotel room availability, live nightly pricing, room-type inventory, rate plans (Flex/Standard/Non-Flex), occupancy rules.
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
ndis.gov.au
overseers-desk
Australia's official NDIS provider register: search registered disability providers by suburb/postcode and radius, or confirm whether a named provider (or…
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
ihg.com
overseers-desk
Anonymous hotel availability, pricing and search; plus logged-in IHG One Rewards member data (your own stays, bookings, points and reward activity) via…
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
interlinetravel.com.au
overseers-desk
Interline Travel cruise deals at industry staff rates on interlinetravel.com.au: prices, availability, interline rates, search.
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
marriott.com
overseers-desk
find hotel properties near a destination, lookup by property code; info (name, brand, address, coords, images, reviews).
SkillAFreshness: A★ 1Claude Code +9 - 0.543score
linkedin
overseers-desk
search people, and search inside named members' connections, read profiles, read a job posting, check keywords, verify connect eligibility, find role/company.
SkillBFreshness: B★ 1Claude Code +9
Cite this page
officeworks.com.au skill. Agent Mart. https://agentmart.dev/skills/overseers-desk-officeworks-com-au (last updated 2026-10-24)