{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Store Finder — Discover & Verify Stores by Niche",
    "description": "Which Shopify stores sell candles, skincare or dog gear? Search the open web by niche and country, verify every candidate against the store's own meta.json and products.json, and get product count, currency, country, price range and sample products per store. No key.",
    "version": "0.1",
    "x-build-id": "oajF0B1dnopAL7fk7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~shopify-store-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-shopify-store-finder",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/insight.solutions~shopify-store-finder/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-shopify-store-finder",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/insight.solutions~shopify-store-finder/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-shopify-store-finder",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "queries": {
            "title": "Niches to search",
            "type": "array",
            "description": "What the stores sell, one niche or keyword per line: `candles`, `organic skincare`, `dog accessories`. Each niche is searched down a fixed ladder — `<niche> site:myshopify.com`, then (with a country) `<niche> shop <country> site:myshopify.com`, then `<niche> inurl:myshopify.com`, then `\"<niche>\" \"powered by shopify\"` — page by page, until it has `maxStoresPerQuery` verified stores or the results run out. Up to 200 niches per run.",
            "items": {
              "type": "string"
            }
          },
          "domains": {
            "title": "Stores to verify (no search)",
            "type": "array",
            "description": "Optional: domains to check directly, one per line — a bare domain (`allbirds.com`), any URL on the site, or a `*.myshopify.com` host. Each is verified exactly like a search candidate, with no search. Up to 5,000 per run; a line that is not a domain is a free `invalid-input` row and the rest of the run carries on.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Search country",
            "pattern": "^([A-Za-z]{2})?$",
            "type": "string",
            "description": "Optional two-letter country code (`US`, `GB`, `DE`, `AU` …). It regionalises the search (DuckDuckGo's region, Bing's market) and adds the `<niche> shop <country name> site:myshopify.com` rung. It does not filter results by itself — use `countries` for that. Empty: DuckDuckGo's US-English region.",
            "default": ""
          },
          "language": {
            "title": "Search language",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter language code for Bing's interface language and, with no country set, whether the US-English DuckDuckGo region is used (`en`) or DuckDuckGo picks a region itself (any other language).",
            "default": "en"
          },
          "maxStores": {
            "title": "Maximum stores in the run",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "The run stops once this many verified stores are in the dataset (each is one paid `store` row). 1–5,000.",
            "default": 200
          },
          "maxStoresPerQuery": {
            "title": "Maximum stores per niche",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "A niche stops searching as soon as it has this many verified stores; candidates are verified in batches no larger than what the niche still needs, so nothing is verified that could not be returned. 1–500.",
            "default": 50
          },
          "maxSerpPagesPerQuery": {
            "title": "Result pages per search",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many DuckDuckGo result pages each search of the ladder may read (page 2 onward follows the page's own Next form). A search also stops on a page that adds nothing new. 1–10.",
            "default": 3
          },
          "expandListicles": {
            "title": "Expand listicles",
            "type": "boolean",
            "description": "A result that is an article about stores (\"12 best organic skincare Shopify stores\", \"places to buy candles in NYC\") is read for its outbound links — at most 50 per page, 3 pages per niche, robots.txt honoured — and each linked site is verified as a candidate (`foundVia.kind: listicle`).",
            "default": true
          },
          "minProducts": {
            "title": "Minimum published products",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Verified stores with fewer published products than this are not returned (a free `below-min-products` row instead). The count is the store's own `published_products_count`; a store verified without it (markers only) is kept. 0 keeps every store.",
            "default": 1
          },
          "includeSampleProducts": {
            "title": "Include sample products",
            "type": "boolean",
            "description": "Read `products.json?limit=<sampleSize>` for every verified store: `sampleProducts[]`, `priceRange`, `topVendors`, `topProductTypes`, `newestProductAt`. Off saves one request per store.",
            "default": true
          },
          "sampleSize": {
            "title": "Sample size",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many of the store's newest products are sampled. 1–50.",
            "default": 5
          },
          "includeTech": {
            "title": "Include theme, apps and socials",
            "type": "boolean",
            "description": "Also read each store's home page (one more request per store) for its Shopify theme, the apps it loads (from a table of 46: reviews, email/SMS, subscriptions, loyalty, BNPL, page builders, analytics pixels …), its own social profiles, whether it has a blog, and its locale.",
            "default": false
          },
          "countries": {
            "title": "Only stores in these countries",
            "type": "array",
            "description": "Optional filter: two-letter codes (`US`, `GB` …) matched against the country the store gives in its own `meta.json`. A store that does not say is not a match. Filtered stores are free and counted in the summary.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "currencies": {
            "title": "Only stores in these currencies",
            "type": "array",
            "description": "Optional filter: three-letter codes (`USD`, `EUR`, `GBP` …) matched against the store's own shop currency. Filtered stores are free and counted in the summary.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxConcurrency": {
            "title": "Stores verified in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many candidate stores are verified at once. One store is never asked two things at the same time, whatever this is set to. 1–20.",
            "default": 8
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run. When it is reached the Actor stops searching and verifying, keeps — and bills — every store it already wrote, and files one free `timeout` row. 30–3,600.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Used for DuckDuckGo, the store endpoints and listicle pages; Apify datacenter by default, which is all they need. Bing, asked only when DuckDuckGo refuses the run, goes out directly.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}