The short answer
I spent three months building a calibrated auditing instrument to test whether a merchant’s catalog is reaching Shopify’s AI index. After 30 rounds of testing and thousands of queries, the answer is no — you cannot reliably measure it from the outside. But the reason is a masterclass in API architecture: the API has a response budget that caps results at ~360 items, silent throttling that produces false negatives, cursor pagination that overlaps, and a symmetric blind spot that makes neither scoped nor unscoped queries sufficient. The SaaS tools selling AI readiness scores are almost certainly generating artefacts, not measurements.
The Architecture of an Illusion
Shopify’s API doesn’t provide an endpoint that simply enumerates a store’s products. To audit visibility, you have to infer membership through search.
However, measuring a relevance-ranked, throttled commercial index from the outside is incredibly difficult. I discovered five hardcoded platform behaviors that actively produce plausible-looking — but mathematically false — artefacts for naive clients.

Trap 1: total_count is a Response Budget, Not a Match Count
If you query the API, the pagination schema officially describes total_count as the "Total number of matching items." It is not. Across semantically unrelated queries — including a literal nonsense string — the returned total_count values consistently hard-capped between 361 and 387. The API utilizes a strict response budget. If a SaaS tool searches for a merchant’s product and doesn’t see it, it doesn’t mean the product is missing from the database. It just means the product ranked below the invisible 360-item cutoff.
Trap 2: The Silent Throttling
When I ran an unpaced enumeration client against the API, I recorded a 14–26% query failure rate. The danger? The API didn’t throw standard hard errors; the runs reported as successful, but with lower handle counts. The client library was silently absorbing HTTP 429s by waiting out ~15-minute retry windows. When I implemented a strict 500ms inter-query delay and a retry-with-backoff invariant, my failure rate dropped to 0.7% (2 out of 299 queries). If your monitoring tool isn’t aggressively pacing its requests, it is reporting network noise as "missing products."
Trap 3: Cursor Pagination Overlap
When paginating deeply into the index, I discovered that consecutive pages share between 1.6% and 8.1% of their contents. The relevance ranking shifts dynamically between requests. If your data pipeline is simply appending pages without a deduplication layer or a disjointness assertion, your total catalog counts will inflate by a variable amount on every single run.
Trap 4: The Symmetric Response Budget
This was my most significant architectural finding. I wanted to test if the Global Catalog was attributing a store’s products to its competitors. I ran into a fascinating "two-way mirror" effect:
- Search for a product unscoped, and you will see other sellers, but the store’s own listing will likely rank below the 360-item response cut and disappear.
- Search for a product scoped to the store, and the store’s listing appears perfectly, but you are blind to competitors.
Neither view alone can establish which sellers carry a product. Both views return confident-looking results that are fundamentally incomplete.

The Engineering Response: Building the Instrument
Once I mapped these traps, I had to build an instrument capable of bypassing them. Naive keyword searches yielded a measured 54% false-negative rate.
I engineered a Partition-Based Enumeration system. By parsing a store’s public metadata, I generated highly scoped vendor-by-product-type queries (roughly 690 targeted queries for an 18,000-product store).
To prove this actually worked, I didn’t guess. I built a mathematically isolated Seeded Reference Standard. I drew random product samples from the store’s sitemaps, probed them with multi-strategy targeted searches to confirm their absolute presence in the database, and then graded my bulk-scanner against that truth.
The result? My instrument achieved 97.7% recall on a small store (~2,600 products) and 98.7% recall on a medium store (~18,000 products).
I built a tool that could effectively see through the API’s matrix.
The Invariant Library: How to Catch Your Own Artefacts
Even with 98% recall, the shifting sands of the API surface required strict engineering guardrails. Throughout the project, I built a library of runtime invariants to prevent my own tool from hallucinating data.
In data science, your numbers will lie to you. The mark of a mature engineering system is the automated ability to catch the lie before it becomes a report.
- The Regex Denominator Trap: I caught my own script inflating product counts by 33–80% because a standard product-URL regex was quietly capturing
<image:loc>CDN URLs embedded in Shopify sitemaps. Caught by: Invariant-9, requiring two independent measurements of the same denominator to agree. - The Infinite Loop: When base64 cursors containing
=characters were mangled by shell interpolation, the API didn’t error — it just silently fed me Page 1, eighty times in a row. Caught by: Invariant-10, an active assertion requiring consecutive pagination arrays to be strictly disjoint. - The Metric Conflation: I implemented a strict code-level rule (Invariant-7) requiring that any programmatic variable tracking "absence" carry its denominator in its formula
|union ∩ sitemap| / |sitemap|. Names drift; formulas don’t.
The Platform Works
After executing 31 rigorous, version-controlled work cycles, isolating the API’s behavior, and testing 9 pre-registered hypotheses, my final conclusion is a testament to Shopify’s engineering: The platform works.
The AI index is not stealing merchant products. It is not hallucinating technical specs. It is simply behaving exactly as a relevance-ranked, bandwidth-throttled, highly-distributed search index should.
If you are a merchant paying for an "AI Readiness Score," you are likely buying an artefact of a broken scanner. A true per-store absence percentage cannot be established cleanly from the outside because the available API views are blind in complementary directions, and the surfaces are intentionally throttled against bulk traversal.
Measuring a live, undocumented, agentic commercial index is an incredible engineering challenge. You cannot simply throw a script or an LLM at it and trust the JSON that comes back. You have to build the invariants, respect the response budgets, pace your clients, and ruthlessly audit your own denominators.
The measurement program ran from June to August 2026. All figures derive from public endpoints and public data.
Frequently Asked Questions
What is the total_count response budget trap in Shopify’s Global Catalog API?
How did you achieve 98.7% recall against a throttled, response-budgeted API?
Shopify’s Global Catalog API has five structural behaviours that make naive visibility measurements lie: a response budget that caps total_count at ~360 regardless of actual matches, silent throttling that produces false negatives at 14–26% without throwing errors, cursor pagination that overlaps 1.6–8.1% between consecutive pages, and a symmetric two-way mirror where neither scoped nor unscoped queries can establish which sellers carry a product.
I built a Partition-Based Enumeration system that bypasses the response budget by generating scoped queries from store metadata — 690 queries for an 18,000-product store. Validated against a Seeded Reference Standard drawn from sitemaps, the instrument achieved 97.7% recall on a small store and 98.7% on a medium store. But even at 98% recall, I needed runtime invariants to catch my own tool hallucinating: a regex inflating counts by 33–80% via CDN image URLs, base64 cursors silently returning Page 1 eighty times, and metric names drifting from their formulas.
The platform works. The AI index is not stealing products or hallucinating specs. It is behaving exactly as a relevance-ranked, bandwidth-throttled, distributed search index should. The SaaS tools selling AI readiness scores are almost certainly reporting artefacts of broken scanners, not measurements of the index. Measuring a live, undocumented, agentic commercial index requires invariants, pacing, response-budget awareness, and ruthless denominator auditing. You cannot throw a script at it and trust the JSON.