[{"data":1,"prerenderedAt":690},["ShallowReactive",2],{"docs-nav-docs_pt":3,"docs-search-docs_pt":76,"doc-docs_pt-\u002Fdocs\u002Fconcepts\u002Fautomations":460,"surround-docs_pt-\u002Fdocs\u002Fconcepts\u002Fautomations":687},[4],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Docs","\u002Fdocs","docs",[9,13,17,21,43,47,68,72],{"title":10,"path":11,"stem":12},"Introdução","\u002Fdocs\u002Fintroduction","docs\u002F1.introduction",{"title":14,"path":15,"stem":16},"Início rápido","\u002Fdocs\u002Fquickstart","docs\u002F2.quickstart",{"title":18,"path":19,"stem":20},"Como funciona","\u002Fdocs\u002Fhow-it-works","docs\u002F3.how-it-works",{"title":22,"path":23,"stem":24,"children":25,"page":42},"Conceitos","\u002Fdocs\u002Fconcepts","docs\u002F4.concepts",[26,30,34,38],{"title":27,"path":28,"stem":29},"Workspaces e recursos","\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources","docs\u002F4.concepts\u002F1.workspaces-and-resources",{"title":31,"path":32,"stem":33},"Serviços e disponibilidade","\u002Fdocs\u002Fconcepts\u002Fservices-and-availability","docs\u002F4.concepts\u002F2.services-and-availability",{"title":35,"path":36,"stem":37},"Agendamentos e pré-reservas","\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds","docs\u002F4.concepts\u002F3.bookings-and-holds",{"title":39,"path":40,"stem":41},"Automações","\u002Fdocs\u002Fconcepts\u002Fautomations","docs\u002F4.concepts\u002F4.automations",false,{"title":44,"path":45,"stem":46},"WhatsApp e IA","\u002Fdocs\u002Fwhatsapp-and-ai","docs\u002F5.whatsapp-and-ai",{"title":48,"path":49,"stem":50,"children":51,"page":42},"API","\u002Fdocs\u002Fapi","docs\u002F6.api",[52,56,60,64],{"title":53,"path":54,"stem":55},"Autenticação","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002F6.api\u002F1.authentication",{"title":57,"path":58,"stem":59},"Convenções","\u002Fdocs\u002Fapi\u002Fconventions","docs\u002F6.api\u002F2.conventions",{"title":61,"path":62,"stem":63},"Endpoints","\u002Fdocs\u002Fapi\u002Fendpoints","docs\u002F6.api\u002F3.endpoints",{"title":65,"path":66,"stem":67},"Webhooks","\u002Fdocs\u002Fapi\u002Fwebhooks","docs\u002F6.api\u002F4.webhooks",{"title":69,"path":70,"stem":71},"MCP e agentes de IA","\u002Fdocs\u002Fmcp","docs\u002F7.mcp",{"title":73,"path":74,"stem":75},"Receitas por negócio","\u002Fdocs\u002Frecipes","docs\u002F8.recipes",[77,81,87,92,97,102,105,110,115,120,125,130,135,140,144,147,152,157,162,167,170,175,180,185,190,193,198,203,208,213,218,221,226,231,236,241,246,249,254,259,264,269,274,277,282,287,292,297,302,307,310,315,320,325,328,333,338,343,348,353,356,361,366,371,376,381,386,389,394,399,404,409,412,417,422,427,432,435,440,445,450,455],{"id":11,"title":10,"titles":78,"content":79,"level":80},[],"O que é o Wagend, para quem é e os blocos que você vai usar. O Wagend é um motor de agendamento com WhatsApp + IA como canal principal. Seus clientes agendam conversando; o sistema oferece só horários que existem de verdade, faz a pré-reserva, confirma e envia lembretes. O negócio gerencia tudo em um painel, e desenvolvedores integram via API REST, webhooks e servidor MCP. O Wagend está em desenvolvimento. Esta documentação descreve o contrato-alvo (rascunho da API v1). Os endpoints ainda podem mudar antes do piloto.",1,{"id":82,"title":83,"titles":84,"content":85,"level":86},"\u002Fdocs\u002Fintroduction#para-quem-é","Para quem é",[10],"Qualquer negócio que vende o tempo de alguém ou de algo: NegócioO que é agendadoBarbeariaUm barbeiro por 30–45 minutosEstéticaUm profissional e uma máquina e uma cabine, ao mesmo tempoClínicaUm médico e um consultórioRestauranteLugares no salão conforme o tamanho do grupoEntregasCapacidade numa janela de 2 horas para uma zonaAulas, quadras, salasUma vaga na aula ou uma quadra por hora",2,{"id":88,"title":89,"titles":90,"content":91,"level":86},"\u002Fdocs\u002Fintroduction#blocos-principais","Blocos principais",[10],"Organização → sua conta. Tem um ou mais workspaces (um negócio ou unidade).Recurso → o que é consumido: um barbeiro, uma mesa, uma máquina de laser, uma sala, uma zona de entrega.Serviço → o que o cliente agenda. Declara seus requisitos: quais recursos precisa, e quantos, ao mesmo tempo.Horário → quando cada recurso está disponível.Agendamento → passa por uma pré-reserva (10 minutos) antes de ser confirmado.Automação → lembretes, confirmações e avisos disparados por eventos do agendamento. Leia Workspaces e recursos para o modelo completo.",{"id":93,"title":94,"titles":95,"content":96,"level":86},"\u002Fdocs\u002Fintroduction#canais","Canais",[10],"Todos os canais usam o mesmo motor: um horário reservado no WhatsApp some na hora da página de reserva e da API. WhatsApp com assistente de IA (texto e áudio).Página pública de reserva e widget para incorporar.Painel para a equipe (agenda do dia, inbox, calendário, configurações).API REST, webhooks e MCP para desenvolvedores e agentes de IA.",{"id":98,"title":99,"titles":100,"content":101,"level":86},"\u002Fdocs\u002Fintroduction#próximos-passos","Próximos passos",[10],"Início rápido: faça seu primeiro agendamento pela API em 5 minutos.Como funciona: a arquitetura e a vida de uma mensagem.MCP: conecte um agente de IA ao Wagend.",{"id":15,"title":14,"titles":103,"content":104,"level":80},[],"Crie seu primeiro agendamento pela API em cinco minutos com uma chave de teste. Este guia usa uma chave de teste (wg_test_...). Chaves de teste funcionam contra uma cópia sandbox do seu workspace: nenhuma mensagem de WhatsApp é enviada e nenhum pagamento real é feito. URL base: https:\u002F\u002Fapi.wagend.app\u002Fv1. Toda requisição precisa de Authorization: Bearer \u003Cchave>.",{"id":106,"title":107,"titles":108,"content":109,"level":86},"\u002Fdocs\u002Fquickstart#_1-gere-uma-chave-de-teste","1. Gere uma chave de teste",[14],"No painel, vá em Desenvolvedores → Chaves de API → Nova chave, escolha Teste e marque os escopos slots:read, bookings:write e config:read. A chave aparece uma única vez. export WAGEND_KEY=\"wg_test_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx\"",{"id":111,"title":112,"titles":113,"content":114,"level":86},"\u002Fdocs\u002Fquickstart#_2-veja-quem-você-é","2. Veja quem você é",[14],"curl https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fme -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"workspace\": { \"id\": \"ws_9f2c\", \"name\": \"Barbearia Centro\", \"timezone\": \"America\u002FSao_Paulo\", \"locale\": \"pt\", \"currency\": \"BRL\" },\n  \"scopes\": [\"slots:read\", \"bookings:write\", \"config:read\"],\n  \"mode\": \"test\"\n} O workspace sempre vem da chave. Você nunca envia um id de workspace.",{"id":116,"title":117,"titles":118,"content":119,"level":86},"\u002Fdocs\u002Fquickstart#_3-liste-os-serviços","3. Liste os serviços",[14],"curl https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fservices -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"data\": [\n    { \"id\": \"svc_corte\", \"name\": \"Corte\", \"duration_min\": 30, \"price_cents\": 5000, \"currency\": \"BRL\",\n      \"requirements\": [{ \"resource_group_id\": \"grp_barbers\", \"units\": 1 }] }\n  ]\n}",{"id":121,"title":122,"titles":123,"content":124,"level":86},"\u002Fdocs\u002Fquickstart#_4-busque-horários-disponíveis","4. Busque horários disponíveis",[14],"curl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fslots?service_id=svc_corte&from=2026-10-15T08:00:00-03:00&to=2026-10-15T13:00:00-03:00\" \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"data\": [\n    { \"start\": \"2026-10-15T09:00:00-03:00\", \"end\": \"2026-10-15T09:30:00-03:00\", \"resource_ids\": [\"res_juan\"] },\n    { \"start\": \"2026-10-15T09:45:00-03:00\", \"end\": \"2026-10-15T10:15:00-03:00\", \"resource_ids\": [\"res_juan\"] }\n  ],\n  \"unavailable_reason\": null\n}",{"id":126,"title":127,"titles":128,"content":129,"level":86},"\u002Fdocs\u002Fquickstart#_5-faça-a-pré-reserva","5. Faça a pré-reserva",[14],"A pré-reserva (hold) segura o horário por 10 minutos enquanto você coleta os dados do cliente. Sempre envie um Idempotency-Key para que reenvios sejam seguros. curl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fholds \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"service_id\": \"svc_corte\", \"start\": \"2026-10-15T09:45:00-03:00\", \"resource_ids\": [\"res_juan\"] }' { \"id\": \"bkg_7Qx1\", \"status\": \"held\", \"expires_at\": \"2026-10-14T15:30:00-03:00\", \"start\": \"2026-10-15T09:45:00-03:00\" }",{"id":131,"title":132,"titles":133,"content":134,"level":86},"\u002Fdocs\u002Fquickstart#_6-confirme","6. Confirme",[14],"curl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fholds\u002Fbkg_7Qx1\u002Fconfirm \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"customer\": { \"name\": \"Carlos\", \"phone\": \"+5521999990000\", \"locale\": \"pt\" } }' { \"id\": \"bkg_7Qx1\", \"status\": \"confirmed\", \"start\": \"2026-10-15T09:45:00-03:00\", \"source\": \"api\" } Se o serviço exige sinal via Pix, o status fica pending_payment e a resposta traz o código Pix. Vira confirmed quando o pagamento chega.",{"id":136,"title":137,"titles":138,"content":139,"level":86},"\u002Fdocs\u002Fquickstart#o-mesmo-fluxo-em-javascript","O mesmo fluxo em JavaScript",[14],"const api = (path: string, init: RequestInit = {}) =>\n  fetch(`https:\u002F\u002Fapi.wagend.app\u002Fv1${path}`, {\n    ...init,\n    headers: { Authorization: `Bearer ${process.env.WAGEND_KEY}`, 'Content-Type': 'application\u002Fjson', ...init.headers },\n  }).then((r) => r.json())\n\nconst { data: slots } = await api(`\u002Fslots?service_id=svc_corte&from=${from}&to=${to}`)\nconst hold = await api('\u002Fholds', {\n  method: 'POST',\n  headers: { 'Idempotency-Key': crypto.randomUUID() },\n  body: JSON.stringify({ service_id: 'svc_corte', start: slots[0].start }),\n})\nconst booking = await api(`\u002Fholds\u002F${hold.id}\u002Fconfirm`, {\n  method: 'POST',\n  headers: { 'Idempotency-Key': crypto.randomUUID() },\n  body: JSON.stringify({ customer: { name: 'Carlos', phone: '+5521999990000' } }),\n})",{"id":141,"title":99,"titles":142,"content":143,"level":86},"\u002Fdocs\u002Fquickstart#próximos-passos",[14],"Reaja a agendamentos com webhooks.Veja todos os endpoints na referência. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"id":19,"title":18,"titles":145,"content":146,"level":80},[],"Arquitetura, princípios e a vida de uma mensagem de WhatsApp dentro do Wagend.",{"id":148,"title":149,"titles":150,"content":151,"level":86},"\u002Fdocs\u002Fhow-it-works#princípios","Princípios",[18],"Núcleo determinístico, IA como intérprete. A IA entende o cliente e chama ferramentas. O motor calcula disponibilidade, faz a pré-reserva, confirma e cobra. A IA nunca inventa horário nem preço.O banco de dados garante as regras. Overbooking é impossível porque o PostgreSQL rejeita alocações sobrepostas, não porque o app \"confere antes\".API primeiro. Painel, página de reserva, bot de WhatsApp e MCP usam os mesmos serviços. Se algo não dá para fazer pela API, está faltando na API.A credencial define o negócio. Uma chave ou sessão sempre pertence a um workspace.",{"id":153,"title":154,"titles":155,"content":156,"level":86},"\u002Fdocs\u002Fhow-it-works#arquitetura","Arquitetura",[18],"Canais:     WhatsApp · Página de reserva · Painel · REST \u002F MCP\n                 │\nGateway:    credencial → workspace · escopos · limites · webhooks assinados\n                 │\nNúcleo:     conversas + IA │ motor de agenda │ automações │ pagamentos │ conhecimento\n                 │\nDados:      PostgreSQL (segurança por linha, constraints de exclusão, jobs) · Redis\nExternos:   modelos de IA (OpenRouter) · transcrição de áudio · provedor de WhatsApp · Pix",{"id":158,"title":159,"titles":160,"content":161,"level":86},"\u002Fdocs\u002Fhow-it-works#a-vida-de-uma-mensagem","A vida de uma mensagem",[18],"Chega. O provedor de WhatsApp chama nosso webhook. Verificamos a assinatura HMAC, descartamos duplicadas pelo id da mensagem e guardamos. Respondemos em menos de 200 ms.É entendida. Áudios são transcritos. Identificamos cliente e conversa. Se uma pessoa assumiu, o bot fica em silêncio.A IA pede. O modelo recebe o contexto do negócio, data e hora locais, um estado estruturado da conversa e as últimas mensagens. Ele só pode chamar ferramentas como find_slots, hold_slot ou confirm_hold.O motor decide. Cada chamada é validada contra um schema estrito e as regras do negócio, e então executada. Erros voltam como dados estruturados (por exemplo slot_taken com alternativas) para a IA perguntar de novo.Resposta exata. Datas, horários, serviços, preços e endereços saem de modelos de mensagem preenchidos com o resultado real.Eventos. booking.confirmed e companhia disparam automações (lembretes) e seus webhooks.",{"id":163,"title":164,"titles":165,"content":166,"level":86},"\u002Fdocs\u002Fhow-it-works#para-onde-ir","Para onde ir",[18],"Agendamentos e pré-reservas explica as garantias.WhatsApp e IA explica o que a IA pode e não pode fazer.",{"id":28,"title":27,"titles":168,"content":169,"level":80},[],"Organizações, workspaces, papéis, recursos, modos de capacidade e grupos de recursos.",{"id":171,"title":172,"titles":173,"content":174,"level":86},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#organização-e-workspaces","Organização e workspaces",[27],"Uma organização é a conta que paga. Ela contém um ou mais workspaces. Um workspace é um negócio ou unidade com seus próprios: fuso horário, idioma e moeda,número(s) de WhatsApp,bot, serviços, recursos e equipe. Uma rede de três barbearias é uma organização com três workspaces.",{"id":176,"title":177,"titles":178,"content":179,"level":86},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#papéis","Papéis",[27],"PapelPodeownerTudo, em todos os workspaces da organizaçãomanagerTudo dentro de um workspacestaffVer e gerenciar só os próprios recursos (por exemplo, o barbeiro vê só a sua agenda)viewerSomente leitura A equipe também pode agir pelo WhatsApp depois de vincular o número com um código de uso único. Ações de administrador pelo WhatsApp sempre pedem confirmação SIM\u002FNÃO.",{"id":181,"title":182,"titles":183,"content":184,"level":86},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#recursos","Recursos",[27],"Um recurso é qualquer coisa consumida por um agendamento. kindExemplosstaffBarbeiro, médico, esteticista, instrutorspaceSala, consultório, cabine, salãoequipmentMáquina de laser, cadeira, quadratableMesa de restaurante (modo mesas)vehicleVan, equipe de entregazoneÁrea de entrega por CEP Cada recurso tem um modo de capacidade: exclusive — atende um agendamento por vez (um barbeiro, uma sala, uma máquina).pooled — tem capacidade em unidades (40 lugares por turno, 12 vagas numa aula, 10 entregas por janela).",{"id":186,"title":187,"titles":188,"content":189,"level":86},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#grupos-de-recursos","Grupos de recursos",[27],"Um grupo de recursos é um conjunto intercambiável (\"qualquer barbeiro\", \"máquinas de laser\"). Serviços exigem grupos, não recursos individuais, para que o motor escolha um. A estratégia de alocação decide qual: assignmentComportamentocustomer_choiceO cliente escolhe (por exemplo \"com o Juan\"); se não tiver preferência, usa outra estratégiaround_robinReveza entre os membrosleast_busyEscolhe o membro com menos agendamentos no diafixedSempre o mesmo membro (máquina única, sala única) {\n  \"name\": \"Barbeiros\",\n  \"assignment\": \"customer_choice\",\n  \"member_ids\": [\"res_juan\", \"res_pedro\", \"res_leo\"]\n} html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":32,"title":31,"titles":191,"content":192,"level":80},[],"Serviços, requisitos com vários recursos, horários e como os slots são calculados.",{"id":194,"title":195,"titles":196,"content":197,"level":86},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#serviços","Serviços",[31],"Um serviço é o que o cliente agenda. CampoSignificadoduration_minDuração do serviçostep_minGrade de início (a cada 15, 30 minutos…)buffer_before_min \u002F buffer_after_minTempo de preparo ou limpeza bloqueado ao redor do agendamentoprice_cents, currencyPreço que o bot informa (sempre do banco de dados)deposit_centsSinal via Pix exigido para confirmarlead_time_minAntecedência mínima (por exemplo 60 minutos)max_advance_daysCom quanta antecedência máxima o cliente pode agendarwindow_modeO slot é uma janela fixa (entregas: 14:00–16:00)fulfillment_modescheduled (padrão, com horário) ou queue (despacho por fila, sem horário fixo)intake_formJSON Schema de dados extras a coletar (convênio, endereço…)requirementsQuais recursos o serviço precisa ao mesmo tempo",{"id":199,"title":200,"titles":201,"content":202,"level":86},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#janela-ou-despacho-dois-modos-de-cumprimento","Janela ou despacho: dois modos de cumprimento",[31],"Cada serviço define como o agendamento é cumprido (fulfillment_mode): scheduled (o padrão): o agendamento ocupa um intervalo de tempo conhecido — um horário fixo ou, com window_mode, uma janela (entregas das 14:00 às 16:00, com cota por zona).queue (despacho, para água, gás ou delivery sob demanda): o agendamento não tem horário fixo — entra na fila de pendências de um entregador. O motor o atribui ao entregador com menos tarefas ativas e cada entregador tem um limite de tarefas ativas por vez, garantido no banco de dados. A fila usa os mesmos estados de um agendamento: pendente → aceita → iniciada → concluída (ou falhou). Assim, um mesmo negócio de entregas pode oferecer janelas programadas, despacho imediato ou os dois.",{"id":204,"title":205,"titles":206,"content":207,"level":86},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#requisitos","Requisitos",[31],"Um requisito diz: deste grupo, preciso de tantas unidades. Um serviço pode ter vários; um slot só existe se todos estiverem livres. {\n  \"name\": \"Depilação a laser\",\n  \"duration_min\": 45,\n  \"buffer_after_min\": 10,\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_professionals\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_lasers\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_rooms\", \"units\": 1 }\n  ]\n} Com duas profissionais e só um laser, o Wagend nunca oferece duas sessões de laser sobrepostas. Opções avançadas: units: \"party_size\" — consome tantas unidades quanto pessoas (restaurantes, aulas).offset_min \u002F duration_min num requisito — usa um recurso só em parte do serviço (por exemplo o lavatório nos últimos 15 minutos de uma coloração).",{"id":209,"title":210,"titles":211,"content":212,"level":86},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#horários","Horários",[31],"Cada recurso tem um horário: regras semanais no fuso do recurso mais exceções para datas específicas (fechado ou horário especial). {\n  \"tz\": \"America\u002FSao_Paulo\",\n  \"weekly\": { \"tue\": [[\"09:00\", \"19:00\"]], \"sat\": [[\"08:00\", \"12:00\"], [\"13:00\", \"16:00\"]] },\n  \"overrides\": [{ \"date\": \"2026-12-24\", \"ranges\": [[\"09:00\", \"13:00\"]] }, { \"date\": \"2026-12-25\", \"closed\": true }]\n}",{"id":214,"title":215,"titles":216,"content":217,"level":86},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#como-os-slots-são-calculados","Como os slots são calculados",[31],"Expandir os horários para o período pedido, no fuso de cada recurso.Remover agendamentos e pré-reservas ativos (mais os buffers) e bloqueios manuais.Cortar em slots candidatos conforme duração e grade do serviço.Aplicar antecedência mínima e máxima, regras de corte e tamanho do grupo.Cruzar todos os requisitos, testando os membros de cada grupo conforme a estratégia de alocação.Devolver uma lista curta e ordenada. Quando não há nada disponível, a resposta traz unavailable_reason (closed, no_staff, no_equipment, no_space, lead_time, max_advance, cutoff, full) para o bot explicar o motivo. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":36,"title":35,"titles":219,"content":220,"level":80},[],"Estados do agendamento, a pré-reserva de 10 minutos, sinal via Pix e a garantia de zero overbooking.",{"id":222,"title":223,"titles":224,"content":225,"level":86},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#por-que-pré-reserva","Por que pré-reserva",[35],"Uma conversa no WhatsApp pode levar minutos: o cliente escolhe o horário, depois você pergunta o nome, talvez um sinal. Enquanto isso, outros clientes, a página de reserva e a API disputam o mesmo horário. A pré-reserva (hold) segura o horário por 10 minutos (15 quando há sinal via Pix) e expira sozinha.",{"id":227,"title":228,"titles":229,"content":230,"level":86},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#estados","Estados",[35],"StatusSignificadoOcupa o horárioheldPré-reserva temporáriaSimpending_paymentAguardando o sinal via PixSimconfirmedAgendadoSimchecked_inO cliente chegouSimcompletedAtendidoNãocancelledCancelado (ou substituído por reagendamento)Nãono_showFalta marcada por uma pessoaNãoexpiredPré-reserva não confirmada a tempoNão held ──confirm──► confirmed ──check-in──► checked_in ──► completed\n │  └─(sinal)──► pending_payment ──pago──► confirmed\n └─expira──► expired          confirmed ──cancela──► cancelled",{"id":232,"title":233,"titles":234,"content":235,"level":86},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#garantias","Garantias",[35],"Cada recurso ocupado por um agendamento é gravado como uma alocação com intervalo de tempo.Para recursos exclusive, o PostgreSQL rejeita alocações sobrepostas com uma constraint de exclusão.Para recursos pooled, os contadores de capacidade nunca passam do limite (verificação atômica).Um agendamento com vários recursos é gravado numa única transação: se qualquer recurso conflitar, nada é agendado.POST \u002Fholds e POST \u002Fholds\u002F{id}\u002Fconfirm exigem Idempotency-Key: reenviar uma requisição nunca cria um segundo agendamento. Se o horário foi ocupado enquanto o cliente decidia, você recebe 409 com code: \"slot_taken\" e uma lista de alternatives.",{"id":237,"title":238,"titles":239,"content":240,"level":86},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#reagendar-e-cancelar","Reagendar e cancelar",[35],"Reagendar cria um novo agendamento e cancela o anterior (ligados por rescheduled_to). Os lembretes se movem sozinhos.Cancelar libera o horário e cancela lembretes pendentes.Falta nunca é automática: o sistema sugere, uma pessoa confirma.",{"id":242,"title":243,"titles":244,"content":245,"level":86},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#sinal","Sinal",[35],"Se o serviço tem deposit_cents, confirmar a pré-reserva devolve pending_payment com um código Pix. Quando o provedor de pagamento avisa, o agendamento vira confirmed e o evento payment.paid é emitido. Um pagamento que chega depois da pré-reserva expirar é marcado para estorno.",{"id":40,"title":39,"titles":247,"content":248,"level":80},[],"Lembretes, confirmações e avisos como regras \"quando acontecer isto, faça aquilo\". Automações são regras com um gatilho, condições opcionais e uma ação. Cada modelo de negócio já vem com padrões que você pode editar.",{"id":250,"title":251,"titles":252,"content":253,"level":86},"\u002Fdocs\u002Fconcepts\u002Fautomations#gatilhos","Gatilhos",[39],"GatilhoExemplobooking.confirmedEnviar o resumo do agendamentobooking.starts_in(Δ)24 h antes: pedir confirmação SIM\u002FNÃObooking.ended(+Δ)1 h depois: sugerir conferir presençabooking.cancelled, booking.rescheduledAvisar a equipehold.expiredRetomar contato com o clientepayment.paidConfirmar e agradecerdaily_at(hh:mm)Enviar a agenda do dia para a equipe",{"id":255,"title":256,"titles":257,"content":258,"level":86},"\u002Fdocs\u002Fconcepts\u002Fautomations#condições","Condições",[39],"Serviço, recurso, tamanho do grupo acima de N, canal, etiqueta do cliente, quantidade de faltas anteriores.",{"id":260,"title":261,"titles":262,"content":263,"level":86},"\u002Fdocs\u002Fconcepts\u002Fautomations#ações","Ações",[39],"Enviar mensagem ou modelo ao cliente, avisar a equipe, pedir confirmação SIM\u002FNÃO, mudar o status do agendamento, criar tarefa interna, chamar um webhook.",{"id":265,"title":266,"titles":267,"content":268,"level":86},"\u002Fdocs\u002Fconcepts\u002Fautomations#padrões-por-negócio","Padrões por negócio",[39],"ModeloAutomaçõesBarbearia, estética, clínicaLembrete 24 h antes com SIM\u002FNÃO · aviso ao profissional 2 h antes · conferir presença 1 h depois · agenda do dia às 7:30RestauranteLembrete no dia anterior · confirmação obrigatória para grupos acima de 6 · agenda do diaEntregas\"A caminho\" 1 h antes · confirmação de recebimento",{"id":270,"title":271,"titles":272,"content":273,"level":86},"\u002Fdocs\u002Fconcepts\u002Fautomations#garantias-de-execução","Garantias de execução",[39],"Os jobs são criados na mesma transação do evento do agendamento, então nunca se perdem.Antes de rodar, o job confere o agendamento de novo. Se foi reagendado ou cancelado, o job antigo é descartado.Cada job roda uma vez (chave de idempotência) e tenta de novo com espera crescente; depois de 5 falhas aparece no painel.Horário de silêncio: nada é enviado a clientes entre 21:00 e 08:00 no fuso deles.Respostas SIM\u002FNÃO são interpretadas sem IA (sim, sí, ok, 👍, não…), instantâneo e sem custo.",{"id":45,"title":44,"titles":275,"content":276,"level":80},[],"Conectar um número, o que o assistente pode e não pode fazer, ações da equipe e transferência para humano.",{"id":278,"title":279,"titles":280,"content":281,"level":86},"\u002Fdocs\u002Fwhatsapp-and-ai#conectar-um-número","Conectar um número",[44],"No painel, vá em Canais → WhatsApp → Conectar e escaneie o QR com o celular do negócio, como no WhatsApp Web. Um workspace pode conectar vários números (um por unidade, por exemplo). Use um número dedicado ao negócio. Para selo verde ou disparos em massa, uma conexão pela plataforma oficial do WhatsApp Business será oferecida como opção.",{"id":283,"title":284,"titles":285,"content":286,"level":86},"\u002Fdocs\u002Fwhatsapp-and-ai#clientes-e-equipe","Clientes e equipe",[44],"O papel é decidido no código, nunca pelo que alguém diz no chat: Um número vinculado a alguém da equipe (verificado com código de uso único) recebe ferramentas de equipe.Todos os outros recebem ferramentas de cliente. Ferramentas de clienteFerramentas de equipe (extras)list_services, find_slots, hold_slot, confirm_hold, my_bookings, cancel_my_booking, reschedule_my_booking, get_business_info, search_knowledge, handoff_to_humanlist_today, block_time, mark_no_show, update_catalog_item — sempre com confirmação SIM\u002FNÃO",{"id":288,"title":289,"titles":290,"content":291,"level":86},"\u002Fdocs\u002Fwhatsapp-and-ai#o-que-a-ia-pode-e-não-pode-fazer","O que a IA pode e não pode fazer",[44],"PodeNão podeEntender texto, áudio, erros de digitação e mudanças de ideiaInventar horários, preços ou endereçosBuscar horários e oferecer 2–3 opçõesConfirmar um agendamento sem o motorFazer a pré-reserva e pedir os dados que faltamUsar ferramentas de administrador com um clienteResponder dúvidas com a base de conhecimento do negócioSeguir instruções escondidas em mensagens ou arquivosPassar a conversa para uma pessoaVer dados de outro negócio Ids de workspace, ids de cliente e preços são injetados pelo sistema; o modelo nunca os fornece.",{"id":293,"title":294,"titles":295,"content":296,"level":86},"\u002Fdocs\u002Fwhatsapp-and-ai#transferência-para-humano","Transferência para humano",[44],"A equipe vê todas as conversas ao vivo no Inbox. Assumir uma conversa pausa o bot nela; ele volta sozinho depois de 15 minutos sem atividade do atendente. O assistente também transfere quando o cliente pede (\"quero falar com uma pessoa\").",{"id":298,"title":299,"titles":300,"content":301,"level":86},"\u002Fdocs\u002Fwhatsapp-and-ai#áudios-e-idiomas","Áudios e idiomas",[44],"Áudios são transcritos antes de a IA ler, e a transcrição aparece no inbox. O assistente responde no idioma do cliente (português, espanhol ou inglês).",{"id":303,"title":304,"titles":305,"content":306,"level":86},"\u002Fdocs\u002Fwhatsapp-and-ai#modelos","Modelos",[44],"A camada de IA roda via OpenRouter com uma chave e um limite de gasto próprios por workspace. O padrão é um modelo rápido e barato; um modelo mais forte só é usado nos turnos que falham na validação. Os provedores são fixados entre os que não retêm dados.",{"id":54,"title":53,"titles":308,"content":309,"level":80},[],"Chaves de API, escopos, modos de teste e produção.",{"id":311,"title":312,"titles":313,"content":314,"level":86},"\u002Fdocs\u002Fapi\u002Fauthentication#chaves-de-api","Chaves de API",[53],"Envie sua chave como bearer token: GET \u002Fv1\u002Fme HTTP\u002F1.1\nHost: api.wagend.app\nAuthorization: Bearer wg_live_3fa9c2_Lr8t... PrefixoModowg_live_Dados de produção, mensagens e pagamentos reaiswg_test_Sandbox: dados isolados, nenhuma mensagem enviada, pagamentos simulados As chaves pertencem a um workspace. O workspace sempre é tirado da chave: não existe id de workspace em paths nem em corpos. As chaves são guardadas com hash; a chave completa aparece só uma vez, na criação.",{"id":316,"title":317,"titles":318,"content":319,"level":86},"\u002Fdocs\u002Fapi\u002Fauthentication#escopos","Escopos",[53],"EscopoPermiteslots:readGET \u002Fslotsbookings:readListar e ler agendamentosbookings:writePré-reservas, confirmar, cancelar, reagendar, check-in, faltacustomers:readLer clientesmessages:readLer conversas e mensagensmessages:writeEnviar mensagens, transferirconfig:read \u002F config:writeServiços, recursos, grupos, horários, automações, conhecimentowebhooks:manageEndpoints de webhook Uma requisição sem o escopo necessário devolve 403 com code: \"insufficient_scope\".",{"id":321,"title":322,"titles":323,"content":324,"level":86},"\u002Fdocs\u002Fapi\u002Fauthentication#rotação","Rotação",[53],"Crie uma chave nova, publique, e depois revogue a antiga em Desenvolvedores → Chaves de API. Chaves revogadas devolvem 401 na hora. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":58,"title":57,"titles":326,"content":327,"level":80},[],"Formatos, idempotência, paginação, erros e limites de requisição.",{"id":329,"title":330,"titles":331,"content":332,"level":86},"\u002Fdocs\u002Fapi\u002Fconventions#básico","Básico",[57],"URL base https:\u002F\u002Fapi.wagend.app\u002Fv1. Mudanças incompatíveis saem como nova versão.JSON na entrada e na saída (Content-Type: application\u002Fjson).Datas em ISO 8601 com offset (2026-10-15T09:45:00-03:00). Guardadas em UTC.Valores em centavos inteiros mais currency (BRL, ARS, PYG, USD).IDs são strings opacas com prefixo (bkg_, svc_, res_, grp_, cus_).",{"id":334,"title":335,"titles":336,"content":337,"level":86},"\u002Fdocs\u002Fapi\u002Fconventions#idempotência","Idempotência",[57],"POST \u002Fholds, POST \u002Fholds\u002F{id}\u002Fconfirm, POST \u002Fbookings e POST \u002Fbookings\u002F{id}\u002Freschedule exigem o header Idempotency-Key (por exemplo um UUID). Repetir uma requisição com a mesma chave em até 24 horas devolve a resposta original. Reutilizar a chave com outro corpo devolve 422.",{"id":339,"title":340,"titles":341,"content":342,"level":86},"\u002Fdocs\u002Fapi\u002Fconventions#paginação","Paginação",[57],"Os endpoints de lista usam cursores: curl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings?limit=50\" -H \"Authorization: Bearer $WAGEND_KEY\"\n# → { \"data\": [...], \"next_cursor\": \"eyJpZCI6...\" }\ncurl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings?limit=50&cursor=eyJpZCI6...\" -H \"Authorization: Bearer $WAGEND_KEY\"",{"id":344,"title":345,"titles":346,"content":347,"level":86},"\u002Fdocs\u002Fapi\u002Fconventions#erros","Erros",[57],"Os erros seguem a RFC 9457 (application\u002Fproblem+json): {\n  \"type\": \"https:\u002F\u002Fwagend.app\u002Fdocs\u002Fapi\u002Fconventions#errors\",\n  \"title\": \"Slot no longer available\",\n  \"status\": 409,\n  \"code\": \"slot_taken\",\n  \"alternatives\": [{ \"start\": \"2026-10-15T10:15:00-03:00\", \"end\": \"2026-10-15T10:45:00-03:00\" }]\n} codeStatusQuandoinvalid_request400 \u002F 422Falha de validaçãounauthorized401Chave ausente, inválida ou revogadainsufficient_scope403A chave não tem o escoponot_found404Id desconhecido (ou de outro workspace)slot_taken409Outra pessoa pegou o horárioinvalid_transition409Por exemplo confirmar um agendamento canceladohold_expired410A pré-reserva expirou antes de confirmaridempotency_mismatch422Mesma chave, corpo diferenterate_limited429Requisições demais",{"id":349,"title":350,"titles":351,"content":352,"level":86},"\u002Fdocs\u002Fapi\u002Fconventions#limites-de-requisição","Limites de requisição",[57],"Os limites valem por chave e por workspace. Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset. Em 429, espere Retry-After segundos. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":62,"title":61,"titles":354,"content":355,"level":80},[],"Todos os endpoints da v1 num relance, com os formatos mais comuns de requisição e resposta. O contrato legível por máquina fica no repositório em packages\u002Fopenapi\u002Fopenapi.yaml (OpenAPI 3.1).",{"id":357,"title":358,"titles":359,"content":360,"level":86},"\u002Fdocs\u002Fapi\u002Fendpoints#agenda","Agenda",[61],"MétodoPathEscopoDescriçãoGET\u002Fslotsslots:readHorários disponíveis para um serviçoPOST\u002Fholdsbookings:writeCriar pré-reserva de 10 minutosPOST\u002Fholds\u002F{id}\u002Fconfirmbookings:writeConfirmar (ou pending_payment se exigir sinal)DELETE\u002Fholds\u002F{id}bookings:writeLiberar pré-reservaGET\u002Fbookingsbookings:readListar (filtros: from, to, status, resource_id, customer_id)POST\u002Fbookingsbookings:writePré-reserva + confirmação numa chamadaGET \u002F PATCH\u002Fbookings\u002F{id}bookings:read \u002F writeLer, atualizar notas ou dados de cadastroPOST\u002Fbookings\u002F{id}\u002Fcancelbookings:writeCancelarPOST\u002Fbookings\u002F{id}\u002Freschedulebookings:writeMudar para um novo inícioPOST\u002Fbookings\u002F{id}\u002Fcheck-inbookings:writeMarcar chegadaPOST\u002Fbookings\u002F{id}\u002Fno-showbookings:writeMarcar falta",{"id":362,"title":363,"titles":364,"content":365,"level":86},"\u002Fdocs\u002Fapi\u002Fendpoints#catálogo","Catálogo",[61],"MétodoPathEscopoGET \u002F POST\u002Fservicesconfig:read \u002F config:writeGET \u002F POST\u002Fresourcesconfig:read \u002F config:writeGET\u002Fresource-groupsconfig:readPOST\u002Fschedules\u002F{id}\u002Foverridesconfig:write",{"id":367,"title":368,"titles":369,"content":370,"level":86},"\u002Fdocs\u002Fapi\u002Fendpoints#clientes-e-conversas","Clientes e conversas",[61],"MétodoPathEscopoGET\u002Fcustomerscustomers:readDELETE\u002Fcustomers\u002F{id}customers:read + papel owner (anonimiza, LGPD)GET\u002Fconversationsmessages:readGET \u002F POST\u002Fconversations\u002F{id}\u002Fmessagesmessages:read \u002F messages:writePOST\u002Fconversations\u002F{id}\u002Fhandoffmessages:write",{"id":372,"title":373,"titles":374,"content":375,"level":86},"\u002Fdocs\u002Fapi\u002Fendpoints#plataforma","Plataforma",[61],"MétodoPathEscopoGET\u002FmequalquerGET \u002F POST\u002Fwebhook-endpointswebhooks:manageGET\u002Feventsbookings:read",{"id":377,"title":378,"titles":379,"content":380,"level":86},"\u002Fdocs\u002Fapi\u002Fendpoints#exemplo-slots","Exemplo: slots",[61],"GET \u002Fv1\u002Fslots?service_id=svc_laser&from=2026-10-20T09:00:00-03:00&to=2026-10-20T20:00:00-03:00&around=2026-10-20T18:00:00-03:00 {\n  \"data\": [\n    { \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:30:00-03:00\", \"resource_ids\": [\"res_ana\", \"res_laser1\", \"res_room2\"] },\n    { \"start\": \"2026-10-20T18:45:00-03:00\", \"end\": \"2026-10-20T19:30:00-03:00\", \"resource_ids\": [\"res_carla\", \"res_laser1\", \"res_room1\"] }\n  ],\n  \"unavailable_reason\": null\n}",{"id":382,"title":383,"titles":384,"content":385,"level":86},"\u002Fdocs\u002Fapi\u002Fendpoints#exemplo-objeto-de-agendamento","Exemplo: objeto de agendamento",[61],"{\n  \"id\": \"bkg_7Qx1\",\n  \"status\": \"confirmed\",\n  \"service_id\": \"svc_laser\",\n  \"start\": \"2026-10-20T17:45:00-03:00\",\n  \"end\": \"2026-10-20T18:30:00-03:00\",\n  \"party_size\": 1,\n  \"customer\": { \"id\": \"cus_31\", \"name\": \"Marina\", \"phone\": \"+5521988887777\", \"locale\": \"pt\" },\n  \"allocations\": [\n    { \"resource_id\": \"res_ana\", \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:40:00-03:00\", \"units\": 1 },\n    { \"resource_id\": \"res_laser1\", \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:40:00-03:00\", \"units\": 1 },\n    { \"resource_id\": \"res_room2\", \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:40:00-03:00\", \"units\": 1 }\n  ],\n  \"payment\": { \"status\": \"paid\", \"amount_cents\": 5000 },\n  \"source\": \"whatsapp\",\n  \"created_at\": \"2026-10-19T11:02:13-03:00\"\n} As alocações incluem o buffer (aqui 10 minutos depois do serviço). html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"id":66,"title":65,"titles":387,"content":388,"level":80},[],"Eventos assinados de agendamentos, pagamentos e conversas, com reenvio automático.",{"id":390,"title":391,"titles":392,"content":393,"level":86},"\u002Fdocs\u002Fapi\u002Fwebhooks#eventos","Eventos",[65],"EventoQuandobooking.createdUma pré-reserva ou agendamento foi criadobooking.confirmedUm agendamento foi confirmado (inclusive após o pagamento)booking.cancelledCancelado ou expiradobooking.rescheduledMudou de horário (o payload traz o id antigo e o novo)booking.no_showMarcado como faltapayment.paidUm sinal via Pix foi recebidomessage.receivedChegou uma mensagem de clienteconversation.handoffUma conversa foi passada para uma pessoa Crie endpoints em Desenvolvedores → Webhooks ou via POST \u002Fv1\u002Fwebhook-endpoints. O segredo de assinatura aparece uma única vez.",{"id":395,"title":396,"titles":397,"content":398,"level":86},"\u002Fdocs\u002Fapi\u002Fwebhooks#payload","Payload",[65],"{\n  \"id\": \"evt_01J9ZK3T6\",\n  \"type\": \"booking.confirmed\",\n  \"created_at\": \"2026-10-14T15:21:07-03:00\",\n  \"workspace_id\": \"ws_9f2c\",\n  \"data\": { \"booking\": { \"id\": \"bkg_7Qx1\", \"status\": \"confirmed\", \"start\": \"2026-10-15T09:45:00-03:00\" } }\n} A entrega é pelo menos uma vez: use o id para ignorar duplicados.",{"id":400,"title":401,"titles":402,"content":403,"level":86},"\u002Fdocs\u002Fapi\u002Fwebhooks#verificando-a-assinatura","Verificando a assinatura",[65],"Toda requisição traz o header: Wagend-Signature: t=1791040867,v1=5c2b9f...e81 v1 é HMAC-SHA256(segredo, t + \".\" + corpo_bruto) em hexadecimal. Rejeite requisições com mais de 5 minutos. import crypto from 'node:crypto'\n\nexport function verifyWagend(rawBody: string, header: string, secret: string) {\n  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=') as [string, string]))\n  const age = Math.abs(Date.now() \u002F 1000 - Number(parts.t))\n  if (!parts.t || !parts.v1 || age > 300) return false\n  const expected = crypto.createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex')\n  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1))\n} import hashlib, hmac, time\n\ndef verify_wagend(raw_body: bytes, header: str, secret: str) -> bool:\n    parts = dict(p.split(\"=\", 1) for p in header.split(\",\"))\n    if abs(time.time() - int(parts.get(\"t\", \"0\"))) > 300:\n        return False\n    signed = f\"{parts['t']}.\".encode() + raw_body\n    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()\n    return hmac.compare_digest(expected, parts.get(\"v1\", \"\"))",{"id":405,"title":406,"titles":407,"content":408,"level":86},"\u002Fdocs\u002Fapi\u002Fwebhooks#reenvios","Reenvios",[65],"Responda com qualquer 2xx em até 10 segundos. Caso contrário, tentamos de novo após 1 min, 5 min, 30 min, 2 h e 12 h. Cada tentativa aparece no log de entregas, onde você também pode reenviar manualmente. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"id":70,"title":69,"titles":410,"content":411,"level":80},[],"Deixe o Claude, o ChatGPT ou seu próprio agente buscar horários, agendar e operar um negócio via Model Context Protocol. O Wagend expõe um servidor MCP para que agentes de IA usem o mesmo motor do bot de WhatsApp: mesmas pré-reservas, mesma validação, mesmo registro de auditoria.",{"id":413,"title":414,"titles":415,"content":416,"level":86},"\u002Fdocs\u002Fmcp#conectar","Conectar",[69],"URL: https:\u002F\u002Fmcp.wagend.app (Streamable HTTP)Autenticação: uma chave de API no header Authorization. OAuth virá depois. Exemplo de configuração do cliente: {\n  \"mcpServers\": {\n    \"wagend\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Fmcp.wagend.app\",\n      \"headers\": { \"Authorization\": \"Bearer wg_live_...\" }\n    }\n  }\n} Use uma chave wg_test_ enquanto testa.",{"id":418,"title":419,"titles":420,"content":421,"level":86},"\u002Fdocs\u002Fmcp#conjuntos-de-ferramentas","Conjuntos de ferramentas",[69],"As ferramentas que o agente vê dependem dos escopos da chave. Agendamento (slots:read, bookings:write) — para assistentes que agendam em nome de um cliente: FerramentaFazlist_servicesServiços com duração e preçofind_slotsHorários disponíveis para um serviço e períodohold_slotPré-reserva de 10 minutosconfirm_bookingConfirma uma pré-reserva com os dados do clientecancel_booking, reschedule_booking, get_bookingGerencia um agendamento existente Administração (config:write) — para o dono operar o negócio pelo seu assistente de IA: FerramentaFazlist_resources, list_todayEquipe, salas, máquinas e agenda do diablock_timeBloqueia um recurso (férias, manutenção)create_service, update_scheduleAltera catálogo e horáriosget_statsAgendamentos, ocupação e faltas",{"id":423,"title":424,"titles":425,"content":426,"level":86},"\u002Fdocs\u002Fmcp#exemplos-de-pedidos","Exemplos de pedidos",[69],"\"Agenda um corte com o Juan amanhã de manhã, nome Carlos.\"\"Bloqueia a máquina de laser na segunda que vem para manutenção e me diz quais agendamentos são afetados.\"\"Quantas faltas tivemos este mês?\"",{"id":428,"title":429,"titles":430,"content":431,"level":86},"\u002Fdocs\u002Fmcp#docs-para-llms","Docs para LLMs",[69],"\u002Fllms.txt lista todas as páginas da documentação.\u002Fllms-full.txt contém a documentação completa em inglês, em Markdown. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":74,"title":73,"titles":433,"content":434,"level":80},[],"Como modelar uma barbearia, uma clínica de estética, um consultório, um restaurante e entregas. Cada receita corresponde a um modelo pronto que você escolhe no onboarding.",{"id":436,"title":437,"titles":438,"content":439,"level":86},"\u002Fdocs\u002Frecipes#barbearia","Barbearia",[73],"Cada barbeiro é um recurso staff exclusive com seu próprio horário. Um grupo, customer_choice com round_robin como alternativa. {\n  \"name\": \"Corte\",\n  \"duration_min\": 30,\n  \"step_min\": 15,\n  \"buffer_after_min\": 5,\n  \"price_cents\": 5000,\n  \"requirements\": [{ \"resource_group_id\": \"grp_barbers\", \"units\": 1 }]\n}",{"id":441,"title":442,"titles":443,"content":444,"level":86},"\u002Fdocs\u002Frecipes#estética","Estética",[73],"Profissionais, máquinas e cabines são recursos separados. O serviço exige os três ao mesmo tempo, então o mais escasso (geralmente a máquina) limita a agenda. {\n  \"name\": \"Depilação a laser\",\n  \"duration_min\": 45,\n  \"buffer_after_min\": 10,\n  \"price_cents\": 18000,\n  \"deposit_cents\": 5000,\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_professionals\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_lasers\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_rooms\", \"units\": 1 }\n  ]\n}",{"id":446,"title":447,"titles":448,"content":449,"level":86},"\u002Fdocs\u002Frecipes#clínica","Clínica",[73],"Médico mais consultório, por unidade (um workspace por unidade). Dados de saúde são sensíveis: o assistente nunca pergunta sintomas, e o formulário coleta só o necessário para agendar. {\n  \"name\": \"Consulta\",\n  \"duration_min\": 30,\n  \"buffer_after_min\": 10,\n  \"intake_form\": { \"type\": \"object\", \"properties\": { \"convenio\": { \"type\": \"string\" } } },\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_doctors\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_offices\", \"units\": 1 }\n  ]\n}",{"id":451,"title":452,"titles":453,"content":454,"level":86},"\u002Fdocs\u002Frecipes#restaurante","Restaurante",[73],"O salão é um recurso pooled com 40 unidades (lugares) por turno. A duração cresce com o tamanho do grupo, e grupos grandes pagam sinal. {\n  \"name\": \"Mesa\",\n  \"step_min\": 30,\n  \"duration_by_units\": [\n    { \"max_units\": 2, \"duration_min\": 90 },\n    { \"max_units\": 4, \"duration_min\": 120 },\n    { \"max_units\": 20, \"duration_min\": 150 }\n  ],\n  \"requirements\": [{ \"resource_group_id\": \"grp_dining_room\", \"units\": \"party_size\" }]\n} O modo mesas (mesas específicas com tamanho mínimo e máximo, e combinações) está no roadmap.",{"id":456,"title":457,"titles":458,"content":459,"level":86},"\u002Fdocs\u002Frecipes#entregas","Entregas",[73],"Cada zona é um recurso pooled com capacidade por janela de 2 horas. A zona é escolhida pelo CEP, e uma regra de corte fecha as janelas do mesmo dia ao meio-dia. {\n  \"name\": \"Entrega\",\n  \"window_mode\": true,\n  \"duration_min\": 120,\n  \"cutoff_rule\": { \"same_day_until\": \"12:00\" },\n  \"intake_form\": { \"type\": \"object\", \"required\": [\"address\", \"cep\"] },\n  \"requirements\": [{ \"resource_group_id\": \"grp_zones\", \"units\": 1, \"select_by\": \"cep\" }]\n} html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":461,"title":39,"badge":462,"body":463,"description":680,"extension":681,"meta":682,"navigation":683,"path":40,"rawbody":684,"seo":685,"stem":41,"__hash__":686},"docs_pt\u002Fdocs\u002F4.concepts\u002F4.automations.md",null,{"type":464,"value":465,"toc":671},"minimark",[466,483,487,581,583,585,588,590,593,628,631],[467,468,469,470,474,475,478,479,482],"p",{},"Automações são regras com um ",[471,472,473],"strong",{},"gatilho",", ",[471,476,477],{},"condições"," opcionais e uma ",[471,480,481],{},"ação",". Cada modelo de negócio já vem com padrões que você pode editar.",[484,485,251],"h2",{"id":486},"gatilhos",[488,489,490,503],"table",{},[491,492,493],"thead",{},[494,495,496,500],"tr",{},[497,498,499],"th",{},"Gatilho",[497,501,502],{},"Exemplo",[504,505,506,518,528,538,551,561,571],"tbody",{},[494,507,508,515],{},[509,510,511],"td",{},[512,513,514],"code",{},"booking.confirmed",[509,516,517],{},"Enviar o resumo do agendamento",[494,519,520,525],{},[509,521,522],{},[512,523,524],{},"booking.starts_in(Δ)",[509,526,527],{},"24 h antes: pedir confirmação SIM\u002FNÃO",[494,529,530,535],{},[509,531,532],{},[512,533,534],{},"booking.ended(+Δ)",[509,536,537],{},"1 h depois: sugerir conferir presença",[494,539,540,548],{},[509,541,542,474,545],{},[512,543,544],{},"booking.cancelled",[512,546,547],{},"booking.rescheduled",[509,549,550],{},"Avisar a equipe",[494,552,553,558],{},[509,554,555],{},[512,556,557],{},"hold.expired",[509,559,560],{},"Retomar contato com o cliente",[494,562,563,568],{},[509,564,565],{},[512,566,567],{},"payment.paid",[509,569,570],{},"Confirmar e agradecer",[494,572,573,578],{},[509,574,575],{},[512,576,577],{},"daily_at(hh:mm)",[509,579,580],{},"Enviar a agenda do dia para a equipe",[484,582,256],{"id":477},[467,584,258],{},[484,586,261],{"id":587},"ações",[467,589,263],{},[484,591,266],{"id":592},"padrões-por-negócio",[488,594,595,604],{},[491,596,597],{},[494,598,599,602],{},[497,600,601],{},"Modelo",[497,603,39],{},[504,605,606,614,621],{},[494,607,608,611],{},[509,609,610],{},"Barbearia, estética, clínica",[509,612,613],{},"Lembrete 24 h antes com SIM\u002FNÃO · aviso ao profissional 2 h antes · conferir presença 1 h depois · agenda do dia às 7:30",[494,615,616,618],{},[509,617,452],{},[509,619,620],{},"Lembrete no dia anterior · confirmação obrigatória para grupos acima de 6 · agenda do dia",[494,622,623,625],{},[509,624,457],{},[509,626,627],{},"\"A caminho\" 1 h antes · confirmação de recebimento",[484,629,271],{"id":630},"garantias-de-execução",[632,633,634,642,645,648,654],"ul",{},[635,636,637,638,641],"li",{},"Os jobs são criados ",[471,639,640],{},"na mesma transação"," do evento do agendamento, então nunca se perdem.",[635,643,644],{},"Antes de rodar, o job confere o agendamento de novo. Se foi reagendado ou cancelado, o job antigo é descartado.",[635,646,647],{},"Cada job roda uma vez (chave de idempotência) e tenta de novo com espera crescente; depois de 5 falhas aparece no painel.",[635,649,650,653],{},[471,651,652],{},"Horário de silêncio:"," nada é enviado a clientes entre 21:00 e 08:00 no fuso deles.",[635,655,656,657,474,660,474,663,666,667,670],{},"Respostas SIM\u002FNÃO são interpretadas sem IA (",[512,658,659],{},"sim",[512,661,662],{},"sí",[512,664,665],{},"ok",", 👍, ",[512,668,669],{},"não","…), instantâneo e sem custo.",{"title":672,"searchDepth":86,"depth":673,"links":674},"",3,[675,676,677,678,679],{"id":486,"depth":86,"text":251},{"id":477,"depth":86,"text":256},{"id":587,"depth":86,"text":261},{"id":592,"depth":86,"text":266},{"id":630,"depth":86,"text":271},"Lembretes, confirmações e avisos como regras \"quando acontecer isto, faça aquilo\".","md",{},true,"---\ntitle: Automações\ndescription: Lembretes, confirmações e avisos como regras \"quando acontecer isto, faça aquilo\".\n---\n\nAutomações são regras com um **gatilho**, **condições** opcionais e uma **ação**. Cada modelo de negócio já vem com padrões que você pode editar.\n\n## Gatilhos\n\n| Gatilho | Exemplo |\n| --- | --- |\n| `booking.confirmed` | Enviar o resumo do agendamento |\n| `booking.starts_in(Δ)` | 24 h antes: pedir confirmação SIM\u002FNÃO |\n| `booking.ended(+Δ)` | 1 h depois: sugerir conferir presença |\n| `booking.cancelled`, `booking.rescheduled` | Avisar a equipe |\n| `hold.expired` | Retomar contato com o cliente |\n| `payment.paid` | Confirmar e agradecer |\n| `daily_at(hh:mm)` | Enviar a agenda do dia para a equipe |\n\n## Condições\n\nServiço, recurso, tamanho do grupo acima de N, canal, etiqueta do cliente, quantidade de faltas anteriores.\n\n## Ações\n\nEnviar mensagem ou modelo ao cliente, avisar a equipe, pedir confirmação SIM\u002FNÃO, mudar o status do agendamento, criar tarefa interna, chamar um webhook.\n\n## Padrões por negócio\n\n| Modelo | Automações |\n| --- | --- |\n| Barbearia, estética, clínica | Lembrete 24 h antes com SIM\u002FNÃO · aviso ao profissional 2 h antes · conferir presença 1 h depois · agenda do dia às 7:30 |\n| Restaurante | Lembrete no dia anterior · confirmação obrigatória para grupos acima de 6 · agenda do dia |\n| Entregas | \"A caminho\" 1 h antes · confirmação de recebimento |\n\n## Garantias de execução\n\n- Os jobs são criados **na mesma transação** do evento do agendamento, então nunca se perdem.\n- Antes de rodar, o job confere o agendamento de novo. Se foi reagendado ou cancelado, o job antigo é descartado.\n- Cada job roda uma vez (chave de idempotência) e tenta de novo com espera crescente; depois de 5 falhas aparece no painel.\n- **Horário de silêncio:** nada é enviado a clientes entre 21:00 e 08:00 no fuso deles.\n- Respostas SIM\u002FNÃO são interpretadas sem IA (`sim`, `sí`, `ok`, 👍, `não`…), instantâneo e sem custo.\n",{"title":39,"description":680},"Pp6NE29GH7zoa2Iw_2EWgbXqCWqemjDpArREXajMZig",[688,689],{"title":35,"path":36,"stem":37,"description":220,"children":-1},{"title":44,"path":45,"stem":46,"description":276,"children":-1},1790796586261]