Documentation
Feedback
Guides
API Reference

Guides
Guides

Catalog multi-language integration guide

Manage multiple languages for catalog entities.

Learn how to create translations and integrate localized content for catalog entities with the multi-language feature.

Overview

The multi-language feature enables the following capabilities:

  • Granular content management: Retrieve and store translations for products, SKUs, categories, brands, specifications, collections, and services.
  • Integrated translation workflows: It enables automated translations with a Translation Management System (TMS).
  • Multiple storefront technologies: Consume translations across Store Framework and headless implementations.
  • Localized experience: Provide customers with localized shopping experiences across multiple markets.

To see the complete documentation of the multi-language endpoints, check the Catalog API.

Use cases

The multi-language feature supports various integration scenarios:

Use caseDescription
Multilingual storefrontDisplays translated product names, descriptions, and specifications based on the customer's locale as identified by the storefront.
TMS integrationConnects your Translation Management System (TMS) to automatically push and pull translations via the Catalog API.
Business expansionSeamlessly adapts your catalog for new geographic markets without duplicating products.
SEO optimizationProvides localized meta descriptions, keywords, and URL slugs for better search engine rankings in each market.
Headless commerceFetches translated catalog data for headless storefront applications.

How the multi-language feature works

When you send translated content using the multi-language feature, the workflow is as follows:

Step 1: Catalog system translation ingestion

The merchant or an integrated TMS makes a request to create or update the translation of a catalog entity, such as product or category. The Catalog system validates and stores the translated fields per locale, then triggers an update event to Intelligent Search.

Step 2: Indexing

Intelligent Search indexes or reindexes the translated entity content to make it searchable and filterable in the storefront by the selected locale. This process runs asynchronously and usually completes within a few minutes. Larger amounts of data may take longer.

Step 3: Storefront display

The storefront components (in this case, Store Framework and Checkout) query Intelligent Search and the Catalog system at render time, so it automatically retrieves and displays the translations according to the customer's selected locale. No manual configuration or synchronization is needed.

The available storefront solutions for the multi-language feature are Store Framework and headless implementations.

Consuming localized content

There are two main approaches to consuming translated catalog data, depending on your storefront implementation.

For most storefront implementations, Intelligent Search is the recommended approach for consuming translated content. When using Intelligent Search:

  • Translations are automatically indexed after being saved using the multi-language endpoints.
  • Search results, filters, and facets display translated content based on the customer's locale.
  • No additional API calls are required, since the storefront receives translated data automatically.
  • Performance is optimized for navigation via native cache strategies.

When to use Intelligent Search:

ImplementationIntelligent Search usage
Store Framework✅ Yes (default behavior)
Headless with IS✅ Yes
CMS Portal (Legacy)⚠️ May require additional configuration
FastStore✅ Yes (Closed Beta)

Option 2: Via Catalog API (direct fetch)

When to use the direct Catalog API:

  • You need specific entity translations not available in search results.
  • You're building VTEX Admin tools or back-office integrations.
  • You need to fetch translations for validation or synchronization.

Implementation by storefront type

See below the implementation by storefront type for consuming localized content:

Store Framework implementation

To enable the multi-language feature for Store Framework in your store, submit a request via Support.

For stores built with Store Framework, localized content is consumed automatically:

  1. Locale detection: The store detects the consumer's locale from the URL binding (e.g., store.com/es-ES/) or browser settings.
  2. Automatic translation: Intelligent Search returns translated content for the detected locale.
  3. Component rendering: Store Framework components (product shelf, product details, search results) display the translated content without additional configuration.

No code changes are required: Once you submit translations via the multi-language feature, they appear automatically in your Store Framework storefront.

Headless implementation

For headless storefronts, you either use the Intelligent Search API or the Catalog API directly, depending on your needs.

Option A: Using Intelligent Search API

Query Intelligent Search with the desired locale to receive translated results:


_10
curl -X GET "https://{accountName}.vtexcommercestable.com.br/api/io/_v/api/intelligent-search/product_search?locale=es-ES&query=camiseta" \
_10
-H "Accept: application/json"

Option B: Use Catalog API directly

Query the Catalog API with the Accept-Language header:


_10
curl -X GET "https://{accountName}.vtexcommercestable.com.br/api/catalog_system/pvt/sku/stockkeepingunitbyid/456" \
_10
-H "Accept-Language: es-ES" \
_10
-H "X-VTEX-API-AppKey: {appKey}" \
_10
-H "X-VTEX-API-AppToken: {appToken}"

FastStore implementation

To enable the multi-language feature for FastStore in your store, submit a request via Support.

The complete implementation for FastStore is described in the Handling internationalization with the Localization feature guide.

Activation

Open a support ticket requesting the activation of the Catalog multi-language feature for your account. Once the VTEX team activates it, they will contact you to inform you that you can start using the feature.

The simultaneous use of both the multi-language APIs and Messages APIs (GraphQL) is not supported for catalog entities. Therefore, once the new feature is activated, you will no longer be able to manage translations using GraphQL.

Permissions

To successfully use the multi-language feature, the user or API key must have the License Manager resources below; otherwise, they will receive a 403 Forbidden error message:

ProductCategoryResource
CatalogContentCategories Management

Handling missing translations

When a translation is not available for a requested locale:

  • Intelligent Search: Returns content in the store's default language.
  • Catalog API: Returns only entities that have translations in the requested locale.

Consider implementing fallback logic in headless implementations to handle missing translations gracefully.

Using the multi-language feature

The solution is composed of a combination of two methods:

  • PUT: Creates or updates translations for catalog entities.
  • GET: Retrieves translations previously created using the PUT method. By default, it returns all existing translations for the entity, but you can filter results for a specific language using the locale query parameter.

They are supported for the following catalog entities:

  • Products
  • SKUs
  • Specifications
  • Categories
  • Brands
  • Attachments
  • Collections
  • Services

Locale format

All locale codes follow the IETF BCP 47, for example:

LocaleDescription
en-USEnglish (United States)
es-ESSpanish (Spain)
pt-BRPortuguese (Brazil)
fr-FRFrench (France)
de-DEGerman (Germany)

Creating or updating translations for a product

See below an example of how the multi-language feature works for a product:

Method: PUT

Endpoint: https://{accountName}.{environment}.com.br/api/catalog/pvt/product/{productId}/language

Request body example:


_10
{
_10
"Locale": "en-US",
_10
"Name": "Classic Blue T-Shirt",
_10
"Title": "Classic Blue Tshirt",
_10
"Description": "A comfortable cotton t-shirt in classic blue color",
_10
"MetaTagDescription": "Buy the best classic blue t-shirt made with premium cotton",
_10
"DescriptionShort": "Comfortable cotton t-shirt",
_10
"Keywords": "t-shirt, blue, cotton, casual",
_10
"LinkId": "classic-blue-tshirt"
_10
}

Responses:

  • 201 Created: The translation was created or updated successfully.
  • 400 Bad Request: The request body is invalid.
  • 403 Forbidden: The user or API key does not have the required permissions.
  • 404 Not Found: The product ID does not exist.
  • 409 Conflict: The translation already exists with the same fields.

For information about how to handle errors, see the Troubleshooting section.

Retrieving translations for a product

After creating translations for an entity, you can use the GET endpoint to retrieve them. See below an example of how to retrieve translations for a product.

Method: GET

Endpoint: https://{accountName}.{environment}.com.br/api/catalog/pvt/product/{productId}/language

Query parameters: locale=en-US (Optional)

If you wish to retrieve translations for a specific language, use the query parameter locale, as described in the Locale format section. Otherwise, you will receive all translations for the entity.

Response body example: 200 OK


_159
[
_159
{
_159
"Id": 2,
_159
"Locale": "en-US",
_159
"Name": "Men's Red T-Shirt",
_159
"Description": "The <strong>Men's Basic Red T-Shirt</strong> is the perfect piece for those who value both style and comfort in their everyday look. Made from <strong>soft, breathable cotton fabric</strong>, it offers a lightweight fit and a smooth touch on the skin. Its <strong>minimalist design</strong> makes it easy to match with different styles — from casual to modern — perfect to wear with jeans, shorts, or layered under a jacket.<ul><li><strong>Color:</strong> Red</li><li><strong>Fit:</strong> Regular</li><li><strong>Neckline:</strong> Crew neck</li><li><strong>Fabric:</strong> 100% cotton</li><li><strong>Ideal for:</strong> Casual wear, work, or leisure</li></ul>A versatile and essential piece in the modern man's wardrobe, combining practicality and good taste in one product.",
_159
"Title": "Men's Red T-Shirt",
_159
"MetaTagDescription": null,
_159
"DescriptionShort": null,
_159
"Keywords": "shirt, red, basic, cotton",
_159
"LinkId": null,
_159
"Category": {
_159
"Id": 18,
_159
"Locale": "en-US",
_159
"Name": "New Clothes",
_159
"Title": "New Clothes",
_159
"Description": "New Clothes for men",
_159
"Keywords": "New, Clothes",
_159
"LinkId": "new-clothes"
_159
},
_159
"Categories": [
_159
{
_159
"Id": 18,
_159
"Locale": "en-US",
_159
"Name": "New Clothes",
_159
"Title": "New Clothes",
_159
"Description": "New Clothes for men casual",
_159
"Keywords": "New, Clothes",
_159
"LinkId": "new-clothes-for-men-casual"
_159
},
_159
{
_159
"Id": 15,
_159
"Locale": "en-US",
_159
"Name": "Accessories",
_159
"Title": "Accessories",
_159
"Description": "Accessories for men",
_159
"Keywords": "fashion",
_159
"LinkId": null
_159
}
_159
],
_159
"SimilarCategories": null,
_159
"Brand": {
_159
"Id": 1,
_159
"Locale": "en-US",
_159
"Name": "Casual clothes",
_159
"Text": "The best casual clothes for your everyday life.",
_159
"Keywords": "casual, clothes, everyday life",
_159
"SiteTitle": "Casual clothes",
_159
"LinkId": "casual-clothes"
_159
},
_159
"Skus": [
_159
{
_159
"Id": 33,
_159
"Locale": "en-US",
_159
"Name": "Men's Red T-Shirt",
_159
"MeasurementUnit": "un",
_159
"Attributes": [
_159
{
_159
"Id": 17,
_159
"Locale": "en-US",
_159
"AttributeName": "Color",
_159
"AttributeValue": "Red"
_159
}
_159
],
_159
"Attachments": [
_159
{
_159
"Id": 4,
_159
"Locale": "en-US",
_159
"Name": "Customization",
_159
"Domains": [
_159
{
_159
"OriginalFieldName": "Customização",
_159
"FieldName": "Customization",
_159
"DomainValues": "Special"
_159
}
_159
]
_159
}
_159
],
_159
"Services": [
_159
{
_159
"Id": 8,
_159
"Locale": "en-US",
_159
"Name": "Packaging",
_159
"Text": "Packaging for giving as a gift",
_159
"SkuServiceType": {
_159
"Id": 34,
_159
"Locale": "en-US",
_159
"Name": "Small box",
_159
"Values": [
_159
{
_159
"Id": 1,
_159
"Locale": "en-US",
_159
"Name": "Premium box"
_159
}
_159
],
_159
"Attachments": [
_159
{
_159
"Id": 4,
_159
"Locale": "en-US",
_159
"Name": "Custom writing on gift card",
_159
"Domains": [
_159
{
_159
"OriginalFieldName": "Tipografia moderna",
_159
"FieldName": "Modern font",
_159
"DomainValues": "helvetica"
_159
}
_159
]
_159
}
_159
]
_159
}
_159
}
_159
],
_159
"SpecificationGroups": [],
_159
"Files": [
_159
{
_159
"Id": 8,
_159
"FileId": 197,
_159
"Locale": "en-US",
_159
"Label": "frontal-view",
_159
"Name": "Frontal view of the product",
_159
"Text": null
_159
}
_159
]
_159
}
_159
],
_159
"SpecificationGroups": [
_159
{
_159
"Id": 8,
_159
"Locale": "en-US",
_159
"Name": "Masculine clothes",
_159
"Specifications": [
_159
{
_159
"Id": 36,
_159
"Locale": "en-US",
_159
"Name": "Fabric type",
_159
"Description": "Fabric types of which the product is made.",
_159
"Values": [
_159
{
_159
"Id": 146,
_159
"Locale": "en-US",
_159
"Name": "Wool, cotton and synthetic fabrics",
_159
"IsCustomValue": false
_159
}
_159
]
_159
}
_159
]
_159
}
_159
],
_159
"Collections": [
_159
{
_159
"Id": 1139,
_159
"Locale": "en-US",
_159
"Name": "Shirts Collection",
_159
"Description": "Shirts Collection description in English",
_159
"LinkId": "shirts-collection"
_159
}
_159
]
_159
}
_159
]

Troubleshooting

See below the most common issues and their respective solutions for the multi-language feature:

IssueSolution
Translations not appearing on storefrontWait a few minutes for Intelligent Search to reindex. Check that the locale matches your store binding configuration.
403 Forbidden errorVerify that your user or application key has the Categories Management resource enabled.
404 Not Found errorConfirm that the entity ID (product, SKU, category, etc.) exists in the Catalog.
409 Conflict errorThe translation may already exist. Use GET to retrieve current translations before updating.

If the issue persists, contact our Support.

Contributors
1
Photo of the contributor
Was this helpful?
Yes
No
Suggest Edits (GitHub)
Contributors
1
Photo of the contributor
Was this helpful?
Suggest edits (GitHub)
On this page