openapi: 3.2.0 info: title: Product Catalog - Public Variant Data Bulk Operations API version: 1.0.1 description: Endpoints for variant data bulk operations servers: - url: https://api.mapp.com security: - Keycloak: [] tags: - name: Variant Data Bulk Operations description: Endpoints for variant data bulk operations paths: /api/product-catalog/v1/catalogs/{catalogId}/variants/bulk: post: tags: - Variant Data Bulk Operations summary: Bulk add variants description: 'Adds multiple variants in a single request. Each variant in the array is processed like a single add: new variants are created and missing fields are added to existing ones, without changing existing values. Up to 1000 variants are allowed per request.' operationId: bulkAddVariants parameters: - name: catalogId in: path description: Catalog identifier where variants should be added. required: true schema: type: integer format: int64 requestBody: description: List of variant payloads to add. Each payload must include variant_id. content: application/json: schema: type: array items: $ref: '#/components/schemas/AddVariantOperationFlatSchema' required: true responses: '202': description: Variant add accepted for processing content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: accepted catalog_id: 123 total_variants_success: 2 total_variants_failed: 0 message: Variant add accepted for processing accepted_at: 1783502993000 variant_events_success: - event_id: 550e8400-e29b-41d4-a716-446655440000 variant_id: V-1001 status: accepted accepted_attributes: variant_id: V-1001 product_id: P-500 status: active availability: available - event_id: 660e8400-e29b-41d4-a716-446655440000 variant_id: V-1002 status: accepted accepted_attributes: variant_id: V-1002 product_id: P-500 status: active availability: available variant_events_failed: [] '500': description: Unexpected error while processing bulk add. 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' '400': description: Bulk add payload list is missing or null. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list is null accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] '422': description: Bulk add payload exceeds the maximum allowed size of 1000 variants. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list exceeds maximum allowed size of 1000 accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] delete: tags: - Variant Data Bulk Operations summary: Bulk delete variants description: Deletes multiple variants in a single request. Each variant in the array is deleted if it exists and skipped otherwise, removing both source and enriched data. Up to 1000 variants are allowed per request. operationId: bulkDeleteVariants parameters: - name: catalogId in: path description: Catalog identifier containing the variants to delete. required: true schema: type: integer format: int64 requestBody: description: List of variant identifiers to delete. content: application/json: schema: type: array items: $ref: '#/components/schemas/BulkDeleteVariantOperationFlatSchema' example: - variant_id: V-1001 - variant_id: V-1002 required: true responses: '400': description: Bulk delete payload list is missing or null. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list is null accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] '422': description: Bulk delete payload exceeds the maximum allowed size of 1000 variants. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list exceeds maximum allowed size of 1000 accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] '500': description: Unexpected error while processing bulk delete. 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' '202': description: Variant delete accepted for processing content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: delete status: accepted catalog_id: 123 total_variants_success: 2 total_variants_failed: 0 message: Variant delete accepted for processing accepted_at: 1783502993000 variant_events_success: - event_id: 550e8400-e29b-41d4-a716-446655440000 variant_id: V-1001 status: accepted - event_id: 660e8400-e29b-41d4-a716-446655440000 variant_id: V-1002 status: accepted variant_events_failed: [] patch: tags: - Variant Data Bulk Operations summary: Bulk partial update variants description: Partially updates multiple existing variants in a single request. For each variant, only the provided fields are changed and non-existent variants are skipped. Up to 1000 variants are allowed per request. operationId: bulkPartialUpdateVariants parameters: - name: catalogId in: path description: Catalog identifier containing the variants to update. required: true schema: type: integer format: int64 requestBody: description: List of partial variant payloads. Only provided fields are changed for each variant. content: application/json: schema: type: array items: $ref: '#/components/schemas/BulkPartialUpdateVariantOperationFlatSchema' required: true responses: '202': description: Variant partial update accepted for processing content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: partial_update status: accepted catalog_id: 123 total_variants_success: 2 total_variants_failed: 0 message: Variant partial update accepted for processing accepted_at: 1783502993000 variant_events_success: - event_id: 550e8400-e29b-41d4-a716-446655440000 variant_id: V-1001 status: accepted accepted_attributes: status: discontinued price: US: 39.99 GB: 34.99 - event_id: 660e8400-e29b-41d4-a716-446655440000 variant_id: V-1002 status: accepted accepted_attributes: availability: not_available variant_events_failed: [] '500': description: Unexpected error while processing bulk partial update. 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' '422': description: Bulk partial update payload exceeds the maximum allowed size of 1000 variants. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list exceeds maximum allowed size of 1000 accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] '400': description: Bulk partial update payload list is missing or null. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list is null accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] put: tags: - Variant Data Bulk Operations summary: Bulk upsert variants description: Creates or fully replaces multiple variants in a single request. Each variant in the array is created if missing or has all of its data overwritten if it already exists. Up to 1000 variants are allowed per request. operationId: bulkUpsertVariants parameters: - name: catalogId in: path description: Catalog identifier where variants should be created or replaced. required: true schema: type: integer format: int64 requestBody: description: List of complete variant payloads that will replace existing variant data. content: application/json: schema: type: array items: $ref: '#/components/schemas/BulkUpsertVariantOperationFlatSchema' required: true responses: '400': description: Bulk upsert payload list is missing or null. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list is null accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] '202': description: Variant upsert accepted for processing content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: upsert status: accepted catalog_id: 123 total_variants_success: 2 total_variants_failed: 0 message: Variant upsert accepted for processing accepted_at: 1783502993000 variant_events_success: - event_id: 550e8400-e29b-41d4-a716-446655440000 variant_id: V-1001 status: accepted accepted_attributes: variant_id: V-1001 product_id: P-500 status: active availability: available - event_id: 660e8400-e29b-41d4-a716-446655440000 variant_id: V-1002 status: accepted accepted_attributes: variant_id: V-1002 product_id: P-500 status: discontinued availability: not_available variant_events_failed: [] '422': description: Bulk upsert payload exceeds the maximum allowed size of 1000 variants. content: application/json: schema: $ref: '#/components/schemas/BulkVariantOperationResponseDTO' example: operation_id: 350e8400-e29b-41d4-a716-546655440000 operation: add status: failed catalog_id: 123 total_variants_success: 0 total_variants_failed: 0 message: Payload list exceeds maximum allowed size of 1000 accepted_at: 1783502993000 variant_events_success: [] variant_events_failed: [] '500': description: Unexpected error while processing bulk upsert. 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: VariantEventResult: type: object properties: event_id: type: string description: 'Unique generated UUID assigned to the event and preserved throughout its whole lifecycle. The event_id is used in logs and is also sent back to the client with webhook events when webhooks are configured, so clients are advised to log/save it on their side.' example: 550e8400-e29b-41d4-a716-446655440000 variant_id: type: string example: V-1001 status: type: string example: accepted enum: - accepted - failed accepted_attributes: type: object additionalProperties: type: object example: color: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine size: US: S EU: '36' example: color: en-GB: Navy Blue de-DE: Marineblau fr-FR: Bleu marine size: US: S EU: '36' skipped_attributes: $ref: '#/components/schemas/SkippedAttributesDTO' failure_reason: type: string description: Filled in only when variant could not be processed. example: price mandatory field cannot be deleted BulkUpsertVariantOperationFlatSchema: required: - variant_id type: object properties: 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' status: type: integer description: 'Variant status value: 0 = pre_order, 1 = active, 2 = discontinued.' format: int32 example: 1 enum: - 0 - 1 - 2 availability: type: boolean description: Variant availability value. example: true 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"]' product_id: type: string description: Identifier used for grouping all variants belonging to the same product. Provide it when creating a new variant. 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 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 variant_id: type: string description: Client-defined unique identifier of the purchasable variant. Maximum length is 255 characters. example: V-1001 description: 'Flat request payload for bulk creating or fully replacing a SOURCE variant, where:
- predefined SOURCE attributes are documented as fields here.
- custom SOURCE attributes are added dynamically on top-level as fields.
- ENRICHED attributes are not accepted by this endpoint; this endpoint writes SOURCE data only.
If the variant doesn''t exist, it will be created. If it exists, all data will be completely replaced with the provided payload. ' BulkVariantOperationResponseDTO: type: object properties: operation_id: type: string example: 350e8400-dgwe-41d4-a716-546655440000 status: type: string example: accepted enum: - accepted - failed catalog_id: type: integer format: int64 example: 123 operation: type: string example: add enum: - add - upsert - partial_update - delete - delete_attributes - add_existing_only - overwrite - overwrite_existing_only - update - update_existing_only - update_localized_attribute - update_localized_attribute_existing_only - clean total_variants_success: type: integer format: int32 example: 1 total_variants_failed: type: integer format: int32 example: 1 message: type: string example: Variant add accepted for processing" accepted_at: type: string format: date-time variant_events_success: type: array items: $ref: '#/components/schemas/VariantEventResult' variant_events_failed: type: array items: $ref: '#/components/schemas/VariantEventResult' AddVariantOperationFlatSchema: required: - variant_id type: object properties: 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' status: type: integer description: 'Variant status value: 0 = pre_order, 1 = active, 2 = discontinued.' format: int32 example: 1 enum: - 0 - 1 - 2 availability: type: boolean description: Variant availability value. example: true 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_id: type: string description: Client-defined unique identifier of the purchasable variant. Maximum length is 255 characters. example: V-1001 product_id: type: string description: Identifier used for grouping all variants belonging to the same product. Provide it when creating a new variant. 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 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 request payload for adding a SOURCE variant, where:
- predefined SOURCE attributes are documented as fields here.
- custom SOURCE attributes are added dynamically on top-level as fields.
- ENRICHED attributes are not accepted by this endpoint; this endpoint writes SOURCE data only.
The field variant_id is always required. product_id should be provided when creating a new variant.' BulkDeleteVariantOperationFlatSchema: required: - variant_id type: object properties: variant_id: type: string description: Client-defined unique identifier of the purchasable variant. Maximum length is 255 characters. example: V-1001 description: 'Flat request payload for bulk deleting a SOURCE variant. ' BulkPartialUpdateVariantOperationFlatSchema: required: - variant_id type: object properties: 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' status: type: integer description: 'Variant status value: 0 = pre_order, 1 = active, 2 = discontinued.' format: int32 example: 1 enum: - 0 - 1 - 2 availability: type: boolean description: Variant availability value. example: true 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"]' 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 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 variant_id: type: string description: Client-defined unique identifier of the purchasable variant. Maximum length is 255 characters. example: V-1001 description: 'Flat request payload for bulk partially updating a SOURCE variant, where:
- predefined SOURCE attributes are documented as fields here.
- custom SOURCE attributes are added dynamically on top-level as fields.
- ENRICHED attributes are not accepted by this endpoint; this endpoint writes SOURCE data only.
Only the provided fields will be updated. If the variant doesn''t exist, no action is taken. ' ErrorResponse: type: object properties: message: type: string httpStatus: type: integer format: int32 errorCode: type: string timestamp: type: string format: date-time SkippedAttributesDTO: type: object properties: non_existing_attributes: uniqueItems: true type: array example: - custom_attribute_abc items: type: string example: '["custom_attribute_abc"]' inactive_attributes: uniqueItems: true type: array example: - custom_attribute_def items: type: string example: '["custom_attribute_def"]' invalid_data_type_attributes: type: object additionalProperties: type: string example: '{"price":"price map value must be a number","gtin":"gtin field must be 8-14 digits","min_age":"min_age value must be a number"}' example: price: price map value must be a number gtin: gtin field must be 8-14 digits min_age: min_age value must be a number 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.