/productData

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

HeaderRequiredDescription
AuthorizationYesBearer token for authentication
X-LC-SHOP-IDYesYour LoudCrowd internal shop identifier
X-SignatureYesThe SHA-256 hexadecimal digest of the UTF-8 encoded JSON payload
X-LC-TOPICYesSpecifies the operation to apply to the provided products (PRODUCT_UPSERT or PRODUCT_DELETE)
Content-TypeYesMust be application/json
Idempotency-KeyYesA 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

FieldTypeRequiredDescription
productsArrayYesBatch of product records to upsert or delete (1-1000 items)

Product Record Schema

FieldTypeRequiredDescription
platform_product_idStringYesUnique product identifier from the eCommerce platform
parent_idStringYesID of the parent product (same as product_id for standalone products)
positionIntegerNoDisplay order for variants (0 for parent products)
titleStringYesProduct title
brandStringNoBrand name
activeBooleanNoWhether product is active/available (Y/N)
product_urlStringNoProduct PDP URL
image_srcStringNoPrimary product image URL
languageStringNoLocale language (ISO 639-1 alpha2 format)
countryStringNoLocale region (ISO 3166-1 alpha2 format)
list_priceNumberNoRegular price of the product
sale_priceNumberNoCurrently discounted price
currency_codeStringNoCurrency code (ISO 4217 format)
availabilityStringNoStock status ("in stock" or "out of stock")
allowed_regionsArrayNoSelling regions where product is available
variantsArrayNoList of product variants (max 250)

Product Variant Schema

FieldTypeRequiredDescription
variant_skuStringYesVariant SKU (acts as external key)
parent_idStringYesID of the parent product
positionIntegerNoDisplay order for this variant
titleStringNoVariant-specific title
product_urlStringNoVariant PDP URL
image_srcStringNoVariant-specific image URL
list_priceNumberNoRegular price of the variant
sale_priceNumberNoCurrently discounted price
currency_codeStringNoCurrency code (ISO 4217 format)
availabilityStringNoStock status ("in stock" or "out of stock")
allowed_regionsArrayNoSelling regions where variant is available
option1_nameStringNoName of the 1st variant option (e.g., "Color")
option1_valueStringNoValue of the 1st variant option (e.g., "Red")
option1_swatch_srcStringNoURL for the 1st option's swatch image
option2_nameStringNoName of the 2nd variant option (e.g., "Size")
option2_valueStringNoValue of the 2nd variant option (e.g., "Medium")
option2_swatch_srcStringNoURL for the 2nd option's swatch image
option3_nameStringNoName of the 3rd variant option
option3_valueStringNoValue of the 3rd variant option
option3_swatch_srcStringNoURL for the 3rd option's swatch image
pricesArrayNoMultiple prices per region/currency (see below)

Variant Price Schema

FieldTypeRequiredDescription
list_priceNumberNoRegular price for this region/currency
sale_priceNumberNoDiscounted price for this region/currency
currency_codeStringNoCurrency code (ISO 4217 format)
allowed_regionStringNoSelling 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 window
  • X-RateLimit-Remaining: Requests remaining in the current window
  • X-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 window
  • X-RateLimit-Remaining: Requests remaining in the current window
  • X-RateLimit-Reset: Unix epoch seconds when the current window resets
  • Retry-After: Seconds until the next request may be made

Error Responses

StatusDescription
400Bad Request - Invalid data provided
401Unauthorized - Invalid authentication
403Forbidden - Invalid API key
404Not Found - Resource doesn't exist
422Unprocessable Entity - Validation errors for individual records
429Too Many Requests - Rate limit exceeded
500Internal Server Error
503Service 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 and country 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, and title 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.

Language
Credentials
Bearer
URL