{
  "openapi": "3.0.1",
  "info": {
    "title": "Target Product Scraper",
    "description": "Scrape Target.com products in bulk by URL, TCIN, or keyword. Get title, brand, UPC/barcode, full category, description, specifications, star rating, review count, all images, variants and seller - one clean row per product. No login or API key.",
    "version": "0.1",
    "x-build-id": "VD9tipmx68UcByoGl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapeworks~target-product-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapeworks-target-product-scraper",
        "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/scrapeworks~target-product-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapeworks-target-product-scraper",
        "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/scrapeworks~target-product-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapeworks-target-product-scraper",
        "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": {
          "productUrls": {
            "title": "Target product URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "One or more Target.com product (PDP) URLs to scrape, e.g. https://www.target.com/p/-/A-1004367031 or a full https://www.target.com/p/<slug>/-/A-<tcin> link. To get a URL: open target.com, click a product, and copy the page URL from your browser. Each URL returns one clean product row (set 'Expand variants' to also get one row per size/colour). Combine with TCINs and Keywords in the same run. Results are billed per product returned.",
            "items": {
              "type": "string"
            }
          },
          "tcins": {
            "title": "Target TCINs (product IDs)",
            "uniqueItems": true,
            "type": "array",
            "description": "One or more Target product IDs (TCINs). A TCIN is the number after '/A-' in any Target product URL (e.g. 1004367031 in .../-/A-1004367031). Paste a big list of TCINs to look up hundreds of products at once - each becomes one row. This is the fastest bulk input if you already have product IDs.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords (optional catalog search)",
            "uniqueItems": true,
            "type": "array",
            "description": "Optional. Product keywords to find in Target's public product sitemap (e.g. 'coffee maker', 'lego', 'air fryer'). The actor scans Target's sitemap of ~2.6M products and scrapes those whose product name contains your keyword(s), up to 'Max products'. This is a broad catalog search over product titles, not Target's on-site relevance search - use it to pull many products in a niche. If you already have exact URLs or TCINs, use those fields instead (they are exact and faster).",
            "items": {
              "type": "string"
            }
          },
          "crawlCatalog": {
            "title": "Crawl the whole catalog (no keyword)",
            "type": "boolean",
            "description": "If ON and no URLs / TCINs / keywords are given, the actor walks Target's public product sitemap and scrapes the first 'Max products' products it finds (a raw catalog dump). Leave OFF unless you specifically want an unfiltered catalog sample.",
            "default": false
          },
          "expandVariants": {
            "title": "Expand variants into separate rows",
            "type": "boolean",
            "description": "If ON, each size / colour / style variant of a product is returned as its OWN row (with its own TCIN, UPC and variant attributes). If OFF (default), you get one row per product with the variants summarised in a 'variants' field. Turning this ON increases the row count (and billing) for products that have many variants.",
            "default": false
          },
          "maxProducts": {
            "title": "Max products",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of products to scrape in this run (across all URLs, TCINs and keyword matches). Every product returned is billed, so set this to control cost. For keyword / catalog crawls this is also the stopping point for how many sitemap matches to collect.",
            "default": 100
          },
          "maxSitemapFiles": {
            "title": "Max sitemap files to scan (keyword/crawl mode)",
            "minimum": 1,
            "maximum": 115,
            "type": "integer",
            "description": "Only used for Keywords / Crawl-catalog mode. Target splits its product sitemap into ~115 files of ~22,000 products each. This caps how many of those files the actor downloads while collecting matches, so a rare keyword can't scan the whole catalog forever. Raise it if a keyword returns fewer products than you expect; each file is one request.",
            "default": 8
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy for reaching target.com. The actor fetches DIRECTLY first with a real Chrome TLS fingerprint (Target's product pages and sitemaps return fine this way) and only routes through this proxy - rotating exits - if a request is blocked. The default (Apify Proxy, automatic/datacenter, US) is cheap and works; if you see blocks in the log, switch the group to RESIDENTIAL. Keep the country US so category and product data stay consistent with the US site.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}