YouCan Store Catalog & Price Scraper avatar

YouCan Store Catalog & Price Scraper

Pricing

from $2.50 / 1,000 products

Go to Apify Store
YouCan Store Catalog & Price Scraper

YouCan Store Catalog & Price Scraper

Products, prices, discounts and variants from any YouCan store (Saudi Arabia, Gulf, Morocco, North Africa). Uses the store's own public product feed - HTTP only, no browser, no key.

Pricing

from $2.50 / 1,000 products

Rating

0.0

(0)

Developer

ABDULWAHAB NASER RASHED ALQARAWI

ABDULWAHAB NASER RASHED ALQARAWI

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a month ago

Last modified

Categories

Share

Products, prices, discounts and variants from any YouCan store — the platform behind thousands of shops in Saudi Arabia, the Gulf, Morocco and North Africa.

Give it a store link. No API key, no login, no browser, no proxy.

tqnyweb.online
https://arabicsouk.shop/products/any-product
youcan.supply

What you get

One row per product, 25 fields, every one always present — missing values come back as null, never dropped.

FieldExample
nameصيانة المايكروويف
price1.0
compareAtPrice2.0
currencySAR
isOnSale / discountPcttrue / 50.0
hasVariants / variantsCounttrue / 12
variantOptionssize: S, M, L, XL
imageUrl / imageCounthttps://cdn.youcan.shop/... / 4

Plus store, productUrl, productId, slug, tracksInventory, description, scrapedAt, and changeType / previousPrice / changedFields / previousValues (filled only with onlyChanges, see below), variants / variantsComplete (filled only with includeVariants), and stockSource (filled only with includeVariantStock).

The right currency. YouCan's product feed does not state a currency, and the storefront's social-media tag is often wrong — on 13 Sep 2026 a Saudi store and a Moroccan store both claimed Kuwaiti dinars there. This Actor reads the currency from the product page's search-engine data instead: SAR for the Saudi stores, MAD for the Moroccan one. When the product page has none, the storefront's settings are used, and only a real ISO 4217 currency code is accepted there — a country code such as SAU is not.

A real discount, not a claimed one. isOnSale is true only when the compare-at price is genuinely above the price. A compare-at price of 0 is not a discount.


Use it for

  • Competitor price monitoring — schedule it with onlyChanges
  • Discount tracking — turn on onlyOnSale, sort by discountPct
  • Product research — see which options and variants a store offers
  • Catalog and market research across Saudi, Gulf and Moroccan stores

Only what changed

Turn on onlyChanges and schedule the Actor. Each run returns only products that are new, or whose price or compareAtPrice changed since the last run. Every row says why: changeType is NEW or UPDATED, and previousPrice holds the price it had before (null for new products). The first run returns every product as NEW. YouCan's feed has no stock level, so stock changes cannot be detected.

An UPDATED row also names what moved in changedFields (["price"], ["compareAtPrice"] or both) and carries both values from before in previousValues, e.g. {"price": 20.0, "compareAtPrice": null}. Both are null on NEW rows and without onlyChanges.

Per product by default. Without includeVariants, prices and changes are the product-level price / compare_at_price, so a price change on one size only is not detected. Turn on includeVariants (below) to watch each variant's price too.

The last known state of each store is kept in a named key-value store in your account (stateStoreName, default youcan-catalog-state). Use a different name for each separate monitor.

A store's state is saved only when its read finished cleanly. If a page fails partway, or the run stops at your spending limit, the old state is kept and those products are compared again on the next run — a change is never skipped, though a product delivered just before the stop can be delivered again.

With onlyChanges on, maxProductsPerStore caps the products checked, not the rows returned; otherwise a store with nothing new would be read to its last page on every run.


Variant prices (includeVariants)

Off by default. When on, the product-list request asks for include=variants — the same request, no extra one per product — and each row gets a nested variants list. Still one row and one charge per product.

{"variantId": "0a9b1f27-...", "options": {"size": "S"}, "price": 249.0,
"compareAtPrice": 299.0, "sku": null, "barcode": null, "weight": null,
"imageUrl": null}
  • Variants are sorted by variantId (then options), so a store that reorders them does not show up as a change.
  • Prices and weights are numbers that are finite and not negative, else null. A compare-at price of 0 is null, as for the product.
  • options holds plain text only: at most 20 options per variant, names up to 100 characters, values up to 200.
  • At most 1000 variants per product. Past that, the first 1000 by variantId are returned and variantsComplete is false.
  • variantsComplete is also false when an entry was malformed, when fewer variants came back than the product's variantsCount, or when the store left the list out — then variants is null, not []: unknown, not empty.
  • A product without options still has one variant; YouCan names its option {"default": "default"}.
  • Without includeVariants, both fields are null.

No stock in the product list. On 22 Sep 2026 the list's variant data of youcan.supply, arabicsouk.shop and tqnyweb.online carried id, options, price, compare-at price, SKU, barcode, weight and image, and no stock quantity or availability. For stock, see includeVariantStock below; nothing is guessed from tracksInventory, prices or counts.

With onlyChanges, a product is also UPDATED when any variant's price or compare-at price moved, or a variant was added or removed. changedFields then includes "variants", and previousValues adds variants — the moved variants with their values from before and a status of CHANGED, ADDED or REMOVED, at most 50 — and variantChangesTotal, the full count. A variant counts as added only if the previous list was complete, and as removed only if the current one is — past the 1000 cap it may just be out of view. If the store leaves the list out on one run, nothing is claimed and the last known variants are kept.

Variant snapshots are kept under their own key per store, so turning includeVariants on or off never disturbs the other mode's history — but the first run with it on returns every product as NEW.

onlyOnSale still looks at the product-level price only.


Variant stock (includeVariantStock)

Off by default, and needs includeVariants — the run stops with an input error otherwise. The product list has no stock, but each product's public page does: its theme embeds each variant's inventory and available. When on, the Actor reads that page — one extra request per product, still one row and one charge per product — and adds two fields to every variant:

  • inventoryQuantity — only when the product tracks inventory (tracksInventory: true) and the page gives a whole number of 0 or more. Without tracking the page can say 0 for a variant it still marks available (arabicsouk.shop, 22 Sep 2026), so it is null, not "sold out".
  • inStock — the page's own available flag, true or false, even without tracking. null when the page does not give it.

stockSource on the row is the page they came from.

The page is read as data, never run: three theme layouts are recognised, as seen on youcan.supply, arabicsouk.shop and tqnyweb.online on 22 Sep 2026. A product page also lists related products' variants, so a variant's stock is taken only when its own product_id is the product in the row.

The page is requested only if it is on the store's own domain under /products/, and robots.txt allows it; it goes through the same public-address check as every request. If it is blocked, fails, redirects elsewhere, is over 5 MB, or uses a layout not recognised, that product's stock fields and stockSource are null and the run goes on. Products onlyOnSale drops and products without variant data are not requested.

With onlyChanges, a change in a variant's inventoryQuantity or inStock makes the product UPDATED (changedFields includes "variants", and the moved variants in previousValues carry their stock from before). A value counts only when it is known on both runs: a page that fails, or a value that goes missing, is never reported as a change, and the last known value is kept. Stock history is kept under its own key per store, so the first run with this option on returns every product as NEW, and price-only monitors are not touched.

Speed. One page per product, 0.2 s apart: a 1000-product store takes several minutes more than without stock.


Speed

Measured 13 Sep 2026: three stores, 34 products, 9 seconds — 50 products per request.


Honest notes

Stock quantities are not in the feed. YouCan's product list says whether a product tracks inventory (tracksInventory), not how many are left. Variant stock comes only from the product page, with includeVariantStock; there is no product-level stock field.

robots.txt is read first. If a store disallows its product feed, that store is skipped and named in the run report.

Only what the store publishes. The feed is the one the store's own theme reads. Hidden and draft products are never collected. No customer data exists in it.

A store that yields nothing is named in the run's status message and under notReached in the run report — a link that is not a YouCan store is reported, not silently dropped.

One odd product never fails the run. It is skipped and counted under skippedProducts.

maxProductsPerStore counts rows returned. Products filtered out by onlyOnSale do not use it up (see onlyChanges above for the one exception).

A cut-short store is flagged, not passed off as complete. If a later page of a store's feed fails, the store is marked truncated: true in the run report and named in the status message. A store that answers "too many requests" is retried once, after the wait it asks for (at most 10 seconds).

Every run publishes a report to the key-value store under RUN_REPORT: products, currency and truncated per store, requests, and stores not reached.


Questions, or a store that returns nothing?

Open an issue with the store link.