Formulários
Lê a definição de um formulário personalizado da loja e envia as respostas do visitante.
Um formulário personalizado é um conjunto de campos que o administrador monta no painel, sem programar: contato, orçamento, cadastro de revenda, pesquisa. A vitrine lê a definição (quais campos existem, quais são obrigatórios) para desenhar a tela, e depois envia as respostas. Cada envio vira uma submissão que o administrador acompanha no painel.
Tipos de campo
type | Uso | Validação feita pela API |
|---|---|---|
text | Texto de uma linha | Tamanho mínimo/máximo e padrão, se definidos. O tamanho conta bytes, então letras acentuadas valem 2 |
textarea | Texto longo | Idem |
email | Formato de endereço | |
phone | Telefone | Tamanho/padrão, se definidos |
select | Lista suspensa | O valor precisa ser um value das options |
radio | Escolha única | O valor precisa ser um value das options |
checkbox | Caixa de seleção | Somente obrigatório, quando definido |
file | Arquivo | Ver aviso de arquivos abaixo |
date | Data | Somente obrigatório, quando definido |
number | Número | Somente obrigatório, quando definido |
hidden | Campo oculto | Somente obrigatório, quando definido |
/api/v1/storefront/forms/{slug}PúblicaLer a definição de um formulário
Parâmetros de caminho
slugstringobrigatórioIdentificador do formulário, definido no painel (por exemplo
contato).Exemplo de requisição
bash
curl "$BASE_URL/api/v1/storefront/forms/contato"Resposta
200Formulário
json
{
"id": "e1d2c3b4-a5f6-4789-8a9b-0c1d2e3f4a5b",
"name": "Fale conosco",
"slug": "contato",
"description": "Responderemos em até 1 dia útil.",
"status": "active",
"fields": [
{ "id": "nome", "type": "text", "label": "Seu nome", "required": true, "order": 1 },
{ "id": "email", "type": "email", "label": "E-mail", "required": true, "order": 2 },
{
"id": "assunto",
"type": "select",
"label": "Assunto",
"required": false,
"order": 3,
"options": [
{ "label": "Dúvida", "value": "duvida" },
{ "label": "Reclamação", "value": "reclamacao" }
]
},
{
"id": "mensagem",
"type": "textarea",
"label": "Mensagem",
"required": true,
"order": 4,
"validation": { "min_length": 10, "max_length": 2000 }
}
],
"settings": {
"success_message": "Recebemos sua mensagem!",
"captcha_enabled": true,
"captcha_provider": "honeypot"
},
"created_at": "2026-08-01T12:00:00Z",
"updated_at": "2026-09-15T09:30:00Z"
}Campos da resposta
iduuidId do formulário.
namestringNome.
slugstringIdentificador na URL.
descriptionstringTexto de apoio exibido no topo.
statusstringAqui sempre
active.fieldsarrayCampos do formulário. A API não os ordena: ordene por
order no cliente.fields[].idstringIdentificador do campo. É a chave que você usa em
data no envio.fields[].typestringtexttextareaemailphoneselectcheckboxradiofiledatenumberhiddenTipo do campo.
fields[].labelstringRótulo para exibir.
fields[].placeholderstringTexto de exemplo dentro do campo. Ausente quando não há.
fields[].requiredbooleanSe o campo é obrigatório.
fields[].orderintegerPosição do campo na tela.
fields[].optionsarrayOpções de
select, radio e checkbox: objetos com label e value.fields[].validationobjectRegras opcionais:
min_length, max_length, min, max, pattern (regex), file_types e max_file_size. Só min_length, max_length e pattern são exigidos pelo servidor.settingsobjectConfiguração do formulário. Pode trazer
success_message, redirect_url, max_submissions, captcha_enabled, captcha_provider e notification_email.created_atstringCriação (RFC 3339).
updated_atstringÚltima alteração (RFC 3339).
Erros
| Status | Quando | Corpo |
|---|---|---|
| 403 | Módulo custom-forms desligado. | {"error":"module_disabled","module":"custom-forms"} |
| 404 | Não há formulário ativo com esse slug. | {"error":"FORM_NOT_FOUND"} |
| 500 | Falha ao ler. | {"error":"FORM_GET_FAILED","detail":"..."} |
/api/v1/storefront/forms/{slug}/submitPúblicaEnviar as respostas de um formulário
Parâmetros de caminho
slugstringobrigatórioIdentificador do formulário.
Corpo da requisição
dataobjectobrigatórioRespostas, com os
id dos campos como chaves e os valores preenchidos. Chaves que não são campos do formulário são aceitas e gravadas, sem erro. O corpo inteiro da requisição pode ter no máximo 10 MB._hpstringCampo isca (honeypot) anti-spam. Deve ir vazio (ou ausente). Se o formulário tem captcha ativado com o provedor
honeypot e este campo, ou data._hp, vier preenchido, o envio é recusado.Exemplo de requisição
bash
curl -X POST "$BASE_URL/api/v1/storefront/forms/contato/submit" \
-H "Content-Type: application/json" \
-d '{
"data": {
"nome": "Maria Souza",
"email": "maria.souza@example.com",
"assunto": "duvida",
"mensagem": "Gostaria de saber o prazo de entrega."
},
"_hp": ""
}'Resposta
201Envio recebido
json
{
"submission": {
"id": "f9e8d7c6-b5a4-4392-81a0-9f8e7d6c5b4a",
"form_id": "e1d2c3b4-a5f6-4789-8a9b-0c1d2e3f4a5b",
"data": {
"nome": "Maria Souza",
"email": "maria.souza@example.com",
"assunto": "duvida",
"mensagem": "Gostaria de saber o prazo de entrega."
},
"ip_address": "203.0.113.10",
"user_agent": "Mozilla/5.0",
"status": "new",
"created_at": "2026-10-11T21:10:00Z"
},
"success_message": "Recebemos sua mensagem!"
}Campos da resposta
submission.iduuidId do envio, útil como protocolo.
submission.form_iduuidFormulário.
submission.dataobjectAs respostas gravadas.
submission.ip_addressstringIP registrado.
submission.user_agentstringUser-Agent registrado.submission.statusstringEstado do envio no painel. Nasce
new.submission.created_atstringQuando foi recebido (RFC 3339).
success_messagestringMensagem de agradecimento definida no painel. Ausente quando não há.
redirect_urlstringEndereço para onde levar o visitante depois do envio. Ausente quando não há.
Erros
Os erros de regra devolvem um código curto em maiúsculas; os de campo trazem o id do campo depois de dois pontos.
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido. | {"error":"INVALID_JSON","detail":"..."} |
| 400 | Corpo acima de 10 MB, ou arquivo embutido grande demais. | {"error":"FILE_TOO_LARGE"} |
| 400 | Valor embutido (data:) com tipo que não é imagem permitida. | {"error":"MALICIOUS_FILE_UPLOAD"} |
| 400 | Campo isca preenchido (captcha honeypot). | {"error":"CAPTCHA_FAILED"} |
| 400 | Campo obrigatório vazio. | {"error":"FIELD_REQUIRED:nome"} |
| 400 | E-mail inválido. | {"error":"INVALID_EMAIL:email"} |
| 400 | Valor que não está nas opções. | {"error":"INVALID_OPTION:assunto"} |
| 400 | Menor que min_length. | {"error":"MIN_LENGTH:mensagem"} |
| 400 | Maior que max_length. | {"error":"MAX_LENGTH:mensagem"} |
| 400 | Fora do pattern. | {"error":"PATTERN_MISMATCH:telefone"} |
| 400 | data que não é um objeto JSON, ou formulário com campos corrompidos. | {"error":"INVALID_SUBMISSION_DATA"} ou {"error":"INVALID_FORM_FIELDS"} |
| 403 | Módulo custom-forms desligado. | {"error":"module_disabled","module":"custom-forms"} |
| 404 | Não há formulário ativo com esse slug. | {"error":"FORM_NOT_FOUND"} |
| 429 | O formulário atingiu max_submissions. | {"error":"MAX_SUBMISSIONS_REACHED"} |
| 500 | Falha ao gravar. | {"error":"SUBMIT_FAILED","detail":"..."} |