Ecommerce scraping & enrichment

Product data & answers.On autopilot. No infrastructure to run. Connected across stores.

AI writes a crawler for each store and turns its pages, or your files, into clean, matched product data. Then let your agent run it all, from the first crawl to the answers.

Start for free · No credit card · Plans from $30/month

See how it works first:Follow 1 shoe through Extralt

From store pages to answers, in 3 steps.

Extract, Enrich and Explore are the 3 shapes in our logo: collect the pages, turn them into one clean, matched dataset, then get answers from it.

  1. 01  Extract

    Collect product data. Skip the scraper upkeep.

    AI writes a crawler for each website and proves it on real pages; then it runs as plain code whenever you choose. Each product page becomes a Capture: what the page said, its URL and when it was seen.

    Product pagetempo.example

    Homme › Chaussures › Baskets

    NIKE Air Max 90 Black

    134,99 €

    Taille 42

    En stock

    Livraison offerte dès 50 €

    Ajouter au panier

    ↳ 1 Capture · /products/airmax90-black-42 · 1 Sep 09:00

  2. 02  Enrich

    Different stores. Comparable products.

    AI turns each Capture into an Item: clean fields in English, one price format, a standard category. Items are then matched across stores into products, variants, listings and offers, with their reviews and changes.

    Itemtempo.example

    brand
    NIKE → Nike
    size
    Taille 42 → EU 42
    price
    134,99 € → €134.99
    stock
    En stock → In stock
    category
    Sneakers

    ↳ Nike Air Max 90 · Black · EU 42 · 3 offers

  3. 03  Explore

    Your product data. Answers you can inspect.

    4 Analyses of the data you collect: price position, price movements, availability changes and assortment overlap. For anything else, ask the agent: it queries your data and shows its work. Each number links back to the pages it came from.

    Price position7 Sep

    −5.5%

    Air Max 90 at north.example against the median of field and tempo

    ↳ 3 offers · 3 pages

Under the hood

Written by AI. Run as code.

AI studies each store once, writes its crawler and proves it on real pages before your first run. Every page after that runs through compiled code, not a model, so extraction never invents a value. Here is the crawler for tempo.example, the third store in the walkthrough.

tempo.example · FRcrawler v2
  1. # reverse-engineer the API

    1. detectplatformcustom storefront✓
    2. recordproduct pageloaded twice · 41 requests✓
    3. selectproduct APIGET /api/v2/products/{id} · JSON✓
    4. replayover HTTP200 · same fields✓
  2. # write the crawler

    1. mapcatalogsitemap + 18 categories · 12,480 products✓
    2. generateextractorRust · 26 fields✓
    3. compilereleasenative library · no model per page✓
  3. # prove it

    1. validate3 live pages26/26 fields on each✓
    2. checkprovenanceevery value found on its page✓
    3. readycrawler v1
  4. # run · 1 Sep 09:00 UTC

    1. routeFR residentialexit country FR✓
    2. fetch12,480 productsvia the store API, over HTTP
    3. retry37 challengesnew fingerprint and IP✓
    4. done12,316 Captures164 pages failed, no credits✓
  5. # redesign · 3 Nov

    1. score3 Nov run14% accepted · below 20%✕
    2. stoprun pausedrejected pages not written
    3. rebuildcrawler v2new product template · 3/3 pages✓
    4. resume3 Nov run12,402 Captures✓
Example build. Every crawler goes through these stages.
  1. detect · record · select · replay

    Reverse-engineers the store’s API.

    We load a product page, record every request it makes and find the internal API that returns the product: the same one the store’s own frontend calls. Replayed over plain HTTP, it gives the full product in clean JSON, and changes less often than a page layout. Shopify, WooCommerce and Wix have native routes; embedded JSON comes next, HTML last.

    # reverse-engineer the API

    1. detectplatformcustom storefront✓
    2. recordproduct pageloaded twice · 41 requests✓
    3. selectproduct APIGET /api/v2/products/{id} · JSON✓
    4. replayover HTTP200 · same fields✓
  2. map · generate · compile

    Writes a crawler for this website.

    A model maps the catalog and writes the extraction code once, in Rust. It compiles to a native library, so every page after that runs as plain code: no model call per page, and the same page always gives the same record.

    # write the crawler

    1. mapcatalogsitemap + 18 categories · 12,480 products✓
    2. generateextractorRust · 26 fields✓
    3. compilereleasenative library · no model per page✓
  3. validate · check

    Proves it on real pages.

    Before your first run, the crawler has to extract every required field from 3 live product pages. Each value must come from the page itself: a crawler that invents or hard-codes a value does not ship.

    # prove it

    1. validate3 live pages26/26 fields on each✓
    2. checkprovenanceevery value found on its page✓
    3. readycrawler v1
  4. route · fetch · retry

    Collects from inside the market.

    Residential IPs in the store’s country, with the exit country checked. Each page comes from the store’s reverse-engineered API, or over plain HTTP where there is none. Cloudflare, DataDome, Akamai and other anti-bot challenges are detected and retried with a new fingerprint and IP.

    # run · 1 Sep 09:00 UTC

    1. routeFR residentialexit country FR✓
    2. fetch12,480 productsvia the store API, over HTTP
    3. retry37 challengesnew fingerprint and IP✓
    4. done12,316 Captures164 pages failed, no credits✓
  5. score · rebuild · resume

    Heals when the site changes.

    Every run scores what it extracts. When a redesign breaks the crawler, the run stops before bad records reach your data, and AI rebuilds it, proves it again and puts it back to work.

    # redesign · 3 Nov

    1. score3 Nov run14% accepted · below 20%✕
    2. stoprun pausedrejected pages not written
    3. rebuildcrawler v2new product template · 3/3 pages✓
    4. resume3 Nov run12,402 Captures✓

Standardized

One schema for every store.

Whatever the site, every crawler writes the same fields: Captures your applications can use as they are. Enrich then puts them in one language, one format per value and one taxonomy, the model Explore matches and compares on.

Each field as the 3 stores wrote it, and as Enrich standardizes it
FieldAs the 3 pages wrote itItem
titlenorth.example: Nike Air Max 90 - Blackfield.example: Air Max 90 / Blacktempo.example: NIKE Air Max 90 BlackNike Air Max 90 · Black · EU 42
brandnorth.example: Nikefield.example: Niketempo.example: NIKENike
sizenorth.example: Size 42field.example: EU42tempo.example: Taille 42EU 42
pricenorth.example: €139.99field.example: 139,99 EURtempo.example: 134,99 €€139.99 · €139.99 · €134.99
availabilitynorth.example: In stockfield.example: availabletempo.example: En stockIn stock
categorynorth.example: Men › Shoes › Trainersfield.example: Sneakerstempo.example: Homme › Chaussures › BasketsApparel & Accessories › Shoes › Sneakers

Captures keep each page’s own words. Items classify every product into Shopify’s open Standard Product Taxonomy (2026-05): 14,606 categories, each with its own attributes, 19 for sneakers.

Browse the taxonomy

Your data

Ready to query. No warehouse to run.

Every Capture, Item and offer lands in ClickHouse, organized as products, variants, listings and offers. Read it from the dashboard, your code or your agent, at no credit cost.

Example data

RequestGET

$ curl -G https://api.extralt.com/v1/explore/analyses/price-position \
    -H "Authorization: Bearer $EXTRALT_API_KEY" \
    -d reference_store_id=$NORTH -d country=FR -d currency=EUR

More of v1

GET  /v1/explore/analyses/price-position
GET  /v1/explore/analyses/price-movements
GET  /v1/explore/analyses/availability-changes
GET  /v1/explore/analyses/assortment-overlap
GET  /v1/explore/variants/{variant_id}/history
POST /v1/extract/robots
POST /v1/extract/schedules
POST /v1/enrich/enrichments
GET  /v1/extract/captures/export

Response200 · application/json

{
  "analysis_id": "price_position",
  "status": "eligible",
  "data": [{
    "title": "Nike Air Max 90",
    "options": { "color": "Black", "size": "EU 42" },
    "reference_store_host": "north.example",
    "reference_price": "129.99",
    "comparison_median_price": "137.49",
    "delta_to_median_percent": "-5.454942",
    "reference_evidence": {
      "url": "https://north.example/products/air-max-90-black-42",
      "observed_at": "2026-09-07T09:00:00Z"
    }
  }],
  "next_cursor": null
}

REST API. Every Analysis, variant, offer and price history is a v1 route, with an OpenAPI spec. Runs, schedules and exports too.

OpenAPI spec

Pricing

From $1 per 1,000 pages. However hard the site.

1 credit extracts a product page and 1 more enriches it: on Scale 1M, $2 per 1,000 pages for both. Only product pages use credits: sitemaps and catalog pages, residential IPs, protected sites and failed pages cost nothing.

tempo.example · FR · 1 Sep run12,480 product pages
Product pages extracted
12,316 credits
Product pages enriched
12,316 credits

Included0 credits

  • Sitemap and 312 catalog pages
  • Residential IPs in FR
  • 37 anti-bot retries
  • 164 failed pages
  • Store API reverse-engineering
  • Crawler build and repairs
  • Storage, API, SDKs and MCP

24,632credits usedof 50,000

Scale 50k · $100/month · 25,368 credits left for other runs

Nothing to configure.

A crawler takes a URL and a country. We reverse-engineer the store’s API and choose each page’s route, IP and retries, and the price does not move with any of them.

POST /v1/extract/robots
{
  "url": "https://tempo.example",
  "country_code": "FR"
}

Cheap to run, by design.

AI writes each crawler before your first run, around the store’s own API where it has one. Every run after that is compiled code over plain HTTP: no browser and no model per page. So one price covers every page, and a failed page costs you nothing.

Choose your monthly credits.

Every plan uses the same 2 credits per page. Start is free, with 3,000 credits once. Scale runs from $30 to $1,000 a month, and larger plans pay less per credit.

Start

Free

No credit card required

  • 3,000 credits, valid for 30 days
  • Shopify, WooCommerce and Wix stores
  • One run at a time

What this covers

Extract only
3,000 pages
Extract + Enrich
1,500 pages

Scale

$100/month

$2.00 per 1,000 credits

  • 50,000 credits a month
  • Custom crawlers for your stores, built and repaired by us
  • Unlimited concurrent runs
  • Dashboard Agent included
  • Extra credits at $2.00 per 1,000

What this covers each month

Extract only
50,000 pages
Extract + Enrich
25,000 pages

Business

Coming soon

Our lowest price per credit

FAQ

Questions before you start.

Start with your stores

You pick the stores. We build the crawlers.

Add a public product or catalog URL and choose its market. Start’s 3,000 free credits cover 1,500 pages, extracted and enriched.

Start for free · No credit card · Plans from $30/month