{"info":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","description":"<html><head></head><body><h1 id=\"integracao-para-parceiros\">Integração para parceiros</h1>\n<p>Esta collection documenta a integração de parceiros com a API pública da Hubii. O fluxo foi desenhado para ERPs, PDVs e WMS que precisam aceitar pedidos, importar dados para operação, faturar, acompanhar eventos logísticos e tratar cancelamentos.</p>\n<p>A integração usa <strong>dois pollings independentes</strong>, executados em paralelo. Eles não são alternativas entre si: cada um cobre uma etapa diferente do ciclo do pedido.</p>\n<hr>\n<h2 id=\"visão-rápida-dos-pollings\">Visão rápida dos pollings</h2>\n<h3 id=\"polling-1--aceite-de-pedidos\">Polling 1 — Aceite de pedidos</h3>\n<p>Usado para decidir se o hub aceita ou recusa uma <strong>oferta de pedido</strong>.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Ponto</th>\n<th>Regra</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Quando usar</td>\n<td>Sempre que o hub precisa responder pedidos novos</td>\n</tr>\n<tr>\n<td>Rotas</td>\n<td><code>GET /hubs/{hub_uuid}/orders/to-answer</code> → <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code> → <code>POST .../answer</code></td>\n</tr>\n<tr>\n<td>O que retorna</td>\n<td>Ofertas pendentes, ainda não aceitas</td>\n</tr>\n<tr>\n<td>Decisão</td>\n<td>Para cada oferta, consulte o pedido completo antes de aceitar ou recusar</td>\n</tr>\n<tr>\n<td>Prazo</td>\n<td>Cada oferta expira em <code>available_until_at</code>; depois disso, some da fila</td>\n</tr>\n<tr>\n<td>Aceite via painel</td>\n<td>Também é válido e dispara o Polling 2</td>\n</tr>\n<tr>\n<td>Recusa / expiração</td>\n<td>Remove a oferta de <code>to-answer</code> e não gera notificação para aquele hub</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>A listagem de <code>to-answer</code> deve ser tratada como fila de ofertas. A decisão normalmente depende do pedido completo, principalmente dos itens, quantidades, preços e disponibilidade do hub. </p>\n</blockquote>\n<h3 id=\"polling-2--notificações-de-pedidos-aceitos\">Polling 2 — Notificações de pedidos aceitos</h3>\n<p>Usado para acompanhar pedidos <strong>após o aceite</strong>: importação no ERP, entrega, NF-e, etiqueta e cancelamentos.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Ponto</th>\n<th>Regra</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Quando usar</td>\n<td>Depois do aceite via API ou painel, em paralelo ao Polling 1</td>\n</tr>\n<tr>\n<td>Rotas</td>\n<td><code>GET /v2/notifications</code> → processar → <code>POST /notifications/ack</code></td>\n</tr>\n<tr>\n<td>O que retorna</td>\n<td>Eventos de pedidos aceitos, como <code>ORDER_CREATED</code>, entrega e etiqueta</td>\n</tr>\n<tr>\n<td><code>ORDER_CREATED</code></td>\n<td>Só chega após o aceite; é o gatilho para importar o pedido no ERP</td>\n</tr>\n<tr>\n<td>ACK</td>\n<td>Obrigatório após processar; eventos reaparecem até ACK e expiram em 2 dias</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p><strong>Resumo:</strong> Polling 1 decide se o hub aceita a oferta. Polling 2 opera o pedido depois que ele foi aceito. Execute os dois a cada <strong>30–60 segundos</strong>. </p>\n</blockquote>\n<hr>\n<h2 id=\"implementação-mínima\">Implementação mínima</h2>\n<p>Para uma integração funcional, implemente este caminho primeiro:</p>\n<ol>\n<li><p>Configure <code>base_url</code> e envie o header <code>apikey</code> em todas as requisições.</p>\n</li>\n<li><p>Chame <code>GET /hubs</code> e salve o <code>uuid</code> de cada hub.</p>\n</li>\n<li><p>A cada 30–60 segundos, execute o <strong>Polling 1</strong>: <code>GET /hubs/{hub_uuid}/orders/to-answer</code>.</p>\n</li>\n<li><p>Para cada oferta retornada, consulte o pedido completo em <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code>.</p>\n</li>\n<li><p>Com base no pedido completo, principalmente nos itens, estoque e regras do hub, aceite ou recuse com <code>POST .../answer</code> antes de <code>available_until_at</code>.</p>\n</li>\n<li><p>Em paralelo, execute o <strong>Polling 2</strong>: <code>GET /v2/notifications</code>.</p>\n</li>\n<li><p>Ao receber <code>ORDER_CREATED</code>, busque ou reconcilie os detalhes do pedido e importe no ERP.</p>\n</li>\n<li><p>Após processar e persistir a notificação, envie <code>POST /notifications/ack</code> usando <code>notification_uuid</code>.</p>\n</li>\n<li><p>Quando aplicável, envie a NF-e com <code>POST .../invoice</code>.</p>\n</li>\n<li><p>Ao receber <code>SHIPPING_LABEL_AVAILABLE</code>, baixe a etiqueta com <code>GET .../label</code>.</p>\n</li>\n</ol>\n<p>Não use busy-loop. Em <code>429</code>, interrompa o ciclo atual, aplique backoff e tente novamente no próximo intervalo.</p>\n<hr>\n<h2 id=\"fluxo-operacional\">Fluxo operacional</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /hubs\n  ↓\n[Polling 1] GET .../to-answer\n  ↓ para cada order_uuid\nGET /hubs/{hub_uuid}/orders/{order_uuid}\n  ↓ decidir com base no pedido completo\nPOST .../answer\n  ↓ após aceite via API ou painel\n[Polling 2] GET /v2/notifications\n  ↓ ORDER_CREATED\nGET /hubs/{hub_uuid}/orders/{order_uuid}\n  ↓ após persistir no ERP\nPOST /notifications/ack\n  ↓ quando aplicável\nPOST .../invoice\n  ↓ SHIPPING_LABEL_AVAILABLE\nGET .../label\n\n</code></pre>\n<p><code>GET .../to-invoice</code> está <strong>descontinuado</strong> e existe apenas por compatibilidade. Para novas integrações, use <code>ORDER_CREATED</code> no Polling 2.</p>\n<hr>\n<h2 id=\"decisão-de-aceite-ou-recusa\">Decisão de aceite ou recusa</h2>\n<p>A Hubii recomenda este padrão para cada oferta retornada em <code>to-answer</code>:</p>\n<ol>\n<li><p>Ler <code>order_uuid</code> e <code>available_until_at</code> na listagem.</p>\n</li>\n<li><p>Buscar o pedido completo em <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code>.</p>\n</li>\n<li><p>Avaliar itens, quantidades, preços, disponibilidade, regras fiscais e operação do hub.</p>\n</li>\n<li><p>Responder com <code>POST .../answer</code> antes do prazo.</p>\n</li>\n</ol>\n<p>Essa etapa evita decisões baseadas apenas no resumo da fila e reduz recusa incorreta, aceite sem estoque ou divergência operacional.</p>\n<hr>\n<h2 id=\"envio-de-estoque\">Envio de estoque</h2>\n<blockquote>\n<p>Para informar à Hubii o estoque atual dos produtos de cada hub, use a seção <strong>06 — Envio de estoque</strong> desta collection: <code>POST /stocking/{hub_uuid}</code> faz upsert em lote (até 500 itens) usando <code>external_id</code> como chave por hub. </p>\n</blockquote>\n<hr>\n<h2 id=\"variáveis-da-collection\">Variáveis da collection</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variável</th>\n<th>Uso</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>base_url</code></td>\n<td><code>https://api.staging.hubii.co</code> em homologação ou <code>https://api.hubii.co</code> em produção</td>\n</tr>\n<tr>\n<td><code>apikey</code></td>\n<td>API Key Hubii enviada no header <code>apikey</code></td>\n</tr>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>UUID do hub retornado em <code>GET /hubs</code></td>\n</tr>\n<tr>\n<td><code>hub_uuid_2</code></td>\n<td>Opcional; segundo hub para exemplos de filtro com múltiplos hubs</td>\n</tr>\n<tr>\n<td><code>order_uuid</code></td>\n<td>UUID do pedido retornado em <code>to-answer</code> ou em uma notificação</td>\n</tr>\n<tr>\n<td><code>notification_uuid</code></td>\n<td>UUID da notificação retornada em <code>GET /v2/notifications</code>; usar no ACK</td>\n</tr>\n<tr>\n<td><code>test_order_uuid</code></td>\n<td>UUID do pedido de teste retornado em <code>POST /homologation/v1/test-orders</code> (staging)</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h2 id=\"autenticação\">Autenticação</h2>\n<p>Envie o header abaixo em todas as requisições:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">apikey: {sua_chave}\n\n</code></pre>\n<p>API Key ausente, inválida ou sem permissão deve ser tratada como erro de configuração, não como falha temporária.</p>\n<hr>\n<h2 id=\"rate-limits\">Rate limits</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Grupo</th>\n<th>Limite</th>\n<th>Rotas</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Listagem</td>\n<td>60/min por token</td>\n<td><code>/hubs</code>, <code>.../to-answer</code>, <code>.../to-invoice</code> legado</td>\n</tr>\n<tr>\n<td>Detalhe</td>\n<td>30/min por token</td>\n<td><code>.../orders/{order_uuid}</code></td>\n</tr>\n<tr>\n<td>Ação</td>\n<td>10/min por token</td>\n<td><code>.../answer</code>, <code>.../invoice</code>, <code>/notifications/ack</code>, <code>.../cancel-accepted</code></td>\n</tr>\n<tr>\n<td>Notificações</td>\n<td>5/min por token</td>\n<td><code>/v2/notifications</code></td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-\\\\\\\\\\\\*</code></strong> como referência operacional. A tabela acima documenta o limite esperado/contratual. </p>\n</blockquote>\n<p>Em <code>429</code>, não faça retry imediato em loop. Aguarde com backoff exponencial e retome o polling no próximo ciclo.</p>\n<hr>\n<h2 id=\"idempotência-e-retry-seguro\">Idempotência e retry seguro</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Operação</th>\n<th>Como tratar retry</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>GET /hubs</code></td>\n<td>Seguro repetir</td>\n</tr>\n<tr>\n<td><code>GET .../to-answer</code></td>\n<td>Seguro repetir; a lista reflete a fila atual</td>\n</tr>\n<tr>\n<td><code>GET .../orders/{order_uuid}</code></td>\n<td>Seguro repetir; use antes de decidir aceite/recusa e para reconciliar pedido aceito</td>\n</tr>\n<tr>\n<td><code>POST .../answer</code></td>\n<td>Não é retry cego; pode retornar <code>422</code> se o pedido já foi respondido</td>\n</tr>\n<tr>\n<td><code>GET /v2/notifications</code></td>\n<td>Seguro repetir; eventos reaparecem até ACK</td>\n</tr>\n<tr>\n<td><code>POST /notifications/ack</code></td>\n<td>Enviar só depois de persistir; se falhar, retentar o ACK, não o processamento</td>\n</tr>\n<tr>\n<td><code>POST .../invoice</code></td>\n<td>Reenvio do mesmo XML é idempotente</td>\n</tr>\n<tr>\n<td><code>POST .../cancel-accepted</code></td>\n<td>Ação sensível; evitar retry automático sem checar o estado do pedido</td>\n</tr>\n<tr>\n<td><code>POST /stocking/{hub_uuid}</code></td>\n<td>Seguro repetir; upsert idempotente por <code>external_id</code>. Reenvie apenas os itens em <code>failed</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Use <code>notification_uuid</code> como chave de idempotência dos eventos no ERP.</p>\n<hr>\n<h2 id=\"estratégia-recomendada-de-ack\">Estratégia recomendada de ACK</h2>\n<ol>\n<li><p>Buscar notificações.</p>\n</li>\n<li><p>Processar cada evento no ERP.</p>\n</li>\n<li><p>Persistir localmente usando <code>notification_uuid</code> como chave única.</p>\n</li>\n<li><p>Enviar ACK somente após sucesso da persistência.</p>\n</li>\n<li><p>Se o ACK falhar, retentar apenas o ACK. Não reprocessar o evento duplicado.</p>\n</li>\n</ol>\n<blockquote>\n<p>ACK cedo demais pode causar perda de evento no ERP. Sem ACK, a notificação reaparece por até 2 dias. </p>\n</blockquote>\n<hr>\n<h2 id=\"segurança-operacional\">Segurança operacional</h2>\n<ul>\n<li><p>Nunca exponha API Key em frontend, repositório, tickets públicos ou logs.</p>\n</li>\n<li><p>Não commite environments do Postman com secrets preenchidos.</p>\n</li>\n<li><p>Mascare credenciais em evidências de homologação.</p>\n</li>\n<li><p>Trate <code>401</code> como configuração incorreta e acione revisão de credenciais.</p>\n</li>\n</ul>\n<hr>\n<h2 id=\"homologação\">Homologação</h2>\n<blockquote>\n<p>Para criar pedidos de teste, listar o catálogo sandbox e gerar XML de NF-e fake em staging, use a seção <strong>07 — Homologação</strong> desta collection (rotas do <code>partner-homologation-service</code>, disponíveis somente em <code>https://api.staging.hubii.co</code>; não existem em produção). </p>\n</blockquote>\n<h3 id=\"obrigatório-para-todos-os-parceiros\">Obrigatório para todos os parceiros</h3>\n<ul>\n<li><p>Smoke test: <code>GET /hubs</code>, <code>401</code> com key inválida e <code>403</code>/<code>404</code> em hub sem permissão.</p>\n</li>\n<li><p>Polling 1: listar ofertas, consultar detalhe completo antes da decisão, aceitar pedido, recusar com motivos, tratar pedido já respondido e pedido expirado.</p>\n</li>\n<li><p>Polling 2: buscar notificações, processar <code>ORDER_CREATED</code>, fazer ACK e validar reprocessamento quando não há ACK.</p>\n</li>\n<li><p>Detalhes do pedido: importar dados completos e exibir <code>order.id</code> no ERP.</p>\n</li>\n<li><p>Operação: aplicar backoff em <code>429</code>, retry em <code>5xx</code>/timeout e proteger credenciais nos logs.</p>\n</li>\n</ul>\n<h3 id=\"obrigatório-quando-aplicável-ao-escopo\">Obrigatório quando aplicável ao escopo</h3>\n<ul>\n<li><p>Envio de NF-e XML com campo multipart <code>invoice_file</code>.</p>\n</li>\n<li><p>Tratamento de formatos diferentes de NF-e.</p>\n</li>\n<li><p>Download de etiqueta após <code>SHIPPING_LABEL_AVAILABLE</code>.</p>\n</li>\n<li><p>Consulta de <code>pickup_code</code> após <code>ORDER_DELIVERY_PICKING_UP</code>.</p>\n</li>\n<li><p>Cancelamento pós-aceite antes da coleta.</p>\n</li>\n</ul>\n<h3 id=\"evidências-aceitas\">Evidências aceitas</h3>\n<ul>\n<li><p>Logs com credenciais mascaradas.</p>\n</li>\n<li><p>Gravação de tela do fluxo em staging.</p>\n</li>\n</ul>\n<hr>\n<h2 id=\"boas-práticas\">Boas práticas</h2>\n<ul>\n<li><p>Consulte o detalhe completo de cada oferta antes de aceitar ou recusar.</p>\n</li>\n<li><p>Exiba <code>order.id</code> no ERP; é o identificador usado no painel Hubii e no suporte.</p>\n</li>\n<li><p>Armazene <code>notification_uuid</code> para evitar duplicidade de processamento.</p>\n</li>\n<li><p>Execute Polling 1 e Polling 2 com o mesmo intervalo recomendado: 30–60 segundos.</p>\n</li>\n<li><p>Cancelamentos Hubii/cliente podem chegar até 1 dia após o evento real.</p>\n</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Integração para parceiros","slug":"integracao-para-parceiros"}],"owner":"34374925","collectionId":"7e207411-7624-4909-8d24-35ec0605eb45","publishedId":"2sBXwvJoRJ","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"6348e5"},"publishDate":"2026-06-19T21:15:22.000Z"},"item":[{"name":"01 — Setup","item":[{"name":"Listagem de Hubs","id":"77a24f11-72c3-4936-b98f-54224cf8d1c8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/hubs","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Lista os hubs vinculados à API Key. Este é o primeiro passo da integração: use <code>data[].uuid</code> como <code>hub_uuid</code> nas demais rotas.</p>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<ul>\n<li><p>Na configuração inicial do ERP, para mapear lojas/hubs.</p>\n</li>\n<li><p>Periodicamente, por exemplo 1 vez ao dia, se novos hubs puderem ser vinculados.</p>\n</li>\n<li><p>Antes de iniciar os dois pollings.</p>\n</li>\n</ul>\n<h2 id=\"posição-no-fluxo\">Posição no fluxo</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /hubs\n  ↓ guardar hub_uuid\n[Polling 1] GET .../to-answer → POST .../answer\n[Polling 2] GET /v2/notifications → processar → ACK\n\n</code></pre>\n<h2 id=\"query-params-opcionais\">Query params opcionais</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>search</code></td>\n<td>string</td>\n<td>Filtra por nome do hub</td>\n</tr>\n<tr>\n<td><code>order_by</code></td>\n<td>string</td>\n<td>Campo de ordenação; padrão: <code>name</code></td>\n</tr>\n<tr>\n<td><code>order_direction</code></td>\n<td><code>asc</code> ou <code>desc</code></td>\n<td>Direção da ordenação</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>int</td>\n<td>Itens por página; padrão: 10</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>int</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>load</code></td>\n<td>string</td>\n<td>Relacionamentos extras, por exemplo <code>address</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-relevantes\">Campos relevantes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Uso</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data[].uuid</code></td>\n<td><code>hub_uuid</code> usado nas URLs</td>\n</tr>\n<tr>\n<td><code>data[].name</code></td>\n<td>Nome fantasia</td>\n</tr>\n<tr>\n<td><code>data[].trading_name</code></td>\n<td>Razão social</td>\n</tr>\n<tr>\n<td><code>data[].document</code></td>\n<td>CNPJ</td>\n</tr>\n<tr>\n<td><code>data[].address</code></td>\n<td>Endereço do hub, quando carregado</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/hubs\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir a qualquer momento.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-\\*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual. </p>\n</blockquote>\n<h2 id=\"próximo-passo\">Próximo passo</h2>\n<p>Com os hubs mapeados, inicie os dois pollings em paralelo:</p>\n<ol>\n<li><p>Polling 1: <code>GET /hubs/{hub_uuid}/orders/to-answer</code>.</p>\n</li>\n<li><p>Polling 2: <code>GET /v2/notifications?hub_uuids={hub_uuid}</code>.</p>\n</li>\n</ol>\n","urlObject":{"path":["hubs"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[]}},"response":[{"id":"a87a5409-4c95-434e-bf8e-4f98a29ab09e","name":"[200] Listagem de Hubs","originalRequest":{"method":"GET","header":[],"url":"https://api.staging.hubii.co/hubs"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"58"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"9"},{"key":"RateLimit-Limit","value":"10"},{"key":"RateLimit-Remaining","value":"9"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:00:02 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"530"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"fb00546bf610dd0d360cc12a3cbd5545"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"uuid\": \"fabb88b2-0954-43db-b32a-e482d5406183\",\n            \"name\": \"Nome do Seu Hub\",\n            \"trading_name\": \"Seu Hub LTDA\",\n            \"document\": \"00000000000100\",\n            \"address\": {\n                \"street_name\": \"Rua do Seu Hub\",\n                \"address_number\": \"000\",\n                \"complement\": \"loja 1 e 2\",\n                \"postal_code\": \"00000-000\",\n                \"neighborhood_name\": \"bairro\",\n                \"city_name\": \"cidade\",\n                \"province_code\": \"UF\",\n                \"country_code\": \"BR\"\n            }\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://api.staging.hubii.co/hubs?search=&order_by=name&order_direction=asc&per_page=10&load=address&page=1\",\n        \"last\": \"https://api.staging.hubii.co/hubs?search=&order_by=name&order_direction=asc&per_page=10&load=address&page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://api.staging.hubii.co/hubs?search=&order_by=name&order_direction=asc&per_page=10&load=address&page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://api.staging.hubii.co/hubs\",\n        \"per_page\": 10,\n        \"to\": 6,\n        \"total\": 6\n    }\n}"}],"_postman_id":"77a24f11-72c3-4936-b98f-54224cf8d1c8"}],"id":"8c934f25-50e9-4597-b1b5-71659418c22e","_postman_id":"8c934f25-50e9-4597-b1b5-71659418c22e","description":"","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"02 — Polling 1: Aceite de pedidos","item":[{"name":"Responder pedido","id":"14070808-d799-44fa-a76e-b0d56660583a","protocolProfileBehavior":{"disabledSystemHeaders":{"accept":true},"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"accept\": false,\n    \"details\": [\n        {\n            \"type\": \"out_of_portfolio\",\n            \"message\": null,\n            \"item\": \"7fa6c19c-063e-4670-b825-asd\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p><strong>Polling 1 — Aceite.</strong> Registra a decisão do hub sobre uma oferta retornada em <code>to-answer</code>: aceitar ou recusar.</p>\n<h2 id=\"antes-de-chamar\">Antes de chamar</h2>\n<p>Para cada oferta retornada em <code>GET .../to-answer</code>, consulte primeiro <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code>. A decisão normalmente depende do pedido completo, especialmente dos itens, quantidades, disponibilidade, preço e regras operacionais do hub.</p>\n<h2 id=\"relação-com-os-dois-pollings\">Relação com os dois pollings</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Polling 1</th>\n<th>Polling 2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Oferta pendente</td>\n<td>Aparece em <code>to-answer</code></td>\n<td>Não aparece</td>\n</tr>\n<tr>\n<td>Consulta de detalhes</td>\n<td>Use antes de decidir aceite/recusa</td>\n<td>Também pode ser usada após <code>ORDER_CREATED</code></td>\n</tr>\n<tr>\n<td>Aceite pela API</td>\n<td>Some de <code>to-answer</code></td>\n<td>Gera <code>ORDER_CREATED</code></td>\n</tr>\n<tr>\n<td>Aceite pelo painel Hubii</td>\n<td>Não exige esta chamada</td>\n<td>Gera <code>ORDER_CREATED</code></td>\n</tr>\n<tr>\n<td>Recusa ou expiração</td>\n<td>Some de <code>to-answer</code></td>\n<td>Não gera notificação para este hub</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>Sim</td>\n<td>UUID do hub</td>\n</tr>\n<tr>\n<td><code>order_uuid</code></td>\n<td>Sim</td>\n<td>UUID da oferta retornada em <code>to-answer</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"body-para-aceitar\">Body para aceitar</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"accept\": true\n}\n</code></pre>\n<h2 id=\"body-para-recusar\">Body para recusar</h2>\n<p>Para recusa, <code>details</code> é obrigatório e deve ter pelo menos um item.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"accept\": false,\n  \"details\": [\n    {\n      \"type\": \"out_of_stock\",\n      \"message\": null,\n      \"item\": \"uuid-do-item\"\n    }\n  ]\n}\n</code></pre>\n<h2 id=\"motivos-de-recusa\">Motivos de recusa</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Significado</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>out_of_portfolio</code></td>\n<td>Produto fora do portfólio do hub</td>\n</tr>\n<tr>\n<td><code>out_of_stock</code></td>\n<td>Sem estoque</td>\n</tr>\n<tr>\n<td><code>quantity_not_enough</code></td>\n<td>Estoque insuficiente para a quantidade solicitada</td>\n</tr>\n<tr>\n<td><code>price</code></td>\n<td>Preço ou repasse não aceito</td>\n</tr>\n<tr>\n<td><code>hub_unavailable</code></td>\n<td>Hub indisponível para atender</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"exemplos-curl\">Exemplos cURL</h2>\n<p>Aceitar:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL/hubs/$HUB_UUID/orders/$ORDER_UUID/answer\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\" \\\n  -d '{\"accept\": true}'\n</code></pre>\n<p>Recusar:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL/hubs/$HUB_UUID/orders/$ORDER_UUID/answer\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\" \\\n  -d '{\"accept\": false, \"details\": [{\"type\": \"out_of_stock\", \"message\": null, \"item\": \"uuid-do-item\"}]}'\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p>Não faça retry cego. Se o mesmo pedido já foi respondido, a API pode retornar <code>422</code> com <code>Order already answered</code>. Trate isso como estado de negócio e verifique o fluxo antes de repetir a ação.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n<h2 id=\"após-o-aceite\">Após o aceite</h2>\n<p>Continue o Polling 2. Aguarde <code>ORDER_CREATED</code>, reconcilie os detalhes do pedido no ERP e só depois envie ACK da notificação processada.</p>\n","urlObject":{"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"","key":"hub_uuid"},{"description":{"content":"<p>UUID do pedido</p>\n","type":"text/plain"},"type":"any","value":"","key":"order_uuid"}]}},"response":[{"id":"4c3ee9d9-bc83-483d-920c-f2e21d4dc270","name":"[200] Responder pedido positivamente","originalRequest":{"method":"POST","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"accept\": true\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"22"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"8"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"8"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:37:39 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"1261"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"c3d55a45ab449b4958b37255173f7c63"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": true,\n        \"message\": \"Order answered\"\n    }\n}"},{"id":"e75ed151-f4e4-4911-9edc-69aabcbc7edf","name":"[200] Responder pedido negativamente por não trabalhar com um dos items","originalRequest":{"method":"POST","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"accept\": false,\n    \"details\": [\n        {\n            \"type\": \"out_of_portfolio\",\n            \"message\": null,\n            \"item\": \"a933aab6-c880-470b-b3be-2cc5af040263\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"22"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"8"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"8"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:37:39 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"1261"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"c3d55a45ab449b4958b37255173f7c63"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": true,\n        \"message\": \"Order answered\"\n    }\n}"},{"id":"594878c9-c02f-47f4-b902-f9e7a9904011","name":"[200] Responder pedido negativamente por não ter em estoque um dos items","originalRequest":{"method":"POST","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"accept\": false,\n    \"details\": [\n        {\n            \"type\": \"out_of_stock\",\n            \"message\": null,\n            \"item\": \"a933aab6-c880-470b-b3be-2cc5af040263\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"22"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"8"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"8"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:37:39 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"1261"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"c3d55a45ab449b4958b37255173f7c63"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": true,\n        \"message\": \"Order answered\"\n    }\n}"},{"id":"535a9edd-3799-434f-9813-aaa914e0aaf1","name":"[200] Responder pedido negativamente por estoque insuficiente","originalRequest":{"method":"POST","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"accept\": false,\n    \"details\": [\n        {\n            \"type\": \"quantity_not_enough\",\n            \"message\": null,\n            \"item\": \"a933aab6-c880-470b-b3be-2cc5af040263\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"22"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"8"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"8"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:37:39 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"1261"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"c3d55a45ab449b4958b37255173f7c63"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": true,\n        \"message\": \"Order answered\"\n    }\n}"},{"id":"cea6ebf3-78da-466b-8fee-6fa45dea028a","name":"[200] Responder pedido negativamente por não aceitar o valor do repasse de um dos itens","originalRequest":{"method":"POST","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"accept\": false,\n    \"details\": [\n        {\n            \"type\": \"price\",\n            \"message\": null,\n            \"item\": \"a933aab6-c880-470b-b3be-2cc5af040263\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"22"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"8"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"8"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:37:39 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"1261"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"c3d55a45ab449b4958b37255173f7c63"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": true,\n        \"message\": \"Order answered\"\n    }\n}"},{"id":"ead0b8c6-f0b3-4119-a715-63d8a8bb2ed7","name":"[422] Responder pedido","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"accept\": false,\r\n    \"details\": [\r\n        {\r\n            \"type\": \"price\",\r\n            \"message\": null,\r\n            \"item\": \"a933aab6-c880-470b-b3be-2cc5af040263\"\r\n        }\r\n    ]\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"21"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"9"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"9"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:35:40 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"258"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"26954260301cc67ab1c5237a1a2f3d24"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": false,\n        \"error\": \"Order already answered\"\n    }\n}"}],"_postman_id":"14070808-d799-44fa-a76e-b0d56660583a"},{"name":"Listagem de pedidos para resposta","id":"5ba35a9c-54f0-4076-aa01-9d604092d2bb","protocolProfileBehavior":{"disabledSystemHeaders":{"accept":true},"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/to-answer","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p><strong>Polling 1 — Aceite.</strong> Lista ofertas de pedidos pendentes para um hub. Esses pedidos ainda não foram aceitos e precisam de resposta antes de <code>available_until_at</code>.</p>\n<blockquote>\n<p>A listagem deve ser tratada como uma fila de ofertas. Para cada pedido retornado, consulte o detalhe completo em <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code> antes de aceitar ou recusar. </p>\n</blockquote>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<ul>\n<li><p>A cada 30–60 segundos.</p>\n</li>\n<li><p>Em paralelo ao Polling 2.</p>\n</li>\n<li><p>Para cada <code>hub_uuid</code> vinculado à API Key.</p>\n</li>\n</ul>\n<h2 id=\"fluxo-recomendado\">Fluxo recomendado</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /hubs/{hub_uuid}/orders/to-answer\n  ↓ para cada data[].uuid\nGET /hubs/{hub_uuid}/orders/{order_uuid}\n  ↓ avaliar itens, quantidades, preço, disponibilidade e regras do hub\nPOST /hubs/{hub_uuid}/orders/{order_uuid}/answer\n  ↓ se aceito\nGET /v2/notifications → ORDER_CREATED\n\n</code></pre>\n<h2 id=\"por-que-consultar-o-pedido-completo\">Por que consultar o pedido completo</h2>\n<p>O hub normalmente decide aceitar ou recusar com base no pedido completo, principalmente:</p>\n<ul>\n<li><p>itens do pedido;</p>\n</li>\n<li><p>quantidades solicitadas;</p>\n</li>\n<li><p>disponibilidade de estoque;</p>\n</li>\n<li><p>preço/repasse;</p>\n</li>\n<li><p>regras fiscais e operacionais;</p>\n</li>\n<li><p>endereço e condições de atendimento.</p>\n</li>\n</ul>\n<p>A resposta de <code>to-answer</code> é útil para identificar as ofertas pendentes e o prazo de resposta, mas não deve ser a única base da decisão.</p>\n<h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>Sim</td>\n<td>UUID do hub retornado em <code>GET /hubs</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-relevantes\">Campos relevantes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Uso</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data[].uuid</code></td>\n<td><code>order_uuid</code> usado para consultar detalhes e aceitar ou recusar</td>\n</tr>\n<tr>\n<td><code>data[].id</code></td>\n<td>ID numérico; exiba no ERP para suporte operacional</td>\n</tr>\n<tr>\n<td><code>data[].total</code></td>\n<td>Valor total resumido da oferta</td>\n</tr>\n<tr>\n<td><code>data[].available_until_at</code></td>\n<td>Prazo máximo para resposta; depois disso, a oferta expira</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-importantes\">Regras importantes</h2>\n<ul>\n<li><p>Consulte o pedido completo antes de responder.</p>\n</li>\n<li><p>Responda antes de <code>available_until_at</code>.</p>\n</li>\n<li><p>Após expirar, a oferta some da fila e pode ser repassada a outro hub.</p>\n</li>\n<li><p>Expiração e recusa não geram notificação para este hub.</p>\n</li>\n<li><p>Aceite pelo painel Hubii também é válido e gera <code>ORDER_CREATED</code> no Polling 2.</p>\n</li>\n</ul>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/hubs/$HUB_UUID/orders/to-answer\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n\n</code></pre>\n<h2 id=\"diagrama-de-sequência\">Diagrama de sequência</h2>\n<img src=\"https://content.pstmn.io/61117942-a924-4c4d-abfc-13c9e3a58437/c2VxLW9yZGVyLnBuZw==\" />\n\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir. A resposta sempre representa o estado atual da fila.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-\\\\\\*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual. </p>\n</blockquote>\n<h2 id=\"próximo-passo\">Próximo passo</h2>\n<p>Para cada <code>order_uuid</code>, chame <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code> e só então use <code>POST /hubs/{hub_uuid}/orders/{order_uuid}/answer</code> para aceitar ou recusar.</p>\n","urlObject":{"path":["hubs",":hub_uuid","orders","to-answer"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"id":"abbe41c4-a660-45cc-895a-cc50614bcf9b","description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"","key":"hub_uuid"}]}},"response":[{"id":"196a6b72-da69-44c4-8c5f-a449a8fc50cc","name":"[200] Listagem de pedidos para resposta","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/to-answer","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders","to-answer"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"55"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"9"},{"key":"RateLimit-Limit","value":"10"},{"key":"RateLimit-Remaining","value":"9"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:17:05 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"273"},{"key":"X-Kong-Proxy-Latency","value":"184"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"ee558d06e231553a42fbd973c1e83a0d"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 102656,\n            \"uuid\": \"71402839-ecb5-4ee0-b73a-331e7bef74f5\",\n            \"available_until_at\": \"2024-12-20T10:55:20+00:00\",\n            \"total\": 50.55\n        },\n        {\n            \"id\": 102864,\n            \"uuid\": \"bccf34dd-5501-4070-a846-926fb9fa02d6\",\n            \"available_until_at\": \"2024-12-20T10:55:20+00:00\",\n            \"total\": 63.33\n        }\n    ]\n}"}],"_postman_id":"5ba35a9c-54f0-4076-aa01-9d604092d2bb"}],"id":"40a6ae6d-be81-4ce0-a1c5-001b00bc5a19","_postman_id":"40a6ae6d-be81-4ce0-a1c5-001b00bc5a19","description":"","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"03 — Polling 2: Notificações (pedidos aceitos)","item":[{"name":"Notificações de Eventos","id":"3f651bb4-3c68-45e2-81e1-3eea7185abf6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/v2/notifications","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p><strong>Polling 2 — Notificações.</strong> Lista eventos de pedidos já aceitos pelo hub, seja por API ou pelo painel Hubii.</p>\n<blockquote>\n<p>Esta rota não mostra ofertas pendentes. Pedido ainda não aceito, recusado ou expirado não aparece aqui para este hub. </p>\n</blockquote>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<ul>\n<li><p>A cada 30–60 segundos, em paralelo ao Polling 1.</p>\n</li>\n<li><p>Depois de processar e persistir cada evento, chame <code>POST /notifications/ack</code>.</p>\n</li>\n</ul>\n<h2 id=\"fluxo\">Fluxo</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">[Polling 1] aceite via API ou painel\n  ↓\nGET /v2/notifications\n  ↓ ORDER_CREATED\nGET /hubs/{hub_uuid}/orders/{order_uuid}\n  ↓ persistir no ERP\nPOST /notifications/ack\n\n</code></pre>\n<h2 id=\"filtros-opcionais\">Filtros opcionais</h2>\n<p>Formato oficial documentado nesta collection: repetir o mesmo parâmetro para múltiplos valores.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Exemplo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuids</code></td>\n<td><code>?hub_uuids={hub_uuid}</code></td>\n<td>Filtra por um hub</td>\n</tr>\n<tr>\n<td><code>hub_uuids</code></td>\n<td><code>?hub_uuids={hub_uuid}&amp;hub_uuids={hub_uuid_2}</code></td>\n<td>Filtra por vários hubs</td>\n</tr>\n<tr>\n<td><code>types</code></td>\n<td><code>?types=ORDER_CREATED</code></td>\n<td>Filtra por um tipo</td>\n</tr>\n<tr>\n<td><code>types</code></td>\n<td><code>?types=ORDER_CREATED&amp;types=ORDER_CANCELLED</code></td>\n<td>Filtra por vários tipos</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Se a implementação do parceiro usar biblioteca que converte arrays para <code>hub_uuids[]</code>, valide com o time Hubii antes da homologação. A collection usa <code>hub_uuids</code> e <code>types</code> sem colchetes. </p>\n</blockquote>\n<h2 id=\"paginação\">Paginação</h2>\n<p>A resposta é um objeto paginado. Itere <code>page</code> até <code>page &gt;= last_page</code> quando houver mais eventos.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Uso</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data</code></td>\n<td>Lista de notificações da página atual</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>Total de notificações no filtro</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>last_page</code></td>\n<td>Última página disponível</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>Tamanho da página (equivale a <code>limit</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-params-de-paginação\">Query params de paginação</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Padrão</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td><code>1</code></td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>limit</code></td>\n<td><code>15</code></td>\n<td>Itens por página (máx. <code>100</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-de-cada-item-em-data\">Campos de cada item em <code>data[]</code></h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Uso</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>notification_uuid</code></td>\n<td>Chave de idempotência no ERP e valor usado no ACK</td>\n</tr>\n<tr>\n<td><code>type</code> / <code>subtype</code></td>\n<td>Tipo e subtipo do evento</td>\n</tr>\n<tr>\n<td><code>order_uuid</code> / <code>order_id</code></td>\n<td>Identificadores do pedido</td>\n</tr>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>Hub relacionado ao evento</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>Data/hora do evento</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"matriz-de-eventos\">Matriz de eventos</h2>\n<h3 id=\"eventos-que-exigem-ação-no-erp\">Eventos que exigem ação no ERP</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>type</th>\n<th>subtype</th>\n<th>Quando acontece</th>\n<th>Ação esperada</th>\n<th>Buscar detalhes do pedido?</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ORDER_CREATED</code></td>\n<td>—</td>\n<td>Após aceite via API ou painel</td>\n<td>Importar/reconciliar pedido</td>\n<td>Sim</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_SEARCHING_COURIER</code></td>\n<td>Buscando entregador</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_COURIER_NOT_FOUND</code></td>\n<td>Entregador não encontrado</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_COURIER_FOUND</code></td>\n<td>Entregador atribuído</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_PICKING_UP</code></td>\n<td>Coleta iniciada</td>\n<td>Atualizar status e buscar <code>pickup_code</code></td>\n<td>Sim</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_PICKED_UP</code></td>\n<td>Pedido coletado</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_DELIVERING</code></td>\n<td>Em rota</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_FAILED_TO_DELIVERY</code></td>\n<td>Falha na entrega</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_DELIVERED</code></td>\n<td>Pedido entregue</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_DELIVERY_UPDATED</code></td>\n<td><code>ORDER_DELIVERY_LOST</code></td>\n<td>Extravio</td>\n<td>Atualizar status logístico</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_CANCELLED</code></td>\n<td><code>ORDER_CANCELLED</code></td>\n<td>Cancelamento pelo cliente/plataforma</td>\n<td>Cancelar ou inutilizar NF se aplicável</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>ORDER_CANCELLED</code></td>\n<td><code>ORDER_CANCELLED_BY_HUB</code></td>\n<td>Cancelamento pelo hub</td>\n<td>Atualizar pedido e NF se aplicável</td>\n<td>Opcional</td>\n</tr>\n<tr>\n<td><code>SHIPPING_LABEL_AVAILABLE</code></td>\n<td>—</td>\n<td>Etiqueta disponível para o pedido</td>\n<td>Baixar etiqueta em <code>GET .../label</code></td>\n<td>Opcional</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>A necessidade de etiqueta depende do pedido, não apenas do canal de venda. </p>\n</blockquote>\n<h3 id=\"eventos-informativos\">Eventos informativos</h3>\n<p>Registre e envie ACK, mas não exigem lógica operacional específica no ERP.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>type</th>\n<th>Observação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVOICE_PENDING</code></td>\n<td>Informativo; não substitui o envio de NF quando aplicável</td>\n</tr>\n<tr>\n<td><code>ORDER_UPDATED</code></td>\n<td>Informativo; use apenas se o escopo do parceiro exigir</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estratégia-de-ack\">Estratégia de ACK</h2>\n<ol>\n<li><p>Buscar notificações.</p>\n</li>\n<li><p>Processar uma a uma no ERP.</p>\n</li>\n<li><p>Persistir localmente usando <code>notification_uuid</code>.</p>\n</li>\n<li><p>Enviar ACK somente após sucesso.</p>\n</li>\n<li><p>Se o ACK falhar, retentar o ACK e não reprocessar o evento duplicado.</p>\n</li>\n</ol>\n<blockquote>\n<p>ACK cedo demais pode causar perda de evento. Sem ACK, a notificação reaparece por até 2 dias. </p>\n</blockquote>\n<h2 id=\"regras-críticas\">Regras críticas</h2>\n<ul>\n<li><p><code>ORDER_CREATED</code> é o gatilho recomendado para importar ou reconciliar o pedido aceito.</p>\n</li>\n<li><p>Notificações expiram em 2 dias sem ACK.</p>\n</li>\n<li><p>Cancelamentos podem chegar até 1 dia após o cancelamento real.</p>\n</li>\n<li><p>Pedido recusado ou expirado no Polling 1 não gera evento neste polling para o hub.</p>\n</li>\n</ul>\n<h2 id=\"exemplos-curl\">Exemplos cURL</h2>\n<p>Sem filtro:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/v2/notifications\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n\n</code></pre>\n<p>Com filtros:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/v2/notifications?hub_uuids=$HUB_UUID&amp;types=ORDER_CREATED\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir. O mesmo <code>notification_uuid</code> retorna até receber ACK.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-\\\\\\\\*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual. </p>\n</blockquote>\n<h2 id=\"diagramas\">Diagramas</h2>\n<h5 id=\"importação-e-faturamento\">Importação e faturamento</h5>\n<img src=\"https://content.pstmn.io/426c6be9-7ada-4976-b875-72c436cf566a/c2VxLWltcG9ydC1iaWxsLnBuZw==\" />\n\n<h5 id=\"atualizações-de-entrega\">Atualizações de entrega</h5>\n<img src=\"https://content.pstmn.io/ca0a1d30-f880-419b-8a66-2da2afdb4870/c2VxLXVwZGF0ZS5wbmc=\" />\n\n<h5 id=\"sequência-de-eventos\">Sequência de eventos</h5>\n<img src=\"https://content.pstmn.io/bbb80891-10aa-45d7-bf95-cf39fb980413/bGluayBwaXJlcy5zdmc=\" />","urlObject":{"path":["v2","notifications"],"host":["https://api.staging.hubii.co"],"query":[{"disabled":true,"description":{"content":"<p>Página atual; padrão: 1</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Itens por página; padrão: 15; máximo: 100</p>\n","type":"text/plain"},"key":"limit","value":"15"},{"disabled":true,"description":{"content":"<p>Filtrar por hub</p>\n","type":"text/plain"},"key":"hub_uuid","value":""},{"disabled":true,"description":{"content":"<p>Segundo hub opcional; repetir o parâmetro para múltiplos hubs</p>\n","type":"text/plain"},"key":"hub_uuids[0]","value":""},{"disabled":true,"description":{"content":"<p>Filtrar por tipo de evento</p>\n","type":"text/plain"},"key":"types","value":"ORDER_CREATED"},{"disabled":true,"description":{"content":"<p>Segundo tipo opcional; repetir o parâmetro para múltiplos tipos</p>\n","type":"text/plain"},"key":"types","value":"ORDER_CANCELLED"}],"variable":[]}},"response":[{"id":"ef79a613-555b-40e6-8c3a-5f60d108395f","name":"Notificações paginadas sem filtros","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"https://api.staging.hubii.co/v2/notifications","host":["https://api.staging.hubii.co"],"path":["v2","notifications"],"query":[{"key":"hub_uuids","value":"a93dd09b-4c47-479a-9dca-9fb8026301a6","description":"Utilize o UUID's dos hubs para filtrar notificações referentes a eles. Para mais de 1 hub envie com separação por virgula","disabled":true},{"key":"types[0]","value":"ORDER_CREATED,ORDER_DELIVERY_UPDATE,ORDER_CANCELLED","description":"Filtre as notificações pelo seu tipo. Para mais de 1 tipo envie com separação por virgula.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 05 Sep 2025 19:31:23 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"x-ratelimit-remaining-minute","value":"9"},{"key":"x-ratelimit-limit-minute","value":"10"},{"key":"ratelimit-remaining","value":"9"},{"key":"ratelimit-reset","value":"38"},{"key":"ratelimit-limit","value":"10"},{"key":"x-powered-by","value":"Express"},{"key":"etag","value":"W/\"f92-vQDqeTTBSMMFuOt/SQZLfa/TQ5M\""},{"key":"Server","value":"cloudflare"},{"key":"x-kong-upstream-latency","value":"39"},{"key":"x-kong-proxy-latency","value":"32"},{"key":"via","value":"1.1 kong/3.9.1"},{"key":"x-kong-request-id","value":"1e499a7323da6603dad0cd7dcfb2a278"},{"key":"cf-cache-status","value":"DYNAMIC"},{"key":"Nel","value":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}"},{"key":"Report-To","value":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=RWjTNpOyWLU2jx1FVJVpG4maaZC0x3YyEPxwkFJVD%2BMl7WI4eWzRVENHZmHsjrmiKJwlmvTm6fyvI0S6E5aiHZ5XBqKG61a15Ri%2FXwRJsfgP4J4%3D\"}]}"},{"key":"Content-Encoding","value":"br"},{"key":"CF-RAY","value":"97a825824f821ce5-GRU"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"notification_uuid\": \"066d19b9-4aef-4b40-941b-d104ab158cd2\",\n            \"type\": \"ORDER_CREATED\",\n            \"subtype\": null,\n            \"order_uuid\": \"356a4241-456b-49a6-8bdc-93f92ddec7f2\",\n            \"order_id\": \"146167\",\n            \"order_delivery_id\": \"119758\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-03T21:46:59.000Z\"\n        },\n        {\n            \"notification_uuid\": \"c3bc1f55-fe65-49c5-ac89-fcef38827d41\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n            \"order_uuid\": \"356a4241-456b-49a6-8bdc-93f92ddec7f2\",\n            \"order_id\": \"146167\",\n            \"order_delivery_id\": \"119758\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-03T21:47:29.000Z\"\n        },\n        {\n            \"notification_uuid\": \"636b4abf-2458-4e5e-a285-4184af2ffdfd\",\n            \"type\": \"ORDER_CREATED\",\n            \"subtype\": null,\n            \"order_uuid\": \"c71af0ac-6d96-4d1f-a59f-a651ce2c4eb8\",\n            \"order_id\": \"146199\",\n            \"order_delivery_id\": \"119790\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-04T12:49:40.000Z\"\n        },\n        {\n            \"notification_uuid\": \"09d0613e-50de-4ed0-9383-184a93429275\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n            \"order_uuid\": \"c71af0ac-6d96-4d1f-a59f-a651ce2c4eb8\",\n            \"order_id\": \"146199\",\n            \"order_delivery_id\": \"119790\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-04T12:49:44.000Z\"\n        },\n        {\n            \"notification_uuid\": \"f8bb9ca5-961c-4bc3-9bf5-2b47452b2f81\",\n            \"type\": \"ORDER_CREATED\",\n            \"subtype\": null,\n            \"order_uuid\": \"571cdfbe-ba9a-4cf2-aaea-45c67b064c88\",\n            \"order_id\": \"146265\",\n            \"order_delivery_id\": \"119856\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-04T16:18:40.000Z\"\n        },\n        {\n            \"notification_uuid\": \"d987097a-a097-49c8-8c57-cf302f3efabd\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_COURIER_NOT_FOUND\",\n            \"order_uuid\": \"c71af0ac-6d96-4d1f-a59f-a651ce2c4eb8\",\n            \"order_id\": \"146199\",\n            \"order_delivery_id\": \"119790\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-04T12:50:59.000Z\"\n        },\n        {\n            \"notification_uuid\": \"35f09ebf-94e4-440f-902e-f74c1f89670c\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n            \"order_uuid\": \"571cdfbe-ba9a-4cf2-aaea-45c67b064c88\",\n            \"order_id\": \"146265\",\n            \"order_delivery_id\": \"119856\",\n            \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n            \"date\": \"2025-09-04T16:18:44.000Z\"\n        },\n        {\n            \"notification_uuid\": \"07451006-152c-4406-8ae1-f755bff7bdca\",\n            \"type\": \"ORDER_CREATED\",\n            \"subtype\": null,\n            \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n            \"order_id\": \"146390\",\n            \"order_delivery_id\": \"119981\",\n            \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n            \"date\": \"2025-09-05T18:57:59.000Z\"\n        },\n        {\n            \"notification_uuid\": \"883596c5-dbdd-4720-9178-68b13f428e30\",\n            \"type\": \"ORDER_CREATED\",\n            \"subtype\": null,\n            \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n            \"order_id\": \"146390\",\n            \"order_delivery_id\": \"119981\",\n            \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n            \"date\": \"2025-09-05T19:06:53.000Z\"\n        },\n        {\n            \"notification_uuid\": \"0cdd2ae7-4a0e-4480-b1e9-950141be78dd\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n            \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n            \"order_id\": \"146390\",\n            \"order_delivery_id\": \"119981\",\n            \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n            \"date\": \"2025-09-05T19:07:35.000Z\"\n        },\n        {\n            \"notification_uuid\": \"95af8726-3833-424d-bb18-0d0c716b4ffa\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_COURIER_FOUND\",\n            \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n            \"order_id\": \"146390\",\n            \"order_delivery_id\": \"119981\",\n            \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n            \"date\": \"2025-09-05T19:07:51.000Z\"\n        },\n        {\n            \"notification_uuid\": \"1766ae9b-b06d-4486-8c41-37add23fe872\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_DELIVERING\",\n            \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n            \"order_id\": \"146390\",\n            \"order_delivery_id\": \"119981\",\n            \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n            \"date\": \"2025-09-05T19:08:03.000Z\"\n        },\n        {\n            \"notification_uuid\": \"7d122bff-d184-4a19-bd62-b30e03fee07f\",\n            \"type\": \"ORDER_DELIVERY_UPDATED\",\n            \"subtype\": \"ORDER_DELIVERY_DELIVERED\",\n            \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n            \"order_id\": \"146390\",\n            \"order_delivery_id\": \"119981\",\n            \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n            \"date\": \"2025-09-05T19:08:11.000Z\"\n        }\n    ],\n    \"total\": 13,\n    \"page\": 1,\n    \"last_page\": 1,\n    \"per_page\": 13\n}"}],"_postman_id":"3f651bb4-3c68-45e2-81e1-3eea7185abf6"},{"name":"Reconhecimento de Notificação em Massa","id":"301bfd7e-ba77-454c-9e0f-f31a2c186825","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"uuids\": [\n        \"9018e5d3-f653-443b-b64e-c45d475f0189\",\n        \"4996dc47-1832-47da-82b9-04468e2696bf\"\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://api.staging.hubii.co/notifications/ack","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Confirma que uma ou mais notificações do Polling 2 foram processadas com sucesso no ERP. Após o ACK, elas deixam de aparecer na fila.</p>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<p>Somente depois de processar e persistir o evento localmente. Não envie ACK antes de gravar o resultado no ERP.</p>\n<h2 id=\"fluxo-recomendado\">Fluxo recomendado</h2>\n<ol>\n<li><code>GET /v2/notifications</code>.</li>\n<li>Processar cada evento no ERP.</li>\n<li>Persistir <code>notification_uuid</code> como chave única.</li>\n<li>Enviar ACK para os eventos concluídos.</li>\n<li>Se o ACK falhar, retentar apenas o ACK.</li>\n</ol>\n<h2 id=\"body\">Body</h2>\n<p>O campo <code>uuids</code> recebe uma lista de <code>notification_uuid</code>.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"uuids\": [\n    \"notification-uuid-1\",\n    \"notification-uuid-2\"\n  ]\n}\n</code></pre>\n<h2 id=\"comportamento-esperado\">Comportamento esperado</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Efeito</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Sem ACK</td>\n<td>A notificação reaparece no próximo poll, por até 2 dias</td>\n</tr>\n<tr>\n<td>ACK após processamento</td>\n<td>A notificação é removida da fila</td>\n</tr>\n<tr>\n<td>ACK antes da persistência</td>\n<td>Risco de perda do evento se o ERP falhar depois</td>\n</tr>\n<tr>\n<td>ACK falhou por timeout ou <code>5xx</code></td>\n<td>Retentar ACK; não reprocessar o evento</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL/notifications/ack\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\" \\\n  -d '{\"uuids\": [\"NOTIFICATION_UUID\"]}'\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p>No ERP, trate <code>notification_uuid</code> como chave única. Se a mesma notificação reaparecer, não duplique o processamento; apenas tente confirmar o ACK novamente.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n","urlObject":{"path":["notifications","ack"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[]}},"response":[],"_postman_id":"301bfd7e-ba77-454c-9e0f-f31a2c186825"}],"id":"e74c0a81-e8cc-4c6d-83c8-2d975bcec6a5","description":"<blockquote>\n<p><strong>Descontinuação:</strong> <code>GET /notifications</code> foi substituído por <code>GET /v2/notifications</code> (resposta paginada com <code>page</code> e <code>limit</code>). O endpoint legado permanece disponível apenas por compatibilidade e retorna os headers <code>X-API-Deprecated: true</code> e <code>X-API-Replacement: /v2/notifications</code>. <strong>Novas integrações devem usar apenas a v2.</strong> O endpoint legado está documentado na pasta <code>[Descontinuado]</code>.</p>\n</blockquote>\n","_postman_id":"e74c0a81-e8cc-4c6d-83c8-2d975bcec6a5","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"04 — Pedidos","item":[{"name":"Detalhes do pedido","id":"8b997ef8-e0ce-4b2f-ac17-628322e3e8d7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"<value>"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Retorna os dados completos de um pedido. Use este endpoint em dois momentos principais:</p>\n<ol>\n<li><p><strong>Antes de aceitar ou recusar uma oferta</strong> retornada em <code>to-answer</code>, para avaliar itens, quantidades, preços, disponibilidade e regras do hub.</p>\n</li>\n<li><p><strong>Depois do aceite</strong>, ao receber <code>ORDER_CREATED</code>, para importar ou reconciliar o pedido no ERP.</p>\n</li>\n</ol>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<ul>\n<li><p>Para cada pedido recebido em <code>GET .../to-answer</code>, antes de <code>POST .../answer</code>.</p>\n</li>\n<li><p>Após receber <code>ORDER_CREATED</code> no Polling 2.</p>\n</li>\n<li><p>Antes de emitir ou enviar NF-e.</p>\n</li>\n<li><p>Após <code>ORDER_DELIVERY_PICKING_UP</code>, quando for necessário obter <code>pickup_code</code>.</p>\n</li>\n<li><p>Sempre que o ERP precisar reconciliar o estado atual do pedido.</p>\n</li>\n</ul>\n<h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>UUID do hub</td>\n</tr>\n<tr>\n<td><code>order_uuid</code></td>\n<td>UUID do pedido</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-principais\">Campos principais</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Uso</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>ID numérico; exiba no ERP e use em suporte Hubii</td>\n</tr>\n<tr>\n<td><code>uuid</code></td>\n<td>UUID do pedido</td>\n</tr>\n<tr>\n<td><code>subtotal</code>, <code>discount</code>, <code>delivery_cost</code>, <code>total</code></td>\n<td>Valores financeiros brutos (transacionados com o consumidor)</td>\n</tr>\n<tr>\n<td><code>transfer_subtotal</code>, <code>transfer_delivery_cost</code>, <code>transfer_freight_fee</code>, <code>transfer_total</code></td>\n<td>Valores líquidos de repasse ao hub</td>\n</tr>\n<tr>\n<td><code>invoice_allowed</code></td>\n<td>Formatos permitidos para NF-e (55 ou 65)</td>\n</tr>\n<tr>\n<td><code>delivery_status</code></td>\n<td>Status logístico atual</td>\n</tr>\n<tr>\n<td><code>estimated_delivery_at</code></td>\n<td>Previsão de entrega</td>\n</tr>\n<tr>\n<td><code>pickup_code</code></td>\n<td><code>null</code> até <code>ORDER_DELIVERY_PICKING_UP</code>; depois do evento, consulte novamente</td>\n</tr>\n<tr>\n<td><code>customer</code></td>\n<td>Dados do comprador</td>\n</tr>\n<tr>\n<td><code>delivery_address</code> / <code>invoice_address</code></td>\n<td>Endereços de entrega e faturamento</td>\n</tr>\n<tr>\n<td><code>items[]</code></td>\n<td>Itens do pedido, incluindo <code>uuid</code>, produto, EAN, quantidade, preços brutos e o repasse unitário (<code>transfer_amount</code>)</td>\n</tr>\n<tr>\n<td><code>courier</code> / <code>carrier</code></td>\n<td>Entregador ou transportadora, quando disponível</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"uso-na-decisão-de-aceite\">Uso na decisão de aceite</h2>\n<p>A decisão do hub normalmente depende dos itens e condições do pedido completo. Antes de responder uma oferta, use os dados deste endpoint para validar:</p>\n<ul>\n<li><p>se os itens fazem parte do portfólio do hub;</p>\n</li>\n<li><p>se há estoque suficiente;</p>\n</li>\n<li><p>se os valores brutos e líquidos (<code>transfer_total</code> e <code>transfer_amount</code>) são aceitáveis e cobrem os custos;</p>\n</li>\n<li><p>se há alguma restrição operacional ou fiscal;</p>\n</li>\n<li><p>se o pedido pode ser atendido dentro do fluxo esperado.</p>\n</li>\n</ul>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/hubs/$HUB_UUID/orders/$ORDER_UUID\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n\n</code></pre>\n","urlObject":{"path":["hubs",":hub_uuid","orders",":order_uuid"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"4cff2462-412f-4868-8b60-620c2efb8292","key":"hub_uuid"},{"description":{"content":"<p>UUID do pedido</p>\n","type":"text/plain"},"type":"any","value":"2f91d2a6-4856-4c3a-b248-4e15f1b07486","key":"order_uuid"}]}},"response":[{"id":"ae84feb1-41d2-48d5-9a0a-b31b76799a84","name":"[200] Detalhes do pedido","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid"],"variable":[{"key":"hub_uuid","value":""},{"key":"order_uuid","value":""}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":":status","value":"200"},{"key":"date","value":"Tue, 02 Jun 2026 13:04:13 GMT"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"ratelimit-reset","value":"48"},{"key":"x-ratelimit-remaining-minute","value":"299"},{"key":"ratelimit-limit","value":"300"},{"key":"x-ratelimit-limit-minute","value":"300"},{"key":"ratelimit-remaining","value":"299"},{"key":"server","value":"cloudflare"},{"key":"vary","value":"Accept-Encoding"},{"key":"x-powered-by","value":"PHP/8.2.31"},{"key":"cache-control","value":"no-cache, private"},{"key":"x-ratelimit-limit","value":"60"},{"key":"x-ratelimit-remaining","value":"59"},{"key":"access-control-allow-origin","value":"*"},{"key":"x-frame-options","value":"SAMEORIGIN"},{"key":"x-xss-protection","value":"1; mode=block"},{"key":"x-content-type-options","value":"nosniff"},{"key":"content-encoding","value":"gzip"},{"key":"x-kong-upstream-latency","value":"1112"},{"key":"x-kong-proxy-latency","value":"3"},{"key":"via","value":"1.1 kong/3.9.1"},{"key":"x-kong-request-id","value":"9771364eb10892350cd59d33b696df33"},{"key":"cf-cache-status","value":"DYNAMIC"},{"key":"nel","value":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}"},{"key":"report-to","value":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=OoLxjchW%2F3qXCK%2FhYJmY6tLtWS4Sea2e0tnnL6htY4fWV1wEbBd6f2O6szshWgiui%2FpxGEYzPLU8sdyZKlMZXvtdhzRUehJOM05%2FZInxpio6v03e4NaHDvacUHDv6P9%2BLiQfe%2B8QwVdQ9Aw98zyAQbO5\"}]}"},{"key":"cf-ray","value":"a056a99cf987b559-GRU"}],"cookie":[],"responseTime":null,"body":"{\r\n    \"data\": {\r\n        \"id\": 1000001,\r\n        \"uuid\": \"00000000-0000-4000-8000-000000000001\",\r\n        \"subtotal\": 62.99,\r\n        \"discount\": 0,\r\n        \"delivery_cost\": 9.9,\r\n        \"total\": 72.89,\r\n        \"transfer_subtotal\": 55.49,\r\n        \"transfer_delivery_cost\": null,\r\n        \"transfer_freight_fee\": 0,\r\n        \"transfer_total\": 55.49,\r\n        \"invoice_allowed\": [\r\n            55,\r\n            65\r\n        ],\r\n        \"delivery_status\": \"delivered\",\r\n        \"estimated_delivery_at\": \"2026-08-05 18:55:05\",\r\n        \"pickup_code\": \"0000\",\r\n        \"customer\": {\r\n            \"name\": \"Maria da Silva\",\r\n            \"document\": \"12345678909\"\r\n        },\r\n        \"delivery_address\": {\r\n            \"street_name\": \"R. das Flores\",\r\n            \"address_number\": \"100\",\r\n            \"complement\": \"Bl A Ap 11\",\r\n            \"postal_code\": \"13000000\",\r\n            \"neighborhood_name\": \"Centro\",\r\n            \"city_name\": \"Campinas\",\r\n            \"province_code\": \"SP\",\r\n            \"country_code\": \"BR\"\r\n        },\r\n        \"invoice_address\": {\r\n            \"street_name\": \"R. das Flores\",\r\n            \"address_number\": \"100\",\r\n            \"complement\": \"Bl A Ap 11\",\r\n            \"postal_code\": \"13000000\",\r\n            \"neighborhood_name\": \"Centro\",\r\n            \"city_name\": \"Campinas\",\r\n            \"province_code\": \"SP\",\r\n            \"country_code\": \"BR\"\r\n        },\r\n        \"invoice_details\": {\r\n            \"item_amount_adjustment\": {\r\n                \"method\": \"net_adjustment_proportional_by_subtotal\",\r\n                \"base_amount\": 62.99,\r\n                \"discount\": 0,\r\n                \"delivery_cost\": 9.9,\r\n                \"net_amount\": 9.9,\r\n                \"order_total\": 72.89,\r\n                \"items\": [\r\n                    {\r\n                        \"id\": \"00000000-0000-4000-8000-000000000002\",\r\n                        \"quantity\": 1,\r\n                        \"unit_price\": 72.89,\r\n                        \"total\": 72.89\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        \"carrier\": {\r\n            \"name\": null,\r\n            \"document\": null\r\n        },\r\n        \"courier\": {\r\n            \"name\": \"JOAO PEREIRA\",\r\n            \"document\": \"+5519900000000\",\r\n            \"document_type\": \"phone\"\r\n        },\r\n        \"items\": [\r\n            {\r\n                \"uuid\": \"00000000-0000-4000-8000-000000000002\",\r\n                \"quantity\": 1,\r\n                \"unit_price\": 62.99,\r\n                \"total\": 62.99,\r\n                \"transfer_amount\": 55.49,\r\n                \"ean\": \"7898724630084\",\r\n                \"product\": \"Tapete Hig. Super Secao C/14\"\r\n            }\r\n        ]\r\n    }\r\n}"}],"_postman_id":"8b997ef8-e0ce-4b2f-ac17-628322e3e8d7"},{"name":"Cancelamento do Pedido","id":"be9ee595-9edc-4a3a-91b5-eafdea8e51a7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/cancel-accepted","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Permite que o hub desista de um pedido já aceito <strong>antes da coleta</strong>. O pedido é redirecionado dentro da rede Hubii; esta ação não cancela automaticamente o pedido para o cliente final.</p>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<ul>\n<li>Quando o hub não consegue atender um pedido que já havia aceitado.</li>\n<li>Apenas antes da coleta pelo entregador/transportadora.</li>\n<li>Quando este cenário fizer parte do escopo de homologação do parceiro.</li>\n</ul>\n<h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>UUID do hub</td>\n</tr>\n<tr>\n<td><code>order_uuid</code></td>\n<td>UUID do pedido</td>\n</tr>\n</tbody>\n</table>\n</div><p>Esta rota não possui body.</p>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL/hubs/$HUB_UUID/orders/$ORDER_UUID/cancel-accepted\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p>Ação de negócio sensível. Evite retry automático sem consultar o estado do pedido, porque a situação operacional pode mudar entre tentativas. Após a coleta, a operação deve falhar.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n<h2 id=\"rate-limit\">Rate limit</h2>\n<p>10 req/min por token, no grupo de ações.</p>\n","urlObject":{"path":["hubs",":hub_uuid","orders",":order_uuid","cancel-accepted"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"","key":"hub_uuid"},{"description":{"content":"<p>UUID do pedido</p>\n","type":"text/plain"},"type":"any","value":"","key":"order_uuid"}]}},"response":[],"_postman_id":"be9ee595-9edc-4a3a-91b5-eafdea8e51a7"}],"id":"5ed24ac5-4e83-461e-a6b9-4f36d18476b3","_postman_id":"5ed24ac5-4e83-461e-a6b9-4f36d18476b3","description":"","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"05 — Faturamento e expedição","item":[{"name":"Enviar nota fiscal para o pedido","id":"5faecefb-0073-464d-932a-895056ba9198","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"invoice_file","type":"file","value":null}]},"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/invoice","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Envia o XML da NF-e de um pedido aceito e importado no ERP.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Pedido aceito no Polling 1, via API ou painel.</li>\n<li>Pedido importado no ERP a partir de <code>ORDER_CREATED</code> no Polling 2.</li>\n<li>NF-e emitida com dados compatíveis com os detalhes do pedido.</li>\n</ul>\n<h2 id=\"body-multipartform-data\">Body multipart/form-data</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>invoice_file</code></td>\n<td>file</td>\n<td>Sim</td>\n<td>Arquivo XML da NF-e</td>\n</tr>\n</tbody>\n</table>\n</div><p>Envie apenas XML. PDF não é aceito neste endpoint.</p>\n<h2 id=\"validações-relevantes\">Validações relevantes</h2>\n<ul>\n<li>CEP do destinatário na NF-e deve ser igual ao CEP de <code>invoice_address</code> nos detalhes do pedido.</li>\n<li>CFOP deve ser compatível com <code>invoice_allowed</code>.</li>\n<li>O campo multipart deve se chamar exatamente <code>invoice_file</code>.</li>\n</ul>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL/hubs/$HUB_UUID/orders/$ORDER_UUID/invoice\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\" \\\n  -F \"invoice_file=@/caminho/nota.xml\"\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p>Reenvio do mesmo XML é idempotente e seguro em caso de timeout ou falha temporária antes da confirmação.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n","urlObject":{"path":["hubs",":hub_uuid","orders",":order_uuid","invoice"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"","key":"hub_uuid"},{"description":{"content":"<p>UUID do pedido</p>\n","type":"text/plain"},"type":"any","value":"","key":"order_uuid"}]}},"response":[{"id":"6f0604da-e921-443b-b32f-10da1e381075","name":"[200] Enviar nota fiscal para o pedido","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"invoice_file","type":"file","src":[]}]},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/invoice","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","invoice"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"22"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"8"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"8"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:37:39 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"1261"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"c3d55a45ab449b4958b37255173f7c63"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": true,\n        \"message\": \"Invoice set successfully\"\n    }\n}"},{"id":"0cc038b9-1e25-42d4-b22e-097a47e3110a","name":"[422] Enviar nota fiscal para o pedido","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"invoice_file","type":"file","src":[]}]},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/invoice","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","invoice"],"variable":[{"key":"hub_uuid","value":"b6f2eefa-da34-4daa-ae2b-98c3bd7b29c2"},{"key":"order_uuid","value":"71402839-ecb5-4ee0-b73a-331e7bef74f5"}]}},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"RateLimit-Reset","value":"21"},{"key":"RateLimit-Limit","value":"10"},{"key":"X-RateLimit-Remaining-Minute","value":"9"},{"key":"X-RateLimit-Limit-Minute","value":"10"},{"key":"RateLimit-Remaining","value":"9"},{"key":"Host","value":"api.staging.hubii.co"},{"key":"X-Powered-By","value":"PHP/8.1.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Thu, 21 Nov 2024 14:35:40 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Server","value":"kong/3.8.0"},{"key":"X-Kong-Upstream-Latency","value":"258"},{"key":"X-Kong-Proxy-Latency","value":"3"},{"key":"Via","value":"1.1 kong/3.8.0"},{"key":"X-Kong-Request-Id","value":"26954260301cc67ab1c5237a1a2f3d24"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": false,\n        \"error\": \"O Cep do comprador da nota fiscal precisa ser a mesma da venda. Cep Nota: 00000000 Cep Venda: 00000001\"\n    }\n}"}],"_postman_id":"5faecefb-0073-464d-932a-895056ba9198"},{"name":"Download etiqueta de despacho de pedido","id":"e6f5b301-9fff-481b-ba8f-7b8ac144b977","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/label","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Retorna uma URL temporária para baixar a etiqueta de envio em PDF.</p>\n<h2 id=\"quando-chamar\">Quando chamar</h2>\n<p>Chame somente após receber <code>SHIPPING_LABEL_AVAILABLE</code> no Polling 2 para o pedido.</p>\n<blockquote>\n<p>A necessidade de etiqueta depende do pedido. Não assuma apenas pelo canal de venda.</p>\n</blockquote>\n<h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>UUID do hub</td>\n</tr>\n<tr>\n<td><code>order_uuid</code></td>\n<td>UUID do pedido</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/hubs/$HUB_UUID/orders/$ORDER_UUID/label\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\"\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir. A URL é temporária; solicite uma nova URL quando expirar.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n","urlObject":{"path":["hubs",":hub_uuid","orders",":order_uuid","label"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"","key":"hub_uuid"},{"description":{"content":"<p>UUID do pedido</p>\n","type":"text/plain"},"type":"any","value":"","key":"order_uuid"}]}},"response":[{"id":"0554fca7-405f-4102-b984-d1e4e2d89754","name":"Download etiqueta de despacho de pedido","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/:order_uuid/label","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders",":order_uuid","label"],"variable":[{"key":"hub_uuid","value":"c6a276b6-ad59-498f-83b6-ee12234a513f"},{"key":"order_uuid","value":"f8aabd66-ee42-4e9e-9415-1ff0935610d7"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":":status","value":"200"},{"key":"date","value":"Tue, 17 Mar 2026 18:41:32 GMT"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"x-ratelimit-remaining-minute","value":"299"},{"key":"x-ratelimit-limit-minute","value":"300"},{"key":"ratelimit-remaining","value":"299"},{"key":"ratelimit-reset","value":"29"},{"key":"ratelimit-limit","value":"300"},{"key":"server","value":"cloudflare"},{"key":"vary","value":"Accept-Encoding"},{"key":"x-powered-by","value":"PHP/8.2.29"},{"key":"cache-control","value":"no-cache, private"},{"key":"x-ratelimit-limit","value":"60"},{"key":"x-ratelimit-remaining","value":"59"},{"key":"access-control-allow-origin","value":"*"},{"key":"x-frame-options","value":"SAMEORIGIN"},{"key":"x-xss-protection","value":"1; mode=block"},{"key":"x-content-type-options","value":"nosniff"},{"key":"content-encoding","value":"gzip"},{"key":"x-kong-upstream-latency","value":"1034"},{"key":"x-kong-proxy-latency","value":"3"},{"key":"via","value":"1.1 kong/3.9.1"},{"key":"x-kong-request-id","value":"ac03a46cadc78b492b0a6e6824cf4256"},{"key":"cf-cache-status","value":"DYNAMIC"},{"key":"nel","value":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}"},{"key":"report-to","value":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=T70xSrp7pP4Y7w%2FH0wTkIVjUNoRYDx3zQsZ1sVXmlPU2%2BcNS6tidu5whD%2FcFLUvGw3fvFewho9POIzCSBHWivuhuDk5xUwO%2FSX6b5fvuluHGnxgSpyNEe0P72UUKqc4%3D\"}]}"},{"key":"cf-ray","value":"9dde21dbfd0ae6c8-GIG"}],"cookie":[],"responseTime":null,"body":"{\n    \"url\": \"https://etiquetas-hubii.s3.amazonaws.com/precode-0000-000000.pdf?X-Amz-Expires=300&X-Amz-Signature=REDACTED\"\n}"}],"_postman_id":"e6f5b301-9fff-481b-ba8f-7b8ac144b977"}],"id":"c723d121-037a-48b8-b8d0-e0090ceee44a","_postman_id":"c723d121-037a-48b8-b8d0-e0090ceee44a","description":"","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"06 — Envio de estoque","item":[{"name":"Enviar estoque do hub (upsert em lote)","id":"f58d4b1c-8bae-bda8-752f-05a169250da7","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":"https://api.staging.hubii.co/hubs/:hub_uuid/products/stock","description":"<p>Envia o estoque atual de até <strong>500 produtos</strong> de um hub. A operação é <strong>upsert</strong>: cria o item se ele não existir para o hub (chave: hub + <code>external_id</code>) ou atualiza o existente.</p>\n<h3 id=\"parâmetros-de-rota\">Parâmetros de rota</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>string (UUID v4)</td>\n<td>Sim</td>\n<td>UUID do hub, retornado em <code>GET /hubs</code>. UUID inválido retorna <code>400</code>; hub inexistente retorna <code>404</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"body-json\">Body (JSON)</h3>\n<p><strong>Campos obrigatórios</strong> — todos os campos de cada item de <code>items</code> são obrigatórios; <strong>não há campos opcionais</strong> neste endpoint.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Regras</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items</code></td>\n<td>array</td>\n<td>Obrigatório. Máx. 500 itens; <code>external_id</code> único dentro do array</td>\n</tr>\n<tr>\n<td><code>items[].ean</code></td>\n<td>string</td>\n<td>Obrigatório, não vazio (espaços nas bordas são removidos). Código de barras do produto; usado para vincular ao catálogo Hubii</td>\n</tr>\n<tr>\n<td><code>items[].sku</code></td>\n<td>string</td>\n<td>Obrigatório, não vazio, máx. <strong>100 caracteres</strong></td>\n</tr>\n<tr>\n<td><code>items[].external_id</code></td>\n<td>string</td>\n<td>Obrigatório, não vazio, <strong>único no array</strong>. Identificador do produto no sistema do parceiro; é a chave de upsert</td>\n</tr>\n<tr>\n<td><code>items[].external_name</code></td>\n<td>string</td>\n<td>Obrigatório, não vazio. Nome do produto no sistema do parceiro</td>\n</tr>\n<tr>\n<td><code>items[].quantity</code></td>\n<td>integer</td>\n<td>Obrigatório, inteiro <strong>≥ 0</strong>. Quantidade absoluta em estoque</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"resposta-200\">Resposta <code>200</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": true,\n  \"created\": 2,\n  \"updated\": 1,\n  \"failed\": []\n}\n\n</code></pre>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>success</code></td>\n<td><code>true</code> somente quando nenhum item falhou</td>\n</tr>\n<tr>\n<td><code>created</code></td>\n<td>Quantidade de itens criados</td>\n</tr>\n<tr>\n<td><code>updated</code></td>\n<td>Quantidade de itens atualizados</td>\n</tr>\n<tr>\n<td><code>failed</code></td>\n<td>Itens que falharam: <code>[{ \"externalId\": \"...\", \"reason\": \"...\" }]</code>. Reenvie apenas estes itens</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"erros\">Erros</h3>\n<ul>\n<li><p><code>400</code> — validação do body ou <code>hub_uuid</code> fora do formato UUID v4.</p>\n</li>\n<li><p><code>404</code> — <code>Hub not found</code>.</p>\n</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}},"urlObject":{"path":["hubs",":hub_uuid","products","stock"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"type":"any","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5","key":"hub_uuid"}]}},"response":[{"id":"0a3b7297-bb17-65c6-0563-c4b45d343b19","name":"200 — Sucesso (todos os itens processados)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/products/stock","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","products","stock"],"variable":[{"key":"hub_uuid","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5"}]},"description":"Envia o estoque atual de até **500 produtos** de um hub. A operação é **upsert**: cria o item se ele não existir para o hub (chave: hub + `external_id`) ou atualiza o existente.\n\n### Parâmetros de rota\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `hub_uuid` | string (UUID v4) | Sim | UUID do hub, retornado em `GET /hubs`. UUID inválido retorna `400`; hub inexistente retorna `404` |\n\n### Body (JSON)\n\n**Campos obrigatórios** — todos os campos de cada item de `items` são obrigatórios; **não há campos opcionais** neste endpoint.\n\n| Campo | Tipo | Regras |\n| --- | --- | --- |\n| `items` | array | Obrigatório. Máx. 500 itens; `external_id` único dentro do array |\n| `items[].ean` | string | Obrigatório, não vazio (espaços nas bordas são removidos). Código de barras do produto; usado para vincular ao catálogo Hubii |\n| `items[].sku` | string | Obrigatório, não vazio, máx. **100 caracteres** |\n| `items[].external_id` | string | Obrigatório, não vazio, **único no array**. Identificador do produto no sistema do parceiro; é a chave de upsert |\n| `items[].external_name` | string | Obrigatório, não vazio. Nome do produto no sistema do parceiro |\n| `items[].quantity` | integer | Obrigatório, inteiro **≥ 0**. Quantidade absoluta em estoque |\n\n### Resposta `200`\n\n``` json\n{\n  \"success\": true,\n  \"created\": 2,\n  \"updated\": 1,\n  \"failed\": []\n}\n\n ```\n\n| Campo | Descrição |\n| --- | --- |\n| `success` | `true` somente quando nenhum item falhou |\n| `created` | Quantidade de itens criados |\n| `updated` | Quantidade de itens atualizados |\n| `failed` | Itens que falharam: `[{ \"externalId\": \"...\", \"reason\": \"...\" }]`. Reenvie apenas estes itens |\n\n### Erros\n\n- `400` — validação do body ou `hub_uuid` fora do formato UUID v4.\n    \n- `404` — `Hub not found`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json; charset=utf-8","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"created\": 1,\n  \"updated\": 1,\n  \"failed\": []\n}"},{"id":"4fbc4ed9-4409-8df5-3020-65d8d543c937","name":"200 — Sucesso parcial (itens em failed)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/products/stock","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","products","stock"],"variable":[{"key":"hub_uuid","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5"}]},"description":"Envia o estoque atual de até **500 produtos** de um hub. A operação é **upsert**: cria o item se ele não existir para o hub (chave: hub + `external_id`) ou atualiza o existente.\n\n### Parâmetros de rota\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `hub_uuid` | string (UUID v4) | Sim | UUID do hub, retornado em `GET /hubs`. UUID inválido retorna `400`; hub inexistente retorna `404` |\n\n### Body (JSON)\n\n**Campos obrigatórios** — todos os campos de cada item de `items` são obrigatórios; **não há campos opcionais** neste endpoint.\n\n| Campo | Tipo | Regras |\n| --- | --- | --- |\n| `items` | array | Obrigatório. Máx. 500 itens; `external_id` único dentro do array |\n| `items[].ean` | string | Obrigatório, não vazio (espaços nas bordas são removidos). Código de barras do produto; usado para vincular ao catálogo Hubii |\n| `items[].sku` | string | Obrigatório, não vazio, máx. **100 caracteres** |\n| `items[].external_id` | string | Obrigatório, não vazio, **único no array**. Identificador do produto no sistema do parceiro; é a chave de upsert |\n| `items[].external_name` | string | Obrigatório, não vazio. Nome do produto no sistema do parceiro |\n| `items[].quantity` | integer | Obrigatório, inteiro **≥ 0**. Quantidade absoluta em estoque |\n\n### Resposta `200`\n\n``` json\n{\n  \"success\": true,\n  \"created\": 2,\n  \"updated\": 1,\n  \"failed\": []\n}\n\n ```\n\n| Campo | Descrição |\n| --- | --- |\n| `success` | `true` somente quando nenhum item falhou |\n| `created` | Quantidade de itens criados |\n| `updated` | Quantidade de itens atualizados |\n| `failed` | Itens que falharam: `[{ \"externalId\": \"...\", \"reason\": \"...\" }]`. Reenvie apenas estes itens |\n\n### Erros\n\n- `400` — validação do body ou `hub_uuid` fora do formato UUID v4.\n    \n- `404` — `Hub not found`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json; charset=utf-8","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"created\": 1,\n  \"updated\": 0,\n  \"failed\": [\n    {\n      \"externalId\": \"PROD-456\",\n      \"reason\": \"mensagem descrevendo a causa da falha do item\"\n    }\n  ]\n}"},{"id":"fe8aba0b-7da3-517a-fb65-6f921db00bd8","name":"400 — Erro de validação","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/products/stock","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","products","stock"],"variable":[{"key":"hub_uuid","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5"}]},"description":"Envia o estoque atual de até **500 produtos** de um hub. A operação é **upsert**: cria o item se ele não existir para o hub (chave: hub + `external_id`) ou atualiza o existente.\n\n### Parâmetros de rota\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `hub_uuid` | string (UUID v4) | Sim | UUID do hub, retornado em `GET /hubs`. UUID inválido retorna `400`; hub inexistente retorna `404` |\n\n### Body (JSON)\n\n**Campos obrigatórios** — todos os campos de cada item de `items` são obrigatórios; **não há campos opcionais** neste endpoint.\n\n| Campo | Tipo | Regras |\n| --- | --- | --- |\n| `items` | array | Obrigatório. Máx. 500 itens; `external_id` único dentro do array |\n| `items[].ean` | string | Obrigatório, não vazio (espaços nas bordas são removidos). Código de barras do produto; usado para vincular ao catálogo Hubii |\n| `items[].sku` | string | Obrigatório, não vazio, máx. **100 caracteres** |\n| `items[].external_id` | string | Obrigatório, não vazio, **único no array**. Identificador do produto no sistema do parceiro; é a chave de upsert |\n| `items[].external_name` | string | Obrigatório, não vazio. Nome do produto no sistema do parceiro |\n| `items[].quantity` | integer | Obrigatório, inteiro **≥ 0**. Quantidade absoluta em estoque |\n\n### Resposta `200`\n\n``` json\n{\n  \"success\": true,\n  \"created\": 2,\n  \"updated\": 1,\n  \"failed\": []\n}\n\n ```\n\n| Campo | Descrição |\n| --- | --- |\n| `success` | `true` somente quando nenhum item falhou |\n| `created` | Quantidade de itens criados |\n| `updated` | Quantidade de itens atualizados |\n| `failed` | Itens que falharam: `[{ \"externalId\": \"...\", \"reason\": \"...\" }]`. Reenvie apenas estes itens |\n\n### Erros\n\n- `400` — validação do body ou `hub_uuid` fora do formato UUID v4.\n    \n- `404` — `Hub not found`."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"value":"application/json; charset=utf-8","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"statusCode\": 400,\n  \"error\": \"Bad Request\",\n  \"message\": [\n    \"items.0.sku must be shorter than or equal to 100 characters\",\n    \"items.1.quantity must not be less than 0\",\n    \"items's elements must be unique\"\n  ]\n}"},{"id":"0f8268a3-657c-a886-1b50-b92ee9f9b626","name":"404 — Hub não encontrado","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/products/stock","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","products","stock"],"variable":[{"key":"hub_uuid","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5"}]},"description":"Envia o estoque atual de até **500 produtos** de um hub. A operação é **upsert**: cria o item se ele não existir para o hub (chave: hub + `external_id`) ou atualiza o existente.\n\n### Parâmetros de rota\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `hub_uuid` | string (UUID v4) | Sim | UUID do hub, retornado em `GET /hubs`. UUID inválido retorna `400`; hub inexistente retorna `404` |\n\n### Body (JSON)\n\n**Campos obrigatórios** — todos os campos de cada item de `items` são obrigatórios; **não há campos opcionais** neste endpoint.\n\n| Campo | Tipo | Regras |\n| --- | --- | --- |\n| `items` | array | Obrigatório. Máx. 500 itens; `external_id` único dentro do array |\n| `items[].ean` | string | Obrigatório, não vazio (espaços nas bordas são removidos). Código de barras do produto; usado para vincular ao catálogo Hubii |\n| `items[].sku` | string | Obrigatório, não vazio, máx. **100 caracteres** |\n| `items[].external_id` | string | Obrigatório, não vazio, **único no array**. Identificador do produto no sistema do parceiro; é a chave de upsert |\n| `items[].external_name` | string | Obrigatório, não vazio. Nome do produto no sistema do parceiro |\n| `items[].quantity` | integer | Obrigatório, inteiro **≥ 0**. Quantidade absoluta em estoque |\n\n### Resposta `200`\n\n``` json\n{\n  \"success\": true,\n  \"created\": 2,\n  \"updated\": 1,\n  \"failed\": []\n}\n\n ```\n\n| Campo | Descrição |\n| --- | --- |\n| `success` | `true` somente quando nenhum item falhou |\n| `created` | Quantidade de itens criados |\n| `updated` | Quantidade de itens atualizados |\n| `failed` | Itens que falharam: `[{ \"externalId\": \"...\", \"reason\": \"...\" }]`. Reenvie apenas estes itens |\n\n### Erros\n\n- `400` — validação do body ou `hub_uuid` fora do formato UUID v4.\n    \n- `404` — `Hub not found`."},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"value":"application/json; charset=utf-8","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"statusCode\": 404,\n  \"error\": \"Not Found\",\n  \"message\": \"Hub not found\"\n}"}],"_postman_id":"f58d4b1c-8bae-bda8-752f-05a169250da7"}],"id":"3006a5b3-b4c4-1939-0010-69ad2567348f","description":"<h2 id=\"sobre-o-envio-de-estoque\">Sobre o envio de estoque</h2>\n<p>Esta seção documenta o endpoint de <strong>envio de estoque</strong> (<code>hub-stock-service</code>), usado pelo parceiro (ERP/PDV/WMS) para informar à Hubii o estoque atual dos produtos de cada hub.</p>\n<h3 id=\"modo-de-funcionamento\">Modo de funcionamento</h3>\n<ul>\n<li><p>A operação é um <strong>upsert em lote</strong>: para cada item enviado, a Hubii cria o registro de estoque se ele ainda não existir para o hub, ou atualiza o registro existente.</p>\n</li>\n<li><p>A chave de identificação de cada item é o par <strong>(hub,</strong> <strong><code>external_id</code>****)</strong> — o <code>external_id</code> é o identificador do produto no sistema do parceiro. Envie sempre o mesmo <code>external_id</code> para o mesmo produto.</p>\n</li>\n<li><p>O vínculo com o catálogo Hubii é feito automaticamente pelo <strong><code>ean</code></strong>: se houver um produto no catálogo com aquele EAN, o item é associado a ele; se não houver, o item é gravado mesmo assim, sem vínculo.</p>\n</li>\n<li><p>O processamento é <strong>parcial e tolerante a falhas</strong>: se um item falhar, os demais são processados normalmente. A resposta informa quantos itens foram criados (<code>created</code>), atualizados (<code>updated</code>) e quais falharam (<code>failed</code>, com <code>externalId</code> e <code>reason</code>).</p>\n</li>\n<li><p>A quantidade enviada é <strong>absoluta</strong> (snapshot do estoque atual), não um delta.</p>\n</li>\n</ul>\n<h3 id=\"regras-do-lote\">Regras do lote</h3>\n<ul>\n<li><p>Máximo de <strong>500 itens</strong> por requisição.</p>\n</li>\n<li><p><code>external_id</code> <strong>não pode se repetir</strong> dentro do mesmo array <code>items</code>.</p>\n</li>\n<li><p>Para catálogos maiores que 500 itens, divida em múltiplas requisições.</p>\n</li>\n</ul>\n<h3 id=\"erros\">Erros</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Código</th>\n<th>Causa</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td><code>hub_uuid</code> não é um UUID v4 válido, ou body fora das regras de validação (campo ausente/vazio, <code>quantity</code> negativa ou não inteira, mais de 500 itens, <code>external_id</code> duplicado)</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Hub não encontrado</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"fluxo-recomendado\">Fluxo recomendado</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /hubs\n  ↓ obter hub_uuid\nPOST /stocking/{hub_uuid} { items: [...] }\n  ↓ ler created / updated / failed\nreprocessar apenas os itens em failed\n\n</code></pre>\n","_postman_id":"3006a5b3-b4c4-1939-0010-69ad2567348f","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"07 — Conciliação financeira","item":[{"name":"Valores a receber","id":"1b226982-3399-07c8-3ec2-d4fb3a17f943","request":{"method":"GET","header":[],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/to-receive?filter=all&page=1&per_page=10","description":"<p>Retorna a visão consolidada dos valores <strong>a receber</strong> do hub, separando pedidos ainda pendentes de processamento e pedidos já processados com data de repasse agendada.</p>\n<h2 id=\"parâmetros-de-rota\">Parâmetros de rota</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>uuid</td>\n<td>UUID do hub retornado em <code>GET /hubs</code>. Deve pertencer à sua conta</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-params\">Query params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filter</code></td>\n<td>string</td>\n<td>Não</td>\n<td><code>pending</code> (somente pendentes), <code>processed</code> (somente processados) ou <code>all</code> (padrão, retorna ambos)</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>inteiro</td>\n<td>Não</td>\n<td>Página da listagem de processados. Padrão: <code>1</code></td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>inteiro</td>\n<td>Não</td>\n<td>Itens por página (1 a 100). Padrão: <code>10</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-da-resposta-data\">Campos da resposta (<code>data</code>)</h2>\n<h3 id=\"financial--resumo-geral\"><code>financial</code> — resumo geral</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>delivered</code></td>\n<td>decimal</td>\n<td>Valor a receber de pedidos já entregues (com data de repasse agendada)</td>\n</tr>\n<tr>\n<td><code>delivering</code></td>\n<td>decimal</td>\n<td>Valor a receber de pedidos ainda em andamento (sem data de repasse)</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>decimal</td>\n<td>Soma de <code>delivered</code> + <code>delivering</code></td>\n</tr>\n<tr>\n<td><code>delivered_orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade de pedidos entregues</td>\n</tr>\n<tr>\n<td><code>delivering_orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade de pedidos em andamento</td>\n</tr>\n<tr>\n<td><code>total_orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade total de pedidos</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"pending--pedidos-sem-data-de-repasse-presente-quando-filter--pending-ou-all\"><code>pending</code> — pedidos sem data de repasse (presente quando <code>filter</code> = <code>pending</code> ou <code>all</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>due_date</code></td>\n<td>string</td>\n<td>Sempre <code>\"-\"</code>, pois ainda não há data de repasse definida</td>\n</tr>\n<tr>\n<td><code>orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade de pedidos no grupo</td>\n</tr>\n<tr>\n<td><code>gross_value</code></td>\n<td>decimal</td>\n<td>Valor bruto (subtotal + custo de entrega − taxa de frete)</td>\n</tr>\n<tr>\n<td><code>anticipation_fee</code></td>\n<td>decimal</td>\n<td>Taxa de antecipação descontada</td>\n</tr>\n<tr>\n<td><code>to_receive</code></td>\n<td>decimal</td>\n<td>Valor líquido a receber</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"processed--pedidos-com-repasse-agendado-agrupados-por-data-presente-quando-filter--processed-ou-all\"><code>processed</code> — pedidos com repasse agendado, agrupados por data (presente quando <code>filter</code> = <code>processed</code> ou <code>all</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>orders[]</code></td>\n<td>array</td>\n<td>Grupos por data de repasse, cada um com <code>due_date</code> (<code>YYYY-MM-DD</code>), <code>orders_amount</code>, <code>gross_value</code>, <code>anticipation_fee</code> e <code>to_receive</code></td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>inteiro</td>\n<td>Itens por página</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>inteiro</td>\n<td>Total de grupos (datas)</td>\n</tr>\n<tr>\n<td><code>last_page</code></td>\n<td>inteiro</td>\n<td>Última página disponível</td>\n</tr>\n<tr>\n<td><code>current_page</code></td>\n<td>inteiro</td>\n<td>Página atual</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}},"urlObject":{"path":["hubs",":hub_uuid","financial","to-receive"],"host":["https://api.staging.hubii.co"],"query":[{"description":{"content":"<p>pending, processed ou all (padrão: all)</p>\n","type":"text/plain"},"key":"filter","value":"all"},{"description":{"content":"<p>Página da listagem de processados (padrão: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Itens por página, de 1 a 100 (padrão: 10)</p>\n","type":"text/plain"},"key":"per_page","value":"10"}],"variable":[{"type":"any","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5","key":"hub_uuid"}]}},"response":[{"id":"990f1972-7e66-e066-8db3-c3a490a93ee4","name":"200 — Sucesso","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/to-receive?filter=all&page=1&per_page=10","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","financial","to-receive"],"query":[{"key":"filter","value":"all","description":"pending, processed ou all (padrão: all)"},{"key":"page","value":"1","description":"Página da listagem de processados (padrão: 1)"},{"key":"per_page","value":"10","description":"Itens por página, de 1 a 100 (padrão: 10)"}],"variable":[{"key":"hub_uuid","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5"}]},"description":"Retorna a visão consolidada dos valores **a receber** do hub, separando pedidos ainda pendentes de processamento e pedidos já processados com data de repasse agendada.\n\n## Parâmetros de rota\n\n| Parâmetro | Tipo | Descrição |\n| --- | --- | --- |\n| `hub_uuid` | uuid | UUID do hub retornado em `GET /hubs`. Deve pertencer à sua conta |\n\n## Query params\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `filter` | string | Não | `pending` (somente pendentes), `processed` (somente processados) ou `all` (padrão, retorna ambos) |\n| `page` | inteiro | Não | Página da listagem de processados. Padrão: `1` |\n| `per_page` | inteiro | Não | Itens por página (1 a 100). Padrão: `10` |\n\n## Campos da resposta (`data`)\n\n### `financial` — resumo geral\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `delivered` | decimal | Valor a receber de pedidos já entregues (com data de repasse agendada) |\n| `delivering` | decimal | Valor a receber de pedidos ainda em andamento (sem data de repasse) |\n| `total` | decimal | Soma de `delivered` + `delivering` |\n| `delivered_orders_amount` | inteiro | Quantidade de pedidos entregues |\n| `delivering_orders_amount` | inteiro | Quantidade de pedidos em andamento |\n| `total_orders_amount` | inteiro | Quantidade total de pedidos |\n\n### `pending` — pedidos sem data de repasse (presente quando `filter` = `pending` ou `all`)\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `due_date` | string | Sempre `\"-\"`, pois ainda não há data de repasse definida |\n| `orders_amount` | inteiro | Quantidade de pedidos no grupo |\n| `gross_value` | decimal | Valor bruto (subtotal + custo de entrega − taxa de frete) |\n| `anticipation_fee` | decimal | Taxa de antecipação descontada |\n| `to_receive` | decimal | Valor líquido a receber |\n\n### `processed` — pedidos com repasse agendado, agrupados por data (presente quando `filter` = `processed` ou `all`)\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `orders[]` | array | Grupos por data de repasse, cada um com `due_date` (`YYYY-MM-DD`), `orders_amount`, `gross_value`, `anticipation_fee` e `to_receive` |\n| `per_page` | inteiro | Itens por página |\n| `total` | inteiro | Total de grupos (datas) |\n| `last_page` | inteiro | Última página disponível |\n| `current_page` | inteiro | Página atual |"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"financial\": {\n            \"delivered\": 1520.75,\n            \"delivering\": 830.4,\n            \"total\": 2351.15,\n            \"delivering_orders_amount\": 12,\n            \"delivered_orders_amount\": 25,\n            \"total_orders_amount\": 37\n        },\n        \"pending\": {\n            \"due_date\": \"-\",\n            \"orders_amount\": 12,\n            \"gross_value\": 905.1,\n            \"anticipation_fee\": 74.7,\n            \"to_receive\": 830.4\n        },\n        \"processed\": {\n            \"orders\": [\n                {\n                    \"due_date\": \"2026-08-14\",\n                    \"orders_amount\": 10,\n                    \"gross_value\": 650.3,\n                    \"anticipation_fee\": 48.25,\n                    \"to_receive\": 602.05\n                },\n                {\n                    \"due_date\": \"2026-08-15\",\n                    \"orders_amount\": 15,\n                    \"gross_value\": 990.8,\n                    \"anticipation_fee\": 72.1,\n                    \"to_receive\": 918.7\n                }\n            ],\n            \"per_page\": 10,\n            \"total\": 2,\n            \"last_page\": 1,\n            \"current_page\": 1\n        }\n    }\n}"},{"id":"98df7866-539b-08da-3ad5-057e1d80c6da","name":"422 — Erro ao consultar dados","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/to-receive?filter=all&page=1&per_page=10","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","financial","to-receive"],"query":[{"key":"filter","value":"all","description":"pending, processed ou all (padrão: all)"},{"key":"page","value":"1","description":"Página da listagem de processados (padrão: 1)"},{"key":"per_page","value":"10","description":"Itens por página, de 1 a 100 (padrão: 10)"}],"variable":[{"key":"hub_uuid","value":"45e2a1cc-509b-4e33-bdc5-8ed255caf8a5"}]},"description":"Retorna a visão consolidada dos valores **a receber** do hub, separando pedidos ainda pendentes de processamento e pedidos já processados com data de repasse agendada.\n\n## Parâmetros de rota\n\n| Parâmetro | Tipo | Descrição |\n| --- | --- | --- |\n| `hub_uuid` | uuid | UUID do hub retornado em `GET /hubs`. Deve pertencer à sua conta |\n\n## Query params\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `filter` | string | Não | `pending` (somente pendentes), `processed` (somente processados) ou `all` (padrão, retorna ambos) |\n| `page` | inteiro | Não | Página da listagem de processados. Padrão: `1` |\n| `per_page` | inteiro | Não | Itens por página (1 a 100). Padrão: `10` |\n\n## Campos da resposta (`data`)\n\n### `financial` — resumo geral\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `delivered` | decimal | Valor a receber de pedidos já entregues (com data de repasse agendada) |\n| `delivering` | decimal | Valor a receber de pedidos ainda em andamento (sem data de repasse) |\n| `total` | decimal | Soma de `delivered` + `delivering` |\n| `delivered_orders_amount` | inteiro | Quantidade de pedidos entregues |\n| `delivering_orders_amount` | inteiro | Quantidade de pedidos em andamento |\n| `total_orders_amount` | inteiro | Quantidade total de pedidos |\n\n### `pending` — pedidos sem data de repasse (presente quando `filter` = `pending` ou `all`)\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `due_date` | string | Sempre `\"-\"`, pois ainda não há data de repasse definida |\n| `orders_amount` | inteiro | Quantidade de pedidos no grupo |\n| `gross_value` | decimal | Valor bruto (subtotal + custo de entrega − taxa de frete) |\n| `anticipation_fee` | decimal | Taxa de antecipação descontada |\n| `to_receive` | decimal | Valor líquido a receber |\n\n### `processed` — pedidos com repasse agendado, agrupados por data (presente quando `filter` = `processed` ou `all`)\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `orders[]` | array | Grupos por data de repasse, cada um com `due_date` (`YYYY-MM-DD`), `orders_amount`, `gross_value`, `anticipation_fee` e `to_receive` |\n| `per_page` | inteiro | Itens por página |\n| `total` | inteiro | Total de grupos (datas) |\n| `last_page` | inteiro | Última página disponível |\n| `current_page` | inteiro | Página atual |"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": false,\n        \"error\": \"Unable to fetch financial data.\"\n    }\n}"}],"_postman_id":"1b226982-3399-07c8-3ec2-d4fb3a17f943"},{"name":"Valores recebidos","id":"9ef8d6ff-973c-c3fd-e62b-4f4ea8fb7dfd","request":{"method":"GET","header":[],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/received?last_days=30&page=1&per_page=10","description":"<p>Retorna os valores <strong>já repassados</strong> ao hub nos últimos dias, agrupados por data de repasse. Considera apenas pedidos entregues (ou extraviados) cujo repasse já foi processado.</p>\n<h2 id=\"parâmetros-de-rota\">Parâmetros de rota</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>uuid</td>\n<td>UUID do hub retornado em <code>GET /hubs</code>. Deve pertencer à sua conta</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-params\">Query params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>last_days</code></td>\n<td>inteiro</td>\n<td>Não</td>\n<td>Janela de dias a considerar, de 1 a 90. Padrão: <code>30</code></td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>inteiro</td>\n<td>Não</td>\n<td>Página da listagem. Padrão: <code>1</code></td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>inteiro</td>\n<td>Não</td>\n<td>Itens por página (1 a 100). Padrão: <code>10</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-da-resposta-data\">Campos da resposta (<code>data</code>)</h2>\n<h3 id=\"financial--resumo-do-período\"><code>financial</code> — resumo do período</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade de pedidos com repasse concluído no período</td>\n</tr>\n<tr>\n<td><code>received</code></td>\n<td>decimal</td>\n<td>Valor total recebido no período</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"orders--repasses-agrupados-por-data\"><code>orders</code> — repasses agrupados por data</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data[]</code></td>\n<td>array</td>\n<td>Grupos por data de repasse</td>\n</tr>\n<tr>\n<td><code>data[].due_date</code></td>\n<td>string</td>\n<td>Data do repasse (<code>YYYY-MM-DD</code>)</td>\n</tr>\n<tr>\n<td><code>data[].orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade de pedidos repassados na data</td>\n</tr>\n<tr>\n<td><code>data[].gross_value</code></td>\n<td>decimal</td>\n<td>Valor bruto (subtotal + custo de entrega − taxa de frete)</td>\n</tr>\n<tr>\n<td><code>data[].anticipation_fee</code></td>\n<td>decimal</td>\n<td>Taxa de antecipação descontada</td>\n</tr>\n<tr>\n<td><code>data[].to_receive</code></td>\n<td>decimal</td>\n<td>Valor líquido repassado</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>inteiro</td>\n<td>Itens por página</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>inteiro</td>\n<td>Total de grupos (datas)</td>\n</tr>\n<tr>\n<td><code>last_page</code></td>\n<td>inteiro</td>\n<td>Última página disponível</td>\n</tr>\n<tr>\n<td><code>current_page</code></td>\n<td>inteiro</td>\n<td>Página atual</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}},"urlObject":{"path":["hubs",":hub_uuid","financial","received"],"host":["https://api.staging.hubii.co"],"query":[{"description":{"content":"<p>Janela de dias a considerar, de 1 a 90 (padrão: 30)</p>\n","type":"text/plain"},"key":"last_days","value":"30"},{"description":{"content":"<p>Página da listagem (padrão: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Itens por página, de 1 a 100 (padrão: 10)</p>\n","type":"text/plain"},"key":"per_page","value":"10"}],"variable":[{"type":"any","value":"","key":"hub_uuid"}]}},"response":[{"id":"802496cc-4d3b-a156-5987-8033d092dd71","name":"200 — Sucesso","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/received?last_days=30&page=1&per_page=10","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","financial","received"],"query":[{"key":"last_days","value":"30","description":"Janela de dias a considerar, de 1 a 90 (padrão: 30)"},{"key":"page","value":"1","description":"Página da listagem (padrão: 1)"},{"key":"per_page","value":"10","description":"Itens por página, de 1 a 100 (padrão: 10)"}],"variable":[{"key":"hub_uuid","value":""}]},"description":"Retorna os valores **já repassados** ao hub nos últimos dias, agrupados por data de repasse. Considera apenas pedidos entregues (ou extraviados) cujo repasse já foi processado.\n\n## Parâmetros de rota\n\n| Parâmetro | Tipo | Descrição |\n| --- | --- | --- |\n| `hub_uuid` | uuid | UUID do hub retornado em `GET /hubs`. Deve pertencer à sua conta |\n\n## Query params\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `last_days` | inteiro | Não | Janela de dias a considerar, de 1 a 90. Padrão: `30` |\n| `page` | inteiro | Não | Página da listagem. Padrão: `1` |\n| `per_page` | inteiro | Não | Itens por página (1 a 100). Padrão: `10` |\n\n## Campos da resposta (`data`)\n\n### `financial` — resumo do período\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `orders_amount` | inteiro | Quantidade de pedidos com repasse concluído no período |\n| `received` | decimal | Valor total recebido no período |\n\n### `orders` — repasses agrupados por data\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `data[]` | array | Grupos por data de repasse |\n| `data[].due_date` | string | Data do repasse (`YYYY-MM-DD`) |\n| `data[].orders_amount` | inteiro | Quantidade de pedidos repassados na data |\n| `data[].gross_value` | decimal | Valor bruto (subtotal + custo de entrega − taxa de frete) |\n| `data[].anticipation_fee` | decimal | Taxa de antecipação descontada |\n| `data[].to_receive` | decimal | Valor líquido repassado |\n| `per_page` | inteiro | Itens por página |\n| `total` | inteiro | Total de grupos (datas) |\n| `last_page` | inteiro | Última página disponível |\n| `current_page` | inteiro | Página atual |"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"financial\": {\n            \"orders_amount\": 25,\n            \"received\": 2351.15\n        },\n        \"orders\": {\n            \"data\": [\n                {\n                    \"due_date\": \"2026-07-28\",\n                    \"orders_amount\": 10,\n                    \"gross_value\": 650.3,\n                    \"anticipation_fee\": 48.25,\n                    \"to_receive\": 602.05\n                },\n                {\n                    \"due_date\": \"2026-08-04\",\n                    \"orders_amount\": 15,\n                    \"gross_value\": 1868.55,\n                    \"anticipation_fee\": 119.45,\n                    \"to_receive\": 1749.1\n                }\n            ],\n            \"per_page\": 10,\n            \"total\": 2,\n            \"last_page\": 1,\n            \"current_page\": 1\n        }\n    }\n}"},{"id":"47f176de-09cb-434f-f7df-8d57dd7e1fc5","name":"422 — Erro ao consultar dados","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/received?last_days=30&page=1&per_page=10","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","financial","received"],"query":[{"key":"last_days","value":"30","description":"Janela de dias a considerar, de 1 a 90 (padrão: 30)"},{"key":"page","value":"1","description":"Página da listagem (padrão: 1)"},{"key":"per_page","value":"10","description":"Itens por página, de 1 a 100 (padrão: 10)"}],"variable":[{"key":"hub_uuid","value":""}]},"description":"Retorna os valores **já repassados** ao hub nos últimos dias, agrupados por data de repasse. Considera apenas pedidos entregues (ou extraviados) cujo repasse já foi processado.\n\n## Parâmetros de rota\n\n| Parâmetro | Tipo | Descrição |\n| --- | --- | --- |\n| `hub_uuid` | uuid | UUID do hub retornado em `GET /hubs`. Deve pertencer à sua conta |\n\n## Query params\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `last_days` | inteiro | Não | Janela de dias a considerar, de 1 a 90. Padrão: `30` |\n| `page` | inteiro | Não | Página da listagem. Padrão: `1` |\n| `per_page` | inteiro | Não | Itens por página (1 a 100). Padrão: `10` |\n\n## Campos da resposta (`data`)\n\n### `financial` — resumo do período\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `orders_amount` | inteiro | Quantidade de pedidos com repasse concluído no período |\n| `received` | decimal | Valor total recebido no período |\n\n### `orders` — repasses agrupados por data\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `data[]` | array | Grupos por data de repasse |\n| `data[].due_date` | string | Data do repasse (`YYYY-MM-DD`) |\n| `data[].orders_amount` | inteiro | Quantidade de pedidos repassados na data |\n| `data[].gross_value` | decimal | Valor bruto (subtotal + custo de entrega − taxa de frete) |\n| `data[].anticipation_fee` | decimal | Taxa de antecipação descontada |\n| `data[].to_receive` | decimal | Valor líquido repassado |\n| `per_page` | inteiro | Itens por página |\n| `total` | inteiro | Total de grupos (datas) |\n| `last_page` | inteiro | Última página disponível |\n| `current_page` | inteiro | Página atual |"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": false,\n        \"error\": \"Unable to fetch financial data.\"\n    }\n}"}],"_postman_id":"9ef8d6ff-973c-c3fd-e62b-4f4ea8fb7dfd"},{"name":"Detalhamento por data de repasse","id":"f900db14-e546-7698-236e-f86e39d32701","request":{"method":"GET","header":[],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/detailed/:date","description":"<p>Retorna o detalhamento <strong>pedido a pedido</strong> dos repasses de uma data específica, com valores brutos, taxas de antecipação e total líquido de cada pedido. Útil para conciliar o extrato bancário com os pedidos individuais.</p>\n<h2 id=\"parâmetros-de-rota\">Parâmetros de rota</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Tipo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hub_uuid</code></td>\n<td>uuid</td>\n<td>Sim</td>\n<td>UUID do hub retornado em <code>GET /hubs</code>. Deve pertencer à sua conta</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>string</td>\n<td>Sim</td>\n<td>Data de repasse a detalhar, no formato <code>YYYY-MM-DD</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-da-resposta-data\">Campos da resposta (<code>data</code>)</h2>\n<h3 id=\"financial--resumo-da-data\"><code>financial</code> — resumo da data</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>total_orders_amount</code></td>\n<td>inteiro</td>\n<td>Quantidade de pedidos com repasse na data</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>decimal</td>\n<td>Valor líquido total repassado na data</td>\n</tr>\n<tr>\n<td><code>gross_value</code></td>\n<td>decimal</td>\n<td>Valor bruto total (subtotal + custo de entrega − taxa de frete)</td>\n</tr>\n<tr>\n<td><code>anticipation_fee</code></td>\n<td>decimal</td>\n<td>Total de taxas de antecipação descontadas</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"orders--pedidos-individuais\"><code>orders[]</code> — pedidos individuais</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>uuid</code></td>\n<td>uuid</td>\n<td>UUID do pedido (mesmo usado nas demais rotas de pedidos)</td>\n</tr>\n<tr>\n<td><code>order_id</code></td>\n<td>inteiro</td>\n<td>Identificador numérico do pedido exibido no painel</td>\n</tr>\n<tr>\n<td><code>accepted_at</code></td>\n<td>string (ISO 8601)</td>\n<td>Data/hora em que o pedido foi aceito</td>\n</tr>\n<tr>\n<td><code>delivered_at</code></td>\n<td>string (ISO 8601)</td>\n<td>Data/hora da entrega. <code>null</code> se ainda não entregue</td>\n</tr>\n<tr>\n<td><code>gross_value</code></td>\n<td>decimal</td>\n<td>Valor bruto do pedido</td>\n</tr>\n<tr>\n<td><code>anticipation_tax</code></td>\n<td>decimal</td>\n<td>Percentual de antecipação aplicado</td>\n</tr>\n<tr>\n<td><code>anticipation_fee</code></td>\n<td>decimal</td>\n<td>Valor descontado pela antecipação</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>decimal</td>\n<td>Valor líquido repassado pelo pedido</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"paginação\">Paginação</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>per_page</code></td>\n<td>inteiro</td>\n<td>Itens por página</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>inteiro</td>\n<td>Total de pedidos na data</td>\n</tr>\n<tr>\n<td><code>last_page</code></td>\n<td>inteiro</td>\n<td>Última página disponível</td>\n</tr>\n<tr>\n<td><code>current_page</code></td>\n<td>inteiro</td>\n<td>Página atual</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}},"urlObject":{"path":["hubs",":hub_uuid","financial","detailed",":date"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"type":"any","value":"","key":"hub_uuid"}]}},"response":[{"id":"df3f62eb-3727-64c5-3f41-dd2e631e6fc0","name":"200 — Sucesso","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/detailed/:date","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","financial","detailed",":date"],"variable":[{"key":"hub_uuid","value":""}]},"description":"Retorna o detalhamento **pedido a pedido** dos repasses de uma data específica, com valores brutos, taxas de antecipação e total líquido de cada pedido. Útil para conciliar o extrato bancário com os pedidos individuais.\n\n## Parâmetros de rota\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `hub_uuid` | uuid | Sim | UUID do hub retornado em `GET /hubs`. Deve pertencer à sua conta |\n| `date` | string | Sim | Data de repasse a detalhar, no formato `YYYY-MM-DD` |\n\n## Campos da resposta (`data`)\n\n### `financial` — resumo da data\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `total_orders_amount` | inteiro | Quantidade de pedidos com repasse na data |\n| `total` | decimal | Valor líquido total repassado na data |\n| `gross_value` | decimal | Valor bruto total (subtotal + custo de entrega − taxa de frete) |\n| `anticipation_fee` | decimal | Total de taxas de antecipação descontadas |\n\n### `orders[]` — pedidos individuais\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `uuid` | uuid | UUID do pedido (mesmo usado nas demais rotas de pedidos) |\n| `order_id` | inteiro | Identificador numérico do pedido exibido no painel |\n| `accepted_at` | string (ISO 8601) | Data/hora em que o pedido foi aceito |\n| `delivered_at` | string (ISO 8601) | Data/hora da entrega. `null` se ainda não entregue |\n| `gross_value` | decimal | Valor bruto do pedido |\n| `anticipation_tax` | decimal | Percentual de antecipação aplicado |\n| `anticipation_fee` | decimal | Valor descontado pela antecipação |\n| `total` | decimal | Valor líquido repassado pelo pedido |\n\n### Paginação\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `per_page` | inteiro | Itens por página |\n| `total` | inteiro | Total de pedidos na data |\n| `last_page` | inteiro | Última página disponível |\n| `current_page` | inteiro | Página atual |"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"financial\": {\n            \"total_orders_amount\": 2,\n            \"total\": 1520.75,\n            \"gross_value\": 1620.4,\n            \"anticipation_fee\": 99.65\n        },\n        \"orders\": [\n            {\n                \"uuid\": \"9c1f2b7e-4a3d-4c8e-b1f0-2d5a6e7f8a90\",\n                \"order_id\": 45231,\n                \"accepted_at\": \"2026-08-05T10:12:33-03:00\",\n                \"delivered_at\": \"2026-08-06T15:40:12-03:00\",\n                \"gross_value\": 810.2,\n                \"anticipation_tax\": 2.5,\n                \"anticipation_fee\": 49.8,\n                \"total\": 760.4\n            },\n            {\n                \"uuid\": \"3e7a9d21-6b5c-4f0a-8e2d-1c4b5a6d7e8f\",\n                \"order_id\": 45248,\n                \"accepted_at\": \"2026-08-05T14:03:07-03:00\",\n                \"delivered_at\": \"2026-08-07T11:22:45-03:00\",\n                \"gross_value\": 810.2,\n                \"anticipation_tax\": 2.5,\n                \"anticipation_fee\": 49.85,\n                \"total\": 760.35\n            }\n        ],\n        \"per_page\": 10,\n        \"total\": 2,\n        \"last_page\": 1,\n        \"current_page\": 1\n    }\n}"},{"id":"0682f644-6e2e-8fb6-21c3-46ecb540ce42","name":"422 — Erro ao consultar dados","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/financial/detailed/:date","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","financial","detailed",":date"],"variable":[{"key":"hub_uuid","value":""}]},"description":"Retorna o detalhamento **pedido a pedido** dos repasses de uma data específica, com valores brutos, taxas de antecipação e total líquido de cada pedido. Útil para conciliar o extrato bancário com os pedidos individuais.\n\n## Parâmetros de rota\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `hub_uuid` | uuid | Sim | UUID do hub retornado em `GET /hubs`. Deve pertencer à sua conta |\n| `date` | string | Sim | Data de repasse a detalhar, no formato `YYYY-MM-DD` |\n\n## Campos da resposta (`data`)\n\n### `financial` — resumo da data\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `total_orders_amount` | inteiro | Quantidade de pedidos com repasse na data |\n| `total` | decimal | Valor líquido total repassado na data |\n| `gross_value` | decimal | Valor bruto total (subtotal + custo de entrega − taxa de frete) |\n| `anticipation_fee` | decimal | Total de taxas de antecipação descontadas |\n\n### `orders[]` — pedidos individuais\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `uuid` | uuid | UUID do pedido (mesmo usado nas demais rotas de pedidos) |\n| `order_id` | inteiro | Identificador numérico do pedido exibido no painel |\n| `accepted_at` | string (ISO 8601) | Data/hora em que o pedido foi aceito |\n| `delivered_at` | string (ISO 8601) | Data/hora da entrega. `null` se ainda não entregue |\n| `gross_value` | decimal | Valor bruto do pedido |\n| `anticipation_tax` | decimal | Percentual de antecipação aplicado |\n| `anticipation_fee` | decimal | Valor descontado pela antecipação |\n| `total` | decimal | Valor líquido repassado pelo pedido |\n\n### Paginação\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `per_page` | inteiro | Itens por página |\n| `total` | inteiro | Total de pedidos na data |\n| `last_page` | inteiro | Última página disponível |\n| `current_page` | inteiro | Página atual |"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"success\": false,\n        \"error\": \"Unable to fetch financial data.\"\n    }\n}"}],"_postman_id":"f900db14-e546-7698-236e-f86e39d32701"}],"id":"cbde5d29-b3a5-bd93-c372-8ca197a94f6d","description":"<h2 id=\"sobre-o-módulo-de-conciliação-financeira\">Sobre o módulo de conciliação financeira</h2>\n<p>Esta seção documenta os endpoints de consulta financeira dos repasses de pedidos do hub. Eles permitem que o parceiro concilie os valores a receber e já recebidos, agrupados por data de repasse, e consulte o detalhamento pedido a pedido de uma data específica.</p>\n<ul>\n<li><p><strong>A receber</strong> (<code>GET .../financial/to-receive</code>): visão consolidada dos valores pendentes de repasse, separados entre pedidos ainda em processamento (sem data de repasse definida) e pedidos já processados (com data de repasse agendada).</p>\n</li>\n<li><p><strong>Recebidos</strong> (<code>GET .../financial/received</code>): valores já repassados ao hub nos últimos dias, agrupados por data de repasse.</p>\n</li>\n<li><p><strong>Detalhado por data</strong> (<code>GET .../financial/detailed/{date}</code>): lista pedido a pedido os repasses de uma data específica, com valores brutos, taxas de antecipação e total.</p>\n</li>\n</ul>\n<h2 id=\"conceitos\">Conceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Termo</th>\n<th>Significado</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Valor bruto (<code>gross_value</code>)</td>\n<td>Subtotal dos itens + custo de entrega repassado − taxa de frete</td>\n</tr>\n<tr>\n<td>Taxa de antecipação (<code>anticipation_fee</code>)</td>\n<td>Valor descontado quando há antecipação de recebíveis</td>\n</tr>\n<tr>\n<td>Total / a receber (<code>to_receive</code>, <code>total</code>)</td>\n<td>Valor líquido efetivamente repassado ao hub</td>\n</tr>\n<tr>\n<td>Data de repasse (<code>due_date</code>)</td>\n<td>Data em que o valor é (ou será) transferido ao hub. <code>\"-\"</code> indica pedidos ainda sem data definida</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"autenticação-e-autorização\">Autenticação e autorização</h2>\n<p>Use o header <code>apikey</code> como nas demais rotas. O <code>hub_uuid</code> informado precisa pertencer à sua conta; caso contrário a requisição é rejeitada.</p>\n<h2 id=\"rate-limits\">Rate limits</h2>\n<p>Essas rotas seguem o grupo de <strong>Listagem</strong> (60/min por token).</p>\n","_postman_id":"cbde5d29-b3a5-bd93-c372-8ca197a94f6d","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"08 — Homologação","item":[{"name":"Listar produtos para pedidos de teste","id":"1cb49bcd-f9ae-4615-90be-18a0d4348099","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/homologation/v1/products","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Lista o catálogo de produtos de teste (EANs sintéticos) provisionado para a sua homologação. Os pedidos de teste (<code>POST .../test-orders</code>) já vêm com itens pré-configurados por modelo; esta rota serve principalmente para conferência do escopo provisionado.</p>\n<h2 id=\"autenticação\">Autenticação</h2>\n<p>Mesma API Key de homologação, enviada no header <code>apikey</code>, contra <code>base_url = https://api.staging.hubii.co</code>.</p>\n<h2 id=\"resposta\">Resposta</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>products[].product_uuid</code></td>\n<td>UUID</td>\n<td>Identificador do produto</td>\n</tr>\n<tr>\n<td><code>products[].product_package_uuid</code></td>\n<td>UUID</td>\n<td>Identificador da embalagem/pacote do produto</td>\n</tr>\n<tr>\n<td><code>products[].name</code></td>\n<td>string</td>\n<td>Nome do produto de teste</td>\n</tr>\n<tr>\n<td><code>products[].ean</code></td>\n<td>string</td>\n<td>EAN sintético gerado para homologação</td>\n</tr>\n</tbody>\n</table>\n</div><p>Se a homologação não tiver produtos provisionados, <code>products</code> retorna lista vazia.</p>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/homologation/v1/products\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_STAGING_API_KEY\"\n\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir a qualquer momento.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>API Key ausente ou inválida; não retentar automaticamente</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"próximo-passo\">Próximo passo</h2>\n<p>Crie um pedido de teste com <code>POST /homologation/v1/test-orders</code>.</p>\n","urlObject":{"path":["homologation","v1","products"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[]}},"response":[{"id":"0d15a776-c276-40c5-a249-e1f609af1247","name":"[200] Listar produtos para pedidos de teste","originalRequest":{"method":"GET","header":[],"url":"https://api.staging.hubii.co/homologation/v1/products"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"products\": [\n        {\n            \"product_uuid\": \"b6e2f292-1e60-4b8a-8a7d-2b7a6a8c9e01\",\n            \"product_package_uuid\": \"6d9a9a68-9a2b-4d61-9b8e-2b7a6a8c9e02\",\n            \"name\": \"Produto Homologação A\",\n            \"ean\": \"7890000000015\"\n        },\n        {\n            \"product_uuid\": \"1a3e6f5a-8b8b-4a2b-9b0a-2b7a6a8c9e03\",\n            \"product_package_uuid\": \"9c4d9a68-9a2b-4d61-9b8e-2b7a6a8c9e04\",\n            \"name\": \"Produto Homologação B\",\n            \"ean\": \"7890000000022\"\n        }\n    ]\n}"}],"_postman_id":"1cb49bcd-f9ae-4615-90be-18a0d4348099"},{"name":"Criar pedido de teste","id":"5ebd8f89-7a91-4557-98fd-9df730cb8709","protocolProfileBehavior":{"disabledSystemHeaders":{"accept":true},"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"model\": \"quick_default\",\n    \"external_reference\": \"optional-partner-id\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.staging.hubii.co/homologation/v1/test-orders","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Cria um pedido de teste em staging a partir de um <strong>modelo pronto</strong> (lista fechada de 9 modelos). O checkout interno é feito automaticamente pelo serviço de homologação; a resposta traz o <code>order_uuid</code> real, que deve ser usado a partir daí <strong>na API pública</strong> (<a href=\"https://doc.hubii.io/\">https://doc.hubii.io/</a>) para aceitar/recusar, faturar, expedir e cancelar — exatamente como um pedido real do dia a dia.</p>\n<h2 id=\"quando-usar\">Quando usar</h2>\n<ul>\n<li>Para exercitar qualquer cenário do roteiro de homologação (aceite, notificações, NF-e, etiqueta, cancelamento).</li>\n<li>Sempre que precisar de um pedido novo; cada chamada cria um pedido diferente.</li>\n</ul>\n<h2 id=\"modelos-disponíveis\">Modelos disponíveis</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Modelo</th>\n<th>Perfil</th>\n<th>Uso principal</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>quick_default</code></td>\n<td>Rápido</td>\n<td>Fluxo padrão de aceite, notificações e entrega</td>\n</tr>\n<tr>\n<td><code>quick_canceled</code></td>\n<td>Rápido</td>\n<td>Cancelamento antes da coleta</td>\n</tr>\n<tr>\n<td><code>quick_lost</code></td>\n<td>Rápido</td>\n<td>Pedido extraviado</td>\n</tr>\n<tr>\n<td><code>scheduled_default</code></td>\n<td>Agendado</td>\n<td>Variação agendada do fluxo padrão</td>\n</tr>\n<tr>\n<td><code>scheduled_canceled</code></td>\n<td>Agendado</td>\n<td>Cancelamento agendado</td>\n</tr>\n<tr>\n<td><code>scheduled_lost</code></td>\n<td>Agendado</td>\n<td>Extravio agendado</td>\n</tr>\n<tr>\n<td><code>marketplace_default</code></td>\n<td>Marketplace</td>\n<td>Fluxo com NF-e (<code>invoice-xml</code>) + etiqueta</td>\n</tr>\n<tr>\n<td><code>marketplace_canceled</code></td>\n<td>Marketplace</td>\n<td>Cancelamento com NF-e já emitida</td>\n</tr>\n<tr>\n<td><code>marketplace_lost</code></td>\n<td>Marketplace</td>\n<td>Extravio com NF-e preservada (roteiro apenas, sem simulação financeira)</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Modelos legados (<code>offer_*</code>, <code>accepted_*</code>, <code>marketplace_express</code>) foram descontinuados e retornam <code>422</code>.</p>\n</blockquote>\n<p>Após o aceite (<code>POST .../answer</code> na API pública), o serviço de homologação avança <strong>automaticamente</strong> o fluxo logístico simulado (busca de courier, coleta, entrega ou cancelamento, conforme o modelo). Não é necessário — e não é possível — chamar rotas internas de avanço de status.</p>\n<h2 id=\"body-applicationjson\">Body (<code>application/json</code>)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Tipo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>model</code></td>\n<td>string</td>\n<td>Sim</td>\n<td>Um dos 9 modelos da tabela acima</td>\n</tr>\n<tr>\n<td><code>external_reference</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Identificador livre do parceiro (até 255 caracteres)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"resposta-201\">Resposta <code>201</code></h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"test_order_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"order_uuid\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\",\n  \"model\": \"quick_default\"\n}\n</code></pre>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>test_order_uuid</code></td>\n<td>Identificador do registro de teste <strong>neste serviço de homologação</strong>; use em <code>GET .../test-orders/{test_order_uuid}</code></td>\n</tr>\n<tr>\n<td><code>order_uuid</code></td>\n<td>Pedido real no order-service; use na <strong>API pública</strong> (<code>to-answer</code>, detalhe, <code>answer</code>, NF, etiqueta, cancelamento) e em <code>GET .../invoice-xml</code></td>\n</tr>\n<tr>\n<td><code>model</code></td>\n<td>Modelo solicitado</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p><strong>Atenção:</strong> <code>test_order_uuid</code> e <code>order_uuid</code> são UUIDs diferentes, com usos diferentes. <code>test_order_uuid</code> só serve para consultar o registro de teste nesta API de homologação; <code>order_uuid</code> é o identificador usado em praticamente todo o resto do fluxo, incluindo a API pública e a rota de XML de NF-e.</p>\n</blockquote>\n<p>Esta rota <strong>não</strong> retorna <code>hub_uuid</code>, <code>delivery_flow_profile</code> nem <code>available_until_at</code>. Para o hub alocado e o prazo de aceite, consulte <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code> na API pública, após o pedido aparecer em <code>to-answer</code>.</p>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL/homologation/v1/test-orders\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"apikey: $HUBII_STAGING_API_KEY\" \\\n  -d '{\"model\": \"quick_default\", \"external_reference\": \"meu-teste-1\"}'\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p>Não é idempotente: cada chamada cria um novo pedido de teste. Não faça retry automático sem confirmar se o pedido anterior já foi criado.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>API Key ausente ou inválida</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td><code>model</code> inválido (fora da lista fechada ou modelo legado); revisar payload</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"próximo-passo\">Próximo passo</h2>\n<p>Use <code>order_uuid</code> na API pública: <code>GET /hubs/{hub_uuid}/orders/to-answer</code> → <code>GET /hubs/{hub_uuid}/orders/{order_uuid}</code> → <code>POST .../answer</code>.</p>\n","urlObject":{"path":["homologation","v1","test-orders"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[]}},"response":[{"id":"6322acdf-cd53-40ed-a178-4f53852fd24d","name":"[201] Criar pedido de teste","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"model\": \"quick_default\",\n    \"external_reference\": \"optional-partner-id\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.staging.hubii.co/homologation/v1/test-orders"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"test_order_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"order_uuid\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\",\n    \"model\": \"quick_default\"\n}"},{"id":"4e770ca9-18f6-46fe-ba3a-8e3111884243","name":"[422] Modelo inválido","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"model\": \"offer_pending\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.staging.hubii.co/homologation/v1/test-orders"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"The selected model is invalid.\",\n    \"errors\": {\n        \"model\": [\n            \"The selected model is invalid.\"\n        ]\n    }\n}"}],"_postman_id":"5ebd8f89-7a91-4557-98fd-9df730cb8709"},{"name":"Consultar pedido de teste","id":"648d86d5-d633-4236-92df-016b76032e9a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/homologation/v1/test-orders/:test_order_uuid","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Consulta o registro de um pedido de teste criado nesta homologação, pelo <code>test_order_uuid</code> retornado no <code>POST /homologation/v1/test-orders</code>.</p>\n<h2 id=\"quando-usar\">Quando usar</h2>\n<ul>\n<li>Para conferir qual <code>order_uuid</code> e <code>model</code> foram associados a um <code>test_order_uuid</code> específico.</li>\n<li>Para reobter esses dados caso a resposta do <code>POST</code> original não tenha sido persistida.</li>\n</ul>\n<h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>test_order_uuid</code></td>\n<td>UUID retornado em <code>test_order_uuid</code> no <code>POST /homologation/v1/test-orders</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"resposta-200\">Resposta <code>200</code></h2>\n<p>Mesmo formato do <code>POST</code>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"test_order_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"order_uuid\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\",\n  \"model\": \"marketplace_default\"\n}\n</code></pre>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/homologation/v1/test-orders/$TEST_ORDER_UUID\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_STAGING_API_KEY\"\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir a qualquer momento.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>API Key ausente ou inválida</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>O <code>test_order_uuid</code> pertence a outra homologação</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>test_order_uuid</code> inexistente</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["homologation","v1","test-orders",":test_order_uuid"],"host":["https://api.staging.hubii.co"],"query":[],"variable":[{"id":"c8c4a55d-8d9e-4b66-bea4-42197f266ba5","description":{"content":"<p>UUID retornado em test_order_uuid no POST /homologation/v1/test-orders</p>\n","type":"text/plain"},"type":"any","value":"","key":"test_order_uuid"}]}},"response":[{"id":"2c528b82-3cce-4bd3-82b6-3342e172977d","name":"[200] Consultar pedido de teste","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/homologation/v1/test-orders/:test_order_uuid","host":["https://api.staging.hubii.co"],"path":["homologation","v1","test-orders",":test_order_uuid"],"variable":[{"key":"test_order_uuid","value":"550e8400-e29b-41d4-a716-446655440000"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"test_order_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"order_uuid\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\",\n    \"model\": \"marketplace_default\"\n}"},{"id":"590d6f36-d1c7-4b29-9d54-5a4b509dc114","name":"[403] Pedido de outra homologação","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/homologation/v1/test-orders/:test_order_uuid","host":["https://api.staging.hubii.co"],"path":["homologation","v1","test-orders",":test_order_uuid"],"variable":[{"key":"test_order_uuid","value":"550e8400-e29b-41d4-a716-446655440000"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"Forbidden.\"\n}"}],"_postman_id":"648d86d5-d633-4236-92df-016b76032e9a"},{"name":"Gerar XML de NF-e fake para pedido de teste","id":"b9f6663c-9eb9-4def-94cf-b709e01a6f93","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/xml","type":"text"}],"url":"https://api.staging.hubii.co/homologation/v1/test-orders/:order_uuid/invoice-xml?variant=valid","description":"<h2 id=\"objetivo\">Objetivo</h2>\n<p>Gera um XML de NF-e sintético para um pedido de teste, pronto para ser enviado à <strong>API pública</strong> em <code>POST /hubs/{hub_uuid}/orders/{order_uuid}/invoice</code>. Use esta rota para homologar o fluxo de faturamento sem depender de um emissor fiscal real.</p>\n<h2 id=\"quando-usar\">Quando usar</h2>\n<p>Apenas para pedidos criados com modelo <code>marketplace_*</code>, que exigem envio de NF-e antes de disponibilizar a etiqueta. Modelos <code>quick_*</code> e <code>scheduled_*</code> não passam por esta etapa.</p>\n<h2 id=\"path-params\">Path params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>order_uuid</code></td>\n<td>Sim</td>\n<td><strong><code>order_uuid</code></strong> do pedido (não é o <code>test_order_uuid</code>) — mesmo valor retornado em <code>POST</code>/<code>GET .../test-orders</code> e usado na API pública</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-params\">Query params</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Obrigatório</th>\n<th>Valores</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>variant</code></td>\n<td>Sim</td>\n<td><code>valid</code> | <code>cep_mismatch</code></td>\n<td>Variante do XML gerado</td>\n</tr>\n</tbody>\n</table>\n</div><div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variante</th>\n<th>Comportamento</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>valid</code></td>\n<td>XML simula uma NF-e <strong>autorizada</strong>, correlacionada ao pedido real: mesmo documento (CPF/CNPJ) e nome do destinatário do pedido, mesmo valor total e protocolo de autorização preenchido (<code>nProt</code>, <code>chNFe</code>, <code>cStat=100</code>, <code>xMotivo=\"Autorizado o uso da NF-e\"</code>). Passa na validação de <code>POST .../invoice</code> da API pública.</td>\n</tr>\n<tr>\n<td><code>cep_mismatch</code></td>\n<td>Idêntico ao <code>valid</code>, exceto pelo CEP do destinatário, propositalmente divergente do CEP da venda. Use para homologar o tratamento do erro <code>422</code> de CEP divergente em <code>POST .../invoice</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"resposta-200\">Resposta <code>200</code></h2>\n<p><code>Content-Type: application/xml</code>. Corpo é o XML da NF-e (<code>nfeProc</code>):</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;nfeProc xmlns=\"http://www.portalfiscal.inf.br/nfe\"&gt;\n  &lt;NFe&gt;\n    &lt;infNFe Id=\"NFe6ba7b810-9dad-11d1-80b4-00c04fd430c8\"&gt;\n      &lt;ide&gt;\n        &lt;cUF&gt;35&lt;/cUF&gt;\n        &lt;natOp&gt;Homologacao Hubii API&lt;/natOp&gt;\n        &lt;mod&gt;55&lt;/mod&gt;\n        &lt;serie&gt;1&lt;/serie&gt;\n        &lt;nNF&gt;1&lt;/nNF&gt;\n      &lt;/ide&gt;\n      &lt;dest&gt;\n        &lt;CPF&gt;00000000000&lt;/CPF&gt;\n        &lt;xNome&gt;Cliente de Teste&lt;/xNome&gt;\n        &lt;enderDest&gt;\n          &lt;CEP&gt;01310100&lt;/CEP&gt;\n          &lt;xLgr&gt;Rua Homologacao&lt;/xLgr&gt;\n          &lt;nro&gt;100&lt;/nro&gt;\n          &lt;xBairro&gt;Centro&lt;/xBairro&gt;\n          &lt;xMun&gt;Sao Paulo&lt;/xMun&gt;\n          &lt;UF&gt;SP&lt;/UF&gt;\n        &lt;/enderDest&gt;\n      &lt;/dest&gt;\n      &lt;det&gt;\n        &lt;prod&gt;\n          &lt;cProd&gt;HOMOLOG-6ba7b810-9dad-11d1-80b4-00c04fd430c8&lt;/cProd&gt;\n          &lt;xProd&gt;Produto de teste homologacao&lt;/xProd&gt;\n          &lt;qCom&gt;1.0000&lt;/qCom&gt;\n        &lt;/prod&gt;\n      &lt;/det&gt;\n      &lt;total&gt;\n        &lt;ICMSTot&gt;\n          &lt;vNF&gt;150.75&lt;/vNF&gt;\n        &lt;/ICMSTot&gt;\n      &lt;/total&gt;\n      &lt;infAdic&gt;\n        &lt;infCpl&gt;order_uuid=6ba7b810-9dad-11d1-80b4-00c04fd430c8;variant=valid&lt;/infCpl&gt;\n      &lt;/infAdic&gt;\n    &lt;/infNFe&gt;\n  &lt;/NFe&gt;\n  &lt;protNFe&gt;\n    &lt;infProt&gt;\n      &lt;tpAmb&gt;2&lt;/tpAmb&gt;\n      &lt;chNFe&gt;35260700000000000155550010000000011000000015&lt;/chNFe&gt;\n      &lt;dhRecbto&gt;2026-07-27T14:00:00-03:00&lt;/dhRecbto&gt;\n      &lt;nProt&gt;135260000000001&lt;/nProt&gt;\n      &lt;cStat&gt;100&lt;/cStat&gt;\n      &lt;xMotivo&gt;Autorizado o uso da NF-e&lt;/xMotivo&gt;\n    &lt;/infProt&gt;\n  &lt;/protNFe&gt;\n&lt;/nfeProc&gt;\n</code></pre>\n<h2 id=\"exemplo-curl\">Exemplo cURL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s \"$BASE_URL/homologation/v1/test-orders/$ORDER_UUID/invoice-xml?variant=valid\" \\\n  -H \"apikey: $HUBII_STAGING_API_KEY\" \\\n  -o nota-teste.xml\n</code></pre>\n<h2 id=\"próximo-passo\">Próximo passo</h2>\n<p>Envie o arquivo baixado para a API pública:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl -s -X POST \"$BASE_URL_PUBLICA/hubs/$HUB_UUID/orders/$ORDER_UUID/invoice\" \\\n  -H \"Accept: application/json\" \\\n  -H \"apikey: $HUBII_API_KEY\" \\\n  -F \"invoice_file=@nota-teste.xml\"\n</code></pre>\n<h2 id=\"idempotência\">Idempotência</h2>\n<p><code>GET</code> seguro repetir; cada chamada gera um novo XML equivalente (o horário de recebimento simulado muda a cada geração; o restante do conteúdo é estável para o mesmo pedido e variante).</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>API Key ausente ou inválida</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>O pedido pertence a outra homologação</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>order_uuid</code> não corresponde a um pedido de teste desta homologação</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td><code>variant</code> inválido (fora de <code>valid</code>/<code>cep_mismatch</code>)</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["homologation","v1","test-orders",":order_uuid","invoice-xml"],"host":["https://api.staging.hubii.co"],"query":[{"description":{"content":"<p>valid | cep_mismatch</p>\n","type":"text/plain"},"key":"variant","value":"valid"}],"variable":[{"id":"5580eb58-ca81-46be-a64d-663cc953f9ea","description":{"content":"<p>order_uuid retornado em POST/GET .../test-orders (não é o test_order_uuid)</p>\n","type":"text/plain"},"type":"any","value":"","key":"order_uuid"}]}},"response":[{"id":"064448e5-acca-47a0-941e-7e74b3044362","name":"[200] XML válido (variant=valid)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/homologation/v1/test-orders/:order_uuid/invoice-xml?variant=valid","host":["https://api.staging.hubii.co"],"path":["homologation","v1","test-orders",":order_uuid","invoice-xml"],"query":[{"key":"variant","value":"valid"}],"variable":[{"key":"order_uuid","value":"6ba7b810-9dad-11d1-80b4-00c04fd430c8"}]}},"status":"OK","code":200,"_postman_previewlanguage":"xml","header":[{"key":"Content-Type","value":"application/xml; charset=UTF-8"}],"cookie":[],"responseTime":null,"body":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<nfeProc xmlns=\"http://www.portalfiscal.inf.br/nfe\">\n  <NFe>\n    <infNFe Id=\"NFe6ba7b810-9dad-11d1-80b4-00c04fd430c8\">\n      <dest>\n        <CPF>00000000000</CPF>\n        <xNome>Cliente de Teste</xNome>\n        <enderDest>\n          <CEP>01310100</CEP>\n        </enderDest>\n      </dest>\n      <total>\n        <ICMSTot>\n          <vNF>150.75</vNF>\n        </ICMSTot>\n      </total>\n    </infNFe>\n  </NFe>\n  <protNFe>\n    <infProt>\n      <cStat>100</cStat>\n      <xMotivo>Autorizado o uso da NF-e</xMotivo>\n    </infProt>\n  </protNFe>\n</nfeProc>"},{"id":"b0e265dc-f587-42cd-9a49-17df3769637c","name":"[200] CEP divergente (variant=cep_mismatch)","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.staging.hubii.co/homologation/v1/test-orders/:order_uuid/invoice-xml?variant=cep_mismatch","host":["https://api.staging.hubii.co"],"path":["homologation","v1","test-orders",":order_uuid","invoice-xml"],"query":[{"key":"variant","value":"cep_mismatch"}],"variable":[{"key":"order_uuid","value":"6ba7b810-9dad-11d1-80b4-00c04fd430c8"}]}},"status":"OK","code":200,"_postman_previewlanguage":"xml","header":[{"key":"Content-Type","value":"application/xml; charset=UTF-8"}],"cookie":[],"responseTime":null,"body":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<nfeProc xmlns=\"http://www.portalfiscal.inf.br/nfe\">\n  <NFe>\n    <infNFe Id=\"NFe6ba7b810-9dad-11d1-80b4-00c04fd430c8\">\n      <dest>\n        <CPF>00000000000</CPF>\n        <xNome>Cliente de Teste</xNome>\n        <enderDest>\n          <CEP>99999999</CEP>\n        </enderDest>\n      </dest>\n      <total>\n        <ICMSTot>\n          <vNF>150.75</vNF>\n        </ICMSTot>\n      </total>\n    </infNFe>\n  </NFe>\n  <protNFe>\n    <infProt>\n      <cStat>100</cStat>\n      <xMotivo>Autorizado o uso da NF-e</xMotivo>\n    </infProt>\n  </protNFe>\n</nfeProc>"}],"_postman_id":"b9f6663c-9eb9-4def-94cf-b709e01a6f93"}],"id":"214af052-ce14-4d90-bcfa-93196f7e710f","description":"<h2 id=\"sobre-o-módulo-de-homologação\">Sobre o módulo de homologação</h2>\n<p>Esta seção documenta o serviço <code>partner-homologation-service</code>, uma API auxiliar disponível <strong>somente em staging</strong>, criada para o parceiro montar cenários de teste durante a homologação. Ela não substitui a API pública documentada em <a href=\"https://doc.hubii.io/\"><b>https://doc.hubii.io/</b></a> — serve apenas para:</p>\n<ul>\n<li><p>Consultar produtos de teste vinculados à sua homologação.</p>\n</li>\n<li><p>Criar pedidos de teste (<code>test-orders</code>) por modelo pronto, sem montar um checkout completo.</p>\n</li>\n<li><p>Gerar um XML de NF-e sintético para exercitar o fluxo de faturamento.</p>\n</li>\n</ul>\n<blockquote>\n<p>As rotas deste módulo <strong>não existem em produção</strong>. Em <code>https://api.hubii.co</code>, <code>/homologation/v1/...</code> retorna <code>404</code>. </p>\n</blockquote>\n<h2 id=\"fluxo-geral\">Fluxo geral</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /homologation/v1/products\n  ↓ (opcional; conferir o catálogo sandbox)\nPOST /homologation/v1/test-orders { model }\n  ↓ retorna { test_order_uuid, order_uuid, model }\n[API pública] GET .../to-answer → GET .../orders/{order_uuid} → POST .../answer\n  ↓ pedido aceito; fluxo logístico avança automaticamente\n[somente marketplace_*] GET /homologation/v1/test-orders/{order_uuid}/invoice-xml\n  ↓\n[API pública] POST .../orders/{order_uuid}/invoice\n\n</code></pre>\n","_postman_id":"214af052-ce14-4d90-bcfa-93196f7e710f","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}},{"name":"[Descontinuado]","item":[{"name":"[Descontinuado] Listagem de notificações","id":"4b9f518f-9b54-4e8b-b191-73208aaba8a3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/notifications","description":"<h2 id=\"descontinuado--não-usar-em-novas-integrações\">DESCONTINUADO — não usar em novas integrações</h2>\n<p>Endpoint legado de listagem de notificações, <strong>sem paginação</strong>. Mantido apenas por compatibilidade com integrações antigas. Novas integrações devem usar:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /v2/notifications\n  ↓ data[]\nPOST /notifications/ack\n</code></pre>\n<h2 id=\"por-que-foi-descontinuado\">Por que foi descontinuado</h2>\n<ul>\n<li>A listagem sem paginação não escala para hubs com alto volume de eventos.</li>\n<li><code>GET /v2/notifications</code> retorna o mesmo conteúdo em <code>data[]</code>, com <code>page</code>, <code>limit</code>, <code>total</code> e <code>last_page</code>.</li>\n<li>A API sinaliza depreciação com <code>X-API-Deprecated: true</code> e <code>X-API-Replacement: /v2/notifications</code>.</li>\n</ul>\n<h2 id=\"diferenças-em-relação-à-v2\">Diferenças em relação à v2</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Aspecto</th>\n<th><code>GET /notifications</code> (legado)</th>\n<th><code>GET /v2/notifications</code></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Resposta</td>\n<td>Array direto <code>[...]</code></td>\n<td>Objeto paginado <code>{ data, total, page, last_page, per_page }</code></td>\n</tr>\n<tr>\n<td>Paginação</td>\n<td>Não suportada</td>\n<td><code>page</code> (padrão <code>1</code>) e <code>limit</code> (padrão <code>15</code>, máx. <code>100</code>)</td>\n</tr>\n<tr>\n<td>Filtros</td>\n<td><code>hub_uuids</code>, <code>types</code></td>\n<td><code>hub_uuids</code>, <code>types</code> (mesmos filtros)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"se-você-já-usa-este-endpoint\">Se você já usa este endpoint</h2>\n<p>Planeje migração para <code>GET /v2/notifications</code>. Enquanto isso, trate a resposta como array e mantenha <code>POST /notifications/ack</code> inalterado.</p>\n<h2 id=\"rate-limit\">Rate limit</h2>\n<p>5 req/min por token, no grupo de notificações.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n","urlObject":{"path":["notifications"],"host":["https://api.staging.hubii.co"],"query":[{"disabled":true,"description":{"content":"<p>Filtrar por hub</p>\n","type":"text/plain"},"key":"hub_uuids","value":""},{"disabled":true,"description":{"content":"<p>Filtrar por tipo de evento</p>\n","type":"text/plain"},"key":"types","value":"ORDER_CREATED"}],"variable":[]}},"response":[{"id":"bfe074a4-941c-47c0-bdd9-6b745c166180","name":"200 OK — array legado","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/notifications"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"X-API-Deprecated","value":"true"},{"key":"X-API-Replacement","value":"/v2/notifications"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"notification_uuid\": \"066d19b9-4aef-4b40-941b-d104ab158cd2\",\n        \"type\": \"ORDER_CREATED\",\n        \"subtype\": null,\n        \"order_uuid\": \"356a4241-456b-49a6-8bdc-93f92ddec7f2\",\n        \"order_id\": \"146167\",\n        \"order_delivery_id\": \"119758\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-03T21:46:59.000Z\"\n    },\n    {\n        \"notification_uuid\": \"c3bc1f55-fe65-49c5-ac89-fcef38827d41\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n        \"order_uuid\": \"356a4241-456b-49a6-8bdc-93f92ddec7f2\",\n        \"order_id\": \"146167\",\n        \"order_delivery_id\": \"119758\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-03T21:47:29.000Z\"\n    },\n    {\n        \"notification_uuid\": \"636b4abf-2458-4e5e-a285-4184af2ffdfd\",\n        \"type\": \"ORDER_CREATED\",\n        \"subtype\": null,\n        \"order_uuid\": \"c71af0ac-6d96-4d1f-a59f-a651ce2c4eb8\",\n        \"order_id\": \"146199\",\n        \"order_delivery_id\": \"119790\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-04T12:49:40.000Z\"\n    },\n    {\n        \"notification_uuid\": \"09d0613e-50de-4ed0-9383-184a93429275\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n        \"order_uuid\": \"c71af0ac-6d96-4d1f-a59f-a651ce2c4eb8\",\n        \"order_id\": \"146199\",\n        \"order_delivery_id\": \"119790\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-04T12:49:44.000Z\"\n    },\n    {\n        \"notification_uuid\": \"f8bb9ca5-961c-4bc3-9bf5-2b47452b2f81\",\n        \"type\": \"ORDER_CREATED\",\n        \"subtype\": null,\n        \"order_uuid\": \"571cdfbe-ba9a-4cf2-aaea-45c67b064c88\",\n        \"order_id\": \"146265\",\n        \"order_delivery_id\": \"119856\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-04T16:18:40.000Z\"\n    },\n    {\n        \"notification_uuid\": \"d987097a-a097-49c8-8c57-cf302f3efabd\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_COURIER_NOT_FOUND\",\n        \"order_uuid\": \"c71af0ac-6d96-4d1f-a59f-a651ce2c4eb8\",\n        \"order_id\": \"146199\",\n        \"order_delivery_id\": \"119790\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-04T12:50:59.000Z\"\n    },\n    {\n        \"notification_uuid\": \"35f09ebf-94e4-440f-902e-f74c1f89670c\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n        \"order_uuid\": \"571cdfbe-ba9a-4cf2-aaea-45c67b064c88\",\n        \"order_id\": \"146265\",\n        \"order_delivery_id\": \"119856\",\n        \"hub_uuid\": \"a93dd09b-4c47-479a-9dca-9fb8026301a6\",\n        \"date\": \"2025-09-04T16:18:44.000Z\"\n    },\n    {\n        \"notification_uuid\": \"07451006-152c-4406-8ae1-f755bff7bdca\",\n        \"type\": \"ORDER_CREATED\",\n        \"subtype\": null,\n        \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n        \"order_id\": \"146390\",\n        \"order_delivery_id\": \"119981\",\n        \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n        \"date\": \"2025-09-05T18:57:59.000Z\"\n    },\n    {\n        \"notification_uuid\": \"883596c5-dbdd-4720-9178-68b13f428e30\",\n        \"type\": \"ORDER_CREATED\",\n        \"subtype\": null,\n        \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n        \"order_id\": \"146390\",\n        \"order_delivery_id\": \"119981\",\n        \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n        \"date\": \"2025-09-05T19:06:53.000Z\"\n    },\n    {\n        \"notification_uuid\": \"0cdd2ae7-4a0e-4480-b1e9-950141be78dd\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_SEARCHING_COURIER\",\n        \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n        \"order_id\": \"146390\",\n        \"order_delivery_id\": \"119981\",\n        \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n        \"date\": \"2025-09-05T19:07:35.000Z\"\n    },\n    {\n        \"notification_uuid\": \"95af8726-3833-424d-bb18-0d0c716b4ffa\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_COURIER_FOUND\",\n        \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n        \"order_id\": \"146390\",\n        \"order_delivery_id\": \"119981\",\n        \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n        \"date\": \"2025-09-05T19:07:51.000Z\"\n    },\n    {\n        \"notification_uuid\": \"1766ae9b-b06d-4486-8c41-37add23fe872\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_DELIVERING\",\n        \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n        \"order_id\": \"146390\",\n        \"order_delivery_id\": \"119981\",\n        \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n        \"date\": \"2025-09-05T19:08:03.000Z\"\n    },\n    {\n        \"notification_uuid\": \"7d122bff-d184-4a19-bd62-b30e03fee07f\",\n        \"type\": \"ORDER_DELIVERY_UPDATED\",\n        \"subtype\": \"ORDER_DELIVERY_DELIVERED\",\n        \"order_uuid\": \"b3372551-01d4-4de8-9f1b-d3e0c912992f\",\n        \"order_id\": \"146390\",\n        \"order_delivery_id\": \"119981\",\n        \"hub_uuid\": \"dbe03cf0-c04b-458c-9b68-16af9faaa9ea\",\n        \"date\": \"2025-09-05T19:08:11.000Z\"\n    }\n]"}],"_postman_id":"4b9f518f-9b54-4e8b-b191-73208aaba8a3"},{"name":"[Descontinuado] Pedidos esperando faturamento","id":"29938c03-ec78-4efa-9d0e-5f5af8555463","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/to-invoice?blocks_shipping=&date_from&accepted_from","description":"<h2 id=\"descontinuado--não-usar-em-novas-integrações\">DESCONTINUADO — não usar em novas integrações</h2>\n<p>Endpoint legado mantido apenas por compatibilidade com integrações antigas. Novas integrações devem usar o Polling 2:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-text\">GET /v2/notifications\n  ↓ ORDER_CREATED\nGET /hubs/{hub_uuid}/orders/{order_uuid}\n</code></pre>\n<h2 id=\"por-que-foi-descontinuado\">Por que foi descontinuado</h2>\n<ul>\n<li>O fluxo atual centraliza pedidos aceitos em notificações.</li>\n<li><code>ORDER_CREATED</code> chega após aceite via API ou painel e deve disparar a importação no ERP.</li>\n<li>Usar esta rota em novas integrações pode duplicar lógica e dificultar idempotência.</li>\n</ul>\n<h2 id=\"se-você-já-usa-este-endpoint\">Se você já usa este endpoint</h2>\n<p>Planeje migração para Polling 2 + <code>ORDER_CREATED</code>. Enquanto isso, mantenha retry e rate limit conforme o grupo de listagem.</p>\n<h2 id=\"rate-limit\">Rate limit</h2>\n<p>60 req/min por token, no grupo de listagem.</p>\n<h2 id=\"tratamento-de-erros\">Tratamento de erros</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Orientação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td>Não retentar automaticamente; revisar API Key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Verificar se a API Key tem acesso ao hub informado</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Verificar <code>hub_uuid</code>, <code>order_uuid</code> ou se o recurso ainda está disponível</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Tratar como erro de regra de negócio ou payload inválido; não fazer retry cego</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Aplicar backoff exponencial e respeitar os headers de rate limit</td>\n</tr>\n<tr>\n<td><code>5xx</code> / timeout</td>\n<td>Retentar com backoff exponencial e limite de tentativas</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Em runtime, use os headers <strong><code>X-RateLimit-*</code></strong> como referência operacional. A tabela de rate limits documenta o limite esperado/contratual.</p>\n</blockquote>\n","urlObject":{"path":["hubs",":hub_uuid","orders","to-invoice"],"host":["https://api.staging.hubii.co"],"query":[{"description":{"content":"<p>Filtra os pedidos que precisam de nota fiscal obrigatoriamente para expedição do pedido</p>\n","type":"text/plain"},"key":"blocks_shipping","value":""},{"description":{"content":"<p>Filtra os pedidos pelo datetime que o cliente realizou a compra. Ex: 2026-03-20 09:00:00-03:00</p>\n","type":"text/plain"},"key":"date_from","value":""},{"description":{"content":"<p>Filtra os pedidos pela datetime que o hub aceitou. Ex: 2026-03-20 09:00:00-03:00</p>\n","type":"text/plain"},"key":"accepted_from","value":""}],"variable":[{"description":{"content":"<p>UUID do hub retornado em GET /hubs</p>\n","type":"text/plain"},"type":"any","value":"","key":"hub_uuid"}]}},"response":[{"id":"6ab6047b-e281-4996-8842-ca7e23e66fe0","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"https://api.staging.hubii.co/hubs/:hub_uuid/orders/to-invoice","host":["https://api.staging.hubii.co"],"path":["hubs",":hub_uuid","orders","to-invoice"],"variable":[{"key":"hub_uuid","value":"","description":"UUID único do Hub"}]}},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Date","value":"Fri, 20 Mar 2026 12:57:23 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"ratelimit-remaining","value":"598"},{"key":"ratelimit-reset","value":"37"},{"key":"ratelimit-limit","value":"600"},{"key":"x-ratelimit-remaining-minute","value":"598"},{"key":"x-ratelimit-limit-minute","value":"600"},{"key":"Server","value":"cloudflare"},{"key":"vary","value":"Accept-Encoding"},{"key":"x-powered-by","value":"PHP/8.2.29"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"x-ratelimit-limit","value":"60"},{"key":"x-ratelimit-remaining","value":"58"},{"key":"access-control-allow-origin","value":"*"},{"key":"x-frame-options","value":"SAMEORIGIN"},{"key":"x-xss-protection","value":"1; mode=block"},{"key":"x-content-type-options","value":"nosniff"},{"key":"Content-Encoding","value":"gzip"},{"key":"x-kong-upstream-latency","value":"337"},{"key":"x-kong-proxy-latency","value":"2"},{"key":"via","value":"1.1 kong/3.9.1"},{"key":"x-kong-request-id","value":"0ad8ae2c72e6dc7e478804580623f662"},{"key":"cf-cache-status","value":"DYNAMIC"},{"key":"Nel","value":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}"},{"key":"Report-To","value":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=w3hBXflqPpn%2BzSyjQDftkxMhfmihQZN5A%2F7qTG5kTI%2FiuzwFGwVU3lHUy38ZJx%2Fnd8Kq8Tm6fTtZxKYbJxGZM5r0S95NOyT5bv4p9VE3X01dN3PzmA%3D%3D\"}]}"},{"key":"CF-RAY","value":"9df4e1e04b7581d6-GRU"}],"cookie":[],"responseTime":null,"body":"{\n    \"current_page\": 1,\n    \"data\": [\n        {\n            \"id\": 620969,\n            \"uuid\": \"c8bd105e-9f01-47e8-98e9-6f26cd463dc3\",\n            \"total\": 76.64\n        }\n    ],\n    \"next_page_url\": \"https://api.staging.hubii.co/hubs/orders/to-invoice?per_page=20&page=2\",\n    \"path\": \"https://api.staging.hubii.co/hubs/orders/to-invoice\",\n    \"per_page\": 20,\n    \"prev_page_url\": null,\n    \"to\": 20,\n    \"total\": 1\n}"}],"_postman_id":"29938c03-ec78-4efa-9d0e-5f5af8555463"}],"id":"0f484384-57d2-4290-a3a5-c7641765126c","_postman_id":"0f484384-57d2-4290-a3a5-c7641765126c","description":"","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]},"isInherited":true,"source":{"_postman_id":"7e207411-7624-4909-8d24-35ec0605eb45","id":"7e207411-7624-4909-8d24-35ec0605eb45","name":"Hubii API","type":"collection"}}}],"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":""}]}},"event":[{"listen":"prerequest","script":{"type":"text/javascript","requests":{},"exec":[""],"id":"28706e55-5f61-4349-b463-8ca45b125125"}},{"listen":"test","script":{"type":"text/javascript","requests":{},"exec":[""],"id":"798c75d2-df07-45bf-9f09-3ed499fd0e78"}}],"variable":[{"key":"base_url","value":"https://api.staging.hubii.co","description":"Homologação: https://api.staging.hubii.co | Produção: https://api.hubii.co"},{"key":"apikey","value":"","description":"API Key Hubii usada no header apikey. Nunca preencher com segredo real em arquivo versionado."},{"key":"hub_uuid","value":"","description":"UUID do hub retornado em GET /hubs"},{"key":"hub_uuid_2","value":"","description":"Opcional: segundo hub para exemplos de filtros com múltiplos hubs"},{"key":"order_uuid","value":"","description":"UUID do pedido retornado em to-answer ou notifications"},{"key":"notification_uuid","value":"","description":"UUID da notificação retornada em GET /v2/notifications (campo notification_uuid em data[]); usar em POST /notifications/ack"},{"key":"test_order_uuid","value":"","description":"UUID do pedido de teste retornado em POST /homologation/v1/test-orders (campo test_order_uuid)"}]}