Upload Product Data and Track Processing
Use this guide to upload product data and follow it through the ingestion pipeline. Accounts with one enabled catalogue can let the API derive catalogue scope. Accounts with multiple enabled catalogues must use the explicit catalogue route and catalogue-scoped tokens.
The upload workflow is:
- Submit product data with the API key.
- Create a single-use
product:readtoken. - Fetch every page of
GET /api/v1/productand inspect each product's processing state.
Keep the API key on your server. Never put it in browser code, a mobile application, source control, or a product-data file.
Before You Start
Set the API base URL and client key in your server-side environment:
export YOUZU_API_BASE="https://platform.youzu.ai"
export YOUZU_CLIENT_KEY="YOUR_CLIENT_KEY"
Prepare every record according to the Product Data Requirements, and keep the complete set of submitted SKUs. Processing can merge several SKUs into one product, so those SKUs are the reliable way to track your upload.
1. Submit Product Data
With exactly one enabled catalogue, both ingestion methods can use the catalogue-free endpoint:
POST /api/v1/admin/catalogue/ingest
x-client-key: YOUR_CLIENT_KEY
Content-Type: application/json
- Use Real-time Catalogue Import to send product objects in a
productsarray. - Use API Batch Import to submit a hosted CSV, JSON, or XML feed.
With multiple enabled catalogues, use POST /api/v1/admin/catalogue/{catalogueId}/ingest with the same body. Do not send clientId, catalogueId, or externalRef inside the body. Youzu derives the account from the key, verifies ownership of the path catalogue, and creates the external reference.
A 200 response means the asynchronous ingestion request was accepted. It does not mean image download, AI enrichment, indexing, or deduplication has finished. Product records returned by the list endpoint are the source of truth for current progress.
2. Create a Product Read Token
Create a token immediately before each product-list request:
POST /api/v1/token
x-client-key: YOUR_CLIENT_KEY
Content-Type: application/json
{
"actionResource": "product",
"actionType": "read",
"catalogueId": "YOUR_CATALOGUE_ID"
}
catalogueId may be omitted only when the key resolves to exactly one enabled catalogue supporting product reads. The token is valid for five minutes and is consumed by one protected request. Create a fresh token for every page, polling request, or retry.
See Authentication for the complete token contract.
3. Retrieve Every Product Page
Use the token once to request a page:
curl "$YOUZU_API_BASE/api/v1/product?page=1&limit=100" \
-H "Authorization: Bearer YOUR_TOKEN"
The response contains complete current product records in data and pagination information in meta. Request pages 1 through meta.totalPages, creating a fresh token before each request. Repeat the full pagination pass when polling so products created or merged during processing are not missed.
The product list is also the download interface for source data, AI enrichment, images, variants, nested offers, processing details, and current moderation results. See Product Management for the complete response and filter reference.
4. Understand Processing State
processStatus summarizes the selected product-ingestion plan:
| Value | Meaning | Terminal |
|---|---|---|
pending |
Selected work has not started | No |
processing |
At least one selected stage is running or waiting | No |
completed |
Every selected stage completed successfully | Yes |
partial |
One or more selected stages failed, but usable output remains | Yes |
failed |
Required processing failed and the product is not usable | Yes |
Do not infer exact progress from processStatus. Use the processing object. It contains an explicit record for each stage in the catalogue's compiled, selected pipeline graph:
| Stage key | Work represented |
|---|---|
ingest |
Accept and persist source product data |
image_acquisition |
Retrieve and store usable product images |
image_indexing |
Build image-search vectors when imageSearch is selected |
semantic_text_indexing |
Build text vectors when semanticTextIndexing is selected |
ai_processing |
Run AI enrichment when aiProcessing is selected |
identity_enrichment |
Apply product identity, translation, and taxonomy results |
dedup_indexing |
Build duplicate-detection identity data |
deduplication |
Evaluate duplicate and relationship candidates when deduplication is selected |
Each processing.stages[] item has:
key: the stable stage identifier.status:pending,processing,completed,skipped, orfailed.required: whether the catalogue's immutable feature selection requires that stage.attemptCount: how many times the stage has been attempted.
Stages outside the compiled graph are absent. A returned stage can use status: "skipped" when runtime processing determines that no work is needed. Use processing.currentStage for the active required stage and completedStages/totalStages for a coarse progress summary.
processing.errors is an array of sanitized failures. Each item contains only code, stage, and retryable; internal provider messages, URLs, and traces are never returned. A partial product can therefore have one or more errors while still exposing successful output from other selected stages.
Moderation is a separate lifecycle. When a catalogue includes moderation, a product can have processStatus: completed or partial while moderation is still pending. Follow Check Moderation Results after evaluating processing.
5. Decide When the Upload Is Processed
Evaluate only the SKUs from the upload you submitted:
- Find each SKU under
variants[].offers[].sku; do not rely only on the top-levelproduct.sku, which represents one offer. - Deduplication can merge several submitted SKUs into variants and offers under one product.
meta.totalItemscan therefore be lower than the submitted SKU count. - Treat a submitted SKU as processed when its containing product has
processStatuscompleted,partial, orfailed. - Treat
partialas terminal with usable output plus failed selected stages. Recordprocessing.errorsand decide whether retry is appropriate. - Treat
failedas terminal and unsuccessful. Record the affected SKU and product for investigation.
The upload's processing phase is finished when every submitted SKU is present and its containing product has a terminal processStatus. This does not imply that moderation has finished.
Relevant Errors
400from ingestion means the product data or ingestion source is invalid.401means the API key or bearer token is missing, invalid, expired, outside the required scope, or already consumed.404from catalogue-free token creation or ingestion means no enabled compatible catalogue could be resolved.409means catalogue scope is ambiguous or the selected catalogue does not support the requested action. Use an explicit catalogue ID when the account has multiple enabled catalogues.413means the JSON request or upstream ingestion payload is too large.429means ingestion is temporarily rate limited; retry later.502means the product or ingestion service was unavailable. Create a fresh token before retrying a product-list request.