openapi: 3.2.0 info: title: Product Catalog - Public Product Data Operations API version: 1.0.1 description: Endpoints for product data operations servers: - url: https://api.mapp.com security: - Keycloak: [] tags: - name: Product Data Operations description: Endpoints for product data operations paths: /api/product-catalog/v1/catalogs/{catalogId}/products/{productId}/variants: get: tags: - Product Data Operations summary: List variants of a product description: Returns all variants belonging to the specified product within the catalog. For products with many variants, cursor-based pagination can be used by supplying 'lastId' (forward) or 'firstId' (backward) together with a page 'size'. Results can additionally be filtered by attribute active status, product data layer, and a modification timestamp range. operationId: listVariants parameters: - name: catalogId in: path description: Catalog identifier that contains the product and its variants. required: true schema: type: integer format: int64 - name: productId in: path description: Product identifier whose variants should be listed. required: true schema: type: string - name: activeStatusSearch in: query description: Controls whether active attributes, inactive attributes, or all attributes are included in the returned variant data. Defaults to ALL. required: false schema: type: string default: ALL enum: - ACTIVE_ONLY - INACTIVE_ONLY - ALL - name: catalogType in: query description: Selects which product data layer to query. Defaults to COMBINED. required: false schema: type: string default: COMBINED enum: - SOURCE - ENRICHED - COMBINED - name: lastId in: query description: Forward pagination cursor. Returns variants after this document id; the cursor value itself is excluded. Cannot be used together with firstId. required: false schema: type: string - name: firstId in: query description: Backward pagination cursor. Returns variants before this document id; the cursor value itself is excluded. Cannot be used together with lastId. required: false schema: type: string - name: size in: query description: Maximum number of variants to return in one page. Required when lastId or firstId is provided; values less than 1 or greater than 100 are normalized to 100. required: false schema: type: integer format: int32 - name: fromModifiedTimestamp in: query description: Filters variants modified at or after this timestamp. The value is epoch milliseconds and the lower bound is inclusive. If this is provided, toModifiedTimestamp is required. For paginated scans, capture this value once before the first page and keep it unchanged for every page. required: false schema: type: integer format: int64 example: 1783503393000 - name: toModifiedTimestamp in: query description: Filters variants modified at or before this timestamp. The value is epoch milliseconds, the upper bound is inclusive, it must not be greater than the current server time, and it is required when fromModifiedTimestamp is provided. For paginated scans, capture this value once before the first page and keep it unchanged for every page. required: false schema: type: integer format: int64 example: 1783506993000 responses: '400': description: Invalid cursor, modification date, or catalog attribute configuration. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: message: Cannot specify both lastId and firstId httpStatus: 400 errorCode: 400 Bad Request timestamp: '2026-07-08T12:00:00Z' '204': description: No variants were found for the requested product and filters. '404': description: Catalog was not found. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: message: 'Product feed not found for companyId: 456 and feedId: 123' httpStatus: 404 errorCode: 404 Not Found timestamp: '2026-07-08T12:00:00Z' '200': description: Product variants found content: application/json: schema: $ref: '#/components/schemas/ProductVariantsResponseDTO' example: catalog_id: 123 view: flat product_id: P-500 total_variants: 2 variants: - variant_id: V-1001 product_id: P-500 catalog_id: 123 status: value: 1 label: active availability: value: true label: available color: en-GB: Navy Blue de-DE: Marineblau price: US: 29.99 GB: 24.99 - variant_id: V-1002 product_id: P-500 catalog_id: 123 status: value: 1 label: active availability: value: true label: available size: US: M EU: '38' '500': description: Unexpected error while listing product variants. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: message: Unexpected error while processing request httpStatus: 500 errorCode: 500 Internal Server Error timestamp: '2026-07-08T12:00:00Z' components: schemas: ProductVariantsResponseDTO: type: object properties: paginationCursor: $ref: '#/components/schemas/PaginationCursorDTO' catalog_id: type: integer format: int64 view: type: string example: flat product_id: type: string total_variants: type: integer description: Only set when pagination is not used format: int32 variants: type: array example: - variant_id: V-1001 product_id: P-500 style_id: S-42 status: value: 1 label: active availability: value: true label: available catalog_id: 12345 source_creation_time: 1783502993000 source_update_time: 1783503093000 enriched_creation_time: 1783503193000 enriched_update_time: 1783503293000 color: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine price: US: 29.99 GB: 24.99 size: US: S EU: '36' fashion_material: leather fashion_season: summer - variant_id: V-1002 product_id: P-500 style_id: S-42 status: value: 1 label: active availability: value: true label: available catalog_id: 12345 source_creation_time: 1783503393000 source_update_time: 1783503493000 enriched_creation_time: 1783503593000 enriched_update_time: 1783503693000 color: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine price: US: 29.99 GB: 24.99 size: US: M EU: '38' fashion_material: leather fashion_season: summer items: $ref: '#/components/schemas/VariantFlatViewResponse' ErrorResponse: type: object properties: message: type: string httpStatus: type: integer format: int32 errorCode: type: string timestamp: type: string format: date-time PaginationCursorDTO: type: object properties: nextPageExists: type: boolean previousPageExists: type: boolean firstId: type: string example: V-1001 lastId: type: string example: V-1010 description: Only set when pagination is used VariantFlatViewResponse: required: - availability - catalog_id - product_id - status - variant_id type: object properties: variant_id: type: string description: Client-defined unique identifier of the purchasable variant. example: V-1001 product_id: type: string description: Identifier used for grouping all variants belonging to the same product. example: P-500 style_id: type: string description: Groups variants that share colour or style but differ by option attributes such as size. example: S-1000 status: type: string example: '{"value":1,"label":"active"}' enum: - PRE_ORDER - ACTIVE - DISCONTINUED availability: type: string example: '{"value":true,"label":"available"}' enum: - AVAILABLE - NOT_AVAILABLE catalog_id: type: integer description: Catalog identifier. format: int64 example: 123 source_creation_time: type: integer description: SOURCE data creation timestamp in milliseconds. Present when SOURCE data is available. format: int64 example: 1783502993000 source_update_time: type: integer description: SOURCE data last update timestamp in milliseconds. Present when SOURCE data is available. format: int64 example: 1783503093000 enriched_creation_time: type: integer description: ENRICHED data creation timestamp in milliseconds. Present when ENRICHED data is available. format: int64 example: 1783503193000 enriched_update_time: type: integer description: ENRICHED data last update timestamp in milliseconds. Present when ENRICHED data is available. format: int64 example: 1783503293000 brand: type: string description: Product brand name. example: AnnTaylor price: type: object additionalProperties: type: number description: Current selling price keyed by ISO 3166-1 alpha-2 country code or '*' fallback. description: Current selling price keyed by ISO 3166-1 alpha-2 country code or '*' fallback. example: US: 29.99 GB: 24.99 DE: 27.5 FR: 28.0 currency: type: object additionalProperties: type: string description: Currency keyed by the same country codes as price. Values are ISO 4217 currency codes. example: '{"US":"USD","GB":"GBP","DE":"EUR","FR":"EUR","*":"USD"}' description: Currency keyed by the same country codes as price. Values are ISO 4217 currency codes. example: US: USD GB: GBP DE: EUR FR: EUR '*': USD size: type: object additionalProperties: type: string description: Size keyed by ISO 3166-1 alpha-2 country code or '*' fallback. example: '{"US":"S","GB":"8","EU":"36"}' description: Size keyed by ISO 3166-1 alpha-2 country code or '*' fallback. example: US: S GB: '8' EU: '36' color: type: object additionalProperties: type: string description: Localized colour keyed by BCP 47 locale or '*' fallback. example: '{"en-GB":"Navy Blue","de-DE":"Marineblau","fr-FR":"Bleu marine"}' description: Localized colour keyed by BCP 47 locale or '*' fallback. example: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine mpn: type: string description: Manufacturer Part Number. Maximum length is 70 characters. example: DRESS-BLK-M-2023 gtin: type: string description: Global Trade Item Number. Expected length is 8-14 digits. example: '1234567890123' material: type: string description: Material of the product. example: cotton gender: type: string description: Gender value for fashion catalogs. example: female enum: - female - male - girls - boys - unisex category: type: array description: Category hierarchy. example: - ladies - dresses - short items: type: string description: Category hierarchy. example: '["ladies","dresses","short"]' locale: type: array description: Supported locales for this variant. example: - en-GB - de-DE items: type: string description: Supported locales for this variant. example: '["en-GB","de-DE"]' ean: type: string description: Standardised article number. example: '8076809513456' multipack: type: integer description: Multipack quantity. format: int32 example: 3 collaboration: type: array description: Retailer-specific collaboration values. example: - designer-capsule - summer-edit items: type: string description: Retailer-specific collaboration values. example: '["designer-capsule","summer-edit"]' variant_title: type: string description: Human-readable title of the variant. example: Basic t-shirt, size L style_title: type: string description: Human-readable title of the style. example: Black basic t-shirt product_title: type: object additionalProperties: type: string description: Localized product title keyed by BCP 47 locale or '*' fallback. example: '{"en-GB":"Summer dress","de-DE":"Sommerkleid","fr-FR":"Robe d''ete","*":"Summer dress"}' description: Localized product title keyed by BCP 47 locale or '*' fallback. example: en-GB: Summer dress de-DE: Sommerkleid fr-FR: Robe d'ete '*': Summer dress product_description: type: object additionalProperties: type: string description: Localized product description keyed by BCP 47 locale or '*' fallback. example: '{"en-GB":"Light dress","de-DE":"Leichtes Kleid"}' description: Localized product description keyed by BCP 47 locale or '*' fallback. example: en-GB: Light dress de-DE: Leichtes Kleid image_url: type: array description: List of product image URLs. example: - https://cdn.com/photo1.jpg - https://cdn.com/photo2.jpg - https://cdn.com/photo3.jpg items: type: string description: List of product image URLs. example: '["https://cdn.com/photo1.jpg","https://cdn.com/photo2.jpg","https://cdn.com/photo3.jpg"]' pdp_url: type: object additionalProperties: type: string description: Localized product detail page URL keyed by BCP 47 locale or '*' fallback. example: '{"en-GB":"https://shop.example/gb/basic-tshirt-001","de-DE":"https://shop.example/de/basic-tshirt-001"}' description: Localized product detail page URL keyed by BCP 47 locale or '*' fallback. example: en-GB: https://shop.example/gb/basic-tshirt-001 de-DE: https://shop.example/de/basic-tshirt-001 season_code: type: boolean description: Indicates whether the product belongs to a seasonal assortment. example: true old_price: type: object additionalProperties: type: number description: Former selling price keyed by ISO 3166-1 alpha-2 country code or '*' fallback. description: Former selling price keyed by ISO 3166-1 alpha-2 country code or '*' fallback. example: US: 39.99 GB: 34.99 set_id: type: string description: Identifier for products sold as a set. example: BIKINI-SET-001 extra_id: type: object additionalProperties: type: string description: Additional localized or country-specific product identifier. example: '{"US":"EXTRA-US-1001","GB":"EXTRA-GB-1001"}' description: Additional localized or country-specific product identifier. example: US: EXTRA-US-1001 GB: EXTRA-GB-1001 ancillary_product_code: type: string description: Additional product identifier. example: ANC-1001 min_age: type: integer description: Minimal age in months for children's wear. format: int32 example: 12 max_age: type: integer description: Maximum age in months for children's wear. format: int32 example: 24 best_model_image: type: string description: Best model image URL. example: https://cdn.com/best_model_image.jpg best_product_image: type: string description: Best product-only image URL. example: https://cdn.com/best_product_image.jpg description: 'Flat variant payload based on the unified product catalog schema, where:
- predefined SOURCE attributes are documented as fields here.
- custom SOURCE attributes are added dynamically on top-level as fields.
- ENRICHED attributes are added dynamically on top-level as fields.
- SOURCE attributes have no prefix, while ENRICHED attributes have the ''fashion_'' prefix.
' example: - variant_id: V-1001 product_id: P-500 style_id: S-42 status: value: 1 label: active availability: value: true label: available catalog_id: 12345 source_creation_time: 1783502993000 source_update_time: 1783503093000 enriched_creation_time: 1783503193000 enriched_update_time: 1783503293000 color: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine price: US: 29.99 GB: 24.99 size: US: S EU: '36' fashion_material: leather fashion_season: summer - variant_id: V-1002 product_id: P-500 style_id: S-42 status: value: 1 label: active availability: value: true label: available catalog_id: 12345 source_creation_time: 1783503393000 source_update_time: 1783503493000 enriched_creation_time: 1783503593000 enriched_update_time: 1783503693000 color: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine price: US: 29.99 GB: 24.99 size: US: M EU: '38' fashion_material: leather fashion_season: summer securitySchemes: Keycloak: type: http scheme: bearer bearerFormat: JWT x-apievangelist-provenance: method: searched generated: '2026-08-12' source: https://docs.mapp.com/apidocs/ (per-endpoint OpenAPI fragments, Product Catalog API) note: Union of the OpenAPI 3.0.1 fragments Mapp publishes on each Product Catalog endpoint page. Content verbatim.