UAE Fragrance Catalog — Ajmal & Swiss Arabian avatar

UAE Fragrance Catalog — Ajmal & Swiss Arabian

Pricing

from $3.00 / 1,000 ajmal product or swiss arabian variant rows

Go to Apify Store
UAE Fragrance Catalog — Ajmal & Swiss Arabian

UAE Fragrance Catalog — Ajmal & Swiss Arabian

Compare public AED fragrance prices, sizes, variants and availability across Ajmal UAE and Swiss Arabian UAE.

Pricing

from $3.00 / 1,000 ajmal product or swiss arabian variant rows

Rating

0.0

(0)

Developer

Vixendata

Vixendata

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Share

UAE Fragrance Catalog: Ajmal and Swiss Arabian

Build a comparable AED catalog across two UAE perfume retailers, with SKU, size, price, original listed price, public availability and rating scale preserved. Useful for assortment comparisons and checking public price changes by rerunning saved inputs and comparing exports.

This is one cross-brand dataset: Ajmal's Next.js catalog and Swiss Arabian's Shopify variants are normalized without treating them as interchangeable source formats.

Quick start

The default input requests two known product pages, one per source, and returns three rows with the sampled catalog: one Ajmal product and two Swiss Arabian variants. For a small hosted smoke run:

{
"productUrls": [
"https://en-ae.ajmal.com/alf-laila-o-lail-spray",
"https://uae.swissarabian.com/products/shaghaf-oud-azraq"
],
"maxProducts": 2,
"maxPages": 1,
"maxRequests": 4
}

Results go into the default dataset (CSV/JSON exports in Apify). The OUTPUT key-value record contains request statuses, errors, stopped sources, attempted product pages and record count. No records causes a failed run; partial results carry explicit OUTPUT errors. Always inspect OUTPUT when checking completeness.

Inputs and discovery

  • productUrls: up to 50 canonical product URL strings on the two supported HTTPS UAE hosts. No queries, tracking, variant parameters, encoded paths, credentials or alternate hosts. All public variants are returned from a supplied Swiss Arabian product.
  • maxProducts: total product-page cap, default 2, hard maximum 50. Variant rows can exceed this number.
  • maxPages: Swiss Arabian collection page cap, default 1, maximum 5.
  • maxRequests: all HTTP requests, including robots, discovery and redirects; default 8, maximum 100. No retries.
  • discoverAjmal: default false. Read the fixed public Ajmal product sitemap and take remaining product capacity. Image sitemap URLs are excluded.
  • swissCollectionUrl: optional plain UAE collection URL, such as https://uae.swissarabian.com/collections/shaghaf. Follows only page links actually exposed as “Next” or rel=next, with loop detection. Current robots rules reject prohibited collections.

Explicit URLs get capacity first. Ajmal discovery fills remaining capacity before Swiss discovery. Omit productUrls or set it to [] for discovery-only; set maxProducts high enough to include both brands if combining discovery methods. This ordering makes output deterministic rather than claiming equal sampling of the brands. When either discovery option is selected, an omitted or empty productUrls field starts with no sample seeds. Without discovery, an omitted field retains the two-product sample behavior. The UI prefill is only a suggestion; clear it for discovery-only.

What the sources mean

Ajmal UAE: Parses expanded product objects embedded in the public page's React Flight scripts using JSON decoding, never JavaScript evaluation. Matches the requested URL key so recommendations are not returned. Tested for simple products; configurable/bundle products and unequal price ranges are rejected rather than flattened into an invented variant price. Missing or reference-only Flight data produces an explicit error.

Ajmal's rating_summary is a 100-point value: a raw 100 means 100/100, not 100 stars. regular_price is retained as originalPrice even when identical to the current price; equality does not imply a discount. Size and concentration come from explicit display attributes.

Swiss Arabian UAE: Reads the public embedded product/variant object, with an independent Shopify variant SKU/price cross-check when available. Emits a row per variant. A 75 ML variant and 25 ML variant keep their distinct prices and IDs. compareAtPrice is originalPrice only when explicitly supplied; absent comparison prices stay null. Ratings are shown on a five-point scale only when the page explicitly contains the widget's “out of 5” label. No automatic conversion to a cross-source star score is applied.

Output fields

  • source: ajmal or swiss_arabian; brand: display brand
  • productId, variantId, sku: source identifiers as strings; null if absent
  • title, productUrl, variantUrl: product title and source URLs; variantUrl is informational and never fetched
  • price, originalPrice, currency: numeric AED amounts; missing values null, no inferred discounts
  • size, concentration: explicit source fields only; Swiss concentration currently null
  • availability, inStock: merchant's public offer status, not verified warehouse quantity, store-level inventory or delivery promise
  • imageUrls: source images; not downloaded
  • ratingRaw, ratingScale, ratingScaleDescription, reviewCount: preserve original scale and aggregate counts
  • fragranceNotes: Ajmal's explicitly named top/heart/base ingredients; Swiss currently null rather than untested prose extraction
  • scrapedAt: UTC extraction timestamp

No reviewer names, review text, hidden APIs, account information, inventory counts or checkout data are collected into output.

Respectful limits

Requests are serial. Ajmal spacing is at least 10 seconds, Swiss Arabian at least 2 seconds; longer published crawl-delay or Request-rate intervals win. Every used host's robots.txt is checked first. Empty/malformed/unavailable policies fail closed. Wildcards and Allow/Disallow precedence are supported.

HTTP 401, 403, 429 and recognized challenge pages stop that source. No custom/paid proxy, login, CAPTCHA solving, retry, API access or access-control workaround. Redirects are manually validated, same-host only, at most two; robots redirects must remain the canonical robots path. Each response is capped at 8 MB and has a 25-second network timeout. Discovery/search/filter/API paths are restricted. Website rules can change; the Actor fails conservatively and reports errors.

Defaults are intended for a small sub-120-second smoke run, not guaranteed latency. Large Ajmal runs necessarily take much longer because of its pacing. Set a matching hosted timeout and keep caps low during testing.

Verified scope and testing

On 2026-10-06, one live product per brand plus both robots files returned HTTP 200 in a four-request bounded check. The Ajmal sample yielded AED 115.50 / 60 ml. Swiss Arabian yielded AED 240 / 75 ML and AED 110 / 25 ML. This is sample validation, not whole-site coverage.

The original public HTML/XML fixtures include Ajmal's 1,146-entry product sitemap, Ajmal product HTML, Swiss Arabian product HTML and one collection page. Collection page 2's link is tested against the fixture; page 2 itself has not been fetched. Sitemap entries are not a guarantee of current availability.

Local parser and safety tests use Python's standard library:

python -m unittest discover -s tests -v

Runtime needs the Apify Python SDK (requirements.txt). Local fixture tests do not need SDK installation. Source HTML fixtures stay outside the container build. No hosted build/run or marketplace publication is claimed by local tests.