{
  "openapi": "3.0.1",
  "info": {
    "title": "Curtsy Fashion Resale Scraper - Listings, Sellers & Reviews",
    "description": "Scrape Curtsy, the US secondhand fashion marketplace: listings with brand, size, list vs original retail price, condition, photos and seller profile. Keyword and brand search, category browse, item and closet links, seller reviews, incremental monitoring, resume, MCP export.",
    "version": "0.1",
    "x-build-id": "JRHM4ZgzKOe8oDD9y"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~curtsy-app-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-curtsy-app-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~curtsy-app-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-curtsy-app-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~curtsy-app-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-curtsy-app-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": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search walks the marketplace feed by keyword, brand or category. URL mode reads the specific item, closet or collection links you paste.",
            "default": "search"
          },
          "query": {
            "title": "Keyword search (optional)",
            "type": "string",
            "description": "Search mode: free-text search, e.g. yellow dress or scrub top. The marketplace matches titles, brands and descriptions. The keyword feed ignores the brand, category, color and price narrowing, and returns a fixed-size result set; the per-listing bounds below still apply."
          },
          "brand": {
            "title": "Brand (optional)",
            "type": "string",
            "description": "Search mode: brand name, e.g. Lululemon, Free People, Zara. Spaces and capitalization are normalized automatically."
          },
          "category": {
            "title": "Category (optional)",
            "enum": [
              "",
              "dresses",
              "tops",
              "pants",
              "skirts",
              "shorts",
              "sweats",
              "set",
              "sweater",
              "jumpsuit",
              "romper",
              "shoes",
              "handbag",
              "accessory",
              "activewear",
              "swimwear",
              "intimates",
              "lounge",
              "outerwear",
              "denim",
              "jewelry",
              "costumes"
            ],
            "type": "string",
            "description": "Search mode: browse one category of the marketplace.",
            "default": ""
          },
          "startUrls": {
            "title": "Item, closet or collection links",
            "type": "array",
            "description": "URL mode: listing links (curtsyapp.com/item/<route>/<id>), seller closet links (curtsyapp.com/closet/<id>, every listing in the closet is read), collection links (curtsyapp.com/collection/<slug>/<id>), or a bare listing id. Entries are read in order.",
            "default": [
              "https://curtsyapp.com/item/showpo-dress/PbFOISYB0P",
              "https://curtsyapp.com/closet/vY8q0ubhYQ"
            ],
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Links (alias)",
            "type": "array",
            "description": "Alias for the links field above, accepted under the name other Apify actors use for URL mode. Entries are read in order.",
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "Min price (USD, optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep listings listed at or above this price. Applied to the browse feed."
          },
          "priceMax": {
            "title": "Max price (USD, optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep listings listed at or below this price. Applied to the browse feed."
          },
          "color": {
            "title": "Color (optional)",
            "type": "string",
            "description": "Single color word, e.g. yellow, black, floral. Applied to the browse feed (keyword searches ignore it)."
          },
          "freeShippingOnly": {
            "title": "Free shipping only",
            "type": "boolean",
            "description": "Keep only listings the seller ships for free.",
            "default": false
          },
          "nwtOnly": {
            "title": "New with tags only",
            "type": "boolean",
            "description": "Keep only listings marked New With Tags. Evaluated per listing after it is read.",
            "default": false
          },
          "fetchDetails": {
            "title": "Read listing details",
            "type": "boolean",
            "description": "Read each listing's detail record: seller description, sizing note, full photo set, fees, and the seller's sales/rating stats. Turn off for a faster card-only run. Each enriched listing is billed once as detail enrichment.",
            "default": true
          },
          "fetchReviews": {
            "title": "Collect seller reviews and comments",
            "type": "boolean",
            "description": "Attach each listing's seller review entries (rating, date, text, reviewer avatar) and listing comments, up to Max reviews per listing. Requires Read listing details. Reviews are billed per 10 entries as review enrichment; comments likewise as comment enrichment.",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per listing",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the seller review entries attached to each listing. 0 skips reviews entirely.",
            "default": 20
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many records. This is THE cap: the run stops when it is reached or when listings run out.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per scope (0 = no cap)",
            "minimum": 0,
            "type": "integer",
            "description": "Advanced. Rarely needed: cap the listing pages read per scope. Zero means no page cap; Max items still stops the run.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Connection settings. The standard pool is the default and works on every plan; Residential is recommended for the most reliable results on large or frequent runs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning items already collected there."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns every matching listing as NEW. Later runs compare the full listing snapshot (price, retail price, size, condition, seller stats, review and comment counts) against the stored baseline and return only NEW and UPDATED listings. Fast-moving fields that move without the listing changing (heart count, relative time labels) are excluded from the comparison by default, and Ignore fields (below) adds more. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and link setup; use State key to name or deliberately share a monitoring campaign.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search, filters and links."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode: changes to only these fields do not mark a record UPDATED. Defaults cover the free-running heart counter and relative time labels; seller review and comment entries count through their totals, so a new review still marks the listing UPDATED.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results 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-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items 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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}