Catalog / Retail, marketplaces & classifieds
RETAIL, MARKETPLACES & CLASSIFIEDS · CANADA
Staples Canada Store Stock & Clearance Tracker
Staples Canada in-store stock near a postal code: one row per product and store with the live unit count, distance, regular and sale price, discount and clearance flag.
About this data
Staples Canada in-store stock near a postal code: one row per product and store with the live unit count, distance, regular and sale price, discount and clearance flag. Look up SKUs or product links, or list clearance, sale, search or category items; track restocks and price drops.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/ca/staples/stock
Check up to five Staples Canada SKUs at up to four nearby stores, at most 20 product-store rows.
Returns published pickup quantities, stock status, pickup messages, store addresses and distance.
Product names, brands, links, photos and online retailer prices are included when the search index supplies them; priceScope identifies that price context.
No ongoing change ledger or product page crawl.
Input
Send a JSON body to POST https://api.ssh.autos/v1/ca/staples/stock.
| Field | Type | Required | Notes |
|---|---|---|---|
postalCode | string | optional | 6–7 characters; default "M5V 3L9" |
products | array of strings | optional | up to 5 items; default ["31307"] |
maxStores | integer | optional | 1–4; default 2 |
Returned fields
The answer is JSON: records, a list, and summary, the run status and counts. Each record has these 36 fields; a field the source does not publish comes back null.
36 fields per record
| Field | Type | Notes |
|---|---|---|
productId | string | Staples product id (Shopify product), as listed. |
variantId | string | Staples variant id of this item, as listed. |
sku | string | Staples item number (SKU). |
brand | string | Brand as listed. |
url | string | Product page on staples.ca. |
image | string | Main product image link. |
storeId | string | Staples store number. |
storeName | string | Store name as the store locator gives it. |
address | string | Store street address. |
city | string | Store city. |
province | string | Store province code, for example ON. |
postalCode | string | Store postal code. |
latitude | number | Store latitude. |
longitude | number | Store longitude. |
distanceKm | number | Straight-line distance in km from the search point (the exact point given, or the centre of the postal code area) to the store. |
storeUrl | string | Store page on stores.staples.ca. |
quantity | integer | Units available for in-store pickup at this store, as Staples states it. Null when Staples gives no unit count for the pair, and on a row that is no longer listed (changeType gone). |
stockStatus | string | in_stock when quantity is above zero, out_of_stock at zero, null when no unit count is published, and not_listed on a gone row for a product that left the completed, unchanged product selection. one of in_stock, out_of_stock, not_listed |
pickupMessage | string | Pickup message exactly as Staples sends it, including its own spacing (currently always in French, for example 'Prêt en 2 h'). |
regularPrice | number | Published regular reference price in CAD; it may equal the current price or be unavailable. |
salePrice | number | Current online price in CAD. Staples prices are national; a store may differ at the till. |
currency | string | CAD when a price is present. one of CAD |
priceScope | string | Price context: Staples' retailer-wide online current and regular-reference prices. A store may charge a different till price. Gone rows can retain last-observed prices; scope alone does not assert a… one of retailer_online |
priceStoreId | string | Shop whose specific price was observed. Always null for this actor: per-store stock is observed, shop-specific pricing is not. one of |
discountPct | number | Derived percent difference between the current regular reference and sale price, only when the regular reference is higher. Not an observed historical or pre-clearance price drop; otherwise null. |
clearance | boolean | True when Staples marks the item as clearance; null when product details could not be read. |
saleLabels | array of strings | Sale, clearance and promotion tags Staples attaches to the item, verbatim (for example clearance_centre|en_CA). |
productDetails | string | How complete the product details are: full (name, brand, image, regular and sale price, clearance flag), basic (name and current price only, when the full details were unavailable this run), or null… one of full, basic |
observedAt | string | When this run read the stock (UTC, ISO 8601). |
changeType | string | Changes mode only: new, backInStock, outOfStock, stockChanged, priceChanged or gone. gone means the product left the same clearance, search or category listing (same search words, category and filter… one of new, backInStock, outOfStock, stockChanged, priceChanged, gone |
changeTypes | array of strings | Changes mode: every change seen on this row (a row can both restock and drop in price). gone appears only when the product left the same unchanged listing that this run read to the end. Empty in full… |
previousQuantity | integer | Changes mode: units at the last run, on stock changes and gone rows. |
previousPrice | number | Changes mode: sale price at the last run, on price changes and gone rows. |
priceDropFromLastSeen | number | Changes mode: how many CAD the price fell since the last run; null when it did not fall. |
firstSeenAt | string | Changes mode: first run that saw this product at this store. |
lastSeenAt | string | Changes mode: this run, or on a gone row the last run that saw it. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/ca/staples/stock -m POST -b '{"products": ["31307"], "postalCode": "M5V 3L9", "maxStores": 1}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: Staples Canada Store Stock & Clearance Tracker. Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt