Experimentos A/B
Cria, lista, inicia, acompanha, para e encerra com vencedor os testes A/B da página do produto.
Um experimento A/B mostra duas versões de um elemento da página do produto a grupos diferentes de visitantes e compara quantos adicionam ao carrinho e compram em cada grupo. A versão A é a atual da loja; a B é a nova. As seis rotas desta página cobrem o ciclo inteiro: criar, listar, iniciar, ver os números, parar e aplicar o vencedor.
Exigem o privilégio manage_settings.
Listar experimentos
/api/v1/admin/pdp-experimentsAdminListar os experimentos, mais novos primeiro
Devolve 50 por página, ordenados do mais novo para o mais antigo.
Parâmetros de consulta
pageintegerpadrão: 1curl "$BASE_URL/api/v1/admin/pdp-experiments" \
-H "Authorization: Bearer $TOKEN"{
"experiments": [
{
"id": "d8bb22a1-31b6-4534-9de1-f50399a70696",
"name": "Botão Comprar agora",
"element_key": "cta_label",
"variant_b_value": "buy_now",
"scope_category_ids": null,
"split_percent": 50,
"status": "completed",
"winner": "b",
"started_at": "2026-07-20T14:59:07.205942Z",
"ended_at": "2026-07-20T19:51:26.765153Z",
"created_at": "2026-07-20T14:59:02.867881Z",
"updated_at": "2026-07-20T19:51:26.765153Z"
}
]
}Campos da resposta
experiments[].iduuidexperiments[].namestringexperiments[].element_keystringcta_labelsocial_proof_badgesprice_history_badgereviews_positionexperiments[].variant_b_valuestringbuy_now para o texto do botão).experiments[].scope_category_idsarraynull ou vazio: o catálogo todo.experiments[].split_percentintegerexperiments[].statusstringdraftrunningcompletedstoppedexperiments[].winnerstringabcompleted.experiments[].started_atstringdraft.experiments[].ended_atstringexperiments[].created_atstringexperiments[].updated_atstringCriar um experimento
/api/v1/admin/pdp-experimentsAdminCriar um experimento (começa em rascunho)
Cria o experimento em draft. Ninguém vê a versão B até você iniciá-lo.
Corpo da requisição
element_keystringobrigatóriocta_labelsocial_proof_badgesprice_history_badgereviews_positionvariant_b_valuestringnamestringelement_key.split_percentintegerpadrão: 50scope_category_idsarraycurl -X POST "$BASE_URL/api/v1/admin/pdp-experiments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Botão Comprar agora","element_key":"cta_label","variant_b_value":"buy_now","split_percent":50}'{
"id": "d8bb22a1-31b6-4534-9de1-f50399a70696",
"name": "Botão Comprar agora",
"element_key": "cta_label",
"variant_b_value": "buy_now",
"scope_category_ids": null,
"split_percent": 50,
"status": "draft",
"created_at": "2026-10-11T22:20:00Z",
"updated_at": "2026-10-11T22:20:00Z"
}Iniciar
/api/v1/admin/pdp-experiments/{id}/startAdminIniciar um experimento em rascunho
Passa o experimento de draft para running. Só pode haver um experimento em andamento por elemento. Sem corpo.
Parâmetros de caminho
iduuidobrigatóriocurl -X PUT "$BASE_URL/api/v1/admin/pdp-experiments/d8bb22a1-31b6-4534-9de1-f50399a70696/start" \
-H "Authorization: Bearer $TOKEN"{ "started": true }Ver as estatísticas
/api/v1/admin/pdp-experiments/{id}/statsAdminFunil por variante e o veredito estatístico
Devolve, para cada variante, quantos visitantes viram a versão (exposições), adicionaram ao carrinho, compraram e quanto geraram de receita, mais a significância (confiança de que a diferença não é acaso) e se já é seguro declarar um vencedor.
Parâmetros de caminho
iduuidobrigatóriocurl "$BASE_URL/api/v1/admin/pdp-experiments/d8bb22a1-31b6-4534-9de1-f50399a70696/stats" \
-H "Authorization: Bearer $TOKEN"{
"variants": [
{ "variant": "a", "exposures": 20, "add_to_carts": 9, "orders": 0, "revenue_cents": 0, "conversion_rate": 0 },
{ "variant": "b", "exposures": 22, "add_to_carts": 8, "orders": 0, "revenue_cents": 0, "conversion_rate": 0 }
],
"significance": 0,
"can_declare_winner": false
}Campos da resposta
variants[].variantstringabvariants[].exposuresintegervariants[].add_to_cartsintegervariants[].ordersintegervariants[].revenue_centsintegervariants[].conversion_ratenumbersignificancenumbercan_declare_winnerbooleantrue quando cada variante tem ao menos 200 exposições e a significância é de 0,95 ou mais.Parar
/api/v1/admin/pdp-experiments/{id}/stopAdminParar um experimento em andamento, sem vencedor
Muda running para stopped e devolve todos os visitantes à versão A. Não faz nada em experimentos que não estão em andamento, nem acusa erro para um id que não existe. Sem corpo.
Parâmetros de caminho
iduuidobrigatóriocurl -X PUT "$BASE_URL/api/v1/admin/pdp-experiments/d8bb22a1-31b6-4534-9de1-f50399a70696/stop" \
-H "Authorization: Bearer $TOKEN"{ "stopped": true }Aplicar o vencedor
/api/v1/admin/pdp-experiments/{id}/apply-winnerAdminEncerrar o experimento declarando um vencedor
Declara a ou b vencedor, marca o experimento como completed e, se a B venceu, grava a configuração real quando o elemento tem uma:
element_key | Se a B vence |
|---|---|
social_proof_badges | Liga os selos de vendidos em 30 dias e de estoque baixo. |
price_history_badge | Liga o selo de histórico de preço. |
cta_label, reviews_position | Nada é gravado (são só ajustes de exibição do teste). O experimento é encerrado e a vitrine volta à versão A. |
Se a A vence, nada muda na configuração. A rota não confere se já há amostra suficiente: use can_declare_winner das estatísticas.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
winnerstringobrigatórioabcurl -X PUT "$BASE_URL/api/v1/admin/pdp-experiments/d8bb22a1-31b6-4534-9de1-f50399a70696/apply-winner" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"winner":"b"}'{ "applied": true }Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo que não é JSON (criar e aplicar). | {"error":"invalid request body","detail":"..."} |
| 401 | Sem token ou token expirado. | {"error":"invalid or expired token"} |
| 403 | Sem manage_settings. | {"error":"insufficient privileges","required":"manage_settings"} |
| 404 | apply-winner num experimento que não existe. | {"error":"experiment not found"} |
| 409 | start quando já há um em andamento para o elemento. | {"error":"an experiment for this element is already running"} |
| 409 | start em experimento que não é rascunho (inclui id inexistente). | {"error":"experiment is not a draft"} |
| 422 | Criar com element_key desconhecido. | {"error":"invalid element_key"} |
| 500 | winner diferente de a ou b; {id} que não é UUID; falha interna. | {"error":"failed to apply winner","detail":"winner must be 'a' or 'b'"} |