Skip to main content
POST
https://searchcompany-main.up.railway.app
/
api
/
validate-shopify
curl -X POST "https://searchcompany-main.up.railway.app/api/validate-shopify" \
  -H "Content-Type: application/json" \
  -d '{"url": "gymshark.com"}'
{
  "is_shopify": true,
  "message": "Valid Shopify store"
}
Public endpoint used on the marketing website to validate that a URL is a Shopify store before proceeding with the ranking analysis flow.
This is a public endpoint - no authentication required. Rate limited to 5 requests/minute per IP.

How It Works

The endpoint checks if the domain has an accessible /products.json endpoint, which is a Shopify-specific API that every standard Shopify store exposes. Why /products.json?
  • Every Shopify store has this endpoint
  • Returns 200 for Shopify stores, 404 for non-Shopify sites
  • If blocked (403), the store is using a headless setup we can’t support

Request Body

url
string
required
Website URL to validate (e.g., β€œgymshark.com” or β€œhttps://www.allbirds.com”)

Response

is_shopify
boolean
true if the URL is a supported Shopify store, false otherwise
message
string
Human-readable status message

Supported vs Unsupported Stores

Store Type/products.jsonSupported?
Standard Shopify200 βœ…Yes
Shopify behind Cloudflare200 βœ…Yes
Headless (custom frontend)403/404 ❌No
Non-Shopify404 ❌No
curl -X POST "https://searchcompany-main.up.railway.app/api/validate-shopify" \
  -H "Content-Type: application/json" \
  -d '{"url": "gymshark.com"}'
{
  "is_shopify": true,
  "message": "Valid Shopify store"
}

Usage on Landing Page

const response = await fetch(
  "https://searchcompany-main.up.railway.app/api/validate-shopify",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ url: userInput }),
  }
);
const { is_shopify, message } = await response.json();

if (!is_shopify) {
  showError("This does not appear to be a Shopify store");
  return;
}

// Proceed with ranking analysis...