post https://store-api.loudcrowd.com/api/product-data
Batch upsert or delete product catalog records in LoudCrowd. Aligns with the supported file formats documented in the LoudCrowd developer docs.
Send Product Data
POST /product-data
Batch upsert or delete product catalog records in LoudCrowd. Aligns with the supported file formats documented in the LoudCrowd developer docs. This API is designed to mirror the ingestion pipeline currently used for file-based product loads so that existing mappings can be reused.
Headers
Header | Required | Description |
---|---|---|
Authorization | Yes | Bearer token for authentication |
X-LC-SHOP-ID | Yes | Your LoudCrowd internal shop identifier |
X-Signature | Yes | The SHA-256 hexadecimal digest of the UTF-8 encoded JSON payload |
X-LC-TOPIC | Yes | Specifies the operation to apply to the provided products (PRODUCT_UPSERT or PRODUCT_DELETE ) |
Content-Type | Yes | Must be application/json |
Idempotency-Key | Yes | A unique identifier for the request (UUID format recommended) |
Request Body
{
"products": [
{
"platform_product_id": "PROD-001",
"parent_id": "PROD-001",
"position": 0,
"title": "Summer T-Shirt",
"brand": "YourBrand",
"active": true,
"product_url": "https://store.com/products/prod-001",
"image_src": "https://store.com/images/prod-001.jpg",
"language": "en",
"country": "US",
"list_price": 29.99,
"sale_price": 24.99,
"currency_code": "USD",
"availability": "in stock",
"allowed_regions": ["US", "CA"],
"variants": [
{
"variant_sku": "PROD-001-RED-M",
"parent_id": "PROD-001",
"position": 1,
"title": "Summer T-Shirt - Red Medium",
"product_url": "https://store.com/products/prod-001?color=red&size=m",
"image_src": "https://store.com/images/prod-001-red.jpg",
"list_price": 29.99,
"sale_price": 24.99,
"currency_code": "USD",
"availability": "in stock",
"allowed_regions": ["US", "CA"],
"option1_name": "Color",
"option1_value": "Red",
"option1_swatch_src": "https://store.com/swatches/red.jpg",
"option2_name": "Size",
"option2_value": "Medium",
"prices": [
{
"list_price": 29.99,
"sale_price": 24.99,
"currency_code": "USD",
"allowed_region": "US"
},
{
"list_price": 39.99,
"sale_price": 32.99,
"currency_code": "CAD",
"allowed_region": "CA"
}
]
}
]
}
]
}
Request Schema
Field | Type | Required | Description |
---|---|---|---|
products | Array | Yes | Batch of product records to upsert or delete (1-1000 items) |
Product Record Schema
Field | Type | Required | Description |
---|---|---|---|
platform_product_id | String | Yes | Unique product identifier from the eCommerce platform |
parent_id | String | Yes | ID of the parent product (same as product_id for standalone products) |
position | Integer | No | Display order for variants (0 for parent products) |
title | String | Yes | Product title |
brand | String | No | Brand name |
active | Boolean | No | Whether product is active/available (Y/N) |
product_url | String | No | Product PDP URL |
image_src | String | No | Primary product image URL |
language | String | No | Locale language (ISO 639-1 alpha2 format) |
country | String | No | Locale region (ISO 3166-1 alpha2 format) |
list_price | Number | No | Regular price of the product |
sale_price | Number | No | Currently discounted price |
currency_code | String | No | Currency code (ISO 4217 format) |
availability | String | No | Stock status ("in stock" or "out of stock") |
allowed_regions | Array | No | Selling regions where product is available |
variants | Array | No | List of product variants (max 250) |
Product Variant Schema
Field | Type | Required | Description |
---|---|---|---|
variant_sku | String | Yes | Variant SKU (acts as external key) |
parent_id | String | Yes | ID of the parent product |
position | Integer | No | Display order for this variant |
title | String | No | Variant-specific title |
product_url | String | No | Variant PDP URL |
image_src | String | No | Variant-specific image URL |
list_price | Number | No | Regular price of the variant |
sale_price | Number | No | Currently discounted price |
currency_code | String | No | Currency code (ISO 4217 format) |
availability | String | No | Stock status ("in stock" or "out of stock") |
allowed_regions | Array | No | Selling regions where variant is available |
option1_name | String | No | Name of the 1st variant option (e.g., "Color") |
option1_value | String | No | Value of the 1st variant option (e.g., "Red") |
option1_swatch_src | String | No | URL for the 1st option's swatch image |
option2_name | String | No | Name of the 2nd variant option (e.g., "Size") |
option2_value | String | No | Value of the 2nd variant option (e.g., "Medium") |
option2_swatch_src | String | No | URL for the 2nd option's swatch image |
option3_name | String | No | Name of the 3rd variant option |
option3_value | String | No | Value of the 3rd variant option |
option3_swatch_src | String | No | URL for the 3rd option's swatch image |
prices | Array | No | Multiple prices per region/currency (see below) |
Variant Price Schema
Field | Type | Required | Description |
---|---|---|---|
list_price | Number | No | Regular price for this region/currency |
sale_price | Number | No | Discounted price for this region/currency |
currency_code | String | No | Currency code (ISO 4217 format) |
allowed_region | String | No | Selling region this price applies to |
Responses
Success Response (200)
{
"success": true,
"message": "Product data processed",
"processedCount": 123
}
Headers:
X-RateLimit-Limit
: Total requests allowed in the current windowX-RateLimit-Remaining
: Requests remaining in the current windowX-RateLimit-Reset
: Unix epoch seconds when the current window resets
Validation Error Response (422)
{
"code": 422,
"message": "Unprocessable Entity",
"recordErrors": [
{
"index": 0,
"field": "products[0].platform_product_id",
"code": "REQUIRED",
"message": "platform_product_id is required"
},
{
"index": 1,
"field": "products[1].title",
"code": "INVALID_FORMAT",
"message": "title must be a non-empty string"
}
]
}
Rate Limit Response (429)
{
"code": 429,
"message": "Rate Limit Exceeded"
}
Headers:
X-RateLimit-Limit
: Total requests allowed in the current windowX-RateLimit-Remaining
: Requests remaining in the current windowX-RateLimit-Reset
: Unix epoch seconds when the current window resetsRetry-After
: Seconds until the next request may be made
Error Responses
Status | Description |
---|---|
400 | Bad Request - Invalid data provided |
401 | Unauthorized - Invalid authentication |
403 | Forbidden - Invalid API key |
404 | Not Found - Resource doesn't exist |
422 | Unprocessable Entity - Validation errors for individual records |
429 | Too Many Requests - Rate limit exceeded |
500 | Internal Server Error |
503 | Service Unavailable |
Examples
Upsert Products
curl -X POST https://api.loudcrowd.com/product-data \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-LC-SHOP-ID: your-shop-id" \
-H "X-Signature: sha256-hash-of-payload" \
-H "X-LC-TOPIC: PRODUCT_UPSERT" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: a1b2c3d4-e5f6-7890-1234-567890abcdef" \
-d '{
"products": [
{
"platform_product_id": "PROD-001",
"parent_id": "PROD-001",
"position": 0,
"title": "Summer T-Shirt",
"brand": "YourBrand",
"active": true,
"product_url": "https://store.com/products/prod-001",
"image_src": "https://store.com/images/prod-001.jpg",
"list_price": 29.99,
"sale_price": 24.99,
"currency_code": "USD",
"availability": "in stock",
"allowed_regions": ["US", "CA"],
"variants": [
{
"variant_sku": "PROD-001-RED-M",
"parent_id": "PROD-001",
"position": 1,
"product_url": "https://store.com/products/prod-001?color=red&size=m",
"list_price": 29.99,
"sale_price": 24.99,
"currency_code": "USD",
"availability": "in stock",
"allowed_regions": ["US", "CA"],
"option1_name": "Color",
"option1_value": "Red",
"option2_name": "Size",
"option2_value": "Medium",
"prices": [
{
"list_price": 29.99,
"sale_price": 24.99,
"currency_code": "USD",
"allowed_region": "US"
},
{
"list_price": 39.99,
"sale_price": 32.99,
"currency_code": "CAD",
"allowed_region": "CA"
}
]
}
]
}
]
}'
Delete Products
curl -X POST https://api.loudcrowd.com/product-data \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-LC-SHOP-ID: your-shop-id" \
-H "X-Signature: sha256-hash-of-payload" \
-H "X-LC-TOPIC: PRODUCT_DELETE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: b2c3d4e5-f6g7-8901-2345-678901bcdefg" \
-d '{
"products": [
{
"platform_product_id": "PROD-001",
"parent_id": "PROD-001",
"title": "Summer T-Shirt"
}
]
}'
Notes
- Multiple Regions: Use
allowed_regions
array to specify which regions a product/variant is available in - Multiple Prices: Use the
prices
array in variants to specify different prices per region/currency - Variant Options: Support up to 3 variant options (option1, option2, option3) with names, values, and swatch images
- Translations: Use
language
andcountry
fields for localized content - Position: Use
position
field to control display order of variants - Parent-Child Relationship: Use
parent_id
to group variants under parent products - For delete operations, only
platform_product_id
,parent_id
, andtitle
are required - Idempotency keys should be unique per request and can be reused for retries
- Rate limits are shared across all endpoints for an account
Alignment with File-Based Ingestion
This API is designed to mirror the file-based product ingestion format to ensure compatibility with existing product data mappings. The JSON structure maps directly to the CSV fields used in the SFTP-based ingestion system.