Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Online Store Intelligence API page →
E-commerce & Marketplaces

Online Store Intelligence API & Scraper

Online Store Intelligence API returns live Online Store Intelligence data as clean JSON for online store intelligence The primary endpoint, store_lookup, returns platform data including name, confidence, ecommerce confirmed, supported and partial.

3 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

Developers reach for it when they need to track product listings, prices, availability, variants and reviews without maintaining one-off scraping code or separate API contracts. If you were about to build or fix a Online Store Intelligence scraper, this API is the maintained alternative — it returns the same data as clean JSON, with the proxies, rotation and anti-bot handling already solved. This page covers the live example, request shape, response shape and available actions: store_lookup, platform_detect, batch. Every request uses the same ReefAPI envelope, one API key and one shared credit pool, so it fits alongside the rest of your data stack.

Reference

Platform verdicts, and what each one unlocks

Two fields decide how much of the response you get: platform.name and platform.supported. Detection is broad, catalog harvesting is not, and the response says so rather than handing back an empty catalog. Values below are measured against allbirds.com, gymshark.com, barefootbuttons.com, amazon.com and a domain that does not exist — which store_lookup now answers with NOT_FOUND rather than with an empty success.

FieldMeasured valueWhat to know
platform.nameshopify / woocommerce / unknownthe enum also lists magento, bigcommerce, prestashop and custom_or_unknown; we verified the first three live
platform.confidence + evidence0.98 with "shopify_public_json_live"; 0.9 with "technographic:woocommerce"; 0.0 with "tech_detect_unavailable"0.98 means the store's own public JSON answered; 0.9 means a technology fingerprint only
platform.supported / partialshopify true and false; woocommerce false and truesupported false means detection worked and catalog harvesting will not run
catalog.availablefalse, with reason "catalog depth is Shopify-only; this store is 'woocommerce'"on a non-Shopify store the catalog block is a one-line refusal, not an empty product array
catalog_sample.size vs products[]size 50 returned 25 products; size 120 returned 25 productsthe distribution stats cover the whole sample, the returned array is capped at 25 rows
catalog_estimate.estimate_source"partial_sample_more_available" in basic; "full_storefront_walk" in catalog modetotal_products_estimate stays null until a full walk finishes; allbirds.com resolved to 120 products
catalog_estimate.collections_count250 on both Shopify stores measuredthe identical figure on two unrelated stores reads as a ceiling, not a count
reputation.trustpilottrust_score 3.4 with stars 3.5; trust_score 0.0 with reviews_count 0trust_score is the fine-grained figure and stars the rounded display; found:true does not mean reviewed
presence.policies_conventionfour /policies/... URLs, but only for a Shopify storefront that was actually reachedconstructed from Shopify's URL convention and not fetched; the response note says "not verified live"
store_info.domain"us.checkout.gymshark.com" for input gymshark.comthis is the domain the Shopify store declares about itself, not the host you asked about

mode is the credit dial. basic samples the storefront's first page, catalog walks pages until max_items (1 to 1000, default 250), and rich adds Trustpilot rating_distribution, is_claimed and sample_reviews plus a Google Maps attempt. In our measurements rich populated neither presence.serp nor presence.social_links on either store; both stayed empty. For a full product export the response itself points you at the shopify engine instead.

Live example

Real request and response JSON

Captured from the indexed primary action, store_lookup, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/enrich-store/v1/store_lookup",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "store": "allbirds.com"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "enrich-store",
    "endpoint": "store_lookup",
    "mode": "basic",
    "latency_ms": 4649,
    "record_count": 5,
    "bytes": 0,
    "cache_hit": false,
    "completeness_pct": 100,
    "subcalls": [
      {
        "api": "domain-intel",
        "action": "tech_detect",
        "status": "ok",
        "latency_ms": 2354.2
      },
      {
        "api": "shopify",
        "action": "store_info",
        "status": "ok",
        "latency_ms": 2432.7
      },
      {
        "api": "shopify",
        "action": "products",
        "status": "ok",
        "latency_ms": 1089.5
      }
    ],
    "charged_credits": 8,
    "version": "1.0.0"
  },
  "data": {
    "provenance": {
      "platform": {
        "status": "matched",
        "engine": "shopify+domain-intel"
      },
      "tech": {
        "status": "matched",
        "engine": "domain-intel"
      },
      "catalog": {
        "status": "matched",
        "engine": "shopify"
      },
      "reputation": {
        "status": "matched",
        "engine": "trustpilot"
      },
      "presence": {
        "status": "matched",
        "engine": "shopify+google-search"
      }
    },
    "platform": {
      "name": "shopify",
      "confidence": 0.98,
      "ecommerce_confirmed": true,
      "evidence": "shopify_public_json_live",
      "technologies": [
        "Cloudflare",
        "Google Tag Manager",
        "Shopify"
      ],
      "supported": true,
      "partial": false
    },
    "store_info": {
      "name": "Allbirds",
      "domain": "www.allbirds.com",
      "myshopify_domain": "weareallbirds.myshopify.com",
      "currency": "USD",
      "description": "The world’s most comfortable shoes, made with natural materials like merino wool, eucalyptus tree fiber, and sugar cane, Allbirds has created the comfiest shoes on the planet.",
      "country": "US",
      "province": "California",
      "city": "Beverly Hills",
      "store_url": "https://www.allbirds.com"
    },
    "tech": {
      "technologies": [
        "Cloudflare",
        "Google Tag Manager",
        "Shopify"
      ],
      "cdn": [
        "Cloudflare"
      ],
      "server": "cloudflare",
      "http_status": 200
    },
    "catalog": {
      "catalog_sample": {
        "size": 50,
        "products": [
          {
            "title": "[trimmed-depth]",
            "handle": "[trimmed-depth]",
            "vendor": "[trimmed-depth]",
            "type": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "price_min": "[trimmed-depth]",
            "price_max": "[trimmed-depth]",
            "on_sale": "[trimmed-depth]",
            "max_discount_percent": "[trimmed-depth]",
            "available": "[trimmed-depth]",
            "total_variants": "[trimmed-depth]",
            "image": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "handle": "[trimmed-depth]",
            "vendor": "[trimmed-depth]",
            "type": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "price_min": "[trimmed-depth]",
            "price_max": "[trimmed-depth]",
            "on_sale": "[trimmed-depth]",
            "max_discount_percent": "[trimmed-depth]",
            "available": "[trimmed-depth]",
            "total_variants": "[trimmed-depth]",
            "image": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "handle": "[trimmed-depth]",
            "vendor": "[trimmed-depth]",
            "type": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "price_min": "[trimmed-depth]",
            "price_max": "[trimmed-depth]",
            "on_sale": "[trimmed-depth]",
            "max_discount_percent": "[trimmed-depth]",
            "available": "[trimmed-depth]",
            "total_variants": "[trimmed-depth]",
            "image": "[trimmed-depth]"
          }
        ],
        "price_range": {
          "min": 0.8,
          "max": 160,
          "median": 105,
          "avg": 94.54,
          "currency": "USD"
        },
        "discount_ratio": 0,
        "avg_discount_percent": null,
        "in_stock_ratio": 0.36,
        "stock_signals": {
          "on_sale": 0,
          "in_stock": 18,
          "sampled": 50
        },
        "top_vendors": [
          {
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          }
        ],
        "top_product_types": [
          {
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]"
          }
        ]
      },
      "catalog_estimate": {
        "total_products_estimate": null,
        "estimate_source": "partial_sample_more_available",
        "collections_count": 250,
        "note": "estimate from store metadata/collections — NOT a full harvest; use the shopify engine with max_items for a complete product pull"
      },
      "sampled": 50,
      "has_more": true
    },
    "reputation": {
      "trustpilot": {
        "found": true,
        "business_unit_id": "5ba28e8dafa8530001888470",
        "domain": "allbirds.com",
        "name": "Allbirds",
        "trust_score": 3.3,
        "stars": 3.5,
        "reviews_count": 2683,
        "categories": [
          "Shoe Store",
          "Clothing Store"
        ],
        "match_type": "domain"
      }
    },
    "presence": {
      "store_url": "https://allbirds.com",
      "policies_convention": {
        "privacy": "https://allbirds.com/policies/privacy-policy",
        "terms": "https://allbirds.com/policies/terms-of-service",
        "refund": "https://allbirds.com/policies/refund-policy",
        "shipping": "https://allbirds.com/policies/shipping-policy"
      },
      "social_links": {},
      "serp": [],
      "note": "policy URLs are Shopify storefront conventions (not verified live); social links are brand-keyed SERP hits"
    }
  }
}
Actions

What the Online Store Intelligence API does

ActionDescriptionConcrete use caseKey params
store_lookupstore domain → platform verdict + store metadata + tech-stack + catalog sample (price/discount/stock signals) + reputation (mode-scaled depth)Pricing teams call store_lookup to get store domain → platform verdict + store metadata + tech-stack + catalog sample (price/discoun….store, mode, max_items, include_marketplace
platform_detectstore domain → ecommerce platform verdict (shopify|woocommerce|magento|bigcommerce|prestashop|custom_or_unknown) from the store's own public JSON capability test + technographic fingerprint — fast, no catalog fetchMarketplace operators call platform_detect to get store domain → ecommerce platform verdict (shopify|woocommerce|magento|bigcommerce|prestashop….store
batchlook up to 5 stores in one call (basic mode, cache-first, per-store ok/error)Catalog enrichment teams call batch to look up to 5 stores in one call (basic mode, cache-first, per-store ok/error).stores
Code samples

Call store_lookup from your stack

curl -X POST https://api.reefapi.com/enrich-store/v1/store_lookup \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"store":"allbirds.com"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.enrich-store.store_lookup with {"store":"allbirds.com"}.
Use cases

Who uses this API and why

  • Pricing teams use Online Store Intelligence to get store domain → platform verdict + store metadata + tech-stack + catalog sample (price/discoun….
  • Marketplace operators use Online Store Intelligence to get store domain → ecommerce platform verdict (shopify|woocommerce|magento|bigcommerce|prestashop….
  • Catalog enrichment teams use Online Store Intelligence to look up to 5 stores in one call (basic mode, cache-first, per-store ok/error).
FAQ

Questions developers ask before integrating

catalog_sample.size says 50 but products[] has 25 rows. Which is right?

Both. size and sampled report how many products were fetched and fed into the aggregates; products[] is truncated to 25. We confirmed it twice: a basic lookup reported size 50 with 25 rows and stock_signals {in_stock: 7, sampled: 50} while only 6 of the 25 returned rows were in stock, and a catalog-mode call with max_items 120 reported size 120 and still returned 25 rows. Read price_range, discount_ratio, in_stock_ratio and top_product_types as the answer over the full sample, and treat products[] as a preview.

Why did amazon.com come back as platform "unknown"?

Because this engine identifies the software a merchant runs their own storefront on, and a marketplace is not running one. A measured amazon.com lookup returned platform.name "unknown", confidence 0.0, ecommerce_confirmed false and evidence "tech_detect_unavailable", with the tech block still reporting server "CloudFront" and http_status 202. A confidence of 0.0 is the honest answer for any site whose platform could not be fingerprinted. For marketplace listings, call the marketplace engines directly.

What actually changes between a supported and a partial platform?

The catalog. Shopify came back supported true and partial false, and the catalog block carried a 50-product sample with a price range, discount ratio, stock ratio and vendor and product-type breakdowns. A measured WooCommerce store came back supported false and partial true, and its catalog block was {available: false, reason: "catalog depth is Shopify-only; this store is 'woocommerce' - platform detected, catalog not harvested (no generic-ecommerce promise)"}. Platform, tech stack, reputation and presence all still resolved on that store.

Trustpilot says found:true but trust_score is 0.0. Is the store rated zero?

No. A measured WooCommerce store returned trustpilot found true with a real business_unit_id and two categories, and trust_score 0.0, stars 0.0, reviews_count 0, which is a claimed profile with nothing on it. Always read reviews_count before reading the score. Zero reviews and a genuinely terrible rating produce the same numbers here, and only reviews_count separates them.

Why are trust_score and stars different numbers?

trust_score is Trustpilot's own weighted figure and stars is the rounded half-star it displays. Both Shopify stores we measured returned trust_score 3.4 with stars 3.5. Use trust_score when you are ranking or thresholding, and stars when you are showing a badge that has to match what a visitor sees on Trustpilot.

I asked about gymshark.com and store_info.domain says us.checkout.gymshark.com. Why?

Because store_info is what the Shopify store publishes about itself, and this brand's US store declares its checkout host. The same response returned myshopify_domain "gymsharkusa.myshopify.com", name "Gymshark US", country US, province Colorado and city Denver, while presence.store_url returned "https://gymshark.com". One response therefore carries two different store_url values. Key your own records on the domain you asked for, and read store_info.domain and myshopify_domain as facts about the store account rather than about the website you typed.

Can I trust the policy URLs?

Only on Shopify, and even there they are constructed rather than fetched. presence.policies_convention returns the same four paths under /policies/ (privacy-policy, terms-of-service, refund-policy, shipping-policy) and the response note states they are storefront conventions, not verified live. They used to be emitted for any domain at all, including stores on other platforms and domains that do not exist; they now appear only when a storefront was genuinely reached, and otherwise the block comes back empty with a note saying why. Re-measured: a Shopify store returns four, a custom-built store returns none, an invented domain returns none. Fetch them yourself before publishing them as links.

What does a domain that does not exist return?

A not-found, and it says which kind. store_lookup on a domain we made up returns ok:false with error.code NOT_FOUND and retryable false, saying the site did not answer and that no platform, catalogue or reputation record matched it — it used to answer 200 with a confidence of zero, which read like a real verdict. A string that is not a domain at all is a different refusal: "definitely not a domain" returns INVALID_PARAM in about 13 ms, before anything goes upstream. batch is the exception on purpose: it keeps a row for every domain you sent, scoring the dead one at confidence 0 with presence marked not_found, so one bad entry never costs you the rest of the list. No path returns a different real store.

What is the Online Store Intelligence API?

Online Store Intelligence API is a ReefAPI endpoint group for online store intelligence It returns live JSON through POST requests under /enrich-store/v1.

Is the Online Store Intelligence API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Online Store Intelligence calls use the same shared credit balance as every other ReefAPI engine.

Do I need an Online Store Intelligence login or account?

No login to Online Store Intelligence is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Online Store Intelligence data?

The page example is captured from a live store_lookup call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Online Store Intelligence API use?

Online Store Intelligence actions currently cost 2-20 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call Online Store Intelligence from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call enrich-store actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / enrich-store

Online Store Intelligence

Online Store Intelligence

base /enrich-store/v13 endpoints
post/enrich-store/v1/store_lookup8 credits

store domain → platform verdict + store metadata + tech-stack + catalog sample (price/discount/stock signals) + reputation (mode-scaled depth)

ParameterAllowed / rangeDescription
storerequired—Store domain or URL (e.g. allbirds.com or https://shop.example.com). A leading www. / scheme / path is accepted and normalized.
mode = basicoptionalbasic · catalog · richDepth of the lookup. Default basic. catalog scales credits with max_items; rich adds reputation/SERP depth.
max_items = 250optional1–1000catalog mode only: walk store pages until this many products are sampled (hard-capped at 1000; for a FULL product harvest use the shopify engine directly — this is enrichment, not bulk export).
include_marketplace = falseoptional—rich mode only: also probe Amazon/Etsy presence for the brand (OPTIONAL — false-match risk; every hit carries a confidence score, none is asserted as definitive).
Try in playground →
post/enrich-store/v1/platform_detect2 credits

store domain → ecommerce platform verdict (shopify|woocommerce|magento|bigcommerce|prestashop|custom_or_unknown) from the store's own public JSON capability test + technographic fingerprint — fast, no catalog fetch

ParameterAllowed / rangeDescription
storerequired—Store domain or URL (e.g. allbirds.com or https://shop.example.com). A leading www. / scheme / path is accepted and normalized.
Try in playground →
post/enrich-store/v1/batch20 credits

look up to 5 stores in one call (basic mode, cache-first, per-store ok/error)

ParameterAllowed / rangeDescription
storesrequired—Up to 5 store domains (array or comma-separated). Each is looked up in basic mode, cache-first, per-store ok/error.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.