openapi: 3.0.1
info:
title: Product Catalog - Public API
version: 1.0.1
servers:
- url: https://api.mapp.com
security:
- Keycloak: []
tags:
- name: Variant Data Bulk Operations
description: Endpoints for variant data bulk operations
- name: Variant Data Operations
description: Endpoints for variant data operations
- name: Catalog Metadata Operations
description: Endpoints for catalog metadata operations
- name: Product Data Operations
description: Endpoints for product data operations
paths:
/api/product-catalog/v1/catalogs/{catalogId}/variants:
post:
tags:
- Variant Data Operations
summary: 'Add a new variant or add missing data to an existing variant. '
description: If the variant does not exist it is created; if it already exists, only fields that are not yet present
are added and existing values remain unchanged.
operationId: addVariant
parameters:
- name: catalogId
in: path
description: Catalog identifier where the variant should be added.
required: true
schema:
type: integer
format: int64
requestBody:
description: Variant attributes to add. The payload must include variant_id.
content:
application/json:
schema:
$ref: '#/components/schemas/AddVariantOperationFlatSchema'
example:
variant_id: V-1001
product_id: P-500
status: 1
availability: true
color:
en-GB: Navy Blue
de-DE: Marineblau
fr-FR: Bleu marine
price:
US: 29.99
GB: 24.99
size:
US: S
EU: '36'
required: true
responses:
'400':
description: Variant add was rejected during validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant add failed: variant_id field must be provided'
operation: add
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
'202':
description: Variant add accepted for processing
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: accepted
message: Variant add accepted for processing
event_id: 550e8400-e29b-41d4-a716-446655440000
operation: add
accepted_at: 1783502993000
accepted_attributes:
variant_id: V-1001
product_id: P-500
status: 1
availability: true
'500':
description: Variant add failed unexpectedly.
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'
get:
tags:
- Variant Data Operations
summary: List variants with cursor pagination
description: Returns a page of variants for the given company and catalog using cursor-based pagination. Provide either
'lastId' (forward) or 'firstId' (backward) together with a page 'size'; the two cursors are mutually exclusive. Results
can additionally be filtered by attribute active status, product data layer, and a modification timestamp range. If
no data is found, HTTP 204 (No Content) is returned.
operationId: getPaginatedVariants
parameters:
- name: catalogId
in: path
description: Catalog identifier whose variants should be listed.
required: true
schema:
type: integer
format: int64
- 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. Defaults to 100; values less than 1 or greater than
100 are normalized to 100.
required: false
schema:
type: integer
format: int32
default: 100
- 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:
'200':
description: Paginated variants found
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedVariantsResponseDTO'
example:
productViewPayloads:
- variant_id: V-1001
product_id: P-500
status:
value: 1
label: active
availability:
value: true
label: available
catalog_id: 123
source_creation_time: 1783502993000
source_update_time: 1783503093000
enriched_creation_time: 1783503193000
enriched_update_time: 1783503293000
color:
en-GB: Navy Blue
de-DE: Marineblau
fashion_material: leather
fashion_season: summer
- variant_id: V-1002
product_id: P-500
status:
value: 1
label: active
availability:
value: true
label: available
catalog_id: 123
source_creation_time: 1783503393000
source_update_time: 1783503493000
enriched_creation_time: 1783503593000
enriched_update_time: 1783503693000
size:
US: M
EU: '38'
fashion_material: leather
fashion_season: summer
paginationCursor:
lastId: 687d57eb6986be26d3f7e0b4
firstId: 687d57eb6986be26d3f7e0a3
previousPageExists: false
nextPageExists: true
'400':
description: Pagination is missing or invalid, modification date filters are invalid, or catalog attributes are
not configured.
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'
'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'
'204':
description: No variants were found for the requested page and filters.
'500':
description: Unexpected error while fetching paginated 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'
/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'
/api/product-catalog/v1/catalogs/{catalogId}/variants/{variantId}:
put:
tags:
- Variant Data Operations
summary: Create or fully replace a variant
description: If the variant does not exist it is created; if it already exists, all of its data is completely overwritten
with the provided payload.
operationId: upsertVariant
parameters:
- name: catalogId
in: path
description: Catalog identifier where the variant should be created or replaced.
required: true
schema:
type: integer
format: int64
- name: variantId
in: path
description: Variant identifier to create or fully replace.
required: true
schema:
type: string
requestBody:
description: Complete variant payload that will replace existing variant data.
content:
application/json:
schema:
$ref: '#/components/schemas/UpsertVariantOperationFlatSchema'
example:
product_id: P-500
status: 1
availability: true
color:
en-GB: Navy Blue
de-DE: Marineblau
fr-FR: Bleu marine
price:
US: 29.99
GB: 24.99
size:
US: S
EU: '36'
required: true
responses:
'500':
description: Variant upsert failed unexpectedly.
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: Variant upsert was rejected during validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant upsert failed: missingMandatoryFields=[price]'
operation: upsert
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
'202':
description: Variant upsert accepted for processing
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: accepted
message: Variant upsert accepted for processing
event_id: 550e8400-e29b-41d4-a716-446655440000
operation: upsert
accepted_at: 1783502993000
accepted_attributes:
variant_id: V-1001
product_id: P-500
status: active
availability: available
delete:
tags:
- Variant Data Operations
summary: Delete a variant by ID
description: Both source and enriched data is removed.
operationId: deleteVariant
parameters:
- name: catalogId
in: path
description: Catalog identifier containing the variant to delete.
required: true
schema:
type: integer
format: int64
- name: variantId
in: path
description: Variant identifier to delete.
required: true
schema:
type: string
responses:
'202':
description: Variant delete accepted for processing
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: accepted
message: Variant delete accepted for processing
event_id: 550e8400-e29b-41d4-a716-446655440000
operation: delete
accepted_at: 1783502993000
'400':
description: Variant delete was rejected during validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant delete failed: price mandatory field cannot be deleted'
operation: delete
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
'404':
description: Variant delete target was not found by downstream validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant delete failed: price mandatory field cannot be deleted'
operation: delete
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
'500':
description: Variant delete failed unexpectedly.
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'
get:
tags:
- Variant Data Operations
summary: Get a single variant by ID
description: Retrieves a single variant identified by its variant ID from the specified catalog. The returned attributes
can be filtered by active status and by the product data layer (source, enriched, or combined). Returns 204 (No Content)
when no variant matches the requested identifier and filters.
operationId: getVariant
parameters:
- name: catalogId
in: path
description: Catalog identifier that contains the variant.
required: true
schema:
type: integer
format: int64
- name: variantId
in: path
description: Variant identifier to retrieve from the catalog.
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
responses:
'500':
description: Unexpected error while fetching variant data.
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'
'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: Variant found
content:
application/json:
schema:
$ref: '#/components/schemas/VariantFlatViewResponse'
example:
variant_id: V-1001
product_id: P-500
status:
value: 1
label: active
availability:
value: true
label: available
catalog_id: 123
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
'204':
description: Variant was not found for the requested catalog and filters.
'400':
description: Invalid query parameters 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'
patch:
tags:
- Variant Data Operations
summary: Partially update a variant
description: 'Updates selected fields of an existing variant. Only the fields present in the payload are changed; all
other fields are left untouched. If the variant does not exist, no action is taken. '
operationId: partialUpdateVariant
parameters:
- name: catalogId
in: path
description: Catalog identifier containing the variant to update.
required: true
schema:
type: integer
format: int64
- name: variantId
in: path
description: Variant identifier to partially update.
required: true
schema:
type: string
requestBody:
description: Variant attributes to update. Only provided fields are changed.
content:
application/json:
schema:
$ref: '#/components/schemas/PartialUpdateVariantOperationFlatSchema'
example:
status: 2
price:
US: 39.99
GB: 34.99
required: true
responses:
'400':
description: Variant partial update was rejected during validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant partial update failed: status value ''archived'' is not a valid VariantStatus'
operation: partial_update
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
'202':
description: Variant partial update accepted for processing
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: accepted
message: Variant partial update accepted for processing
event_id: 550e8400-e29b-41d4-a716-446655440000
operation: partial_update
accepted_at: 1783502993000
accepted_attributes:
variant_id: V-1001
status: discontinued
price:
US: 39.99
GB: 34.99
'500':
description: Variant partial update failed unexpectedly.
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'
/api/product-catalog/v1/catalogs/{catalogId}/variants/:
delete:
tags:
- Variant Data Operations
summary: Delete all variants in a catalog
description: Deletes every variant in the specified catalog, removing both source and enriched data. This clears the
entire catalog contents and cannot be undone.
operationId: deleteAllCatalogData
parameters:
- name: catalogId
in: path
description: Catalog identifier whose variants should be deleted.
required: true
schema:
type: integer
format: int64
responses:
'500':
description: Catalog variants delete failed unexpectedly.
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: Catalog variants delete accepted for processing
content:
application/json:
schema:
$ref: '#/components/schemas/CatalogOperationResponseDTO'
example:
catalog_id: 123
status: accepted
message: Catalog variants delete accepted for processing
event_id: 550e8400-e29b-41d4-a716-446655440000
operation: delete
accepted_at: 1783502993000
'400':
description: Catalog variants delete was rejected during validation.
content:
application/json:
schema:
$ref: '#/components/schemas/CatalogOperationResponseDTO'
example:
catalog_id: 123
status: failed
message: 'Catalog variants delete failed: Product Catalog by catalogId 123 not found'
operation: delete
accepted_at: 1783502993000
/api/product-catalog/v1/catalogs/{catalogId}/variants/{variantId}/attributes:
delete:
tags:
- Variant Data Operations
summary: Delete attributes from a variant
description: Deletes the named attributes from the variant identified by its variant ID in the specified catalog. Only
the attributes listed in the request body are removed; the rest of the variant is left unchanged.
operationId: deleteVariantAttributes
parameters:
- name: catalogId
in: path
description: Catalog identifier containing the variant.
required: true
schema:
type: integer
format: int64
- name: variantId
in: path
description: Variant identifier whose attributes should be deleted.
required: true
schema:
type: string
requestBody:
description: Names of attributes to delete from the variant.
content:
application/json:
schema:
type: array
example:
- custom_attributeA
- custom_attribute_B
required: true
responses:
'404':
description: Variant attributes delete target was not found by downstream validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant attributes delete failed: attributeNames cannot be parsed'
operation: delete_attributes
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
'500':
description: Variant attributes delete failed unexpectedly.
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 attributes delete accepted for processing
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: accepted
message: Variant attributes delete accepted for processing
event_id: 550e8400-e29b-41d4-a716-446655440000
operation: delete_attributes
accepted_at: 1783502993000
accepted_attributes:
variant_id: V-1001
attributeNames: custom_attributeA, custom_attribute_B
'400':
description: Variant attributes delete was rejected during validation.
content:
application/json:
schema:
$ref: '#/components/schemas/VariantOperationResponseDTO'
example:
variant_id: V-1001
catalog_id: 123
status: failed
message: 'Variant attributes delete failed: attributeNames cannot be parsed'
operation: delete_attributes
accepted_at: 1783502993000
accepted_attributes: {}
skipped_attributes: {}
/api/product-catalog/v1/catalogs/metadata/attribute/{catalogId}:
get:
tags:
- Catalog Metadata Operations
summary: Get all attributes assigned to a catalog
description: Returns all active attributes assigned to the specified catalog. Inactive attributes are not returned by
this endpoint.
operationId: getCatalogAttributes
parameters:
- name: catalogId
in: path
description: Catalog identifier whose assigned attributes should be returned.
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Catalog attributes found
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/CatalogAttributeDTO'
example:
- name: color
dataType: MAP
localizedAttributeKeyType: LANGUAGE_COUNTRY
localizedAttributeValueType: STRING
catalogType: SOURCE
- name: price
dataType: MAP
localizedAttributeKeyType: COUNTRY
localizedAttributeValueType: DECIMAL
catalogType: SOURCE
- name: fashion_material
dataType: STRING
localizedAttributeKeyType: null
localizedAttributeValueType: null
catalogType: ENRICHED
'500':
description: Unexpected error while fetching catalog attributes.
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'
'204':
description: No active attributes are assigned to the catalog.
/api/product-catalog/v1/catalogs/metadata/catalog/workspace:
get:
tags:
- Catalog Metadata Operations
summary: Get catalog metadata for a workspace
description: Returns the metadata of the catalog assigned to a workspace, which a token you authorize with belongs
to
operationId: getCatalogMetadataByWorkspace
parameters: []
responses:
'204':
description: No catalog is assigned to the requested workspace, or the assigned catalog lookup returned an empty
body.
'404':
description: Assigned 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: Catalog metadata found
content:
application/json:
schema:
$ref: '#/components/schemas/CatalogDTO'
example:
id: 123
name: Spring Fashion Catalog
description: Primary product catalog for spring assortment
enrichReady: true
createDate: '2026-07-08T12:00:00Z'
modifyDate: '2026-07-08T13:30:00Z'
creatorId: 789
'500':
description: Unexpected error while fetching catalog metadata.
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'
/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:
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.'
VariantOperationResponseDTO:
type: object
properties:
variant_id:
type: string
example: V-1001
catalog_id:
type: integer
format: int64
example: 123
status:
type: string
example: accepted
enum:
- accepted
- failed
message:
type: string
example: Variant add accepted for processing
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
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
accepted_at:
type: integer
format: int64
example: 1783502993000
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'
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
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'
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
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. '
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. '
UpsertVariantOperationFlatSchema:
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
description: 'Flat request payload for 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.'
CatalogOperationResponseDTO:
type: object
properties:
catalog_id:
type: integer
format: int64
example: 123
status:
type: string
enum:
- accepted
- failed
message:
type: string
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
operation:
type: string
example: delete
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
accepted_at:
type: string
format: date-time
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
CatalogAttributeDTO:
type: object
properties:
name:
type: string
description: Unique attribute name as defined in the catalog
dataType:
type: string
description: 'Data type of a catalog attribute value:
- `STRING` — plain text value (e.g. `"blue"`)
- `NUMBER` — integer or decimal value (e.g. `42`, `3.14`)
- `BOOLEAN` — boolean value (`true` or `false`)
- `JSON` — arbitrary JSON object (e.g. `{"key": "value"}`)
- `MAP` — flat key-value map (e.g. `{"en": "blue", "de": "blau"}`)
- `LIST` — ordered list of scalar values (e.g. `["S", "M", "L"]`)
- `LIST_OF_MAPS` — list of key-value maps (e.g. `[{"color": "red"}, {"color": "blue"}]`)
- `MAP_OF_LISTS` — map where each key holds a list of values (e.g. `{"sizes": ["S", "M"], "colors": ["red"]}`)'
enum:
- STRING
- NUMBER
- BOOLEAN
- JSON
- MAP
- LIST
- LIST_OF_MAPS
- MAP_OF_LISTS
localizedAttributeKeyType:
type: string
description: 'Type of localized attribute key, determining the expected key format:
- `COUNTRY_CODE` — ISO 3166-1 alpha-2 two-letter country code (e.g. `US`, `DE`)
- `LANGUAGE_CODE` — ISO 639-1 two-letter language code (e.g. `en`, `de`)
- `LANGUAGE_CODE_COUNTRY_CODE` — BCP 47 language-country tag, hyphen-separated (e.g. `en-US`, `de-DE`)
- `CURRENCY` — ISO 4217 three-letter currency code (e.g. `USD`, `EUR`)
- `NUMBER` — numeric value, integer or decimal (e.g. `42`, `3.14`)
- `STRING` — arbitrary string value'
enum:
- COUNTRY_CODE
- LANGUAGE_CODE
- LANGUAGE_CODE_COUNTRY_CODE
- CURRENCY
- NUMBER
- STRING
localizedAttributeValueType:
type: string
description: 'Type of localized attribute value, determining the expected value format:
- `STRING` — arbitrary string value (e.g. `sample text`)
- `NUMBER` — numeric value, integer or decimal (e.g. `42`, `3.14`)
- `BOOLEAN` — boolean value (`true` or `false`)
- `COUNTRY_CODE` — ISO 3166-1 alpha-2 two-letter country code (e.g. `US`, `DE`)
- `LANGUAGE_CODE` — ISO 639-1 two-letter language code (e.g. `en`, `de`)
- `CURRENCY` — ISO 4217 three-letter currency code (e.g. `USD`, `EUR`)
- `LANGUAGE_CODE_COUNTRY_CODE` — BCP 47 language-country tag, hyphen-separated (e.g. `en-US`, `de-DE`)'
enum:
- STRING
- NUMBER
- BOOLEAN
- COUNTRY_CODE
- LANGUAGE_CODE
- CURRENCY
- LANGUAGE_CODE_COUNTRY_CODE
catalogType:
type: string
description: Catalog data layer this attribute originates from
enum:
- SOURCE
- ENRICHED
- COMBINED
description: Represents a single product catalog attribute with its data type and optional localization metadata
CatalogDTO:
type: object
properties:
id:
type: integer
description: Catalog identifier
format: int64
readOnly: true
name:
type: string
description: Catalog name
description:
type: string
description: Catalog description
enrichReady:
type: boolean
description: Whether enriched catalog data is ready
createDate:
type: string
description: Catalog creation date
format: date-time
readOnly: true
modifyDate:
type: string
description: Catalog last modification date
format: date-time
readOnly: true
creatorId:
type: integer
description: Identifier of the user who created the catalog
format: int64
readOnly: true
description: Public catalog metadata
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'
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
PaginatedVariantsResponseDTO:
type: object
properties:
productViewPayloads:
type: array
example:
- variant_id: V-1001
product_id: P-500
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
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'
paginationCursor:
$ref: '#/components/schemas/PaginationCursorDTO'
PartialUpdateVariantOperationFlatSchema:
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
description: 'Flat request payload for 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.'
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.