> ## Documentation Index
> Fetch the complete documentation index at: https://docs.machine.global/llms.txt
> Use this file to discover all available pages before exploring further.

# Entregas

> Histórico de alterações e novidades da API de Entregas v2

export const Entry = ({date, label, labelColor = "#16A34A", children}) => <div style={{
  display: "flex",
  gap: "32px",
  marginBottom: "56px",
  position: "relative"
}}>
    <div style={{
  display: "flex",
  flexDirection: "column",
  alignItems: "center",
  minWidth: "140px",
  paddingTop: "4px"
}}>
      <div style={{
  fontSize: "13px",
  fontWeight: "600",
  color: "var(--tw-prose-body)",
  opacity: 0.55,
  whiteSpace: "nowrap",
  letterSpacing: "0.02em"
}}>{date}</div>
      {label && <div style={{
  marginTop: "8px",
  padding: "3px 10px",
  borderRadius: "20px",
  background: `${labelColor}22`,
  border: `1px solid ${labelColor}55`,
  color: labelColor,
  fontSize: "11px",
  fontWeight: "700",
  letterSpacing: "0.06em",
  textTransform: "uppercase"
}}>{label}</div>}
    </div>

    <div style={{
  width: "2px",
  background: "rgba(22, 163, 74, 0.15)",
  borderRadius: "2px",
  flexShrink: 0,
  position: "relative"
}}>
      <div style={{
  position: "absolute",
  top: "6px",
  left: "50%",
  transform: "translateX(-50%)",
  width: "10px",
  height: "10px",
  borderRadius: "50%",
  background: "#16A34A",
  border: "2px solid var(--tw-prose-bg, #fff)",
  boxShadow: "0 0 0 2px #16A34A44"
}} />
    </div>

    <div style={{
  flex: 1,
  paddingBottom: "8px"
}}>
      {children}
    </div>
  </div>;

export const ChangeSection = ({type, children}) => {
  const config = {
    added: {
      label: "Adicionado",
      bg: "#16A34A14",
      border: "#16A34A44",
      dot: "#16A34A"
    },
    changed: {
      label: "Alterado",
      bg: "#f59e0b14",
      border: "#f59e0b44",
      dot: "#f59e0b"
    },
    fixed: {
      label: "Corrigido",
      bg: "#3b82f614",
      border: "#3b82f644",
      dot: "#3b82f6"
    },
    removed: {
      label: "Removido",
      bg: "#ef444414",
      border: "#ef444444",
      dot: "#ef4444"
    }
  };
  const c = config[type] ?? config.added;
  return <div style={{
    marginBottom: "16px",
    padding: "16px 20px",
    borderRadius: "12px",
    background: c.bg,
    border: `1px solid ${c.border}`
  }}>
      <div style={{
    display: "flex",
    alignItems: "center",
    gap: "8px",
    marginBottom: "10px"
  }}>
        <div style={{
    width: "8px",
    height: "8px",
    borderRadius: "50%",
    background: c.dot,
    flexShrink: 0
  }} />
        <span style={{
    fontSize: "12px",
    fontWeight: "700",
    letterSpacing: "0.07em",
    textTransform: "uppercase",
    color: c.dot
  }}>{c.label}</span>
      </div>
      <div style={{
    fontSize: "14px",
    lineHeight: "1.65"
  }}>
        {children}
      </div>
    </div>;
};

export const ParamBadge = ({name}) => <code style={{
  background: "rgba(22, 163, 74, 0.12)",
  border: "1px solid rgba(22, 163, 74, 0.25)",
  color: "#16A34A",
  borderRadius: "6px",
  padding: "1px 6px",
  fontSize: "13px",
  fontWeight: "600"
}}>{name}</code>;

export const EndpointBadge = ({method, path, href}) => <a href={href} style={{
  display: "inline-flex",
  alignItems: "center",
  gap: "8px",
  background: "rgba(255,255,255,0.04)",
  border: "1px solid rgba(255,255,255,0.1)",
  borderRadius: "8px",
  padding: "6px 12px",
  marginBottom: "16px",
  fontFamily: "monospace",
  fontSize: "13px",
  textDecoration: "none",
  cursor: href ? "pointer" : "default",
  transition: "border-color 0.15s, background 0.15s"
}} onMouseEnter={e => {
  if (href) {
    e.currentTarget.style.borderColor = "rgba(22,163,74,0.5)";
    e.currentTarget.style.background = "rgba(22,163,74,0.06)";
  }
}} onMouseLeave={e => {
  e.currentTarget.style.borderColor = "rgba(255,255,255,0.1)";
  e.currentTarget.style.background = "rgba(255,255,255,0.04)";
}}>
    <span style={{
  background: method === "GET" ? "#3b82f6" : method === "POST" ? "#16A34A" : method === "DELETE" ? "#ef4444" : method === "PUT" ? "#f59e0b" : method === "PATCH" ? "#8b5cf6" : "#6b7280",
  color: "#fff",
  borderRadius: "4px",
  padding: "1px 7px",
  fontWeight: "700",
  fontSize: "11px",
  letterSpacing: "0.05em"
}}>{method}</span>
    <span style={{
  opacity: 0.8
}}>{path}</span>
  </a>;

<div style={{ maxWidth: "860px", margin: "0 auto", padding: "40px 20px 80px" }}>
  <div style={{ marginBottom: "56px" }}>
    <div style={{ fontSize: "40px", fontWeight: "800", marginBottom: "12px", letterSpacing: "-0.02em" }}>Entregas</div>

    <p style={{ fontSize: "17px", opacity: 0.65, lineHeight: "1.6" }}>
      Acompanhe todas as novidades, melhorias e alterações nos endpoints de Entregas da API v2.
    </p>
  </div>

  <Entry date="13 ago 2026" label="Melhoria" labelColor="#16A34A">
    <h2 id="detalhes-entregas-programadas" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Detalhes da solicitação e das entregas na consulta de programadas
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      A consulta de entregas programadas passa a devolver categoria, valor, observação, endereço de
      coleta e a lista completa de paradas com os dados de cada pedido — antes era necessário
      consultar outro endpoint para saber qualquer um desses dados.
    </p>

    <EndpointBadge method="GET" path="/api/v2/integracao/entregas/programadas" href="/pages/v2/entregas/endpoint/get-programadas" />

    <div style={{ marginTop: "24px" }}>
      <EndpointBadge method="GET" path="/api/v2/integracao/entregas/programadas/{id}" href="/pages/v2/entregas/endpoint/get-programadas-by-id" />
    </div>

    <ChangeSection type="added">
      <p style={{ marginBottom: "10px" }}>Campos novos na resposta dos dois endpoints:</p>

      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li><ParamBadge name="categoria" /> — <code>id</code> e <code>nome</code> da categoria da solicitação.</li>
        <li><ParamBadge name="valor" /> — <code>estimado</code> (estimativa no momento da criação) e <code>prefixado</code> (valor fechado, quando houver).</li>
        <li><ParamBadge name="observacao" /> — observação da solicitação.</li>
        <li><ParamBadge name="coleta" /> — endereço de coleta completo: <code>endereco</code>, <code>complemento</code>, <code>referencia</code>, <code>bairro</code>, <code>cidade</code>, <code>estado</code>, <code>lat</code> e <code>lng</code>.</li>
        <li><ParamBadge name="paradas" /> — lista de paradas na ordem da entrega, cada uma com <code>id</code>, <code>ordem</code>, endereço completo, <code>numero\_pedido</code>, <code>nome\_cliente</code>, <code>telefone\_cliente</code> e <code>observacao</code>.</li>
      </ul>
    </ChangeSection>

    <ChangeSection type="changed">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li>A consulta por id passa a devolver <ParamBadge name="id_mch_programada" />, que antes só aparecia na listagem.</li>
      </ul>
    </ChangeSection>

    <div
      style={{
  marginTop: "20px",
  padding: "14px 18px",
  borderRadius: "10px",
  background: "rgba(59, 130, 246, 0.08)",
  border: "1px solid rgba(59, 130, 246, 0.2)",
  fontSize: "13px",
  lineHeight: "1.6",
}}
    >
      <strong>Nota:</strong> os campos são apenas adicionados — nenhum campo existente mudou de nome, tipo ou posição. O destino de cada entrega fica na respectiva parada, por isso a resposta não traz um endereço de destino da solicitação.
    </div>
  </Entry>

  <Entry date="10 ago 2026" label="Novo" labelColor="#3b82f6">
    <h2 id="limite-webhooks-por-tipo" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Aumento do limite de webhooks por tipo
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      Limite de cadastro de webhooks atualizado: até 5 webhooks por tipo. O webhook do tipo mensagem é limitado a 1 cadastro.
    </p>

    <EndpointBadge method="POST" path="/api/v2/integracao/webhooks" href="/pages/v2/entregas/webhooks/endpoint/post" />

    <ChangeSection type="added">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "6px" }}>
        <li>Aumentou o limite de webhooks cadastrados para até 5 webhooks por tipo.</li>
        <li>O webhook do tipo mensagem é limitado a 1 cadastro.</li>
      </ul>
    </ChangeSection>
  </Entry>

  <Entry date="16 jul 2026" label="Novo" labelColor="#3b82f6">
    <h2 id="consultar-status-webhook" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Consulta de status de entrega do webhook
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      Novo endpoint para verificar se um webhook está entregando eventos normalmente ou se foi
      bloqueado por falhas de entrega, com detalhes do bloqueio e da próxima tentativa de reenvio.
    </p>

    <EndpointBadge method="GET" path="/api/v2/integracao/webhooks/{id}/status" href="/pages/v2/entregas/webhooks/endpoint/get-status" />

    <ChangeSection type="added">
      <p style={{ marginBottom: "10px" }}>Campos retornados na consulta:</p>

      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li><ParamBadge name="situacao" /> — <code>ativo</code>, <code>bloqueado\_temporariamente</code> (falhas consecutivas de entrega) ou <code>bloqueado\_definitivamente</code> (tentativas de reenvio esgotadas).</li>
        <li><ParamBadge name="bloqueio_temporario" /> — estado do bloqueio temporário: <code>ativo</code>, <code>falhas\_consecutivas</code>, <code>desde</code> e <code>proxima\_tentativa</code> (datas em ISO-8601, UTC).</li>
        <li><ParamBadge name="bloqueio_definitivo" /> — estado do bloqueio definitivo: <code>ativo</code> e <code>desde</code>.</li>
      </ul>
    </ChangeSection>

    <div
      style={{
  marginTop: "20px",
  padding: "14px 18px",
  borderRadius: "10px",
  background: "rgba(59, 130, 246, 0.08)",
  border: "1px solid rgba(59, 130, 246, 0.2)",
  fontSize: "13px",
  lineHeight: "1.6",
}}
    >
      <strong>Nota:</strong> durante um bloqueio temporário as entregas ficam suspensas até <code>proxima\_tentativa</code>. No bloqueio definitivo os eventos deixam de ser entregues ao webhook.
    </div>
  </Entry>

  <Entry date="14 jul 2026" label="Novo" labelColor="#3b82f6">
    <h2 id="foto-condutor" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Foto do condutor na consulta por ID
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      O endpoint de consulta de condutor por ID agora retorna a foto de rosto cadastrada,
      permitindo exibi-la na interface do integrador.
    </p>

    <EndpointBadge method="GET" path="/api/v2/integracao/condutores/{id}" href="/pages/v2/entregas/condutores/endpoint/get-by-id" />

    <ChangeSection type="added">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li><ParamBadge name="foto_url" /> — link temporário (presigned, expira em 30 minutos) da foto de rosto do condutor. <code>null</code> quando não há foto cadastrada.</li>
      </ul>
    </ChangeSection>
  </Entry>

  <Entry date="30 jun 2026" label="Novo" labelColor="#3b82f6">
    <h2 id="editar-entrega" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Editar paradas de uma entrega em andamento ou programada
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      Dois novos endpoints permitem substituir a lista de paradas de uma entrega já criada,
      tanto para solicitações ativas quanto para programadas ainda não disparadas.
    </p>

    <EndpointBadge method="PUT" path="/api/v2/integracao/entregas/{id}" href="/pages/v2/entregas/endpoint/put-by-id" />

    <ChangeSection type="added">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li><ParamBadge name="paradas" /> — lista completa das paradas desejadas (substituição total). A ordem define a sequência de entrega. Obrigatório.</li>
        <li><ParamBadge name="com_retorno" /> — define se a entrega tem retorno ao ponto de partida. Se omitido, preserva o valor atual.</li>
      </ul>
    </ChangeSection>

    <div style={{ marginTop: "24px" }}>
      <EndpointBadge method="PUT" path="/api/v2/integracao/entregas/programadas/{id}" href="/pages/v2/entregas/endpoint/put-programadas-by-id" />

      <ChangeSection type="added">
        <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
          <li><ParamBadge name="paradas" /> — lista completa das paradas desejadas (substituição total). Obrigatório.</li>
          <li><ParamBadge name="data" /> — data do disparo no formato <code>DD/MM/AAAA</code>. Obrigatório.</li>
          <li><ParamBadge name="hora" /> — hora do disparo no formato <code>HH:MM</code>. Obrigatório.</li>
          <li><ParamBadge name="forma_pagamento" /> — forma de pagamento da entrega. Obrigatório.</li>
        </ul>
      </ChangeSection>
    </div>

    <div
      style={{
  marginTop: "20px",
  padding: "14px 18px",
  borderRadius: "10px",
  background: "rgba(59, 130, 246, 0.08)",
  border: "1px solid rgba(59, 130, 246, 0.2)",
  fontSize: "13px",
  lineHeight: "1.6",
}}
    >
      <strong>Substituição total:</strong> ambos os endpoints substituem toda a lista de paradas — não é um patch parcial. Inclua todas as paradas desejadas na requisição, inclusive as que devem ser mantidas.
    </div>
  </Entry>

  <Entry date="30 jun 2026" label="Novo" labelColor="#3b82f6">
    <h2 id="excluir-entrega" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Excluir entrega de uma solicitação
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      Novos endpoints permitem remover uma entrega individual de solicitações ativas e programadas
      sem cancelar toda a solicitação.
    </p>

    <EndpointBadge method="DELETE" path="/api/v2/integracao/entregas/{id}/paradas/{parada_id}" href="/pages/v2/entregas/endpoint/delete-entrega-by-id" />

    <ChangeSection type="added">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li>Remove uma entrega de solicitação ativa pelo ID da solicitação e da entrega.</li>
      </ul>
    </ChangeSection>

    <div style={{ marginTop: "24px" }}>
      <EndpointBadge method="DELETE" path="/api/v2/integracao/entregas/programadas/{id}/paradas/{parada_id}" href="/pages/v2/entregas/endpoint/delete-entrega-programada-by-id" />

      <ChangeSection type="added">
        <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
          <li>Remove uma entrega de solicitação programada pelo ID da solicitação e da entrega.</li>
        </ul>
      </ChangeSection>
    </div>
  </Entry>

  <Entry date="25 jun 2026" label="Novo" labelColor="#3b82f6">
    <h2 id="crud-consumidores" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      CRUD de Consumidores e Endereços
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      Quatro endpoints para gerenciar consumidores da empresa e quatro para gerenciar seus endereços salvos,
      permitindo criar, consultar, editar e excluir diretamente pela API.
    </p>

    <EndpointBadge method="GET" path="/api/v2/integracao/consumidores" href="/pages/v2/entregas/consumidores/endpoint/get" />

    <EndpointBadge method="POST" path="/api/v2/integracao/consumidores" href="/pages/v2/entregas/consumidores/endpoint/post" />

    <EndpointBadge method="GET" path="/api/v2/integracao/consumidores/{id}" href="/pages/v2/entregas/consumidores/endpoint/get-by-id" />

    <EndpointBadge method="PATCH" path="/api/v2/integracao/consumidores/{id}" href="/pages/v2/entregas/consumidores/endpoint/patch-by-id" />

    <ChangeSection type="added">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li>Listagem paginada de consumidores da empresa (<ParamBadge name="limite" /> e <ParamBadge name="pagina" />).</li>
        <li>Criação de consumidor com <ParamBadge name="telefone" /> em formato E.164 (ex: <code>+5544999999999</code>).</li>
        <li>Consulta individual retorna o consumidor com seus endereços.</li>
        <li>Edição do nome do consumidor via PATCH.</li>
      </ul>
    </ChangeSection>

    <div style={{ marginTop: "24px" }}>
      <EndpointBadge method="GET" path="/api/v2/integracao/consumidores/{id}/enderecos" href="/pages/v2/entregas/consumidores/endpoint/enderecos-get" />

      <EndpointBadge method="POST" path="/api/v2/integracao/consumidores/{id}/enderecos" href="/pages/v2/entregas/consumidores/endpoint/enderecos-post" />

      <EndpointBadge method="PATCH" path="/api/v2/integracao/consumidores/{id}/enderecos/{enderecoId}" href="/pages/v2/entregas/consumidores/endpoint/enderecos-patch" />

      <EndpointBadge method="DELETE" path="/api/v2/integracao/consumidores/{id}/enderecos/{enderecoId}" href="/pages/v2/entregas/consumidores/endpoint/enderecos-delete" />

      <ChangeSection type="added">
        <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
          <li>Listagem dos endereços salvos de um consumidor.</li>
          <li>Criação de endereço com deduplicação automática por <ParamBadge name="place_id" /> (Google Places).</li>
          <li>Edição parcial de endereço via PATCH (apenas os campos enviados são alterados).</li>
          <li>Exclusão de endereço.</li>
        </ul>
      </ChangeSection>
    </div>
  </Entry>

  <Entry date="25 jun 2026" label="Melhoria" labelColor="#16A34A">
    <h2 id="filtros-busca-clientes-condutores" style={{ fontSize: "22px", fontWeight: "700", marginBottom: "6px", marginTop: 0 }}>
      Novos filtros de busca em Clientes e Condutores
    </h2>

    <p style={{ fontSize: "15px", opacity: 0.7, marginBottom: "20px", lineHeight: "1.6" }}>
      Os endpoints de listagem foram expandidos com filtros de busca direta por CPF, e-mail,
      telefone e nome, eliminando a necessidade de conhecer o ID do registro para localizá-lo.
    </p>

    <EndpointBadge method="GET" path="/api/v2/integracao/clientes" href="/pages/v2/referencia/clientes/endpoint/get" />

    <ChangeSection type="added">
      <p style={{ marginBottom: "10px" }}>Novos parâmetros de query disponíveis:</p>

      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
        <li><ParamBadge name="cpf" /> — correspondência exata, com ou sem máscara (ex: <code>064.181.699-56</code> ou <code>06418169956</code>). Ignora <code>status\_cliente</code> e paginação.</li>
        <li><ParamBadge name="email" /> — correspondência exata. Ignora <code>status\_cliente</code> e paginação.</li>
        <li><ParamBadge name="telefone" /> — aceita com ou sem DDI e prefixo <code>+</code>; DDI inferido pelo país da bandeira, fallback Brasil (<code>55</code>). Ignora <code>status\_cliente</code> e paginação.</li>
        <li><ParamBadge name="nome" /> — busca parcial, mínimo 3 caracteres. Ignora <code>status\_cliente</code>, mas mantém paginação.</li>
      </ul>
    </ChangeSection>

    <ChangeSection type="changed">
      <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "6px" }}>
        <li><ParamBadge name="status_cliente" />, <ParamBadge name="limite" /> e <ParamBadge name="pagina" /> agora documentam explicitamente quando são ignorados na presença de filtros diretos.</li>
      </ul>
    </ChangeSection>

    <div style={{ marginTop: "24px" }}>
      <EndpointBadge method="GET" path="/api/v2/integracao/condutores" href="/pages/v2/referencia/condutores/endpoint/get" />

      <ChangeSection type="added">
        <p style={{ marginBottom: "10px" }}>Novos parâmetros de query disponíveis:</p>

        <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "8px" }}>
          <li><ParamBadge name="email" /> — correspondência exata. Ignora <code>status\_condutor</code> e paginação.</li>
          <li><ParamBadge name="nome" /> — busca parcial, mínimo 3 caracteres. Ignora <code>status\_condutor</code>, mas mantém paginação.</li>
        </ul>
      </ChangeSection>

      <ChangeSection type="changed">
        <ul style={{ margin: 0, paddingLeft: "20px", display: "flex", flexDirection: "column", gap: "6px" }}>
          <li><ParamBadge name="cpf" /> passou a aceitar apenas correspondência exata com ou sem máscara (busca parcial por inteiro removida). Ignora <code>status\_condutor</code> e paginação.</li>
          <li><ParamBadge name="telefone" /> expandido: agora documenta comportamento de DDI e prefixo <code>+</code>, alinhado ao endpoint de clientes.</li>
          <li><ParamBadge name="status_condutor" />, <ParamBadge name="limite" /> e <ParamBadge name="pagina" /> agora documentam explicitamente quando são ignorados.</li>
        </ul>
      </ChangeSection>
    </div>

    <div
      style={{
  marginTop: "20px",
  padding: "14px 18px",
  borderRadius: "10px",
  background: "rgba(59, 130, 246, 0.08)",
  border: "1px solid rgba(59, 130, 246, 0.2)",
  fontSize: "13px",
  lineHeight: "1.6",
}}
    >
      <strong>Nota sobre prioridade de filtros:</strong> filtros diretos (<code>id</code>, <code>cpf</code>, <code>email</code> ou <code>telefone</code>) suprimem status e paginação automaticamente. O filtro <code>nome</code> mantém a paginação, mas ignora o status.
    </div>
  </Entry>
</div>
