{
  "openapi": "3.0.1",
  "info": {
    "title": "KLEKT Sneaker & Apparel Resale Scraper",
    "description": "Scrape sneaker and streetwear listings from KLEKT (klekt.com). Browse the catalog with filters and extract product details, prices, and availability for resale market research and price monitoring.",
    "version": "0.1",
    "x-build-id": "kyjdV0ExvuVsG9yeU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~klekt-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-klekt-com-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/abotapi~klekt-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-klekt-com-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/abotapi~klekt-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-klekt-com-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Scrape mode",
            "enum": [
              "browse",
              "product-urls",
              "sitemap"
            ],
            "type": "string",
            "description": "Browse walks the KLEKT catalogue page by page using the strategy and filters below — this is the default and needs no other input. Product URLs scrapes the exact listing pages you paste. Full catalogue streams every product from the official sitemaps (about 15,000 products) and ignores the browse filters.",
            "default": "browse"
          },
          "productUrls": {
            "title": "Product URLs",
            "type": "array",
            "description": "KLEKT product page URLs to scrape (one per line). Only applies in Product URLs mode. New products are https://klekt.com/product/new/<slug>; pre-owned listings are https://klekt.com/product/used/<listing-id>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "strategy": {
            "title": "Catalogue section",
            "enum": [
              "trending",
              "used",
              "sale",
              "drops",
              "upcoming",
              "gift_cards"
            ],
            "type": "string",
            "description": "Which KLEKT catalogue section to walk. Trending, Drops and Upcoming return product rows; Used and On sale return individual marketplace listings (these are the only sections carrying size, box condition and listing type); Gift cards returns the handful of gift-card products and is the one section that ignores EVERY filter below, so a filtered Gift cards run returns the whole section and the dropped filters are listed in the run log. Anything outside this list is ignored by KLEKT and would return the entire catalogue, so an unrecognised value is replaced with Trending and reported in the log. These filters apply only in Browse mode; Product URLs and Sitemap reads ignore them.",
            "default": "trending"
          },
          "brand": {
            "title": "Brand",
            "type": "string",
            "description": "Filter to one brand, written the way KLEKT displays it (capitals and spaces, not a slug). Observed brands: Nike, Adidas, Air Jordan, New Balance, Yeezy, Asics, Nike SB, Crocs, On, Vans, Saucony, Supreme, Reebok, Converse, Puma, Travis Scott, Luxury, The North Face, Under Armour, Off White, Palace, Rick Owens, Stussy, Timberland, Mizuno, Karhu, Clarks, Fear Of God, Axel Arigato, Kaws, Ugg, Brooks, Brands Other. KLEKT's brand list differs per section, so this is free text; a brand that section does not carry simply returns no products.",
            "default": ""
          },
          "brandLine": {
            "title": "Brand line / model family",
            "type": "string",
            "description": "Optional narrower model family inside a brand — use it together with Brand (e.g. Brand = Nike with Dunk Low, Air Force, Air Max 90, Air Max 1; Brand = Adidas with Samba, Campus, Gazelle, Forum, Stan Smith; Brand = Air Jordan with Jordan 1, Jordan 4, Jordan 11; Brand = New Balance with 550, 990, 2002, 9060). Written the way KLEKT displays it. Leave empty for the whole brand.",
            "default": ""
          },
          "productCategory": {
            "title": "Product category",
            "enum": [
              "",
              "Sneakers",
              "Streetwear",
              "Accessories"
            ],
            "type": "string",
            "description": "Limit to one KLEKT product category. These three are the complete set — their counts add up to the unfiltered total. Leave on Any for everything.",
            "default": ""
          },
          "sizeCategory": {
            "title": "Size category",
            "enum": [
              "",
              "Men",
              "Women",
              "Youth",
              "Default"
            ],
            "type": "string",
            "description": "Limit to one KLEKT size category. This is the complete set KLEKT publishes, and the four counts add up to the unfiltered total.",
            "default": ""
          },
          "sizeMetric": {
            "title": "Size system (needed for Size)",
            "enum": [
              "",
              "US",
              "UK",
              "EU",
              "CM",
              "US-Men",
              "US-Women",
              "US-Kids",
              "Men-US",
              "WMNS_WOMEN_US",
              "FR",
              "IT",
              "DE",
              "Inch",
              "Length",
              "Presto",
              "model"
            ],
            "type": "string",
            "description": "The size system the Size below is written in. KLEKT only applies a size filter when BOTH this and Size are set — either one on its own is ignored by the site, so the actor drops a half-filled pair and says so in the run log.",
            "default": ""
          },
          "size": {
            "title": "Size (needs Size system)",
            "type": "string",
            "description": "One size in the size system chosen above, exactly as KLEKT writes it — e.g. 10, 10.5, 44, M4/W6, 3.5Y, 4C. Free text because each size system has its own list (US alone has over a hundred values). Requires Size system: a size on its own is ignored by KLEKT, so it is dropped with a warning instead of pretending to filter.",
            "default": ""
          },
          "boxCondition": {
            "title": "Box condition",
            "enum": [
              "",
              "good",
              "missing_lid",
              "damaged",
              "no_box",
              "replacement_box"
            ],
            "type": "string",
            "description": "Condition of the shoe box. This is the complete set — the five counts add up exactly to the unfiltered total. Most meaningful on the Used and On sale sections, where every row is an individual listing.",
            "default": ""
          },
          "listingType": {
            "title": "Listing type (Used section only)",
            "enum": [
              "",
              "used",
              "new_with_defect"
            ],
            "type": "string",
            "description": "Split the Used section into genuinely used pairs and new-with-defect pairs. This only narrows when Catalogue section = Used / pre-owned; on the other sections KLEKT either returns nothing or ignores it entirely, so the actor drops it there and says so in the run log.",
            "default": ""
          },
          "availability": {
            "title": "Availability",
            "enum": [
              "",
              "0",
              "1",
              "2"
            ],
            "type": "string",
            "description": "Limit to products KLEKT flags as available, express-dispatch, or available pre-owned. Keep to these options: KLEKT ignores any other value and would quietly return everything, so the actor drops unrecognised values. On the Used section only Express dispatch returns rows.",
            "default": ""
          },
          "priceFrom": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return products priced at or above this many euros. Whole euros, not cents. 0 (the default) or empty = no lower bound.",
            "default": 0
          },
          "priceTo": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return products priced at or below this many euros. Whole euros, not cents. 0 (the default) or empty = no upper bound.",
            "default": 0
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Fetch each product's own page for the full record (description, images, seller, last sold price, lowest listing price). Applies to Browse mode ONLY: switching it off there keeps the lighter catalogue row instead, with no per-product enrichment charge. Product URLs mode and Full catalogue mode have no catalogue row behind them — the product page is their only source of data — so detail fetching always runs in those two modes and the run log says so.",
            "default": true
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of products to scrape. 0 = unlimited (stop only at the end of the catalogue). Counts records actually returned, not pages read.",
            "default": 20
          },
          "maxPages": {
            "title": "Max catalogue pages (Browse mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional safety bound on how many catalogue pages Browse mode walks (20 products per page). Leave 0 (the default) for no page bound: the walk stops by itself at the end of the section, or earlier when Max items is reached.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl without returning, or charging for, records already collected there. For recurring monitoring of the same scrape use Incremental mode below instead.",
            "default": ""
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring of the same scrape. The first run returns everything as NEW. Later runs normally return only NEW and UPDATED records, plus REAPPEARED ones for products that come back after vanishing. State is kept separately for each combination of mode, catalogue section, filters and detail setting; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key from the scrape itself, so two different scrapes never mix state.",
            "default": ""
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want a full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scrape, never when Max items capped it, when Resume was used, or when the walk was interrupted. This returns, and bills, extra synthetic rows.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Whichever proxy groups you select here are the ones used — leave the groups empty to use your account's default pool. Turning Apify Proxy off connects directly, with no proxy traffic billed.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mcpConnectors": {
            "title": "MCP connectors (optional)",
            "type": "array",
            "description": "Optionally send scraped KLEKT products into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-product export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).",
            "default": []
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which one page per product is created. Required to enable the Notion export; ignored by other connectors.",
            "default": ""
          },
          "maxNotifyListings": {
            "title": "Max products to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on products written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}