{
  "openapi": "3.0.1",
  "info": {
    "title": "Vivrelle Scraper - Luxury Bags, Jewelry, Prices & Availability",
    "description": "Scrape Vivrelle luxury handbag and jewelry rentals by keyword, filter or URL. Extract product names, brands, membership tiers, retail values, monthly rental prices by tier, availability and full image galleries.",
    "version": "0.1",
    "x-build-id": "RVrIe0hamq5v2EyTl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~vivrelle-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-vivrelle-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~vivrelle-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-vivrelle-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~vivrelle-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-vivrelle-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": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to start the scrape. 'search' runs closet searches: keyword searches plus the filters below. 'url' processes the Vivrelle links you paste: an item URL returns that single item in full, and a collection or curated-edit URL is paged like a browse, the link's own filters deciding the scope. The filters below also apply to the rows URL mode reads.",
            "default": "search"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "One or more things to search the closet for, for example 'chanel flap', 'gold hoop earrings', 'weekender'. Each term is scraped independently. Search mode only: in URL mode the scope is read out of each pasted link instead.",
            "items": {
              "type": "string"
            }
          },
          "collection": {
            "title": "Collection",
            "enum": [
              "Handbags",
              "Designer Jewelry",
              "Fine Jewelry"
            ],
            "type": "string",
            "description": "Narrow to one or more closet collections. The closet serves three: Handbags, Designer Jewelry and Fine Jewelry. Applies in BOTH search mode and URL mode."
          },
          "categories": {
            "title": "Item types",
            "type": "array",
            "description": "Item types inside the collection, for example Shoulder, Crossbody, Top Handle, Tote, Mini, Clutch, Satchel, Wallet on a Chain for Handbags; Necklaces, Bracelets, Earrings, Rings, Watches for the jewelry collections. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Only keep items by these brands, for example Chanel, Hermes, Louis Vuitton, Christian Dior, Saint Laurent, Gucci, Van Cleef & Arpels, Cartier. Use the brand's display name. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "colors": {
            "title": "Colors",
            "type": "array",
            "description": "Only keep items in these colors, for example Black, Gold, Pink, Red, Neutral. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "occasions": {
            "title": "Occasions and edits",
            "type": "array",
            "description": "Only keep items tagged for these occasions or edits, for example Everyday Essentials, Special Occasion, Beach Bound, Quiet Luxury, Curated Vintage. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "materials": {
            "title": "Materials",
            "type": "array",
            "description": "Only keep items in these materials, for example Leather, Canvas, Tweed, Caviar Leather, Raffia, Gold (Yellow, Rose, White). Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "tiers": {
            "title": "Membership tiers",
            "type": "array",
            "description": "Only keep items borrowable with these membership tiers. Premier is the entry tier, Classique and Couture are the core bag and jewelry tiers, and the plus tiers add the top-shelf closet. Applies in BOTH search mode and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "newArrivals": {
            "title": "New arrivals only",
            "type": "boolean",
            "description": "Only keep the closet's new arrivals. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "minRetailValue": {
            "title": "Minimum retail value (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Only keep rows whose estimated retail value is at least this amount, in USD. Applied to the rows this run reads (the value comes from the item page, so keep Fetch item details on for this filter to be meaningful)."
          },
          "maxRetailValue": {
            "title": "Maximum retail value (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Only keep rows whose estimated retail value is at most this amount, in USD. Applied to the rows this run reads."
          },
          "urls": {
            "title": "Vivrelle URLs",
            "type": "array",
            "description": "Paste item URLs or collection URLs; every link shape the site uses is accepted. Item links look like vivrelle.com/products/caviar-slim-vanity-case-with-chain-32 and return that single item in full. Collection links look like vivrelle.com/collection?collection=Handbags or vivrelle.com/collection?brand=Chanel&page=2 (add page=N to start that walk further in). Curated edit links like vivrelle.com/collection/morganstewart are paged like a browse. The filters above also narrow these walks.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch item details",
            "type": "boolean",
            "description": "Fetch each item's own page for the description, sizes and measurements, condition notes, estimated retail value, monthly price per membership tier and the full photo gallery. Slower, and charged once per record. Leave off for a fast crawl: title, brand, tier, availability and photos are on the rows either way.",
            "default": true
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The single cap on this run: stop after collecting this many records across all search terms and URLs. Set 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per source",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on how many result pages to walk per search term or URL, about 90 items per page. Leave empty (0) for no page limit: the run then stops at Max items, not here. Does not impose a separate cap below Max items.",
            "default": 0
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave the default for the cheapest run. The closet is served over ordinary shared connections; Residential is recommended for the most reliable results on large or frequent runs, and the run escalates to it automatically if the default connection cannot serve. If the run reports it could not read any results, try residential before anything else.",
            "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 crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or weekly recurring monitoring of the same search, for example watching a wishlist. The first run returns everything matching as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Availability changes (an item being borrowed or returned), retail value moves and monthly price moves ARE reported as UPDATED: on a rental closet they are the signal, not noise. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per search, URL and filter setup; 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 automatically from the search terms, URLs and filters, so two different searches never mix state."
          },
          "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 specifically 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 search: not when Max items capped it, not when Resume was used, and not when the run was refused. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Extra top-level field names to exclude from incremental change detection, on top of the built-in list (raw is ignored by default: it re-embeds the whole upstream item object each run). Use when a field moves every run without the item changing.",
            "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 and Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this 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)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which record 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 records 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}