Cadastro de Produto Configurável via REST API — Magento 2
Guia de referência para criar um produto configurável e suas variações pela API REST, no fluxo recomendado: criar os simples primeiro, depois o configurável já com os links embutidos (sem precisar das chamadas /child).
Exemplo testado e funcionando, usando 2 variações (tamanhos P e M).
⚠️ Dois pontos essenciais antes de começar
Por favor leiam estes dois pontos com atenção — são o que faz o fluxo funcionar de forma confiável:
1. Salvar o id de cada simples para usar no configurável
Quando você cria cada produto simples (passos 1 e 2), a API responde com um campo id (o ID interno do produto no Magento). Esse id precisa ser guardado, porque na hora de criar o configurável (passo 3), é ele que vincula a variação ao produto pai — no campo configurable_product_links.
Ou seja, o fluxo é:
- Passo 1 cria o simples P → a API devolve, por exemplo,
"id": 42234→ guarde esse número. - Passo 2 cria o simples M → a API devolve, por exemplo,
"id": 42235→ guarde esse número também. - Passo 3 cria o configurável → no campo
configurable_product_links, você coloca esses dois IDs:[42234, 42235].
É assim que o Magento entende que os dois simples são variações daquele configurável — sem precisar das chamadas /child separadas, que era o que vinha dando problema.
Importante: os IDs
42234e42235no exemplo abaixo são só ilustrativos. Use sempre os IDs reais que a sua resposta retornar.
2. Mesmo neste fluxo, é preciso um pequeno delay entre uma request e outra
Este ponto é muito importante e é a causa raiz do problema que estávamos investigando.
As requisições não podem ser disparadas todas ao mesmo tempo. Mesmo com este fluxo melhorado, é necessário enviar uma de cada vez, aguardando a resposta de cada uma antes de enviar a próxima (ou colocar um pequeno intervalo de ~300 a 500 ms entre elas).
O motivo: quando várias requisições gravam no banco ao mesmo tempo, o Magento gera um deadlock (conflito de escrita no banco), e algumas variações falham com mensagens como "Could not save Source Item Configuration". Isso foi confirmado nos logs do servidor — os erros aconteceram exatamente no instante em que as requisições saíram todas juntas.
Com o envio sequencial (uma após a outra), esse conflito simplesmente não acontece. O custo é de poucos segundos a mais por produto, o que é totalmente tranquilo para um processo de cadastro em segundo plano.
Resumo da regra: simples primeiro, um de cada vez → guardar os IDs → configurável por último com os IDs no configurable_product_links.
Passo 1 — Criar a 1ª variação (simples, tamanho P)
curl --location 'https://www.mundodasgemeas.com.br/rest/all/V1/products' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {token}' \
--data '{
"product": {
"sku": "MAGESHOP-TESTE-P",
"name": "Mageshop Teste Produto Configuravel (Marrom P)",
"attribute_set_id": 4,
"status": 1,
"visibility": 1,
"type_id": "simple",
"price": 519.00,
"weight": 0.5,
"extension_attributes": {
"website_ids": [1],
"stock_item": {
"qty": 0,
"is_in_stock": false,
"manage_stock": true,
"use_config_manage_stock": true
}
},
"custom_attributes": [
{ "attribute_code": "color", "value": "48" },
{ "attribute_code": "size", "value": "10" },
{ "attribute_code": "mgs_brand", "value": "646" },
{ "attribute_code": "tax_class_id", "value": "0" },
{ "attribute_code": "codigo", "value": "MAGESHOP-TESTE-P" },
{ "attribute_code": "ncm", "value": "62024000" }
]
}
}'
➡️ Guarde o id da resposta (no exemplo, vamos supor que voltou 42234).
Passo 2 — Criar a 2ª variação (simples, tamanho M)
Envie só depois de receber a resposta do Passo 1. Repare que o size é diferente (11 em vez de 10) — cada variação precisa ter um valor diferente no atributo eixo (tamanho).
curl --location 'https://www.mundodasgemeas.com.br/rest/all/V1/products' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {token}' \
--data '{
"product": {
"sku": "MAGESHOP-TESTE-M",
"name": "Mageshop Teste Produto Configuravel (Marrom M)",
"attribute_set_id": 4,
"status": 1,
"visibility": 1,
"type_id": "simple",
"price": 519.00,
"weight": 0.5,
"extension_attributes": {
"website_ids": [1],
"stock_item": {
"qty": 0,
"is_in_stock": false,
"manage_stock": true,
"use_config_manage_stock": true
}
},
"custom_attributes": [
{ "attribute_code": "color", "value": "48" },
{ "attribute_code": "size", "value": "11" },
{ "attribute_code": "mgs_brand", "value": "646" },
{ "attribute_code": "tax_class_id", "value": "0" },
{ "attribute_code": "codigo", "value": "MAGESHOP-TESTE-M" },
{ "attribute_code": "ncm", "value": "62024000" }
]
}
}'
➡️ Guarde o id da resposta (no exemplo, vamos supor que voltou 42235).
Passo 3 — Criar o configurável já com os links
Este é o passo que junta tudo. Dentro de extension_attributes:
configurable_product_options→ define o atributo eixo (aqui é o tamanho,attribute_id152) e quais valores entram (osvalue_index10 e 11, que correspondem aos tamanhos dos simples criados acima).configurable_product_links→ recebe os IDs dos simples que você guardou nos passos 1 e 2. Substitua42234e42235pelos IDs reais que a sua resposta retornou.
curl --location 'https://www.mundodasgemeas.com.br/rest/all/V1/products' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {token}' \
--data '{
"product": {
"sku": "MAGESHOP-TESTE",
"name": "Mageshop Teste Produto Configuravel",
"attribute_set_id": 4,
"status": 1,
"visibility": 4,
"type_id": "configurable",
"weight": 0.5,
"price": null,
"extension_attributes": {
"website_ids": [1],
"stock_item": {
"is_in_stock": true
},
"configurable_product_options": [
{
"attribute_id": "152",
"label": "TAMANHO",
"values": [
{ "value_index": 10 },
{ "value_index": 11 }
]
}
],
"configurable_product_links": [42234, 42235]
},
"custom_attributes": [
{ "attribute_code": "mgs_brand", "value": "646" },
{ "attribute_code": "codigo", "value": "MAGESHOP-TESTE" },
{ "attribute_code": "url_key", "value": "mageshop-teste-produto-configuravel" },
{ "attribute_code": "ncm", "value": "62024000" }
]
}
}'
✅ Se tudo der certo, a resposta vem com o configurável já trazendo os dois filhos no configurable_product_links preenchido — sem precisar de nenhuma chamada /child.
Dicas finais
- Atributo eixo: confirme que o atributo usado como eixo (aqui,
size/ id 152) está comoscope: globale tiposelectno ambiente. Se não estiver, o Passo 3 não aceita. value_index: os valores emconfigurable_product_options(10 e 11) precisam bater exatamente com osizeinformado em cada simples. Se não baterem, o Magento não associa a variação à opção.- Campos do
configurable_product_options: esse bloco serve só para definir o atributo eixo. Além deattribute_id,labelevalues, ele aceita opcionalmenteposition(ordem de exibição da opção) eis_use_default. Dados do produto em si (preço, descrição, estoque) não vão aqui — ficam noscustom_attributesou nos campos do produto.