{ "openapi": "3.1.0", "info": { "title": "Lokki API", "description": "API documentation for Lokki, a rental management application.", "license": { "name": "MIT" }, "version": "2.0" }, "servers": [ { "url": "https://staging.api.eu-west-3.lokki.rent" }, { "url": "https://prod.api.eu-west-3.getlokki.com" } ], "security": [ { "x-access-token": [] } ], "paths": { "/v2/external/verticales": { "get": { "operationId": "external__getManyVerticales", "parameters": [ { "name": "lang", "required": true, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/VerticaleExternalDto" } } } } } } } }, "/v2/external/verticales/categories": { "get": { "operationId": "external__getManyCategories", "parameters": [ { "name": "skip", "required": false, "in": "query", "description": "Number of documents to skip", "schema": { "minimum": 0, "default": 0, "type": "number" } }, { "name": "limit", "required": false, "in": "query", "description": "Maximum number of documents to return", "schema": { "minimum": 0, "maximum": 100, "default": 100, "type": "number" } }, { "name": "sort", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "string" } ] }, "description": "Sort order for the results. Use '__asc' or '__desc' suffix to specify ascending or descending order respectively. Example: 'name__asc'" }, { "name": "fields", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "string" } ] }, "description": "Fields to include in the response" }, { "name": "verticale.in", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "string" } ] }, "description": "Filter entries that match any of the specified values" }, { "name": "verticale.notIn", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "string" } ] }, "description": "Filter entries that do not match any of the specified values" }, { "name": "verticale.equals", "required": false, "in": "query", "description": "Filter entries that have a specific value", "schema": { "type": "string" } }, { "name": "verticale.notEquals", "required": false, "in": "query", "description": "Filter entries that do not have a specific value", "schema": { "type": "string" } }, { "name": "lang", "required": false, "in": "query", "description": "Language for localized content", "example": "fr", "schema": { "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetManyCategoriesResponseDto" } } } } } } }, "/v2/external/stores": { "get": { "operationId": "external__getManyStores", "parameters": [ { "name": "skip", "required": false, "in": "query", "description": "Number of documents to skip", "schema": { "minimum": 0, "default": 0, "type": "number" } }, { "name": "limit", "required": false, "in": "query", "description": "Maximum number of documents to return", "schema": { "minimum": 0, "maximum": 100, "default": 100, "type": "number" } }, { "name": "sort", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "string" } ] }, "description": "Sort order for the results. Use '__asc' or '__desc' suffix to specify ascending or descending order respectively. Example: 'name__asc'" }, { "name": "fields", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "string" } ] }, "description": "Fields to include in the response" }, { "name": "verticale.in", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "type": "#/components/schemas/CompanyVerticale" } ] }, "description": "Filter entries that match any of the specified values" }, { "name": "verticale.notIn", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "type": "#/components/schemas/CompanyVerticale" } ] }, "description": "Filter entries that do not match any of the specified values" }, { "name": "verticale.equals", "required": false, "in": "query", "description": "Filter entries that have a specific value", "schema": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "name": "verticale.notEquals", "required": false, "in": "query", "description": "Filter entries that do not have a specific value", "schema": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "name": "position.radius", "required": false, "in": "query", "description": "Radius in kilometers (max 50km). Optional, but if provided, latitude and longitude must also be provided.", "schema": { "minimum": 0, "maximum": 50, "type": "number" } }, { "name": "position.latitude", "required": false, "in": "query", "description": "Latitude of the position. Optional, but if provided, longitude and radius must also be provided.", "schema": { "minimum": -90, "maximum": 90, "type": "number" } }, { "name": "position.longitude", "required": false, "in": "query", "description": "Longitude of the position. Optional, but if provided, latitude and radius must also be provided.", "schema": { "minimum": -180, "maximum": 180, "type": "number" } }, { "name": "lang", "required": false, "in": "query", "description": "Language for localized content", "example": "fr", "schema": { "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetManyStoresResponseDto" } } } } } } }, "/v2/external/stores/count": { "get": { "operationId": "external__getCountStores", "parameters": [ { "name": "verticale.in", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "type": "#/components/schemas/CompanyVerticale" } ] }, "description": "Filter entries that match any of the specified values" }, { "name": "verticale.notIn", "required": false, "in": "query", "schema": { "oneOf": [ { "type": "array", "items": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "type": "#/components/schemas/CompanyVerticale" } ] }, "description": "Filter entries that do not match any of the specified values" }, { "name": "verticale.equals", "required": false, "in": "query", "description": "Filter entries that have a specific value", "schema": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "name": "verticale.notEquals", "required": false, "in": "query", "description": "Filter entries that do not have a specific value", "schema": { "$ref": "#/components/schemas/CompanyVerticale" } }, { "name": "position.radius", "required": false, "in": "query", "description": "Radius in kilometers (max 50km). Optional, but if provided, latitude and longitude must also be provided.", "schema": { "minimum": 0, "maximum": 50, "type": "number" } }, { "name": "position.latitude", "required": false, "in": "query", "description": "Latitude of the position. Optional, but if provided, longitude and radius must also be provided.", "schema": { "minimum": -90, "maximum": 90, "type": "number" } }, { "name": "position.longitude", "required": false, "in": "query", "description": "Longitude of the position. Optional, but if provided, latitude and radius must also be provided.", "schema": { "minimum": -180, "maximum": 180, "type": "number" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CountStoresResponseDto" } } } } } } }, "/v2/external/stores/{id}": { "get": { "operationId": "external__getOneStore", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "The unique ID or slug of the store", "example": "64b64c4f5f3c2a6d8e7f9a01", "schema": { "type": "string" } }, { "name": "fields", "required": false, "in": "query", "description": "Fields to include in the response", "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "lang", "required": false, "in": "query", "description": "Language for localized content", "example": "fr", "schema": { "default": "fr", "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Deprecated_External_Store" } } } } } } }, "/v2/external/stores/{slug}/items/{itemId}": { "get": { "operationId": "external__getOneStoreItem", "parameters": [ { "name": "slug", "required": true, "in": "path", "description": "The slug of the store", "example": "my-store-slug", "schema": { "pattern": "/^[a-z0-9-]+$/", "type": "string" } }, { "name": "itemId", "required": true, "in": "path", "description": "The ID of the item", "example": "item-12345", "schema": { "type": "string" } }, { "name": "ids", "required": false, "in": "query", "description": "Item IDs to retrieve", "example": [ "1", "2", "3" ], "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "lang", "required": true, "in": "query", "description": "Language for localized content", "example": "fr", "schema": { "default": "fr", "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string" } }, { "name": "preview", "required": false, "in": "query", "description": "If true, include unpublished stores (for preview mode)", "example": false, "schema": { "default": false, "type": "boolean" } }, { "name": "from", "required": false, "in": "query", "description": "Start date for filtering items (optional)", "example": "2025-09-26T10:00:00.000Z", "schema": { "format": "date-time", "type": "string" } }, { "name": "to", "required": false, "in": "query", "description": "End date for filtering items (optional)", "example": "2025-10-31T14:30:00.000Z", "schema": { "format": "date-time", "type": "string" } }, { "name": "verticale", "required": false, "in": "query", "description": "The large category of the item (e.g., BIKE, CAR, BOAT, etc.)", "example": "BIKE", "schema": { "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ], "type": "string" } }, { "name": "verticaleCategoryIds", "required": false, "in": "query", "description": "The precise category of the item (e.g., Mountain Bike, Road Bike, etc.)", "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "sortBy", "required": false, "in": "query", "description": "Sort by", "example": "price_asc", "schema": { "enum": [ "relevance", "price_asc", "price_desc" ], "type": "string" } }, { "name": "limit", "required": false, "in": "query", "description": "Limit of items to retrieve", "example": 10, "schema": { "type": "number" } }, { "name": "skip", "required": false, "in": "query", "description": "Skip of items to retrieve", "example": 0, "schema": { "default": 0, "type": "number" } }, { "name": "fields", "required": false, "in": "query", "description": "Fields to include in the response", "schema": { "type": "array", "items": { "type": "string" } } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StoreItemDto" } } } } } } }, "/v2/external/stores/{slug}/items": { "get": { "operationId": "external__getManyStoreItems", "parameters": [ { "name": "slug", "required": true, "in": "path", "description": "The slug of the store", "example": "my-store-slug", "schema": { "pattern": "/^[a-z0-9-]+$/", "type": "string" } }, { "name": "ids", "required": false, "in": "query", "description": "Item IDs to retrieve", "example": [ "1", "2", "3" ], "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "lang", "required": true, "in": "query", "description": "Language for localized content", "example": "fr", "schema": { "default": "fr", "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string" } }, { "name": "preview", "required": false, "in": "query", "description": "If true, include unpublished stores (for preview mode)", "example": false, "schema": { "default": false, "type": "boolean" } }, { "name": "from", "required": false, "in": "query", "description": "Start date for filtering items (optional)", "example": "2025-09-26T10:00:00.000Z", "schema": { "format": "date-time", "type": "string" } }, { "name": "to", "required": false, "in": "query", "description": "End date for filtering items (optional)", "example": "2025-10-31T14:30:00.000Z", "schema": { "format": "date-time", "type": "string" } }, { "name": "verticale", "required": false, "in": "query", "description": "The large category of the item (e.g., BIKE, CAR, BOAT, etc.)", "example": "BIKE", "schema": { "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ], "type": "string" } }, { "name": "verticaleCategoryIds", "required": false, "in": "query", "description": "The precise category of the item (e.g., Mountain Bike, Road Bike, etc.)", "schema": { "type": "array", "items": { "type": "string" } } }, { "name": "sortBy", "required": false, "in": "query", "description": "Sort by", "example": "price_asc", "schema": { "enum": [ "relevance", "price_asc", "price_desc" ], "type": "string" } }, { "name": "limit", "required": false, "in": "query", "description": "Limit of items to retrieve", "example": 10, "schema": { "type": "number" } }, { "name": "skip", "required": false, "in": "query", "description": "Skip of items to retrieve", "example": 0, "schema": { "default": 0, "type": "number" } }, { "name": "fields", "required": false, "in": "query", "description": "Fields to include in the response", "schema": { "type": "array", "items": { "type": "string" } } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/StoreItemDto" } } } } } } } } }, "components": { "securitySchemes": { "x-access-token": { "type": "apiKey", "in": "header", "name": "x-access-token" } }, "schemas": { "CompanyVerticale": { "type": "string", "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ] }, "VerticaleExternalDto": { "type": "object", "properties": { "id": { "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ], "type": "string", "description": "Unique identifier for the verticale", "example": "BIKE" }, "infos": { "description": "Descriptive information about the verticale", "allOf": [ { "$ref": "#/components/schemas/VerticaleExternalInfos" } ] } }, "required": [ "id", "infos" ] }, "GetManyCategoriesResponseDto": { "type": "object", "properties": { "total": { "type": "number", "description": "Total number of categories matching the query", "minimum": 0, "example": 10 }, "docs": { "description": "List of categories matching the query", "type": "array", "items": { "$ref": "#/components/schemas/CategoryExternalDto" } } }, "required": [ "total", "docs" ] }, "GetManyStoresResponseDto": { "type": "object", "properties": { "total": { "type": "number", "description": "Total number of documents matching the query", "minimum": 0, "example": 150 }, "docs": { "description": "List of stores matching the query", "type": "array", "items": { "$ref": "#/components/schemas/Deprecated_External_Store" } } }, "required": [ "total", "docs" ] }, "CountStoresResponseDto": { "type": "object", "properties": { "total": { "type": "number", "description": "Total number of stores matching the query", "minimum": 0, "example": 42 } }, "required": [ "total" ] }, "Deprecated_External_Store": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the booking store - MongoDB ObjectId", "example": "64b64c4f5f3c2a6d8e7f9b0a" }, "slug": { "type": "string", "description": "Unique identifier for the store. Used for URL paths (e.g., https://www.lokki.rent/loueur/my-store)", "example": "my-store" }, "rentalPointSlug": { "type": "string", "description": "Slug of the rental point to get details for. If not provided, main store location is used.", "example": "my-rental-point" }, "profile": { "description": "Store general profile information (name, description, verticales)", "allOf": [ { "$ref": "#/components/schemas/StoreProfile" } ] }, "localization": { "description": "Store localization information (current, default, available languages)", "allOf": [ { "$ref": "#/components/schemas/StoreLocalization" } ] }, "contact": { "description": "Store contact information (email, phone, website, social media, etc.)", "allOf": [ { "$ref": "#/components/schemas/StoreContact" } ] }, "branding": { "description": "Store branding information (banners, colors, etc.)", "allOf": [ { "$ref": "#/components/schemas/StoreBranding" } ] }, "geo": { "description": "Store geographical information (main and secondary locations)", "allOf": [ { "$ref": "#/components/schemas/StoreGeo" } ] }, "modules": { "description": "Store modules settings (delivery, online payment, insurance, etc.)", "allOf": [ { "$ref": "#/components/schemas/StoreModules" } ] }, "reviews": { "description": "Store reviews from external platforms (e.g., Google Reviews)", "allOf": [ { "$ref": "#/components/schemas/StoreReviews" } ] }, "temporal": { "description": "Store temporal settings (opening hours, timezone, etc.)", "allOf": [ { "$ref": "#/components/schemas/StoreTemporal" } ] }, "pricing": { "description": "Store pricing settings (currency, tax, discounts, etc.)", "allOf": [ { "$ref": "#/components/schemas/StorePricing" } ] }, "booking": { "description": "Booking settings", "allOf": [ { "$ref": "#/components/schemas/StoreBookingSettings" } ] }, "metadata": { "description": "Store technical metadata and timestamps", "allOf": [ { "$ref": "#/components/schemas/StoreMetadata" } ] }, "name": { "type": "string", "description": "Name of the store.\nDeprecated, use `profile.name` instead.", "example": "My Store", "deprecated": true }, "logoURL": { "type": "string", "description": "URL to the store logo image\nDeprecated, use `branding.logoURL` instead.", "example": "https://bucket-prod.getlokki.com/****+/logo.png", "deprecated": true }, "bannerURL": { "description": "URLs to the store banner images\nDeprecated, use `branding.banners.urls` instead.", "example": [ "https://bucket-prod.getlokki.com/****+/banner1.png", "https://bucket-prod.getlokki.com/****+/banner2.png" ], "deprecated": true, "type": "array", "items": { "type": "string" } }, "pageUrl": { "type": "string", "description": "Public URL for the online store page. UTM parameters may be appended for tracking.", "example": "https://www.lokki.rent/loueur/my-store?utm_source=partner&utm_medium=social&utm_campaign=spring-sale" }, "currency": { "description": "Currency used by the store\nDeprecated, use `pricing.currency` instead.", "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/Deprecated_External_StoreCurrency" } ] }, "lat": { "type": "number", "description": "Latitude of the store location\nDeprecated, use `geo.location.point.lat` instead.", "example": 50.62925, "deprecated": true }, "lng": { "type": "number", "description": "Longitude of the store location\nDeprecated, use `geo.location.point.lng` instead.", "example": 3.057256, "deprecated": true }, "address": { "type": "string", "description": "Full address of the store\nDeprecated, use `geo.location.address` instead.", "example": "1 Place du Général de Gaulle, 59000 Lille, France", "deprecated": true }, "addressComponents": { "description": "Address components of the store\nDeprecated, use `geo.location.components` instead.", "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/Deprecated_External_StoreAddressComponents" } ] }, "distance": { "type": "number", "description": "Distance from the queried location (in km)", "example": 5 }, "googleRating": { "type": "number", "description": "Google rating of the store\nDeprecated, use `reviews.google.rating` instead.", "example": 4.5, "deprecated": true }, "googleReviewsNb": { "type": "number", "description": "Number of Google reviews for the store\nDeprecated, use `reviews.google.total` instead.", "example": 120, "deprecated": true }, "verticales": { "type": "array", "items": { "type": "string", "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ] }, "description": "Verticals associated with the store\nDeprecated, use `profile.verticales` instead.", "deprecated": true } }, "required": [ "id", "slug", "profile", "localization", "contact", "branding", "geo", "modules", "reviews", "temporal", "pricing", "booking", "metadata", "name", "logoURL", "bannerURL", "pageUrl", "currency", "lat", "lng", "address", "addressComponents", "googleRating", "googleReviewsNb", "verticales" ] }, "StoreItemDto": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the item", "example": "61e7b8f9e4b0c8a1d4f3c2b1" }, "type": { "enum": [ "product", "service" ], "type": "string", "description": "Type of the item", "example": "product" }, "rentalType": { "enum": [ "LCD", "LLD" ], "type": "string", "description": "The rental type of the item (Short-term or Long-term rental)", "example": "LCD" }, "settings": { "description": "Settings and configuration for the item", "allOf": [ { "$ref": "#/components/schemas/ItemSettings" } ] }, "infos": { "description": "Information about the item", "allOf": [ { "$ref": "#/components/schemas/ItemInfos" } ] }, "category": { "description": "Category information of the item", "nullable": true, "allOf": [ { "$ref": "#/components/schemas/ItemCategory" } ] }, "media": { "description": "Media associated with the item", "allOf": [ { "$ref": "#/components/schemas/ItemMedia" } ] }, "pricing": { "description": "Pricing details of the item", "allOf": [ { "$ref": "#/components/schemas/ItemPricing" } ] }, "time": { "description": "Time range information and constraints for the item", "allOf": [ { "$ref": "#/components/schemas/ItemTimeInfos" } ] }, "stock": { "description": "Stock information of the item", "allOf": [ { "$ref": "#/components/schemas/ItemStock" } ] }, "modules": { "description": "Item modules settings (insurance..)", "allOf": [ { "$ref": "#/components/schemas/ItemModules" } ] } }, "required": [ "id", "type", "rentalType", "settings", "infos", "category", "media", "pricing", "time", "stock", "modules" ] }, "VerticaleExternalInfos": { "type": "object", "properties": { "name": { "type": "string", "description": "Localized name of the verticale", "example": "Vélo" } }, "required": [ "name" ] }, "CategoryExternalDto": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the category", "example": "61e7b8f9e4b0c8a1d4f3c2b1" }, "infos": { "description": "Descriptive information about the category", "allOf": [ { "$ref": "#/components/schemas/CategoryExternalInfos" } ] }, "meta": { "description": "Metadata flags for the category", "allOf": [ { "$ref": "#/components/schemas/CategoryExternalMeta" } ] } }, "required": [ "id", "infos", "meta" ] }, "StoreProfile": { "type": "object", "properties": { "name": { "type": "string", "description": "Store name", "example": "Henri Corp" }, "description": { "type": "string", "description": "Store description in the requested language, or fallback to French", "example": "Location de vélos entre particuliers. Louez un vélo près de chez vous, où que vous soyez en France." }, "verticales": { "type": "array", "items": { "type": "string", "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ] }, "description": "List of company verticales (sectors of activity)", "example": [ "BIKE", "SCOOTER" ] } }, "required": [ "name", "description", "verticales" ] }, "StoreLocalization": { "type": "object", "properties": { "current": { "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string", "description": "Language used in this response", "example": "fr" }, "default": { "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ], "type": "string", "description": "Default language of the store", "example": "fr" }, "available": { "type": "array", "items": { "type": "string", "enum": [ "fr", "en", "nl", "de", "it", "pt", "es", "pl" ] }, "description": "List of available languages for the store", "example": [ "fr", "en" ] } }, "required": [ "current", "default", "available" ] }, "StoreContact": { "type": "object", "properties": { "socialMedia": { "description": "List of social media profiles for the store", "allOf": [ { "$ref": "#/components/schemas/StoreContactSocialMedia" } ] } }, "required": [ "socialMedia" ] }, "StoreBranding": { "type": "object", "properties": { "logoURL": { "type": "string", "description": "Logo image URL for the online store" }, "banners": { "description": "Banner images and settings for the online store", "allOf": [ { "$ref": "#/components/schemas/StoreBrandingBanners" } ] } }, "required": [ "logoURL", "banners" ] }, "StoreGeo": { "type": "object", "properties": { "location": { "nullable": true, "description": "Queried location for the store (or main location if none queried). May be null if address display is disabled", "allOf": [ { "$ref": "#/components/schemas/StoreLocation" } ] }, "locations": { "nullable": true, "description": "List of rental point locations. May be null if none exist or address display is disabled", "type": "array", "items": { "$ref": "#/components/schemas/StoreLocation" } } }, "required": [ "location", "locations" ] }, "StoreModules": { "type": "object", "properties": { "delivery": { "description": "Delivery module settings", "allOf": [ { "$ref": "#/components/schemas/StoreDelivery" } ] }, "onlinePayment": { "description": "Online payment module settings", "allOf": [ { "$ref": "#/components/schemas/StoreOnlinePayment" } ] }, "insurance": { "description": "Insurance module settings", "allOf": [ { "$ref": "#/components/schemas/StoreInsurance" } ] }, "multipleLocations": { "description": "Multiple locations module settings", "allOf": [ { "$ref": "#/components/schemas/StoreMultipleLocations" } ] }, "cancellation": { "description": "Cancellation module settings", "allOf": [ { "$ref": "#/components/schemas/StoreCancellation" } ] } }, "required": [ "delivery", "onlinePayment", "insurance", "multipleLocations", "cancellation" ] }, "StoreReviews": { "type": "object", "properties": { "google": { "nullable": true, "description": "Google Reviews data", "allOf": [ { "$ref": "#/components/schemas/StoreGoogleReviews" } ] } }, "required": [ "google" ] }, "StoreTemporal": { "type": "object", "properties": { "timezone": { "type": "string", "description": "Store timezone in IANA format (e.g., Europe/Paris)", "example": "Europe/Paris" }, "schedule": { "description": "Store opening hours and schedule", "allOf": [ { "$ref": "#/components/schemas/StoreSchedule" } ] } }, "required": [ "timezone", "schedule" ] }, "StorePricing": { "type": "object", "properties": { "currency": { "description": "Store currency information", "allOf": [ { "$ref": "#/components/schemas/StoreCurrency" } ] }, "tax": { "description": "Store tax information", "allOf": [ { "$ref": "#/components/schemas/StoreTax" } ] }, "discount": { "description": "Store discount information", "allOf": [ { "$ref": "#/components/schemas/StoreDiscount" } ] }, "showPricingTable": { "type": "boolean", "description": "Whether the store chooses to display the full pricing table (price per duration).", "example": true } }, "required": [ "currency", "tax", "discount", "showPricingTable" ] }, "StoreBookingSettings": { "type": "object", "properties": { "bookingType": { "description": "Booking type settings", "allOf": [ { "$ref": "#/components/schemas/StoreBookingType" } ] }, "instantBooking": { "description": "Indicates if automatic online store booking is enabled", "allOf": [ { "$ref": "#/components/schemas/StoreInstantBooking" } ] }, "fixedDurations": { "description": "Predefined booking durations", "allOf": [ { "$ref": "#/components/schemas/StoreBookingFixedDurations" } ] }, "rules": { "description": "Booking rules and restrictions", "allOf": [ { "$ref": "#/components/schemas/StoreBookingRules" } ] } }, "required": [ "bookingType", "instantBooking", "fixedDurations", "rules" ] }, "StoreMetadata": { "type": "object", "properties": { "timestamps": { "description": "Store lifecycle timestamps", "allOf": [ { "$ref": "#/components/schemas/StoreTimestamps" } ] } }, "required": [ "timestamps" ] }, "Deprecated_External_StoreCurrency": { "type": "object", "properties": { "isoName": { "type": "string", "description": "Currency code in ISO 4217 format\nDeprecated, use `pricing.currency.isoName` instead.", "example": "EUR", "deprecated": true }, "symbol": { "type": "string", "description": "Currency symbol\nDeprecated, use `pricing.currency.symbol` instead.", "example": "€", "deprecated": true } }, "required": [ "isoName", "symbol" ] }, "Deprecated_External_StoreAddressComponents": { "type": "object", "properties": { "administrativeAreaLevel1": { "type": "string", "description": "State, province, or region\nDeprecated, use `geo.location.components.administrativeAreaLevel1` instead.", "example": "Hauts-de-France", "deprecated": true }, "administrativeAreaLevel2": { "type": "string", "description": "County or district\nDeprecated, use `geo.location.components.administrativeAreaLevel2` instead.", "example": "Nord", "deprecated": true }, "city": { "type": "string", "description": "City\nDeprecated, use `geo.location.components.city` instead.", "example": "Lille", "deprecated": true }, "country": { "type": "string", "description": "Country\nDeprecated, use `geo.location.components.country` instead.", "example": "France", "deprecated": true }, "placeId": { "type": "string", "description": "Google Place ID\nDeprecated, use `geo.location.placeId` instead.", "example": "ChIJCSaqfIjVwkcRhvxuup4tznk", "deprecated": true }, "postalCode": { "type": "string", "description": "Postal code\nDeprecated, use `geo.location.components.postalCode` instead.", "example": "59000", "deprecated": true }, "street": { "type": "string", "description": "Route or street name\nDeprecated, use `geo.location.components.street` instead.", "example": "Place du Général de Gaulle", "deprecated": true }, "streetNumber": { "type": "string", "description": "Street number\nDeprecated, use `geo.location.components.streetNumber` instead.", "example": "1", "deprecated": true } }, "required": [ "administrativeAreaLevel1", "administrativeAreaLevel2", "city", "country", "placeId", "postalCode", "street", "streetNumber" ] }, "ItemSettings": { "type": "object", "properties": { "visibility": { "enum": [ "PUBLIC", "RESTRICTED" ], "type": "string", "description": "Visibility status of the item", "example": "PUBLIC" } }, "required": [ "visibility" ] }, "ItemInfos": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the item", "example": "Mountain Bike X2000" }, "description": { "type": "string", "description": "Detailed localized description of the item", "example": "A high-performance mountain bike suitable for all terrains." } }, "required": [ "name", "description" ] }, "ItemCategory": { "type": "object", "properties": { "storeItemCategory": { "description": "The store-specific category of the item", "allOf": [ { "$ref": "#/components/schemas/ItemCategoryLevel" } ] }, "verticale": { "nullable": true, "description": "The large category of the item (e.g., BIKE, CAR, BOAT, etc.)", "allOf": [ { "$ref": "#/components/schemas/ItemVerticale" } ] }, "categoryLevel1": { "nullable": true, "description": "The precise category of the item (e.g., Mountain Bike, Road Bike, etc.)", "allOf": [ { "$ref": "#/components/schemas/ItemCategoryLevel" } ] } }, "required": [ "storeItemCategory", "verticale", "categoryLevel1" ] }, "ItemMedia": { "type": "object", "properties": { "images": { "description": "Images associated with the item", "allOf": [ { "$ref": "#/components/schemas/ItemMediaImages" } ] }, "videos": { "description": "Videos associated with the item", "allOf": [ { "$ref": "#/components/schemas/ItemMediaVideos" } ] }, "documents": { "description": "Documents associated with the item", "type": "array", "items": { "$ref": "#/components/schemas/ItemMediaDocuments" } } }, "required": [ "images", "videos", "documents" ] }, "ItemPricing": { "type": "object", "properties": { "basis": { "enum": [ "RANGE_COMPUTED", "LOWEST_PRICE" ], "type": "string", "description": "Basis used for pricing the item", "example": "LOWEST_PRICE" }, "price": { "type": "number", "nullable": true, "description": "Rental price of the item (null if no price available)", "example": 29.99 }, "basePrice": { "type": "number", "nullable": true, "description": "Base rental price of the item (without discounts, null if no price available)", "example": 29.99 }, "discount": { "description": "Discount applied to the item", "allOf": [ { "$ref": "#/components/schemas/ItemPricingDiscount" } ] }, "deposit": { "description": "Deposit amount for the item", "allOf": [ { "$ref": "#/components/schemas/ItemDeposit" } ] }, "vat": { "nullable": true, "description": "VAT information for the item (null means store default VAT)", "allOf": [ { "$ref": "#/components/schemas/ItemVat" } ] }, "pricingTable": { "nullable": true, "description": "Full pricing table split by season. Null when the store has disabled the pricing table display.", "allOf": [ { "$ref": "#/components/schemas/ItemPricingTable" } ] } }, "required": [ "basis", "price", "basePrice", "discount", "deposit", "vat", "pricingTable" ] }, "ItemTimeInfos": { "type": "object", "properties": { "duration": { "description": "Duration constraints for the item", "allOf": [ { "$ref": "#/components/schemas/ItemDurationInfos" } ] }, "ranges": { "description": "Relevant time ranges with available price", "type": "array", "items": { "$ref": "#/components/schemas/ItemRangeInfos" } } }, "required": [ "duration", "ranges" ] }, "ItemStock": { "type": "object", "properties": { "availableQuantity": { "type": "number", "description": "Available quantity of the item", "example": 10 }, "totalQuantity": { "type": "number", "description": "Total quantity of the item", "example": 10 } }, "required": [ "availableQuantity", "totalQuantity" ] }, "ItemModules": { "type": "object", "properties": { "insurance": { "description": "Insurance module settings", "allOf": [ { "$ref": "#/components/schemas/ItemInsurance" } ] } }, "required": [ "insurance" ] }, "CategoryExternalInfos": { "type": "object", "properties": { "name": { "type": "string", "description": "Localized name of the category", "example": "Mountain Bike" }, "verticale": { "description": "Information about the parent verticale", "allOf": [ { "$ref": "#/components/schemas/CategoryExternalVerticaleInfos" } ] } }, "required": [ "name", "verticale" ] }, "CategoryExternalMeta": { "type": "object", "properties": { "isOptions": { "type": "boolean", "description": "True if this category is for accessories/options", "example": false }, "isDefault": { "type": "boolean", "description": "True if this is the default category for the verticale", "example": true } }, "required": [ "isOptions", "isDefault" ] }, "StoreContactSocialMedia": { "type": "object", "properties": { "facebook": { "type": "string", "nullable": true, "description": "Facebook profile URL", "example": "https://www.facebook.com/henricorp" }, "twitter": { "type": "string", "nullable": true, "description": "Twitter profile URL", "example": "https://www.twitter.com/henricorp" }, "instagram": { "type": "string", "nullable": true, "description": "Instagram profile URL", "example": "https://www.instagram.com/henricorp" }, "linkedIn": { "type": "string", "nullable": true, "description": "LinkedIn profile URL", "example": "https://www.linkedin.com/company/henricorp" }, "tiktok": { "type": "string", "nullable": true, "description": "TikTok profile URL", "example": "https://www.tiktok.com/@henricorp" } }, "required": [ "facebook", "twitter", "instagram", "linkedIn", "tiktok" ] }, "StoreBrandingBanners": { "type": "object", "properties": { "urls": { "description": "List of banner image URLs", "type": "array", "items": { "type": "string" } }, "scrollTime": { "type": "number", "description": "Time each banner is displayed before transitioning to the next one", "example": 5 } }, "required": [ "urls", "scrollTime" ] }, "StoreLocation": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the secondary location", "example": "64b64c4f5f3c2a6d8e7f9b0b" }, "name": { "type": "string", "description": "Name of the secondary location", "example": "Point de retrait - Gare de Lyon" }, "slug": { "type": "string", "description": "Unique slug for the secondary location, used in URLs (https://www.lokki.rent/loueur/my-store/magasin/my-location)", "example": "my-location" }, "address": { "type": "string", "description": "Full address as a single string", "example": "4 Rue du Commandant Rivière, 75008 Paris, France" }, "placeId": { "type": "string", "description": "Google Place ID for the location", "example": "ChIJLU7jZClu5kcR4PcOOO6p3I0" }, "components": { "description": "Detailed address components", "allOf": [ { "$ref": "#/components/schemas/AddressComponents" } ] }, "canonicalComponents": { "description": "Detailed address components, normalized in english", "allOf": [ { "$ref": "#/components/schemas/AddressComponents" } ] }, "point": { "description": "Geographical point (latitude and longitude)", "allOf": [ { "$ref": "#/components/schemas/StoreLocationPoint" } ] } }, "required": [ "id", "name", "slug", "address", "placeId", "components", "canonicalComponents", "point" ] }, "StoreDelivery": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if delivery is enabled for this store", "example": true }, "deliveryOnly": { "type": "boolean", "description": "Indicates if only delivery is allowed for this store", "example": false }, "ranges": { "description": "List of delivery ranges for this store", "type": "array", "items": { "$ref": "#/components/schemas/StoreDeliveryRange" } }, "excludedCities": { "description": "List of cities excluded from delivery", "type": "array", "items": { "$ref": "#/components/schemas/StoreDeliveryRangeSpecificPriceCity" } }, "freeDelivery": { "description": "Free delivery settings for this store", "allOf": [ { "$ref": "#/components/schemas/StoreDeliveryFreeSettings" } ] } }, "required": [ "enabled", "deliveryOnly", "ranges", "excludedCities", "freeDelivery" ] }, "StoreOnlinePayment": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if online payment is enabled for this store", "example": true }, "provider": { "type": "string", "enum": [ "STRIPE" ], "description": "Online payment provider for this store", "example": "STRIPE" }, "methods": { "description": "Available payment methods for the online store", "allOf": [ { "$ref": "#/components/schemas/StoreOnlinePaymentMethods" } ] } }, "required": [ "enabled", "provider", "methods" ] }, "StoreInsurance": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if insurance is enabled for this store", "example": true }, "provider": { "type": "string", "enum": [ "TULIP" ], "description": "Insurance provider for this store", "example": "TULIP" }, "details": { "description": "Detailed settings for the insurance provider", "allOf": [ { "$ref": "#/components/schemas/StoreInsuranceTulipDetails" } ] } }, "required": [ "enabled", "provider", "details" ] }, "StoreMultipleLocations": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if multiple locations are enabled for this store", "example": true }, "dropoffRule": { "enum": [ "SAME", "DIFFERENT" ], "type": "string", "description": "Controls whether the user can drop-off the products in a different rental point", "example": "DIFFERENT" } }, "required": [ "enabled", "dropoffRule" ] }, "StoreCancellation": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if the cancellation module is enabled for this store", "example": true }, "ranges": { "description": "List of cancellation ranges and their refund policies", "type": "array", "items": { "$ref": "#/components/schemas/StoreCancellationRange" } } }, "required": [ "enabled", "ranges" ] }, "StoreGoogleReviews": { "type": "object", "properties": { "rating": { "type": "number", "description": "Average rating from Google Reviews (out of 5)", "example": 4.5 }, "total": { "type": "number", "description": "Total number of Google Reviews", "example": 120 }, "placeId": { "type": "string", "description": "Google Place ID associated with the reviews", "example": "ChIJLU7jZClu5kcR4PcOOO6p3I0" }, "reviews": { "description": "List of individual Google Reviews", "type": "array", "items": { "$ref": "#/components/schemas/StoreGoogleReview" } }, "mapsUrl": { "type": "string", "description": "URL to the Google Maps page for the store", "example": "https://maps.google.com/?cid=1234567890123456789" }, "updatedAt": { "format": "date-time", "type": "string", "description": "Date when the Google Reviews were last updated", "example": "2024-11-01T12:00:00.000Z" } }, "required": [ "rating", "total", "placeId", "reviews", "mapsUrl", "updatedAt" ] }, "StoreSchedule": { "type": "object", "properties": { "openingHours": { "description": "List of regular opening hours", "type": "array", "items": { "$ref": "#/components/schemas/StoreOpeningHours" } }, "openingHoursLowSeason": { "description": "List of opening hours for the low season", "type": "array", "items": { "$ref": "#/components/schemas/StoreOpeningHours" } }, "lowSeasonRanges": { "description": "List of date ranges for the low season", "type": "array", "items": { "$ref": "#/components/schemas/StoreDateRange" } }, "closedRanges": { "description": "List of date ranges when the store is closed", "type": "array", "items": { "$ref": "#/components/schemas/StoreDateRange" } } }, "required": [ "openingHours", "openingHoursLowSeason", "lowSeasonRanges", "closedRanges" ] }, "StoreCurrency": { "type": "object", "properties": { "isoCode": { "type": "string", "description": "Currency code in ISO 4217 format", "example": "EUR" }, "symbol": { "type": "string", "description": "Currency symbol", "example": "€" } }, "required": [ "isoCode", "symbol" ] }, "StoreTax": { "type": "object", "properties": { "type": { "enum": [ "INCLUSIVE", "EXCLUSIVE" ], "type": "string", "description": "Type of tax applied to prices (inclusive or exclusive of tax)", "example": "INCLUSIVE" }, "value": { "type": "number", "description": "Tax percentage applied to prices", "example": 20 }, "name": { "type": "string", "description": "Name of the tax (e.g., VAT)", "example": "TVA" } }, "required": [ "type", "value", "name" ] }, "StoreDiscount": { "type": "object", "properties": { "globalDiscounts": { "description": "List of global discounts applicable to the store", "type": "array", "items": { "$ref": "#/components/schemas/StoreGlobalDiscount" } }, "categoryDiscounts": { "description": "List of category-specific discounts applicable to the store", "type": "array", "items": { "$ref": "#/components/schemas/StoreCategoryDiscount" } } }, "required": [ "globalDiscounts", "categoryDiscounts" ] }, "StoreBookingType": { "type": "object", "properties": { "lcd": { "type": "boolean", "description": "Indicates if short-term rentals (LCD) are enabled", "example": true }, "lld": { "type": "boolean", "description": "Indicates if long-term rentals (LLD) are enabled", "example": true }, "event": { "type": "boolean", "description": "Indicates if events are enabled", "example": true } }, "required": [ "lcd", "lld", "event" ] }, "StoreInstantBooking": { "type": "object", "properties": { "lcd": { "type": "boolean", "description": "Indicates if automatic online store booking is enabled for short-term rentals", "example": true }, "lld": { "type": "boolean", "description": "Indicates if automatic online store booking is enabled for long-term rentals", "example": true } }, "required": [ "lcd", "lld" ] }, "StoreBookingFixedDurations": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if predefined booking durations are enabled", "example": true }, "durations": { "description": "List of predefined booking durations", "type": "array", "items": { "$ref": "#/components/schemas/StoreBookingFixedDuration" } } }, "required": [ "enabled", "durations" ] }, "StoreBookingRules": { "type": "object", "properties": { "timeAnchors": { "description": "Allowed booking times (e.g., specific time slots)", "allOf": [ { "$ref": "#/components/schemas/StoreBookingTimeAnchorsRule" } ] }, "leadTime": { "description": "Lead time required before a booking can be made", "allOf": [ { "$ref": "#/components/schemas/StoreBookingLeadTimeRule" } ] }, "duration": { "description": "Minimum and maximum booking durations", "allOf": [ { "$ref": "#/components/schemas/StoreBookingDurationRule" } ] } }, "required": [ "timeAnchors", "leadTime", "duration" ] }, "StoreTimestamps": { "type": "object", "properties": { "createdAt": { "format": "date-time", "type": "string", "description": "Date when the store was created", "example": "2024-10-15T10:30:00.000Z" } }, "required": [ "createdAt" ] }, "ItemCategoryLevel": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the category", "example": "61e7b8f9e4b0c8a1d4f3c2b1" }, "name": { "type": "string", "description": "Localized name of the category", "example": "Mountain Bike" }, "type": { "enum": [ "STANDARD", "ACCESSORY" ], "type": "string", "description": "Type of the category", "example": "STANDARD" } }, "required": [ "id", "name", "type" ] }, "ItemVerticale": { "type": "object", "properties": { "id": { "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ], "type": "string", "description": "Identifier of the verticale", "example": "BIKE" }, "name": { "type": "string", "description": "Localized name of the verticale", "example": "Bike" } }, "required": [ "id", "name" ] }, "ItemMediaImages": { "type": "object", "properties": { "urls": { "description": "Array of image URLs associated with the item", "example": [ "https://example.com/images/item1.jpg", "https://example.com/images/item2.jpg" ], "type": "array", "items": { "type": "string" } } }, "required": [ "urls" ] }, "ItemMediaVideos": { "type": "object", "properties": { "youtubeUrls": { "description": "Array of YouTube video URLs associated with the item", "example": [ "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://www.youtube.com/watch?v=sNPnbI1arSE" ], "nullable": true, "type": "array", "items": { "type": "string" } } }, "required": [ "youtubeUrls" ] }, "ItemMediaDocuments": { "type": "object", "properties": { "url": { "type": "string", "description": "document URLs associated with the item", "example": [ "https://example.com/documents/item1.pdf", "https://example.com/documents/item2.pdf" ] }, "name": { "type": "string", "description": "Name of the document", "example": "Item Manual" } }, "required": [ "url", "name" ] }, "ItemPricingDiscount": { "type": "object", "properties": { "appliedDiscounts": { "type": "array", "description": "List of discounts applied to the item", "items": { "oneOf": [ { "$ref": "#/components/schemas/ItemDiscountPeriodic" }, { "$ref": "#/components/schemas/ItemDiscountWeekly" } ] } }, "availableDiscounts": { "type": "array", "description": "List of available discounts for the item", "items": { "oneOf": [ { "$ref": "#/components/schemas/ItemDiscountQuantity" } ] } } }, "required": [ "appliedDiscounts", "availableDiscounts" ] }, "ItemDeposit": { "type": "object", "properties": { "amount": { "type": "number", "description": "Deposit amount for the item", "example": 100 } }, "required": [ "amount" ] }, "ItemVat": { "type": "object", "properties": { "amount": { "type": "number", "description": "VAT percentage (e.g., 20 for 20%)", "example": 20 } }, "required": [ "amount" ] }, "ItemPricingTable": { "type": "object", "properties": { "highSeason": { "description": "High-season pricing rows, ordered by duration", "type": "array", "items": { "$ref": "#/components/schemas/ItemPricingTableEntry" } }, "lowSeason": { "nullable": true, "description": "Low-season pricing rows, ordered by duration. Null when the store has no low-season pricing configured.", "type": "array", "items": { "$ref": "#/components/schemas/ItemPricingTableEntry" } } }, "required": [ "highSeason", "lowSeason" ] }, "ItemDurationInfos": { "type": "object", "properties": { "min": { "type": "number", "description": "Minimum duration in minutes allowed for the item", "example": 60 }, "max": { "type": "number", "description": "Maximum duration in minutes allowed for the item", "example": 1440 } }, "required": [ "min", "max" ] }, "ItemRangeInfos": { "type": "object", "properties": { "min": { "type": "number", "description": "Minimum time in minutes for this time range with price", "example": 60 }, "max": { "type": "number", "description": "Maximum time in minutes for this time range with price", "example": 1440 } }, "required": [ "min", "max" ] }, "ItemInsurance": { "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Indicates if insurance is enabled for this item", "example": true }, "provider": { "type": "string", "enum": [ "TULIP" ], "description": "Insurance provider for this item", "example": "TULIP" }, "details": { "nullable": true, "description": "Detailed settings for the insurance provider", "allOf": [ { "$ref": "#/components/schemas/ItemInsuranceTulipDetails" } ] } }, "required": [ "enabled", "provider", "details" ] }, "CategoryExternalVerticaleInfos": { "type": "object", "properties": { "id": { "enum": [ "BIKE", "ELECTRIC_BIKE", "MOPED", "MOTORCYCLE", "CAR", "SCOOTER", "SKI", "CLIMBING", "SNOWSHOES", "SURF", "PADDLE", "CANOE_KAYAK", "BOAT", "EVENT", "MOTOCULTURE", "TOOLING" ], "type": "string", "description": "Identifier of the verticale", "example": "BIKE" }, "name": { "type": "string", "description": "Localized name of the verticale", "example": "Vélo" } }, "required": [ "id", "name" ] }, "AddressComponents": { "type": "object", "properties": { "streetNumber": { "type": "string", "description": "Street number", "example": "4" }, "street": { "type": "string", "description": "Street name", "example": "Rue du Commandant Rivière" }, "postalCode": { "type": "string", "description": "Postal code", "example": "75008" }, "city": { "type": "string", "description": "City name", "example": "Paris" }, "administrativeAreaLevel1": { "type": "string", "description": "Administrative area level 1 (e.g. state or province)", "example": "Île-de-France" }, "administrativeAreaLevel2": { "type": "string", "description": "Administrative area level 2 (e.g. city or district)", "example": "Paris" }, "country": { "type": "string", "description": "Country name", "example": "France" } }, "required": [ "streetNumber", "street", "postalCode", "city", "administrativeAreaLevel1", "administrativeAreaLevel2", "country" ] }, "StoreLocationPoint": { "type": "object", "properties": { "lat": { "type": "number", "description": "Latitude of the location", "example": 48.8728361 }, "lng": { "type": "number", "description": "Longitude of the location", "example": 2.3094988 } }, "required": [ "lat", "lng" ] }, "StoreDeliveryRange": { "type": "object", "properties": { "min": { "type": "number", "description": "Minimum distance for this delivery range, in kilometers", "example": 0 }, "max": { "type": "number", "description": "Maximum distance for this delivery range, in kilometers", "example": 5 }, "price": { "type": "number", "description": "Base price for deliveries within this range", "example": 10 }, "specificPrices": { "description": "List of specific prices for certain cities within this range", "type": "array", "items": { "$ref": "#/components/schemas/StoreDeliveryRangeSpecificPrice" } } }, "required": [ "min", "max", "price", "specificPrices" ] }, "StoreDeliveryRangeSpecificPriceCity": { "type": "object", "properties": { "cityName": { "type": "string", "description": "Name of the city", "example": "Paris" }, "sublocalityName": { "type": "string", "description": "Name of the sublocality (e.g., neighborhood or district)", "example": "Batignolles" }, "zipCode": { "type": "string", "description": "Postal code", "example": "75017" }, "placeId": { "type": "string", "description": "Google Place ID for the city", "example": "ChIJD7fiBh9u5kcRYJSMaMOCCwQ" }, "hasMultiplePostcodeLocalities": { "type": "boolean", "description": "Indicates if the city has multiple postal code localities", "example": false } }, "required": [ "cityName", "sublocalityName", "zipCode", "placeId", "hasMultiplePostcodeLocalities" ] }, "StoreDeliveryFreeSettings": { "type": "object", "properties": { "activated": { "type": "boolean", "description": "Indicates if free delivery is activated", "example": true }, "type": { "enum": [ "MINUTES", "SUBTOTAL" ], "type": "string", "description": "Type of condition for free delivery (either minimum minutes or subtotal amount)", "example": "MINUTES" }, "value": { "type": "number", "description": "Value corresponding to the type (minutes or subtotal amount)", "example": 60 } }, "required": [ "activated", "type", "value" ] }, "StoreOnlinePaymentMethods": { "type": "object", "properties": { "card": { "type": "boolean", "description": "Credit card enabled", "example": true }, "applePay": { "type": "boolean", "description": "Apple Pay enabled", "example": true }, "googlePay": { "type": "boolean", "description": "Google Pay enabled", "example": true }, "ancvConnect": { "type": "boolean", "description": "ANCV Connect enabled", "example": false }, "sepa": { "type": "boolean", "description": "SEPA enabled", "example": false }, "ideal": { "type": "boolean", "description": "iDEAL enabled", "example": false }, "bancontact": { "type": "boolean", "description": "Bancontact enabled", "example": false }, "giroPay": { "type": "boolean", "description": "Giropay enabled", "example": false }, "p24": { "type": "boolean", "description": "Przelewy24 enabled", "example": false }, "blik": { "type": "boolean", "description": "BLIK enabled", "example": false }, "multibanco": { "type": "boolean", "description": "Multibanco enabled", "example": false }, "eps": { "type": "boolean", "description": "EPS enabled", "example": false } }, "required": [ "card", "applePay", "googlePay", "ancvConnect", "sepa", "ideal", "bancontact", "giroPay", "p24", "blik", "multibanco", "eps" ] }, "StoreInsuranceTulipDetails": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ "TULIP" ] }, "status": { "enum": [ "off", "on_inclusion_hidden", "on_inclusion", "on_option", "with_assurance" ], "type": "string", "description": "Tulip insurance status for the store", "example": "on_inclusion" } }, "required": [ "provider", "status" ] }, "StoreCancellationRange": { "type": "object", "properties": { "hourThreshold": { "type": "number", "description": "Threshold in hours before the booking start time for this cancellation range. (e.g. 48 means cancellations made more than 48 hours before start)", "example": 48 }, "refundType": { "enum": [ "PERCENTAGE", "AMOUNT" ], "type": "string", "description": "Type of refund for this cancellation range", "example": "PERCENTAGE" }, "refundAmount": { "type": "number", "description": "Refund amount for this cancellation range", "example": 50 } }, "required": [ "hourThreshold", "refundType", "refundAmount" ] }, "StoreGoogleReview": { "type": "object", "properties": { "author": { "description": "Author information of the Google Review", "allOf": [ { "$ref": "#/components/schemas/StoreGoogleReviewAuthor" } ] }, "comment": { "type": "string", "description": "Comment text of the Google Review", "example": "Great service and friendly staff!" }, "rating": { "type": "number", "description": "Rating given in the Google Review (out of 5)", "example": 5 }, "publishTime": { "format": "date-time", "type": "string", "description": "Date when the Google Review was published", "example": "2024-10-15T10:30:00.000Z" } }, "required": [ "author", "comment", "rating", "publishTime" ] }, "StoreOpeningHours": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the opening hours entry", "example": "64b64c4f5f3c2a6d8e7f9b0c" }, "day": { "enum": [ "0", "1", "2", "3", "4", "5", "6", "*" ], "type": "string", "description": "Day of the week these opening hours apply to (0=Sunday, 1=Monday, ..., 6=Saturday, *=Every day)", "example": "1" }, "from": { "type": "string", "description": "Opening time in \"HH:mm\" format (24-hour clock)", "example": "09:00" }, "to": { "type": "string", "description": "Closing time in \"HH:mm\" format (24-hour clock)", "example": "18:00" }, "open": { "type": "boolean", "description": "Indicates if the store is open during this time range", "example": true } }, "required": [ "id", "day", "from", "to", "open" ] }, "StoreDateRange": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the date range", "example": "64b64c4f5f3c2a6d8e7f9b0d" }, "from": { "format": "date-time", "type": "string", "description": "Start date of the range (inclusive)", "example": "2024-12-01T00:00:00.000Z" }, "to": { "format": "date-time", "type": "string", "description": "End date of the range (inclusive)", "example": "2024-12-31T23:59:59.999Z" } }, "required": [ "id", "from", "to" ] }, "StoreGlobalDiscount": { "type": "object", "properties": { "percentage": { "type": "number", "description": "Percentage value of the discount", "example": "10.0" }, "from": { "format": "date-time", "type": "string", "nullable": true, "description": "Start date of the discount period (null if always applicable)", "example": "2024-12-01T00:00:00.000Z" }, "to": { "format": "date-time", "type": "string", "nullable": true, "description": "End date of the discount period (null if always applicable)", "example": "2024-12-31T23:59:59.999Z" }, "applicableDate": { "enum": [ "CREATED_DATE", "START_DATE" ], "type": "string", "description": "Whether the discount applies on the start date of the booking or when the booking is made", "example": "START_DATE" } }, "required": [ "percentage", "from", "to", "applicableDate" ] }, "StoreCategoryDiscount": { "type": "object", "properties": { "itemCategoryIds": { "description": "Categories of items to which the discount applies", "type": "array", "items": { "type": "string" } }, "rules": { "description": "List of discount rules for the category", "type": "array", "items": { "$ref": "#/components/schemas/CompanyCategoryDiscountRange" } } }, "required": [ "itemCategoryIds", "rules" ] }, "StoreBookingFixedDuration": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier for the predefined booking duration", "example": "64b64c4f5f3c2a6d8e7f9b0e" }, "minutes": { "type": "number", "description": "Predefined booking duration in minutes", "example": 60 }, "hours": { "type": "number", "description": "Predefined booking duration in hours", "example": 1 }, "label": { "type": "string", "description": "Label for the predefined booking duration", "example": "1 hour" } }, "required": [ "id", "minutes", "hours", "label" ] }, "StoreBookingTimeAnchorsRule": { "type": "object", "properties": { "startTimes": { "description": "List of allowed booking start times (e.g., specific time slots)", "type": "array", "items": { "$ref": "#/components/schemas/StoreBookingTimeAnchorTime" } }, "endTimes": { "description": "List of allowed booking end times (e.g., specific time slots)", "type": "array", "items": { "$ref": "#/components/schemas/StoreBookingTimeAnchorTime" } } }, "required": [ "startTimes", "endTimes" ] }, "StoreBookingLeadTimeRule": { "type": "object", "properties": { "minHours": { "type": "number", "description": "Minimum lead time required before a booking can be made, in hours", "example": 2 } }, "required": [ "minHours" ] }, "StoreBookingDurationRule": { "type": "object", "properties": { "minHours": { "type": "number", "nullable": true, "description": "Minimum booking duration in hours, null if no minimum", "example": 1 }, "maxHours": { "type": "number", "nullable": true, "description": "Maximum booking duration in hours, null if no maximum", "example": 24 } }, "required": [ "minHours", "maxHours" ] }, "ItemDiscountPeriodic": { "type": "object", "properties": { "amount": { "type": "number", "description": "Discount amount applied to the item", "example": 5 }, "amountType": { "enum": [ "PERCENTAGE", "AMOUNT" ], "type": "string", "description": "Discount type (amount or percentage)", "example": "PERCENTAGE" }, "type": { "type": "string", "default": "PERIODIC", "enum": [ "PERIODIC" ] }, "from": { "format": "date-time", "type": "string", "nullable": true, "description": "Start date of the discount period (nullable if always applicable)", "example": "2025-09-01T00:00:00.000Z" }, "to": { "format": "date-time", "type": "string", "nullable": true, "description": "End date of the discount period (nullable if always applicable)", "example": "2025-09-30T23:59:59.000Z" }, "applicableDate": { "enum": [ "CREATED_DATE", "START_DATE" ], "type": "string", "description": "Applicable date context for the discount (Creation date or Booking start date)", "example": "CREATED_DATE" } }, "required": [ "amount", "amountType", "type", "from", "to", "applicableDate" ] }, "ItemDiscountWeekly": { "type": "object", "properties": { "amount": { "type": "number", "description": "Discount amount applied to the item", "example": 5 }, "amountType": { "enum": [ "PERCENTAGE", "AMOUNT" ], "type": "string", "description": "Discount type (amount or percentage)", "example": "PERCENTAGE" }, "type": { "type": "string", "default": "WEEKLY", "enum": [ "WEEKLY" ] }, "baseAmount": { "type": "number", "description": "Base amount of the discount before applying overlap percentage", "example": 100 }, "overlapPercentage": { "type": "number", "description": "Percentage of overlap between the booking and the price rule period", "example": 75 }, "rule": { "description": "Price rule associated with the weekly discount", "allOf": [ { "$ref": "#/components/schemas/PriceRule" } ] } }, "required": [ "amount", "amountType", "type", "baseAmount", "overlapPercentage", "rule" ] }, "ItemDiscountQuantity": { "type": "object", "properties": { "type": { "type": "string", "default": "QUANTITY", "enum": [ "QUANTITY" ] }, "rules": { "description": "Rules for quantity-based discounts", "type": "array", "items": { "$ref": "#/components/schemas/CompanyCategoryDiscountRange" } } }, "required": [ "type", "rules" ] }, "ItemPricingTableEntry": { "type": "object", "properties": { "id": { "type": "string", "description": "Unique identifier of the price model row", "example": "61e7b8f9e4b0c8a1d4f3c2b1" }, "label": { "type": "string", "description": "Localized duration label (e.g. '1 jour', '1 semaine')", "example": "1 jour" }, "price": { "type": "number", "description": "Price for this duration", "example": 50 }, "duration": { "description": "Raw duration data for client-side formatting", "oneOf": [ { "$ref": "#/components/schemas/ItemPricingTableEntryDurationRange" }, { "$ref": "#/components/schemas/ItemPricingTableEntryDurationSpecific" }, { "$ref": "#/components/schemas/ItemPricingTableEntryDurationLld" } ], "discriminator": { "propertyName": "type", "mapping": { "range": "#/components/schemas/ItemPricingTableEntryDurationRange", "specific": "#/components/schemas/ItemPricingTableEntryDurationSpecific", "LLD": "#/components/schemas/ItemPricingTableEntryDurationLld" } } } }, "required": [ "id", "label", "price", "duration" ] }, "ItemInsuranceTulipDetails": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ "TULIP" ] }, "status": { "enum": [ "off", "on_inclusion_hidden", "on_inclusion", "on_option", "with_assurance" ], "type": "string", "description": "Tulip insurance status for the item", "example": "on_inclusion_hidden" } }, "required": [ "provider", "status" ] }, "StoreDeliveryRangeSpecificPrice": { "type": "object", "properties": { "price": { "type": "number", "description": "Price for delivery to the specified cities", "example": 5 }, "cities": { "description": "List of cities with specific delivery prices", "type": "array", "items": { "$ref": "#/components/schemas/StoreDeliveryRangeSpecificPriceCity" } } }, "required": [ "price", "cities" ] }, "StoreGoogleReviewAuthor": { "type": "object", "properties": { "name": { "type": "string", "description": "Author name of the Google Review", "example": "John Doe" }, "profilePictureUrl": { "type": "string", "description": "Profile picture URL of the Google Review author", "example": "https://example.com/profile.jpg" } }, "required": [ "name", "profilePictureUrl" ] }, "CompanyCategoryDiscountRange": { "type": "object", "properties": { "discount": { "type": "number", "description": "Discount value for the range" }, "discountType": { "enum": [ "AMOUNT", "PERCENTAGE" ], "type": "string", "description": "Type of discount applied (amount or percentage)" }, "rangeFrom": { "type": "number", "description": "Minimum value of the range (Quantity of items)" }, "rangeTo": { "type": "number", "description": "Maximum value of the range (Quantity of items)" }, "infiniteTo": { "type": "boolean", "description": "Indicates if the range has no upper limit" } }, "required": [ "discount", "discountType", "rangeFrom", "rangeTo", "infiniteTo" ] }, "StoreBookingTimeAnchorTime": { "type": "object", "properties": { "hours": { "type": "number", "description": "Hours of the time anchor", "example": 9 }, "minutes": { "type": "number", "description": "Minutes of the time anchor", "example": 30 } }, "required": [ "hours", "minutes" ] }, "PriceRule": { "type": "object", "properties": { "startDate": { "$ref": "#/components/schemas/PriceRuleDate" }, "endDate": { "$ref": "#/components/schemas/PriceRuleDate" }, "type": { "type": "string", "enum": [ "in", "include", "overlap" ] }, "variation": { "type": "number" } }, "required": [ "startDate", "endDate", "type", "variation" ] }, "ItemPricingTableEntryDurationRange": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "range" ] }, "minMinutes": { "type": "number", "description": "Minimum duration in minutes", "example": 0 }, "maxMinutes": { "type": "number", "description": "Maximum duration in minutes", "example": 1440 } }, "required": [ "type", "minMinutes", "maxMinutes" ] }, "ItemPricingTableEntryDurationSpecific": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "specific" ] }, "minutes": { "type": "number", "description": "Duration in minutes", "example": 1440 } }, "required": [ "type", "minutes" ] }, "ItemPricingTableEntryDurationLld": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "LLD" ] }, "months": { "type": "number", "description": "Duration in calendar months", "example": 12 } }, "required": [ "type", "months" ] }, "PriceRuleDate": { "type": "object", "properties": { "day": { "type": "number" }, "time": { "type": "string" } }, "required": [ "day", "time" ] } } } }