Products

Products

POST /products

Creates a new product within the context of a given establishment. The current handler requires only establishmentId and stock. Localized content should be sent in translations; top-level fields such as name, description, extendedDescription, and additionalDetails are not consumed by this lambda.

Endpoint

POST/products

Request Body

{
  "productId": "string",
  "establishmentId": "string",
  "stock": 0,
  "establishmentValueInEuros": 0,
  "valueInEuros": 0,
  "value": 0,
  "height": 0,
  "weight": 0,
  "status": "available",
  "verificationDate": "2025-06-20 09:30:00",
  "verifiedBy": "string",
  "providerId": "string",
  "provider": "string",
  "dateOfObject": "string",
  "reference": "string",
  "gameCatalog": "string",
  "category": {
    "categoryId": "string"
  },
  "type": "string",
  "certificate": false,
  "isAdmin": false,
  "helpLink": "string",
  "prizeCategory": "legendary",
  "imageUrl": "string",
  "featuredImageUrl": "string",
  "featured": false,
  "digital": false,
  "isImport": false,
  "medias": [
    {
      "example_key": "string"
    }
  ],
  "year": 0,
  "order": 0,
  "translations": {
    "example_key": {
      "name": "string",
      "description": "string",
      "extendedDescription": "string",
      "additionalDetails": "string"
    }
  },
  "currency": "string"
}
AttributeTypeRequiredDescription
productIdstringNoOptional explicit product ID. Required when isImport is true.
establishmentIdstringYesEstablishment identifier. If isAdmin is true, the product is stored under global.
stockintegerYes
establishmentValueInEurosnumberNoEstablishment-facing price in euros. The handler stores this as cents.
valueInEurosnumberNoProduct value in euros. The handler stores this as cents.
valuenumberNoLegacy alias for valueInEuros. When present, it takes precedence over valueInEuros.
heightnumberNo
weightnumberNo
statusstring [available, unavailable, booked, hidden, sold]No
verificationDatestringNoDatetime in YYYY-MM-DD HH:mm:ss format.
verifiedBystringNo
providerIdstringNo
providerstringNo
dateOfObjectstringNoLegacy pass-through field currently stored without additional validation.
referencestringNoLegacy pass-through field currently stored without additional validation.
gameCatalogstringNoLegacy pass-through field currently stored without additional validation.
categoryobjectNoOnly categoryId is used during creation. If omitted, the product is stored with categoryId set to none.
category.categoryIdstringNo
typestringNo
certificatebooleanNo
isAdminbooleanNo
helpLinkstringNo
prizeCategorystring [legendary, epic, rare, uncommon, common, virtual]No
imageUrlstringNo
featuredImageUrlstringNo
featuredbooleanNo
digitalbooleanNo
isImportbooleanNo
mediasarray<object<{key}: object>>NoMedia entries are stored as provided.
medias[]object<{key}: object>No
medias[].{key}objectNo
yearintegerNo
ordernumberNo
translationsobject<{key}: object>NoLocale-keyed content used by product listing and search.
translations.{key}objectNo
translations.{key}.namestringNo
translations.{key}.descriptionstringNo
translations.{key}.extendedDescriptionstringNo
translations.{key}.additionalDetailsstringNo
currencystringNo

Responses

200

Product created successfully.

{
  "message": "Product created successfully",
  "productId": "string"
}
AttributeTypeRequiredDescription
messagestringNo
productIdstringNo

400

Bad request for create flows that require an explicit productId, such as isImport: true.

{
  "message": "NULL_PRODUCT_ID"
}
AttributeTypeRequiredDescription
messagestringNo

422

Invalid product payload.

{
  "example_key": [
    "string"
  ]
}
AttributeTypeRequiredDescription
{key}array<string>No
{key}[]stringNo

500

Failed to create product.

POST /products/search

Searches products for the authenticated establishment with pagination, sorting, optional text query, and filter metadata. This endpoint is handled by /code/productListFilter.js.

Endpoint

POST/products/search

Request Body

{
  "query": "string",
  "pagination": {
    "page": 1,
    "limit": 25,
    "cursor": "string"
  },
  "sort": {
    "field": "string",
    "order": "asc"
  },
  "filters": {
    "types": [
      "string"
    ],
    "categories": [
      "string"
    ],
    "status": [
      "string"
    ],
    "priceRange": {
      "min": 0,
      "max": 0
    },
    "stock": {
      "min": 0
    },
    "catalogId": "string",
    "locale": "string"
  }
}
AttributeTypeRequiredDescription
querystringNo
paginationobjectNo
pagination.pageintegerNo
pagination.limitintegerNo
pagination.cursorstringNo
sortobjectNo
sort.fieldstringNo
sort.orderstring [asc, desc]No
filtersobjectNo
filters.typesarray<string>No
filters.types[]stringNo
filters.categoriesarray<string>No
filters.categories[]stringNo
filters.statusarray<string>No
filters.status[]stringNo
filters.priceRangeobjectNo
filters.priceRange.minnumberNo
filters.priceRange.maxnumberNo
filters.stockobjectNo
filters.stock.minintegerNo
filters.catalogIdstringNo
filters.localestringNo

Responses

200

Products search result.

{
  "data": [
    {
      "productId": "00000000-0000-0000-0000-000000000000",
      "establishmentId": "string",
      "name": "string",
      "provider": "string",
      "status": "string",
      "type": "string",
      "stock": 0,
      "reserved": 0,
      "price": 0,
      "establishmentValueInEuros": 0,
      "priceSource": "string",
      "ruleName": "string",
      "verificationDate": "2026-01-01T00:00:00.000Z",
      "imageUrl": "string",
      "translations": {
        "example_key": {
          "name": "string",
          "description": "string",
          "extendedDescription": "string",
          "additionalDetails": "string"
        }
      },
      "category": {
        "categoryId": "string",
        "name": "string",
        "translations": {}
      },
      "catalogs": [
        {
          "catalogId": "string",
          "name": "string",
          "category": "string"
        }
      ]
    }
  ],
  "pagination": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "hasMore": false,
    "nextCursor": "string"
  },
  "metadata": {
    "categories": [
      "string"
    ],
    "types": [
      "string"
    ],
    "statuses": [
      "string"
    ],
    "filters": {
      "categories": [
        {
          "categoryId": "string",
          "name": "string",
          "translations": {}
        }
      ]
    }
  }
}
AttributeTypeRequiredDescription
dataarray<object>No
data[]objectNo
data[].productIdstring(uuid)No
data[].establishmentIdstringNo
data[].namestringNo
data[].providerstringNo
data[].statusstringNo
data[].typestringNo
data[].stockintegerNo
data[].reservedintegerNo
data[].pricenumberNo
data[].establishmentValueInEurosnumberNo
data[].priceSourcestringNo
data[].ruleNamestringNo
data[].verificationDatestring(date-time)No
data[].imageUrlstringNo
data[].translationsobject<{key}: object>No
data[].translations.{key}objectNo
data[].translations.{key}.namestringNo
data[].translations.{key}.descriptionstringNo
data[].translations.{key}.extendedDescriptionstringNo
data[].translations.{key}.additionalDetailsstringNo
data[].categoryobjectNo
data[].category.categoryIdstringNo
data[].category.namestringNo
data[].category.translationsobjectNo
data[].catalogsarray<object>No
data[].catalogs[]objectNo
data[].catalogs[].catalogIdstringNo
data[].catalogs[].namestringNo
data[].catalogs[].categorystringNo
paginationobjectNo
pagination.pageintegerNo
pagination.limitintegerNo
pagination.totalintegerNo
pagination.hasMorebooleanNo
pagination.nextCursorstringNo
metadataobjectNo
metadata.categoriesarray<string>No
metadata.categories[]stringNo
metadata.typesarray<string>No
metadata.types[]stringNo
metadata.statusesarray<string>No
metadata.statuses[]stringNo
metadata.filtersobjectNo
metadata.filters.categoriesarray<object>No
metadata.filters.categories[]objectNo
metadata.filters.categories[].categoryIdstringNo
metadata.filters.categories[].namestringNo
metadata.filters.categories[].translationsobjectNo

422

Invalid search payload.

500

Failed to list products.

GET /products/[productId]

Retrieves the details of a specific product by its ID. Returns complete metadata, including category, availability, and configuration.

Endpoint

GET/products/{productId}

Parameters

AttributeDescriptionTypeLocationRequired
productIdstringpathYes

Responses

200

Product retrieved successfully.

{
  "catalogs": {},
  "internalPrice": 0,
  "status": "string",
  "reserved": 0,
  "stock": 0,
  "establishmentId": "string",
  "weight": 0,
  "probability": 0,
  "valueInEuros": 0,
  "provider": "string",
  "verificationDate": "2026-01-01T00:00:00.000Z",
  "featured": false,
  "productId": "00000000-0000-0000-0000-000000000000",
  "visible": false,
  "certificate": false,
  "order": 0,
  "isAdmin": false,
  "digital": false,
  "helpLink": "string",
  "providerId": "string",
  "medias": [
    "string"
  ],
  "height": 0,
  "year": 0,
  "verifiedBy": "string",
  "category": "string",
  "prizeCategory": "string",
  "price": 0,
  "type": "string",
  "translations": {
    "example_key": {
      "name": "string",
      "description": "string",
      "extendedDescription": "string",
      "additionalDetails": "string"
    }
  }
}
AttributeTypeRequiredDescription
catalogsobjectNo
internalPricenumberNo
statusstringNo
reservedintegerNo
stockintegerNo
establishmentIdstringNo
weightintegerNo
probabilitynumberNo
valueInEurosnumberNo
providerstringNo
verificationDatestring(date-time)No
featuredbooleanNo
productIdstring(uuid)No
visiblebooleanNo
certificatebooleanNo
ordernumberNo
isAdminbooleanNo
digitalbooleanNo
helpLinkstringNo
providerIdstringNo
mediasarray<string>No
medias[]stringNo
heightintegerNo
yearintegerNo
verifiedBystringNo
categorystringNo
prizeCategorystringNo
pricenumberNo
typestringNo
translationsobject<{key}: object>NoPer-locale translations; keys are language codes (e.g., 'en', 'es').
translations.{key}objectNo
translations.{key}.namestringNo
translations.{key}.descriptionstringNo
translations.{key}.extendedDescriptionstringNo
translations.{key}.additionalDetailsstringNo

400

Invalid product ID.

404

Product not found.

500

Error retrieving product details.

PUT /products/[productId]

Updates a product by ID. Fields such as price, stock, translations, and metadata can be modified. Only valid product data should be submitted to avoid data integrity issues.

Endpoint

PUT/products/{productId}

Request Body

{
  "stock": 0,
  "price": 0,
  "internalPrice": 0,
  "valueInEuros": 0,
  "height": 0,
  "weight": 0,
  "status": "available",
  "verificationDate": "2026-01-01T00:00:00.000Z",
  "verifiedBy": "string",
  "providerId": "string",
  "provider": "string",
  "category": "string",
  "type": "string",
  "certificate": false,
  "isAdmin": false,
  "helpLink": "string",
  "prizeCategory": "legendary",
  "imageUrl": "string",
  "featuredImageUrl": "string",
  "featured": false,
  "digital": false,
  "medias": [
    "string"
  ],
  "year": 0,
  "translations": {
    "example_key": {
      "name": "string",
      "description": "string",
      "extendedDescription": "string",
      "additionalDetails": "string"
    }
  }
}
AttributeTypeRequiredDescription
stockintegerNo
priceintegerNo
internalPriceintegerNo
valueInEurosnumberNo
heightintegerNo
weightintegerNo
statusstring [available, unavailable, booked, hidden, sold]No
verificationDatestring(date-time)No
verifiedBystringNo
providerIdstringNo
providerstringNo
categorystringNo
typestringNo
certificatebooleanNo
isAdminbooleanNo
helpLinkstringNo
prizeCategorystring [legendary, epic, rare, uncommon, common, virtual]No
imageUrlstringNo
featuredImageUrlstringNo
featuredbooleanNo
digitalbooleanNo
mediasarray<string>No
medias[]stringNo
yearintegerNo
translationsobject<{key}: object>NoPer-locale translations; keys are language codes (e.g., 'en', 'es').
translations.{key}objectNo
translations.{key}.namestringNo
translations.{key}.descriptionstringNo
translations.{key}.extendedDescriptionstringNo
translations.{key}.additionalDetailsstringNo

Parameters

AttributeDescriptionTypeLocationRequired
productIdstringpathYes

Responses

200

Product updated successfully.

404

Product not found.

500

Failed to update product.

DELETE /products/[productId]

Deletes a product by its ID. This operation is irreversible and will remove the product from all associated catalogs and listings.

Endpoint

DELETE/products/{productId}

Parameters

AttributeDescriptionTypeLocationRequired
productIdstringpathYes

Responses

200

Product deleted successfully.

400

Invalid product ID.

404

Product not found.

500

Server error during deletion.

POST /exclusive

Requests an exclusive product lock or reservation for a limited time period. This may be used to provide VIP-only availability or time-sensitive rewards.

Endpoint

POST/exclusive

Request Body

{
  "days": 0
}
AttributeTypeRequiredDescription
daysnumberYes

Responses

200

Exclusive access granted or acknowledged.

400

Invalid exclusivity request.

500

Failed to process exclusivity request.

POST /admin/exclusive

Creates or updates a product exclusivity rule for the administrator establishment. This endpoint always stores an infinite duration using requestedDurationDays = -1.

Endpoint

POST/admin/exclusive

Request Body

{
  "productId": "00000000-0000-0000-0000-000000000000"
}
AttributeTypeRequiredDescription
productIdstring(uuid)Yes

Responses

200

Exclusive product stored successfully.

403

Admin access required.

404

Product not found.

500

Failed to upsert exclusive product.