{
  "openapi": "3.0.1",
  "info": {
    "title": "Tarazu -Shopify Free Shipping & Discount Tester",
    "description": "Test your Shopify store's free-shipping threshold, discount codes, automatic discounts and cart totals over the public Ajax Cart API. Boundary carts, exact money math and evidence for every verdict. Never opens checkout or places orders.",
    "version": "0.1",
    "x-build-id": "BHARm1htTcu8kzjLM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sayuj~tarazu/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sayuj-tarazu",
        "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/sayuj~tarazu/runs": {
      "post": {
        "operationId": "runs-sync-sayuj-tarazu",
        "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/sayuj~tarazu/run-sync": {
      "post": {
        "operationId": "run-sync-sayuj-tarazu",
        "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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "demo",
              "live"
            ],
            "type": "string",
            "description": "<strong>Demo store</strong> runs a built-in test suite against a simulated Shopify store: free, no store needed, and every store field below is ignored. <strong>My store</strong> tests the store in Store URL, which you must own or be authorized to test.",
            "default": "live"
          },
          "storeUrl": {
            "title": "Store URL",
            "maxLength": 2048,
            "type": "string",
            "description": "Your storefront address with <code>https://</code> and nothing after the domain, e.g. <code>https://your-store.myshopify.com</code> or <code>https://www.yourbrand.com</code>. Shopify admin → <strong>Settings → Domains</strong> lists your domains. Put a market subfolder such as <code>/en-in</code> in Locale path instead."
          },
          "authorizationConfirmed": {
            "title": "I own this store or am authorized to test it",
            "type": "boolean",
            "description": "Required in live mode. Tarazu adds products to test carts on the store you name, so only run it on stores you own or have permission to test, for example a client store your agency maintains. Ticking the box is your declaration; Tarazu cannot verify ownership.",
            "default": false
          },
          "storefrontPassword": {
            "title": "Storefront password",
            "type": "string",
            "description": "Only for password-protected stores (development, staging or pre-launch). Shopify admin → <strong>Online Store → Preferences → Password protection</strong> shows it. Stored encrypted and never written to results or logs."
          },
          "country": {
            "title": "Market country",
            "pattern": "^[A-Z]{2}$",
            "type": "string",
            "description": "Two-letter country code (ISO 3166-1, capitals) of the market to test, e.g. <code>IN</code>. Tarazu selects this market through Shopify's localization form before building carts, so prices and currency match it. Leave empty to use the store's default market."
          },
          "expectedCurrency": {
            "title": "Expected cart currency",
            "pattern": "^[A-Z]{3}$",
            "type": "string",
            "description": "Three-letter currency code (ISO 4217, capitals), e.g. <code>INR</code>. Adds a currency check to every scenario. If the cart uses another currency, that scenario's money checks are reported as inconclusive instead of being compared across currencies."
          },
          "localePath": {
            "title": "Locale path",
            "pattern": "^(/[a-z]{2}(-[a-z]{2})?)?$",
            "type": "string",
            "description": "Market subfolder put in front of every request, e.g. <code>/en-in</code> when your India market lives at <code>yourbrand.com/en-in</code>. Leave empty for the primary market. Shopify admin → <strong>Settings → Markets</strong> shows each market's domain or subfolder.",
            "default": ""
          },
          "shippingCountry": {
            "title": "Shipping country",
            "pattern": "^[A-Z]{2}$",
            "type": "string",
            "description": "Two-letter country code of the address Tarazu requests shipping rates for, e.g. <code>IN</code>. Defaults to Market country. Required for free-shipping tests."
          },
          "shippingProvince": {
            "title": "Shipping province or state",
            "maxLength": 100,
            "type": "string",
            "description": "Province or state of the shipping address as a code or name, e.g. <code>MH</code> or <code>Maharashtra</code>. Shopify needs it for shipping rates in many countries, including India, the USA and Canada."
          },
          "shippingZip": {
            "title": "Shipping postal code",
            "maxLength": 20,
            "type": "string",
            "description": "Postal or ZIP code of the shipping address, e.g. <code>400001</code>. Use an address inside the shipping zone whose rates you want to test."
          },
          "freeShippingThreshold": {
            "title": "Free-shipping threshold",
            "pattern": "^\\d{1,9}(\\.\\d{1,2})?$",
            "type": "string",
            "description": "Order amount from which shipping should be free, in the store currency's major units with a dot for decimals, e.g. <code>4000</code> or <code>4000.00</code> (no currency symbol, no thousands separators). Shopify admin → <strong>Settings → Shipping and delivery</strong> → your free rate's price condition shows it."
          },
          "freeShippingBasis": {
            "title": "Threshold applies to",
            "enum": [
              "after_discounts",
              "before_discounts"
            ],
            "type": "string",
            "description": "Which amount should count toward the threshold: the cart total <strong>after</strong> discounts, or the subtotal <strong>before</strong> discounts.",
            "default": "after_discounts"
          },
          "freeShippingInclusive": {
            "title": "Free at exactly the threshold",
            "type": "boolean",
            "description": "On: a cart of exactly the threshold (e.g. 4000.00) should ship free (amount ≥ threshold). Off: only carts above it ship free (amount > threshold).",
            "default": true
          },
          "freeShippingRateName": {
            "title": "Free rate name",
            "maxLength": 200,
            "type": "string",
            "description": "Optional. When set, only a rate with exactly this name and price 0 counts as free shipping, e.g. <code>Free Shipping</code>. When empty, any rate priced 0 counts."
          },
          "boundaryVariantIds": {
            "title": "Variants for boundary carts",
            "maxItems": 10,
            "type": "array",
            "description": "Up to 10 variant IDs Tarazu may combine into the boundary carts; a mix of prices makes exact boundaries easier to hit. To find a variant ID, open Shopify admin → <strong>Products</strong>, choose the product and click the variant: the number at the end of the page URL is the variant ID.",
            "items": {
              "type": "string",
              "pattern": "^\\d{1,20}$"
            },
            "default": []
          },
          "boundaryDiscountCodes": {
            "title": "Discount codes for boundary carts",
            "maxItems": 5,
            "type": "array",
            "description": "Optional, up to 5 discount codes applied to every boundary cart, e.g. to check that a code which takes the cart below the threshold also removes free shipping. One code per entry; codes are case-insensitive.",
            "items": {
              "type": "string",
              "maxLength": 255,
              "pattern": "^[^,\\s](?:[^,]*[^,\\s])?$"
            },
            "default": []
          },
          "discountChecks": {
            "title": "Discount code checks",
            "maxItems": 20,
            "type": "array",
            "description": "One test cart per entry, each with one discount code: <code>code</code>, <code>lines</code> (variant IDs and quantities), optional <code>expectApplicable</code> (default true) and optional <code>expectedAmount</code> (the discount in major units). Example: <code>[{\"code\": \"FLAT500\", \"lines\": [{\"variantId\": \"41234567890123\", \"quantity\": 2}], \"expectedAmount\": \"500.00\"}]</code>. A code the cart accepts can still be rejected at checkout if it is limited to certain customers.",
            "default": []
          },
          "scenarios": {
            "title": "Scenarios",
            "maxItems": 20,
            "type": "array",
            "description": "Explicit test carts. Each scenario has an <code>id</code> (lowercase letters, digits, - or _), an optional <code>label</code>, <code>lines</code> (1 to 20 of <code>{\"variantId\": \"…\", \"quantity\": 1}</code>), optional <code>discountCodes</code> (up to 5) and <code>checks</code> (1 to 20). Check types: <code>free_shipping</code> (threshold, inclusive, basis, rateName), <code>discount_code</code> (code, expectApplicable, expectedAmount), <code>automatic_discount</code> (title, expectPresent, expectedAmount), <code>cart_total</code> (field plus expected or computeFrom), <code>line_price</code> (variantId, expectedUnitPrice, field), <code>variant_available</code> (variantId, expectAvailable), <code>currency</code> (expected) and <code>cart_page_total</code> (selector). Checkout-only types (<code>cod_available</code>, <code>payment_method</code>, <code>tax_amount</code>, <code>checkout_total</code>, <code>shipping_discount</code>) are accepted and always reported as unsupported.",
            "default": []
          },
          "maxScenarios": {
            "title": "Max scenarios",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Upper limit of test carts per run (boundary carts, discount checks and your scenarios together), 1 to 20. Input that could create more scenarios than this is rejected before any request is sent.",
            "default": 20
          },
          "maxRuntimeSeconds": {
            "title": "Max run time",
            "minimum": 30,
            "maximum": 900,
            "type": "integer",
            "description": "Run time budget, 30 to 900 seconds. Tarazu stops starting new scenarios when 20 seconds or less remain and reports which scenarios were not covered.",
            "default": 240
          },
          "requestDelayMs": {
            "title": "Delay between requests",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Pause between requests to your store in live mode, 0 to 10000 milliseconds, so Shopify's bot protection does not throttle the test. The demo store uses no delay.",
            "default": 1000
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Usually not needed for your own store; a crawler-access signature (below) is the better way past Shopify's bot protection. Apify Proxy traffic is charged by Apify.",
            "default": {
              "useApifyProxy": false
            }
          },
          "crawlerSignatureInput": {
            "title": "Crawler access: Signature-Input",
            "type": "string",
            "description": "Optional, recommended for live tests. In Shopify admin open <strong>Online Store → Preferences → Crawler access → Create signature</strong>, copy the <code>Signature-Input</code> value here and the <code>Signature</code> value into the next field. Signed requests identify Tarazu to Shopify's bot protection and avoid 429 throttling. A signature expires after at most 3 months."
          },
          "crawlerSignature": {
            "title": "Crawler access: Signature",
            "type": "string",
            "description": "The <code>Signature</code> value of the same crawler-access signature. Both values are sent with <code>Signature-Agent: \"https://shopify.com\"</code>. Stored encrypted and never written to results or logs."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}