Editar perfil comercial
/v1/instances/{id}/business/profiledesde M12token da instância ou adminQuando usar
Altera só os campos enviados (os ausentes ficam como estão) e devolve o perfil lido de novo do WhatsApp. Para remover, use clear com os campos (hours, email, websites, description, address); null num desses campos (e em categories, que não podem ser removidas) responde 400 (seria ambíguo com "ausente"). "clear": ["hours"] tira o horário inteiro (sem fuso), validado num número Business em 2026-10-21. O pin do mapa não pode ser removido por um aparelho conectado: "clear": ["location"] (e latitude/longitude null) responde 422 not_supported sem chamar o WhatsApp; remova no app WhatsApp Business (Perfil comercial > Endereço). No aparelho, em 2026-10-21, <latitude/><longitude/> e <latitude></latitude><longitude></longitude> voltaram 406 not-acceptable e <address/> foi aceito mas manteve o pin; o WhatsApp Web só oferece "editar o mapa no celular". Trocar a localização (latitude + longitude) funciona. websites e categories substituem as listas atuais (websites: [] remove os sites); hours substitui a semana inteira (dias ausentes ficam fechados); latitude e longitude vão juntas. Token admin ou da instância; chaves de API com escopo (lzk_) não podem. Limite de 5 alterações por minuto e 50 por dia por instância.
Os campos vão ao WhatsApp como o WhatsApp Web e o Baileys enviam (IQ w:biz, mutação delta). Em 2026-10-21, num número Business real, descrição, endereço, localização e horário foram aceitos e apareceram no celular, "" apagou descrição e endereço e clear: ["hours"] tirou o horário. Categorias e remover sites ainda aguardam essa validação: se o WhatsApp recusar um valor, a resposta é 400 validation_failed com o código do servidor.
Autenticação
Aceita o token da instância (só a própria instância) ou o token admin. Um token de outra instância recebe 403 forbidden (ou 404 not_found em webhooks de outra instância).
Parâmetros
Caminho
| Nome | Tipo | Descrição |
|---|---|---|
idobrigatório | string | Id da instância (inst_...). |
Corpo (JSON)
| Nome | Tipo | Descrição |
|---|---|---|
description | string | "" apaga. (até 512) |
address | string | (até 256) |
email | string | Endereço simples ([email protected]); "" apaga. (até 128) |
websites | string[] | URLs http(s); substituem as atuais ([] remove). (até 2 itens) |
latitude | number | (-90–90) |
longitude | number | (-180–180) |
categories | string[] | Ids de categoria (category_list do GET); substituem as atuais. (até 3 itens) |
hours | BusinessWeek | A semana de funcionamento no formato do PATCH (na leitura, todos os dias aparecem). |
hours.timezoneobrigatório | string | Fuso IANA, como America/Sao_Paulo. |
hours.days | object | Chaves sun, mon, tue, wed, thu, fri, sat. No PATCH, dia ausente = fechado. |
clear | "hours" | "email" | "websites" | "description" | "address"[] | Campos a remover. Não combine com o mesmo campo preenchido. O horário só sai assim. location responde 422 not_supported: o pin do mapa só sai no app WhatsApp Business (Perfil comercial > Endereço). |
Exemplo
curl -s -X PATCH "$LITEZAP_URL/v1/instances/$ID/business/profile" \ -H "Authorization: Bearer $LITEZAP_TOKEN" \ -d '{"description":"Pizzas artesanais no forno a lenha","websites":["https://loja.exemplo"],"categories":["133436743388217"],"hours":{"timezone":"America/Sao_Paulo","days":{"mon":{"mode":"open","open":"09:00","close":"18:00"},"tue":{"mode":"open","intervals":[{"open":"11:00","close":"14:00"},{"open":"18:00","close":"23:00"}]},"sat":{"mode":"24h"},"sun":{"mode":"closed"}}}}'const res = await fetch("http://localhost:8787/v1/instances/inst_7f3a9c2e5b1d4086/business/profile", { method: "PATCH", headers: { Authorization: `Bearer ${process.env.LITEZAP_TOKEN}`, "Content-Type": "application/json" }, body: JSON.stringify({ "description": "Pizzas artesanais no forno a lenha", "websites": [ "https://loja.exemplo" ], "categories": [ "133436743388217" ], "hours": { "timezone": "America/Sao_Paulo", "days": { "mon": { "mode": "open", "open": "09:00", "close": "18:00" }, "tue": { "mode": "open", "intervals": [ { "open": "11:00", "close": "14:00" }, { "open": "18:00", "close": "23:00" } ] }, "sat": { "mode": "24h" }, "sun": { "mode": "closed" } } } }),});console.log(res.status, res.status === 204 ? "" : await res.json());import osimport requests
r = requests.patch( "http://localhost:8787/v1/instances/inst_7f3a9c2e5b1d4086/business/profile", headers={"Authorization": f"Bearer {os.environ['LITEZAP_TOKEN']}"}, json={ "description": "Pizzas artesanais no forno a lenha", "websites": ["https://loja.exemplo"], "categories": ["133436743388217"], "hours": { "timezone": "America/Sao_Paulo", "days": { "mon": { "mode": "open", "open": "09:00", "close": "18:00", }, "tue": { "mode": "open", "intervals": [ { "open": "11:00", "close": "14:00", }, { "open": "18:00", "close": "23:00", }, ], }, "sat": { "mode": "24h", }, "sun": { "mode": "closed", }, }, }, }, timeout=150,)print(r.status_code, r.json() if r.content else "")package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { req, _ := http.NewRequest("PATCH", "http://localhost:8787/v1/instances/inst_7f3a9c2e5b1d4086/business/profile", strings.NewReader(`{"description":"Pizzas artesanais no forno a lenha","websites":["https://loja.exemplo"],"categories":["133436743388217"],"hours":{"timezone":"America/Sao_Paulo","days":{"mon":{"mode":"open","open":"09:00","close":"18:00"},"tue":{"mode":"open","intervals":[{"open":"11:00","close":"14:00"},{"open":"18:00","close":"23:00"}]},"sat":{"mode":"24h"},"sun":{"mode":"closed"}}}}`)) req.Header.Set("Authorization", "Bearer "+os.Getenv("LITEZAP_TOKEN")) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.Status, string(out))}<?phprequire 'vendor/autoload.php'; // composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client(['base_uri' => 'http://localhost:8787']);$res = $client->request('PATCH', '/v1/instances/inst_7f3a9c2e5b1d4086/business/profile', [ 'headers' => ['Authorization' => 'Bearer ' . getenv('LITEZAP_TOKEN')], 'json' => [ 'description' => 'Pizzas artesanais no forno a lenha', 'websites' => ['https://loja.exemplo'], 'categories' => ['133436743388217'], 'hours' => [ 'timezone' => 'America/Sao_Paulo', 'days' => [ 'mon' => [ 'mode' => 'open', 'open' => '09:00', 'close' => '18:00', ], 'tue' => [ 'mode' => 'open', 'intervals' => [ [ 'open' => '11:00', 'close' => '14:00', ], [ 'open' => '18:00', 'close' => '23:00', ], ], ], 'sat' => [ 'mode' => '24h', ], 'sun' => [ 'mode' => 'closed', ], ], ], ], 'http_errors' => false,]);echo $res->getStatusCode(), ' ', $res->getBody(), PHP_EOL;Nos exemplos, LITEZAP_URL é a URL base (ex.: http://localhost:8787) e o token vem deLITEZAP_TOKEN (instância) ou LITEZAP_ADMIN_TOKEN.
Resposta
200 O perfil lido de novo depois da alteração.
Campos de BusinessProfile
jid | string | |
business_name | string | |
description | string | |
address | string | |
email | string | |
websites | string[] | |
location | object | O pino no mapa, quando o perfil tem um. |
location.latitude | number | |
location.longitude | number | |
categories | string[] | Nomes das categorias. |
category_list | object[] | Categorias com o id (o PATCH recebe os ids). |
timezone | string | |
hours | object[] | Entradas brutas do WhatsApp (open/close em minutos desde a meia-noite). |
business_hours | BusinessWeek | A semana de funcionamento no formato do PATCH (na leitura, todos os dias aparecem). |
business_hours.timezone | string | Fuso IANA, como America/Sao_Paulo. |
business_hours.days | object | Chaves sun, mon, tue, wed, thu, fri, sat. No PATCH, dia ausente = fechado. |
options | object |
Erros
| Código | HTTP | Retentável | O que fazer |
|---|---|---|---|
validation_failed | 400 | não | Corrija o corpo ou os parâmetros; a message diz o campo. |
unauthorized | 401 | não | Envie Authorization: Bearer <token> válido. |
forbidden | 403 | não | Use o token certo (admin, ou o da própria instância). |
business_account_required | 409 | não | |
not_supported | 422 | não | |
rate_limited | 429 | sim | Espere e tente de novo com backoff. |
Todo erro usa o envelope {"error":{"code","message","retryable"}}. Tabela completa em Erros.
Eventos gerados
Equivalente na Z-API: Editar perfil comercial (descrição, endereço, e-mail, sites, horário, categorias). Veja Migrar da Z-API.
Outras operações de Etiquetas e Business: Listar etiquetas · Criar etiqueta · Renomear ou mudar a cor · Apagar etiqueta · Etiquetar conversa · Remover etiqueta da conversa · Etiquetar mensagem · Remover etiqueta da mensagem · Perfil comercial

