Catalog multi-language integration guide
Manage multiple languages for catalog entities.
This feature is in beta, which means that we are working to improve it. If you have any questions or feedback, please contact our Support.
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 case | Description |
|---|---|
| Multilingual storefront | Displays translated product names, descriptions, and specifications based on the customer's locale as identified by the storefront. |
| TMS integration | Connects your Translation Management System (TMS) to automatically push and pull translations via the Catalog API. |
| Business expansion | Seamlessly adapts your catalog for new geographic markets without duplicating products. |
| SEO optimization | Provides localized meta descriptions, keywords, and URL slugs for better search engine rankings in each market. |
| Headless commerce | Fetches 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.
Option 1: Via Intelligent Search (recommended)
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:
| Implementation | Intelligent Search usage |
|---|---|
| Store Framework | ✅ Yes (default behavior) |
| Headless with IS | ✅ Yes |
| CMS Portal (Legacy) | ⚠️ May require additional configuration |
| FastStore | ❌ Not available |
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:
The multi-language feature is not available for FastStore.
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:
- Locale detection: The store detects the consumer's locale from the URL binding (e.g.,
store.com/es-ES/) or browser settings. - Automatic translation: Intelligent Search returns translated content for the detected locale.
- 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:
_10curl -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:
_10curl -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}"
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:
| Product | Category | Resource |
|---|---|---|
| Catalog | Content | Categories 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
PUTmethod. By default, it returns all existing translations for the entity, but you can filter results for a specific language using thelocalequery 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:
| Locale | Description |
|---|---|
en-US | English (United States) |
es-ES | Spanish (Spain) |
pt-BR | Portuguese (Brazil) |
fr-FR | French (France) |
de-DE | German (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:
| Issue | Solution |
|---|---|
| Translations not appearing on storefront | Wait a few minutes for Intelligent Search to reindex. Check that the locale matches your store binding configuration. |
403 Forbidden error | Verify that your user or application key has the Categories Management resource enabled. |
404 Not Found error | Confirm that the entity ID (product, SKU, category, etc.) exists in the Catalog. |
409 Conflict error | The translation may already exist. Use GET to retrieve current translations before updating. |
If the issue persists, contact our Support.